查看: 6674|回复: 14

[已解决] 使用MKE04Z128VLK4芯片,只要开启外设就产生 hard fault 中断

[复制链接]

该用户从未签到

2

主题

9

帖子

0

新手上路

Rank: 1

积分
26
最后登录
2016-11-11
发表于 2016-10-12 15:47:19 | 显示全部楼层 |阅读模式
最近我公司一个项目使用MKE04Z128VLK4这个芯片时遇到一个问题,GPIO和systick都能正常工作,但是在主程序中只要使能别的外设就会进入hard fault中断,不知道是为什么,我使用的编译器是MDK5.21A,使用官方提供的外设库。

代码如下:
int main (void)

{
    uint32_t        u32LoadValue0, u32LoadValue1;     
    PIT_ConfigType  sPITConfig0, sPITConfig1;   
    PIT_ConfigType  *pPIT_Config1   =&sPITConfig1;
    PIT_ConfigType  *pPIT_Config0   =&sPITConfig0;


        sysinit();


        //*/
       
        //PIT_DeInit();
        /* configure PIT module in chain mode */
    /* PIT clock source is bus clock,20MHz */
    /* PIT channel 0 load value = (1000000-1), channel 1 load value = (20-1) */
    u32LoadValue0   = 0xF423F;                  /*!< PIT ch0 timer load value  */
    u32LoadValue1   = 0x13;                     /*!< PIT ch1 timer load value  */     

    /* configure PIT channel 1 in chain mode, enable interrupt and timer */
    pPIT_Config1->u32LoadValue      = u32LoadValue1;
    pPIT_Config1->bFreeze           = FALSE;
    pPIT_Config1->bModuleDis        = FALSE;    /*!< enable PIT module */
    pPIT_Config1->bInterruptEn      = TRUE;
    pPIT_Config1->bChainMode        = TRUE;
    pPIT_Config1->bTimerEn          = TRUE;

    /* configure PIT channel 0, only enable timer */   
    pPIT_Config0->u32LoadValue      = u32LoadValue0;
    pPIT_Config0->bFreeze           = FALSE;   
    pPIT_Config0->bModuleDis        = FALSE;    /*!< enable PIT module */     
    pPIT_Config0->bInterruptEn      = FALSE;
    pPIT_Config0->bChainMode        = FALSE;
    pPIT_Config0->bTimerEn          = TRUE;

   // PIT_Init(PIT_CHANNEL0, pPIT_Config0);               
    PIT_Init(PIT_CHANNEL1, pPIT_Config1);

       
    PIT_SetCallback(PIT_CHANNEL1, PIT_Task);   
       
       
        SysTick_Config(SystemCoreClock/1000);
       
    PTA->PDDR |= 0xFFFFFFFF;
        PTA->PDOR |= 0xFFFFFFFF;
         PTB->PDDR |= 0xFFFFFFFF;
        PTB->PDOR |= 0xFFFFFFFF;
       
    while (1)
        {
                Delay(1000);
                PTA->PDOR ^= 0xFFFFFFFF;
                PTB->PDOR ^= 0xFFFFFFFF;
        }

}

最佳答案

xionghua235 发表于 2016-10-13 10:50 感谢小恩GG。还真的是SIM-&gt;SCGC |= SIM_SCGC_PIT_MASK;     /*!&lt; enable clock to PIT */运行之后没有使 ... 你的头文件要换成KE04Z128VLK4的,否则 ...

hard fault

hard fault
回复

使用道具 举报

该用户从未签到

2

主题

9

帖子

0

新手上路

Rank: 1

积分
26
最后登录
2016-11-11
 楼主| 发表于 2016-10-12 15:51:57 | 显示全部楼层
// PIT_Init(PIT_CHANNEL0, pPIT_Config0);               
    PIT_Init(PIT_CHANNEL1, pPIT_Config1);
只要这两句话都屏蔽,系统运行就正常,不仅是PIT初始化会产生硬件错误中断,其他外设比如串口开启也会产生hard fault 中断,请问这是为什么?

下面是PIT_Ini()的原型:
void PIT_Init(uint8_t u8Channel_No, PIT_ConfigType *pConfig)
{  
    SIM->SCGC |= SIM_SCGC_PIT_MASK;     /*!< enable clock to PIT */
   
    if (pConfig->bFreeze)            
    {                                               
        PIT_SetDebugFreeze();            
    }
   
    if (pConfig->bModuleDis == 0)
    {                                             
        PIT_Enable();       /*!< enable pit module */      
             
    }  
   
    PIT_SetLoadVal(u8Channel_No, pConfig->u32LoadValue);  
   
    if (pConfig->bInterruptEn)            
    {                                   
        if (u8Channel_No)
        {        
             NVIC_EnableIRQ(PIT_CH1_IRQn);            
        }
        else
        {                  
            NVIC_EnableIRQ(PIT_CH0_IRQn);
        }
        PIT_ChannelEnableInt(u8Channel_No);
    }                  
    else                                    
    {                     
        NVIC_DisableIRQ(PIT_CH0_IRQn);      
    }

    if (pConfig->bChainMode)            
    {                                               
        PIT_ChannelEnableChain(u8Channel_No);            
    }
   
    if (pConfig->bTimerEn)            
    {                                               
        PIT_ChannelEnable(u8Channel_No);            
    }            

}
在运行到  PIT_Enable(); 的时候就进入hard fault中断了。
__STATIC_INLINE void PIT_Enable(void)
{

    PIT->MCR &= ~PIT_MCR_MDIS_MASK;
   
}
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

