关于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]

这样改动之后程序竟然正常运行了,我现在十分不理解是因为什么,希望大家能够帮我分析一下,十分感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
taizonglai
1楼-- · 2019-08-23 19:15
zhubeilife 发表于 2017-3-31 22:52
但是我基本上是按程序走了一遍,把跟systick有关的都给关了啊

你确定你全部关闭了?那下图这里你关闭了吗?
X$XFIL9JPJ$QVN@~_%`5F.png


taizonglai
2楼-- · 2019-08-23 22:30
你肯定开启了滴答定时器中断!HAL库里面会默认开启滴答定时器中断的,结果你开启了滴答定时器中断,但是滴答定时器中断服务函数Systick_Handler()被你给屏蔽掉了!
zhubeilife
3楼-- · 2019-08-24 00:18
zuozhongkai 发表于 2017-3-31 21:23
你肯定开启了滴答定时器中断!HAL库里面会默认开启滴答定时器中断的,结果你开启了滴答定时器中断,但是滴 ...

但是我基本上是按程序走了一遍,把跟systick有关的都给关了啊
shikihane
4楼-- · 2019-08-24 05:34
 精彩回答 2  元偷偷看……
zhubeilife
5楼-- · 2019-08-24 10:46
zuozhongkai 发表于 2017-4-1 10:16
你确定你全部关闭了?那下图这里你关闭了吗?

十分感谢,提醒了我,这个确实屏蔽了,但是应该是系统默认就把中断打开了,我得手动把中断这一位给置0
zhubeilife
6楼-- · 2019-08-24 13:00
shikihane 发表于 2017-4-1 09:27
HAL内部的延时也是用滴答定时器,所以他内部大概在什么地方初始化的时候,把他开了

确实是我没完全关闭,十分感谢!

一周热门 更多>