萌新的STM32學習-9
我們在使用某個外設,必須線使能該外設時鐘
SYSTEM 文件夾里面的代碼由正點原子提供,是 STM32F1xx 系列的底層核心驅動函數,
可以用在 STM32F1xx 系列的各個型號上面,方便大家快速構建自己的工程。本章,我們將向大
家介紹這些代碼的由來及其功能,也希望大家可以靈活使用 SYSTEM 文件夾提供的函數,來快
速構建工程,并實際應用到自己的項目中去。
SYSTEM 文件夾下包含了 delay、sys、usart 等三個文件夾。分別包含了 delay.c、sys.c、usart.c
及其頭文件。這 3 個 c 文件提供了系統時鐘設置、延時和串口 1 調試功能,任何一款 STM32F1
都具備這幾個基本外設,所以可以快速地將這些設置應用到任意一款 STM32F1 產品上,通過
這些驅動文件實現快速移植和輔助開發的效果。
12.1 deley 文件夾代碼介紹
12.2 sys 文件夾代碼介紹
12.3 usart 文件夾代碼介紹
delay 文件夾內包含了 delay.c 和 delay.h 兩個文件,這兩個文件用來實現系統的延時功能,
其中包含 7 個函數:
void delay_osschedlock(void);
void delay_osschedunlock(void);
void delay_ostimedly(uint32_t ticks);
void SysTick_Handler(void);
void delay_init(uint16_t sysclk);
void delay_us(uint32_t nus);
void delay_ms(uint16_t nms);
前面 4 個函數,僅在支持操作系統(OS)的時候,需要用到,而后面 3 個函數,則不論是
否支持 OS 都需要用到。
void delay_init(uint16_t sysclk);
初始化系統滴答定時器
void delay_us(uint32_t nus);
用系統滴答定時器實現微妙延時
void delay_ms(uint16_t nms);
用微妙延時函數實現毫秒延時
CM3 內核處理器,內部包
含了一個 SysTick 定時器,SysTick 是一個 24 位的向下遞減的計數定時器,當計數值減到 0 時,
將從 RELOAD 寄存器中自動重裝載定時初值,開始新一輪計數。只要不把它在 SysTick 控制及
狀態寄存器中的使能位清除,就永不停息
CLKSOURCE 可以通過 0 1 來選擇是幾分頻 比如說 0 就是選擇8分頻 1就是選擇 1分頻
/**
- @brief 初始化延遲函數
- @param sysclk: 系統時鐘頻率, 即 CPU 頻率(HCLK)
- @retval 無
/
void delay_init(uint16_t sysclk)
{
#if SYS_SUPPORT_OS / 如果需要支持 OS. /
uint32_t reload;
#endif
SysTick->CTRL = 0; /清 Systick 狀態,以便下一步重設,如果這里開了中斷會關閉其中斷/
/ SYSTICK 使用內核時鐘源 8 分頻,因 systick 的計數器最大值只有 2^24 /
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
g_fac_us = sysclk / 8; / 不論是否使用 OS,g_fac_us 都需要使用,作為 1us 的基礎時基 /
#if SYS_SUPPORT_OS / 如果需要支持 OS. /
reload = sysclk / 8; / 每秒鐘的計數次數 單位為 M /
reload = 1000000/delay_ostickspersec;/ 根據 delay_ostickspersec 設定溢出時間/
g_fac_ms = 1000 / delay_ostickspersec;/* 代表 OS 可以延時的最少單位 /
SysTick->CTRL |= 1 << 1; / 開啟 SYSTICK 中斷 /
SysTick->LOAD = reload; / 每 1/delay_ostickspersec 秒中斷一次 /
SysTick->CTRL |= 1 << 0; / 開啟 SYSTICK */
#endif
}
下面對這句話進行簡單的理解和分析
g_fac_us = sysclk / 8; /* 不論是否使用 OS,g_fac_us 都需要使用,作為 1us 的基礎時基 */
假設滴答計數器的計數頻率是1M 1000000 那么每數一次 就是1/1000000 對于我們F1 系列來說就是72MHz 8分頻 滴答計數器真正的計數頻率是9M 而我們1M 得到1微妙是1/1000000 而在9M的情況下 就需要9/9000000 那么這個9哪里來 本來都是?/9000000 那么想要得到? 就需要我們把這個數據截取出來用 72/8=9 得到
500ms延時正確