>[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文件,如圖所示。

###
hal\_system將會主要用于存放系統相關的內容,筆者把延時API也歸為此類。
<br/>
打開本節課配套的工程,筆者把hal\_system.c以及標準庫文件stm32f0xx\_syscfg.c、stm32f0xx_misc.c添加進工程了,如圖所示。

<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/)

(非商務合作**勿擾**,此處**非**技術支持)
- 課程介紹
- 配套資源下載
- 配套開發套件簡介
- 簡介
- 硬件組成 & 技術參數
- 電路原理圖 & 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. 數據通信任務說明
- 版權聲明與免責聲明