[APM32F1] Systick外设初始化函数为什么没有在库文件中?

[复制链接]
 楼主| 发光的梦 发表于 2025-5-13 17:55 | 显示全部楼层 |阅读模式
Systick外设初始化函数为什么没有在库文件中?

在浏览APM32F103的SDK库(版本V1.8)时,看到在Examples文件夹里有systick实现案例。只是一个普通的定时器而已,还专门列出来了一个Case,是不是小题大做?我在详细了解systick外设后,认为简单的systick并不简单!

为什么说systick简单?
在APM32F103的示例里面,systick的示例程序只有几行:

  1. int main(void)
  2. {
  3.     APM_MINI_LEDInit(LED2);

  4.     SysTick_Config(SystemCoreClock / 1000);

  5.     while(1)
  6.     {
  7.         APM_MINI_LEDToggle(LED2);

  8.         Delay();
  9.     }
  10. }
准确的说,systick的示例程序只有一行!简单不?
systick也不简单
从定义范围来讲,systick的功能并不是由厂商设计实现的,而是ARM公司的Cortex-M3内核中规范要求的。理论上,每一颗基于Cortex-M3内核的MCU一定会带有Systick功能外设。咱们的APM32F103也不例外!
也正是由于其由内核负责,APM32F103的驱动库并没有它的身影。其它,在APM32F103的技术手册中也没有谈及到它。
systick的实现函数SysTick_Config()在哪里呢?其在core_m3.h文件第1830行中。源代码如下:
  1. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
  2. {
  3.   if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  4.   {
  5.     return (1UL);                                                   /* Reload value impossible */
  6.   }

  7.   SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  8.   NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  9.   SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  10.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
  11.                    SysTick_CTRL_TICKINT_Msk   |
  12.                    SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  13.   return (0UL);                                                     /* Function successful */
  14. }
我们来看看这个在头文件里面的函数。
  • 第3行,systick为24位计数器,所以配置值不能大于24bit长度
  • 第8行,配置tick的值与常规的Timer的计数值相同。注意函数中已减1处理了,所以我们在传参时,无需减1;
  • 第9行,配置systick中断的优先级最低;
  • 第10行,使能中断,使能systick


配置完成了,此时,systick已经运行,并在计数归零后进入到systick_handler的中断函数中。




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

本版积分规则

2

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

2

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部