关于Systick进行延时的疑惑

2019-08-23 14:36发布

本帖最后由 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]

这样改动之后程序竟然正常运行了,我现在十分不理解是因为什么,希望大家能够帮我分析一下,十分感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。