根据项目需要,把ADC的终端设置为最高,并且可以进行抢占运行;其他中断低于这个中断。因此我设置为顺序为: 1、首先设置中断控制器配置为 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 2、配置ADC的终端为最高 // 配置ADC的中断向量 NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = INT_Prio_HIGHEST;// INT_Prio_HIGHEST = 0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
3、其他的中断优先级配置低一级,如SysTick、RTC、Timer3等的中断优先级都为2 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); // 选择HCLK/8作为SysTick的时钟 SysTick_SetReload((SYSTICKCLK/OS_TICKS_PER_SEC)-1); // 设置中断时间 SysTick_CounterCmd(SysTick_Counter_Clear); // 清楚计数器 SysTick_CounterCmd(SysTick_Counter_Enable); // 使能计数器 NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, INT_Prio_MIDDLE, 0); // 设置SysTick的优先级为INT_Prio_MIDDLE SysTick_ITConfig(ENABLE); // 使能SysTick的中断
但是在程序运行后,发现程序有错,直接进入下面这段代码 HardFault_Handler PROC EXPORT HardFault_Handler [WEAK] B . <--跑这来了 ENDP
在查找问题的时候,把(1)项屏蔽后(也就是不设置中断采用抢占式),程序就可以运行起来,并且未报错。我曾经怀疑过堆栈过小,然后修改STM32F10x.s中的stack size,由原来的0x00000200改为0x00000400,但是问题依旧。 请问香主,出现这样的问题,是哪里的设置有问题会导致这样。
|