本帖最后由 zhubeilife 于 2017-3-31 20:20 编辑
最近在通过Mini的板子学习HAL库,想着把原子429上delay等库移植过来,但是发现了一个问题一直没想明白。
首先我是使用CubeMx生成的系统配置,然后初始化时钟什么的都没问题。
因为CubeMX生成的是利用systick的中断来实现延时,原子的在没有os的情况下是没有利用中断的,所以我就把原来系统初始化中的与systick先关的代码都注释掉了:
[mw_shl_code=c,true]/* Use systick as time base source and configure 1ms tick (default clock after Reset is MSI) */
HAL_InitTick(TICK_INT_PRIORITY);[/mw_shl_code]
[mw_shl_code=c,true]/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);[/mw_shl_code]
并且把中断服务cubemx生成的中断服务程序给注释掉了
[mw_shl_code=c,true]void SysTick_Handler(void)
{
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
}[/mw_shl_code]
然后按原子的程序进行初始化,配置完成之后运行发现程序只要进入delay就会调到下面这段代码,即Default_Handler.
[mw_shl_code=c,true]/**
* @brief This is the code that gets called when the processor receives an
* unexpected interrupt. This simply enters an infinite loop, preserving
* the system state for examination by a debugger.
*
* @param None
* @retval : None
*/
.section .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
b Infinite_Loop
.size Default_Handler, .-Default_Handler[/mw_shl_code]
然后我按照这个函数的意思,明白是说有一个中断无法响应,然后我试着把屏蔽到的中断服务程序给恢复了,但是是个空函数不执行任何内容,就是下面这样。
[mw_shl_code=c,true]void SysTick_Handler(void)
{
}[/mw_shl_code]
这样改动之后程序竟然正常运行了,我现在十分不理解是因为什么,希望大家能够帮我分析一下,十分感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
但是我基本上是按程序走了一遍,把跟systick有关的都给关了啊
一周热门 更多>