• 滴答定时器


    1.定时与计数的本质 

    2.滴答定时器的原理

    1.向下计数,24位的计数器。滴答定时器属于内核。

    每来一个脉冲计数值减一。当为零时。继续把重载寄存器给计数值。然后每来一个脉冲减一。

    可以不停重复次操作。

     

    控制寄存器:时钟的选择(bit2),是否开启中断(bit1),滴答定时器是否使能(bit0)

    COUNTFLG(bit16)当计数值为0改为为1,当重新把重载寄存器给计数器。改为为0。

    3.代码实现

    systick.h

    1. #ifndef SYSTICK_H
    2. #define SYSTICK_H
    3. #include
    4. /* configure systick */
    5. void systick_config(void);
    6. /* delay a time in milliseconds */
    7. void inter_1ms(uint32_t count);
    8. /* delay decrement */
    9. void delay_decrement(void);
    10. #endif /* SYSTICK_H */

    systick.c

    1. #include "gd32f10x.h"
    2. #include "systick.h"
    3. #include "LED.h"
    4. volatile static uint32_t delay_reload;
    5. volatile static uint32_t delay_value;
    6. /*!
    7. \brief configure systick
    8. \param[in] none
    9. \param[out] none
    10. \retval none
    11. */
    12. void systick_config(void)
    13. {
    14. /* setup systick timer for 1000Hz interrupts */
    15. if (SysTick_Config(SystemCoreClock / 1000U)){
    16. /* capture error */
    17. while (1){
    18. }
    19. }
    20. /* configure the systick handler priority */
    21. NVIC_SetPriority(SysTick_IRQn, 0x00U);
    22. }
    23. /*!
    24. \brief delay a time in milliseconds
    25. \param[in] count: count in milliseconds
    26. \param[out] none
    27. \retval none
    28. */
    29. void inter_1ms(uint32_t count)
    30. {
    31. delay_reload = count;
    32. delay_value = delay_reload;
    33. }
    34. /*!
    35. \brief delay decrement
    36. \param[in] none
    37. \param[out] none
    38. \retval none
    39. */
    40. void delay_decrement(void)
    41. {
    42. if (0U != delay_value){
    43. delay_value--;
    44. }else{
    45. LED1_Toggle();
    46. LED2_Toggle();
    47. delay_value = delay_reload;
    48. }
    49. }
    50. void SysTick_Handler(void)
    51. {
    52. delay_decrement();
    53. }

    SysTick_Config函数是在core_cm3.h里

    1. */
    2. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
    3. {
    4. if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* 重载值不是大于2的24次方 */
    5. SysTick->LOAD = ticks - 1; /* 设置重载值 */
    6. NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
    7. SysTick->VAL = 0; /* 清零计数值 */
    8. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | /* 滴答定时器时钟 */
    9. SysTick_CTRL_TICKINT_Msk | /* 开启中断 */
    10. SysTick_CTRL_ENABLE_Msk; /* 使能定时器 */
    11. return (0); /* Function successful */
    12. }

    重载值是根据定时的时间来的:

    每一次计数值减一是:1 / SystemCoreClock(频率)秒   转成毫秒:1000/SystemCoreClock.

    这时计数值*1000/SystemCoreClock时间。因为计数值是重载值赋值的。

    所以重载值*1000/SystemCoreClock 而重载值 SystemCoreClock / 1000 (SysTick_Config调用传递的)

    两个相乘就是1ms。每一毫秒计数值为0.然后重载值又给计数值这样循环往复。

    main.c 

    1. #include "LED.h"
    2. #include "systick.h"
    3. int main(){
    4. LED_Init();
    5. systick_config();
    6. inter_1ms(1000);
    7. while(1){
    8. ;
    9. }
    10. }

  • 相关阅读:
    Qt: windows下关闭系统窗体
    北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊原理(一):以太坊概述、账户、状态树、交易树和收据树
    MindSpore社区与北大BIOPIC联合发布蛋白质多序列比对开源数据集
    AcWing第126场周赛 - 思维+字符串处理+递归
    python数字
    多种方式解决交叉编译中glibc版本不兼容导致的编译问题(libc.so.6: version `GLIBC_xxx‘ not found问题)
    基于PaddlePaddle训练中文标点符号模型
    435-C++基础语法(61-70)
    Python3中map()、reduce()、filter()的用法
    MCollections——15
  • 原文地址:https://blog.csdn.net/qq_41328470/article/details/133443497