打印
[应用相关]

STM32CubeMX自动生成SYSTICK配置

[复制链接]
680|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rzjvv|  楼主 | 2022-2-28 16:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.SYSTICK原理及其寄存器

   1.1  SYSTICK原理

SysTick 是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,且同时触发中断。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基,产生一个周期性的中断。

1.2SYSTICK寄存器

  CTRL: Systick控制和状态寄存器
  LOAD: Systick重装载寄存器
  VAL: Systick当前值寄存器
  CALIB: Systick校准值寄存器  




使用特权

评论回复
沙发
rzjvv|  楼主 | 2022-2-28 16:38 | 只看该作者
CLKCOURCE-时钟源  0:外部时钟源HCLK(AHB总线时钟)/8 72M/8 = 9M  1:内核时钟(HCLK) 72M

使用特权

评论回复
板凳
rzjvv|  楼主 | 2022-2-28 16:39 | 只看该作者

使用特权

评论回复
地板
rzjvv|  楼主 | 2022-2-28 17:03 | 只看该作者
   CURRENT: 每经过一个Systick时钟周期,寄存器值-1 。


使用特权

评论回复
5
rzjvv|  楼主 | 2022-2-28 21:46 | 只看该作者
2.STM32CubeMX配置与代码生成

如下图STM32CubeMX配置所示,图中To Cortex System timer(MHz)就是Systick的时钟频率。

使用特权

评论回复
6
rzjvv|  楼主 | 2022-2-28 22:01 | 只看该作者
自动代码生成如下:

    /**Configure the Systick interrupt time */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/8000);   //  = /8/1000 :1000 is 1ms ;1000000 is 1us

    /**Configure the Systick */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

使用特权

评论回复
7
rzjvv|  楼主 | 2022-2-28 22:13 | 只看该作者
3.相关重要的函数

  3.1中断处理函数

void SysTick_Handler(void)
{undefined
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  HAL_SYSTICK_IRQHandler();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

__IO uint32_t uwTick;

__weak void HAL_IncTick(void)
{undefined
  uwTick += uwTickFreq;
}

每次SysTick异常中断后,会执行SysTick_Handler() 函数,然后HAL_IncTick()函数。由于uwTick是                                               无符号32位整型数,所以根据C语言的定义,当累计到0xFFFFFFFF后,再加1等于0。

使用特权

评论回复
8
rzjvv|  楼主 | 2022-2-28 22:15 | 只看该作者
3.2 延时函数

__weak void HAL_Delay(uint32_t Delay)
{undefined
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {undefined
    wait += (uint32_t)(uwTickFreq);
  }

  while ((HAL_GetTick() - tickstart) < wait)
  {undefined
  }
}

__weak uint32_t HAL_GetTick(void)
{undefined
  return uwTick;
}

由于tickstart和HAL_GetTick()的返回值都是无符号32位整型,所以HAL_GetTick() - tickstart                                                  =HAL_GetTick() + (~ tickstart) ,如果tickstart > HAL_GetTick(),也可以计算出两者之间正确的差值。

使用特权

评论回复
9
rzjvv|  楼主 | 2022-2-28 22:18 | 只看该作者
本帖最后由 rzjvv 于 2022-2-28 22:28 编辑

4.注意事项

1.Systick的中断函数一定要在STM32CubeMX中设置自动生成出来;

2.由于Systick中断每次累加值uwTickFreq是在stm32f1xx_hal.c定义,且默认是1U(以1kHz为默认频率)。而Systick配置函数是在stm32f1xx_hal_cortex.c和core_cm3.h定义,各自完全独立。因此,如果Systck配置频率不是1kHz时,需要利用stm32f1xx_hal.c的HAL_SetTickFreq()函数重新配置累计值uwTickFreq;

3.当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。



使用特权

评论回复
10
Pulitzer| | 2023-9-24 11:54 | 只看该作者

---------------------------
wpsoffice
---------------------------
对话框打开时命令无法执行。单击“确定”,然后关闭对话框再试。
---------------------------
确定   
---------------------------

使用特权

评论回复
11
童雨竹| | 2023-9-25 07:09 | 只看该作者

但是,由于变压器存在漏感,

使用特权

评论回复
12
Wordsworth| | 2023-9-25 08:12 | 只看该作者

在此情况下我们通常会用电阻串联在电路中

使用特权

评论回复
13
Clyde011| | 2023-9-25 09:15 | 只看该作者

缩合型灌封硅胶由于固化过程有体积收缩一般不使用在模块电源的灌封中

使用特权

评论回复
14
万图| | 2023-9-25 11:11 | 只看该作者

设备中的ESD静电阻抗器一般都不易老化损坏

使用特权

评论回复
15
Uriah| | 2023-9-25 12:14 | 只看该作者

通过将各类分立元器件进行整合和封装,模块电源能够实现以最小的体积来实现功率密度更高的效果。

使用特权

评论回复
16
帛灿灿| | 2023-9-25 14:10 | 只看该作者

可对电路进行一个防护效果

使用特权

评论回复
17
Bblythe| | 2023-9-25 15:13 | 只看该作者

以保护器件免受ESD的损坏

使用特权

评论回复
18
周半梅| | 2023-9-25 17:09 | 只看该作者

不会达到该电压

使用特权

评论回复
19
周半梅| | 2023-9-25 19:15 | 只看该作者

如果防护与热设计欠佳

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

204

帖子

1

粉丝