|
本代碼使用系統(tǒng)時(shí)鐘SysTick進(jìn)行設(shè)計(jì),騰出用TIM寫延時(shí)函數(shù)占用的時(shí)鐘。
Delay.c
- void Delay_Init(void)
- {
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //選擇外部時(shí)鐘
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
- }
- //微秒延時(shí)
- void Delay_us(u16 n)
- {
- u32 temp;
- SysTick->LOAD = n * 9; //時(shí)間加載
- SysTick->VAL = 0x00; //清空計(jì)數(shù)器
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //開始倒數(shù)
- do
- {
- temp = SysTick->CTRL;
- } while ((temp & 0x01) && !(temp & (1 << 16))); //等待時(shí)間到達(dá)
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關(guān)閉計(jì)數(shù)器
- SysTick->VAL = 0X00; //清空計(jì)數(shù)器
- }
- //毫秒延時(shí)
- void Delay_ms(u16 n)
- {
- u32 temp;
- SysTick->LOAD = (u32)n * 9000; //時(shí)間加載
- SysTick->VAL = 0x00; //清空計(jì)數(shù)器
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //開始倒數(shù)
- do
- {
- temp = SysTick->CTRL;
- } while ((temp & 0x01) && !(temp & (1 << 16))); //等待時(shí)間到達(dá)
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關(guān)閉計(jì)數(shù)器
- SysTick->VAL = 0X00; //清空計(jì)數(shù)器
- }
- //秒延時(shí)
- void Delay_s(u16 n)
- {
- for (u16 x = 0; x < n; x++)
- {
- u32 temp;
- SysTick->LOAD = 9000000; //時(shí)間加載
- SysTick->VAL = 0x00; //清空計(jì)數(shù)器
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //開始倒數(shù)
- do
- {
- temp = SysTick->CTRL;
- } while ((temp & 0x01) && !(temp & (1 << 16))); //等待時(shí)間到達(dá)
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關(guān)閉計(jì)數(shù)器
- SysTick->VAL = 0X00; //清空計(jì)數(shù)器
- }
- }
復(fù)制代碼
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
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|