|
本代碼使用系統時鐘SysTick進行設計,騰出用TIM寫延時函數占用的時鐘。
Delay.c
- void Delay_Init(void)
- {
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //選擇外部時鐘
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
- }
- //微秒延時
- void Delay_us(u16 n)
- {
- u32 temp;
- SysTick->LOAD = n * 9; //時間加載
- SysTick->VAL = 0x00; //清空計數器
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //開始倒數
- do
- {
- temp = SysTick->CTRL;
- } while ((temp & 0x01) && !(temp & (1 << 16))); //等待時間到達
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關閉計數器
- SysTick->VAL = 0X00; //清空計數器
- }
- //毫秒延時
- void Delay_ms(u16 n)
- {
- u32 temp;
- SysTick->LOAD = (u32)n * 9000; //時間加載
- SysTick->VAL = 0x00; //清空計數器
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //開始倒數
- do
- {
- temp = SysTick->CTRL;
- } while ((temp & 0x01) && !(temp & (1 << 16))); //等待時間到達
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關閉計數器
- SysTick->VAL = 0X00; //清空計數器
- }
- //秒延時
- void Delay_s(u16 n)
- {
- for (u16 x = 0; x < n; x++)
- {
- u32 temp;
- SysTick->LOAD = 9000000; //時間加載
- SysTick->VAL = 0x00; //清空計數器
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //開始倒數
- do
- {
- temp = SysTick->CTRL;
- } while ((temp & 0x01) && !(temp & (1 << 16))); //等待時間到達
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關閉計數器
- SysTick->VAL = 0X00; //清空計數器
- }
- }
復制代碼
Delay.h
- #ifndef __DELAY_H
- #define __DELAY_H
- extern void Delay_Init(void);
- extern void Delay_ms(u16 n);
- extern void Delay_us(u16 n);
- extern void Delay_s(u16 n);
- #endif
復制代碼
|
評分
-
查看全部評分
|