1回答

0收藏

[原创] GDF207ZE学习记录2.SystemTick定时器的学习

GD32 GD32 3199 人阅读 | 1 人回复 | 2016-01-09

本帖最后由 杉树林-罗 于 2016-1-9 23:43 编辑

基础的LED点灯过后,如何做到精确的延时成为了一个很必要的目标。参考多数STM32的教程,特别是仿照正点原子的例程,移植出了GDF2开发板的 delay 函数。

与主流的STM32F1开发板不同的地方在于,此次GD32使用了 25MHZ 的外部晶振,因此通过倍频后可以得到内部 120MHZ 的最高时钟频率。时间树在DATASHEET里描述如下:

由图可见 SystemTick 的频率来自 AHB 八分频,为15MHZ。

在 system_gd32f20x.c 文件里定义了AHB 时钟线使用的频率:


初始化工作如下:


SYSTICK_CKSOURCE_HCLK_DIV8 在 misc.h 文件中定义,其值为 ((uint32_t)0xFFFFFFFB),代表时能SystemTick定时器,倒数为零时产生异常,使用外部时钟源。fac_ms 为计数的基准,可以理解为积累有多少个 SystemTick 时钟周期才达到1us. fac_ms自然为其 1000 倍。

延时函数如下:


原子的程序还是相当好理解的。

最后,对于光盘附带的例程表示十分不解:


这个函数是怎么实现 1ms 的延时的?



分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

wambob

发表于 2016-1-10 13:21:47 | 只看该作者

光盘里的延时函数,首先配置了1ms的中断
  1. void SysTick_Configuration(void)
  2. {   
  3.     /* Setup SysTick Timer for 1000Hz interrupts */
  4.     if (SysTick_Config(SystemCoreClock / 1000))
  5.     {
  6.         /* Capture error */
  7.         while (1);
  8.     }
  9.     /* Configure the SysTick handler priority */
  10.     NVIC_SetPriority(SysTick_IRQn, 0x00);
  11. }
复制代码
然后封装了计数自减函数
  1. void TimingDelay_Decrement(void)
  2. {
  3.     if (TimingDelay != 0x00)
  4.     {
  5.         TimingDelay--;
  6.     }
  7. }
复制代码
使用的时候需要在中断里调用计数自减函数
  1. void SysTick_Handler(void)
  2. {
  3.     LED_Spark();
  4.     TimingDelay_Decrement();
  5. }
复制代码
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条