9

帖子

0

新手上路

Rank: 1

积分
26
最后登录
2016-11-11
 楼主| 发表于 2016-10-12 16:16:39 | 显示全部楼层
经过试验,IAR和keil产生的现象是一样的,请大神帮忙解决一下,很急。
回复 支持 反对

使用道具 举报

该用户从未签到

719

主题

6378

帖子

0

超级版主

Rank: 8Rank: 8

积分
25335
最后登录
2025-8-29
发表于 2016-10-12 16:22:41 | 显示全部楼层
楼主你好!
通常在配置外设寄存器的时候,进入hard fault,是由于模块的时钟没有使能导致的。
请检查下SIM寄存器中,相关模块的时钟是否使能?
回复 支持 反对

使用道具 举报

该用户从未签到

719

主题

6378

帖子

0

超级版主

Rank: 8Rank: 8

积分
25335
最后登录
2025-8-29
发表于 2016-10-12 16:26:48 | 显示全部楼层
xionghua235 发表于 2016-10-12 15:51
// PIT_Init(PIT_CHANNEL0, pPIT_Config0);               
    PIT_Init(PIT_CHANNEL1, pPIT_Config1);
...

楼主你好!
使用仿真器debug下, 看看运行PIT_init的哪句话就会进hardfault?
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2020-6-18 08:45
  • 签到天数: 812 天

    连续签到: 1 天

    [LV.10]以坛为家III

    66

    主题

    4900

    帖子

    64

    金牌会员

    Rank: 6Rank: 6

    积分
    6324
    最后登录
    2025-8-6
    发表于 2016-10-12 16:29:52 | 显示全部楼层
    中断函数要声明
    开心
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    719

    主题

    6378

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25335
    最后登录
    2025-8-29
    发表于 2016-10-12 16:32:11 | 显示全部楼层
    6楼说的也是很大的因素,楼主开启中断之后,有没有添加PIT的中断服务函数?
    其他模块也是一样,如果你不使能中断,是否还有问题?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    26
    最后登录
    2016-11-11
     楼主| 发表于 2016-10-12 17:40:14 | 显示全部楼层
    小恩GG 发表于 2016-10-12 16:32
    6楼说的也是很大的因素,楼主开启中断之后,有没有添加PIT的中断服务函数?
    其他模块也是一样,如果你不使 ...

    不是的,中断函数已经声明并且添加
    #define VECTOR_002      default_isr     // 0x0000_0008 2 -          ARM core        Non-maskable Interrupt (NMI)
    #define VECTOR_003      hard_fault_handler_c     // 0x0000_000C 3 -          ARM core        Hard Fault
    #define VECTOR_004      default_isr     // 0x0000_0010 4 -
    #define VECTOR_005      default_isr     // 0x0000_0014 5 -          ARM core         Bus Fault
    #define VECTOR_006      default_isr     // 0x0000_0018 6 -          ARM core         Usage Fault
    #define VECTOR_007      default_isr     // 0x0000_001C 7 -                           
    #define VECTOR_008      default_isr     // 0x0000_0020 8 -                           
    #define VECTOR_009      default_isr     // 0x0000_0024 9 -
    #define VECTOR_010      default_isr     // 0x0000_0028 10 -
    #define VECTOR_011      default_isr     // 0x0000_002C 11 -         ARM core         Supervisor call (SVCall)
    #define VECTOR_012      default_isr     // 0x0000_0030 12 -         ARM core         Debug Monitor
    #define VECTOR_013      default_isr     // 0x0000_0034 13 -                          
    #define VECTOR_014      default_isr     // 0x0000_0038 14 -         ARM core         Pendable request for system service (PendableSrvReq)
    #define VECTOR_015      SysTick_Handler     // 0x0000_003C 15 -         ARM core         System tick timer (SysTick)
    #define VECTOR_016      default_isr     // 0x0000_0040 16     0     Reserved DMA     DMA Channel 0 transfer complete
    #define VECTOR_017      default_isr     // 0x0000_0044 17     1     Reserved DMA     DMA Channel 1 transfer complete
    #define VECTOR_018      default_isr     // 0x0000_0048 18     2     Reserved DMA     DMA Channel 2 transfer complete
    #define VECTOR_019      default_isr     // 0x0000_004C 19     3     Reserved DMA     DMA Channel 3 transfer complete
    #define VECTOR_020      default_isr     // 0x0000_0050 20     4     Reserved MCM     MCM
    #define VECTOR_021      default_isr     // 0x0000_0054 21     5     NVM              FTMRH flash memory command complete,ECC fault
    #define VECTOR_022      default_isr     // 0x0000_0058 22     6     PMC              LVD,LVW interrupt
    #define VECTOR_023      default_isr     // 0x0000_005C 23     7     LLWU             LLWU/IRQ
    #define VECTOR_024      default_isr     // 0x0000_0060 24     8     I2C0             I2C
    #define VECTOR_025      default_isr     // 0x0000_0064 25     9     -             --
    #define VECTOR_026      default_isr     // 0x0000_0068 26    10     SPI0             SPI0
    #define VECTOR_027      default_isr     // 0x0000_006C 27    11     SPI1             SPI1
    #define VECTOR_028      default_isr     // 0x0000_0070 28    12     SCI0             UART0
    #define VECTOR_029      default_isr     // 0x0000_0074 29    13     SCI1             UART1
    #define VECTOR_030      default_isr     // 0x0000_0078 30    14     SCI2             UART2
    #define VECTOR_031      default_isr     // 0x0000_007C 31    15     ADC0             ADC conversion complete
    #define VECTOR_032      default_isr     // 0x0000_0080 32    16     ACMP0            ACMP0
    #define VECTOR_033      default_isr     // 0x0000_0084 33    17     FTM0             FlexTimer0
    #define VECTOR_034      default_isr     // 0x0000_0088 34    18     FTM1             FlexTimer1
    #define VECTOR_035      default_isr     // 0x0000_008C 35    19     FTM2             FlexTimer2
    #define VECTOR_036      default_isr     // 0x0000_0090 36    20     RTC              RTC overflow
    #define VECTOR_037      default_isr     // 0x0000_0094 37    21     ACMP1            ACMP1
    #define VECTOR_038       PIT_Ch0Isr     // 0x0000_0098 38    22     PIT_CH0          PIT_CH0 overflow

    相关时钟已经使能,运行PIT_Init()中的PIT_Enable()就进入hard fault中断。还有个特别重要的是我在ke04_config.h中配置的是 #define USE_FEI ,因为外部晶振接的是16M,头文件中没有16M的选项,因此我使用内部晶振。
    //#define USE_FEE                         /*!< use FEE clock mode */       
       // #define USE_FEE_OSC                   /*!< use FEE clock mode with external active oscillator */
        #define USE_FEI                       /*!< use FEI clock mode */

        /*! define external crystal frequency. */
        //#define EXT_CLK_FREQ_KHZ        32          /* in KHz */
        //#define EXT_CLK_FREQ_KHZ        4000        /* in KHz */
        #define EXT_CLK_FREQ_KHZ        8000        /* in KHz */
        //#define EXT_CLK_FREQ_KHZ        10000       /* in KHz */
    若是配置成USE_FEE,则会停留在
    if(pConfig->bWaitInit)
            {

                    /* wait for OSC to be initialized
                     *
                     */
                    while(!(OSC->CR & OSC_CR_OSCINIT_MASK));
                   
            }
    不知为何,明天我换8M的试试
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    26
    最后登录
    2016-11-11
     楼主| 发表于 2016-10-12 17:44:01 | 显示全部楼层
    小恩GG 发表于 2016-10-12 16:26
    楼主你好!
    使用仿真器debug下, 看看运行PIT_init的哪句话就会进hardfault?

    只要运行到使能外设模块的函数就会发生 hard fault 中断,不仅是PIT会这样,UART也是这样,初始化的过程就会进入hard fault中断。此外,只要不运行外设,GPIO和systick工作均能正常,能正常中断。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    719

    主题

    6378

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25335
    最后登录
    2025-8-29
    发表于 2016-10-13 09:39:09 | 显示全部楼层
    xionghua235 发表于 2016-10-12 17:44
    只要运行到使能外设模块的函数就会发生 hard fault 中断,不仅是PIT会这样,UART也是这样,初始化的过程 ...

    楼主你好!
    再进一步测试下:
    void PIT_Init(uint8_t u8Channel_No, PIT_ConfigType *pConfig)
    {  
         SIM->SCGC |= SIM_SCGC_PIT_MASK;     /*!< enable clock to PIT */
         
         if (pConfig->bFreeze)            
         {                                               
             PIT_SetDebugFreeze();            
         }
         
         if (pConfig->bModuleDis == 0)
         {                                             
             PIT_Enable();       /*!< enable pit module */      
                   
         }  
         
         PIT_SetLoadVal(u8Channel_No, pConfig->u32LoadValue);

    你调用:
    PIT_Init(PIT_CHANNEL0, pPIT_Config0);   

    然后进入到PIT_Init,测试,
    运行:
    SIM->SCGC |= SIM_SCGC_PIT_MASK;     /*!< enable clock to PIT */
    这句之后,你查看下寄存器,看看SIM_SCGC_PIT这个位到底有没有使能?
    另外,在
    PIT_SetLoadVal(u8Channel_No, pConfig->u32LoadValue);
    这句设置个断点,看看是否能跑进去?因为如果你的PIT中断还没使能就进入中断,那么应该和PIT的中断无关。
    再一个,看门狗关了没有?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-30 04:20 , Processed in 0.112650 second(s), 32 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表