>[success] **技术支持说明**
> 1.**客服**提供简单的技术支持,一般自主学习为主
> 2.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/nb-iot)
> 3.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解!
<br/>
## **概述**
  上节课讲解了闪烁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/7b/de/7bde385ae21db2fcd0c76ece009bc518_261x383.png =300x)
###
hal\_system将会主要用于存放系统相关的内容,笔者把延时API也归为此类。
<br/>
打开本节课配套的工程,笔者把hal\_system.c以及标准库文件stm32f0xx\_syscfg.c、stm32f0xx_misc.c添加进工程了,如图所示。
![](https://img.kancloud.cn/de/b5/deb53f7d8a2a34fad12eb5e2368d4eaa_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;
}
```
###
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/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =150x)
(非商务合作**勿扰**,此处**非**技术支持)
- 课程介绍
- 配套资源下载
- 配套开发套件简介
- 简介
- 硬件组成 & 技术参数
- 电路原理图 & PCB图
- 拨码开关使用说明
- 第一部分:无线通信 开发指南
- 1.1.1 NB-IoT:技术简介
- 1.1.2 NB:CH34x USB转串口驱动安装
- 1.1.3 NB:AT 指令开发与测试
- 1.1.4 NB:基础指令集简介
- 1.1.5 NB:云端服务器
- 1.1.5.1 PuTTY 简介与安装
- 1.1.5.2 登录云端服务器
- 1.1.6 NB:移远官方工具简介
- 1.1.7 NB:使用UDP协议与云端服务器通信
- 1.1.8 NB:使用TCP协议与云端服务器通信
- 1.1.9 NB:使用MQTT协议与云端服务器通信
- 进阶课程
- 第二部分:STM32 开发指南
- 2.1 搭建开发环境
- 2.1.1 Keil MDK 简介与安装
- 2.1.2 STM32 Pack 简介与安装
- 2.1.3 CH34x 驱动简介与安装
- 2.1.4 其他开发工具
- 2.2 STM32 开发基础
- 2.2.1 新建工程
- 2.2.2 实现第1个程序
- 2.2.3 Hex 文件烧录详解
- 2.3 移植官方标准工程模板
- 2.4 GPIO实验——LED灯
- 2.5 系统延时应用
- 2.6 GPIO实验——按键
- 2.7 GPIO中断实验——按键触发
- 2.8 使用定时器TIM3
- 2.9 串口通信实验
- 2.10 ADC 实验
- 2.11 OLED显示器实验
- 2.12 SDK 设计思想
- 2.13 SDK 架构解析
- 2.14 多任务应用
- 2.15 输入型任务:按键输入
- 2.16 输入型任务:串口接收
- 课外篇:项目实战
- 基于STM32+NB-IoT的温湿度采集
- 系统简介
- 系统搭建
- 系统详解
- 1.代码编译与架构说明
- 2.DHT11温湿度传感器
- 3. 数据通信任务说明
- 版权声明与免责声明