查看: 2660|回复: 1

[项目] GDF207ZE学习记录2.SystemTick定时器的学习

[复制链接]
  • TA的每日心情
    慵懒
    2021-1-16 10:58
  • 签到天数: 602 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2016-1-9 23:43:41 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 杉树林-罗 于 2016-1-9 23:43 编辑

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

    与主流的STM32F1开发板不同的地方在于,此次GD32使用了 25MHZ 的外部晶振,因此通过倍频后可以得到内部 120MHZ 的最高时钟频率。时间树在DATASHEET里描述如下:
    屏幕截图.jpg
    由图可见 SystemTick 的频率来自 AHB 八分频,为15MHZ。

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

    初始化工作如下:
    3.jpg

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

    延时函数如下:
    4.jpg

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

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

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



    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 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. }
    复制代码
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-12-24 21:24 , Processed in 0.135144 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.