多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
>[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/nb-iot) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> ## **概述** &emsp;&emsp;上节课讲解了闪烁LED的实现,其中用到了一个for循环来实现延时,这种延迟方式有多种缺点,例如这种延时的时间并不是恒定的,即每次执行完for循环所需的时间不一定相同的。如果需要以恒定的时间间隔来闪烁LED等,那么可以借助SysTick。SysTick(System Tick Timer)是一个24位的系统节拍定时器,具有自动重载和计数溢出中断的功能。 <br/> ## **系统延时 HAL API 设计** 本节课将讲解基于STM32的SysTick来实现一个精确度为us的延时函数。 >[info] 1秒(s) = 1000毫秒(ms) = 1000000微秒(us) 笔者在本节课配套的源代码中新建了 hal\_system.h 和 hal\_system.c文件,如图所示。 ![](https://img.kancloud.cn/e7/3e/e73ecf7c170837a03f3fe25493490169_261x383.png =250x) ### hal\_system将会主要用于存放系统相关的内容,笔者把延时API也归为此类。 <br/> 打开本节课配套的工程,笔者把hal\_system.c以及标准库文件stm32f0xx\_syscfg.c、stm32f0xx_misc.c添加进工程了,如图所示。 ![](https://img.kancloud.cn/4a/ed/4aed599d6287af52724e4626937c5351_375x494.png =300x) <br/> **编写代码** hal_system.h文件的代码如下: ### ``` #ifndef __HAL_SYSTEM_H__ #define __HAL_SYSTEM_H__ void halSystemInit(void); void halSystemDelayUs(unsigned long n); #endif /* #define __HAL_SYSTEM_H__ */ ``` <br/> hal_system.c文件的代码如下: ### ``` #include "hal_system.h" #include "stm32f0xx_syscfg.h" /* * 系统初始化函数,这里暂时仅初始化SysTick */ void halSystemInit() { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); } /* * 系统延时 * * @param time - 延时时间,以微秒(us)为单位 */ void halSystemDelayUs(unsigned long time) { volatile uint32_t value; SysTick->LOAD = time * (SystemCoreClock / 8000000); SysTick->VAL = 0x00; SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; do { value = SysTick->CTRL; }while ((value & 0x01) && !(value & (1<<16))); SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->VAL = 0x00; } ``` ### >[warning] halSystemDelayUs函数的代码较为复杂,但读者暂时只需会使用此API即可。 <br/> ## **使用系统延时API** 在配套的工程中,打开main.c文件,可找到如下的系统延时API使用示例代码: ``` int main(void) { halSystemInit();//系统初始化 halLedInit();//初始化LED灯 /* Infinite loop */ while (1) { halLedToggle();//反转LED灯的状态 /* 延时1秒 */ halSystemDelayUs(1000 * 1000); } } ``` 与上节课类似,上述代码实现了闪烁LED的功能。不同的是,这里恒定以1秒为闪烁间隔。 <br/> <br/> ## **商务合作** 如有以下需求,可扫码添加管理员好友,注明“**商务合作**” * 项目定制开发,技术范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等; * 入驻平台,成为讲师; * 接项目赚外快; * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/b7/5a/b75ac8c3da945f20568771f5935c388f_430x430.png =150x) (非商务合作**勿扰**,此处**非**技术支持)