实验目的:
使用系统定时器(systick定时器)点灯
实验代码:
(1)延时函数
1 //不带中断进行精确延时 2 3 //全局变量 4 static u8 fac_us;//us级基数 --0~255 5 static u16 fac_ms;//ms级基数 --0~65536 6 7 8 //延时函数初始化 9 void delay_init(void) 10 { 11 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//9MHz 12 //SysTick->CTRL &= 0xfffffffb;--misc.c-199选择HCLK/8作为systick时钟 13 14 fac_us =SystemCoreClock/8000000;//9 15 fac_ms =(u16)fac_us*1000; 16 } 17 18 //us 19 void delay_us(u32 nus)//nus--2^24/9 20 { 21 u32 time; 22 SysTick->CTRL = 0x00; //关闭SysTick定时器 23 SysTick->LOAD =nus*fac_us;//加载时间 24 SysTick->VAL =0x00; //清空计数器 25 26 //SysTick->CTRL |=0x01;//开定时器 27 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//使能定时器 28 29 do 30 { 31 time =SysTick->CTRL; 32 33 }while(time&0x01 && !(time&(1<<16)));//等待时间到达 34 35 SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;//失能定时器 36 SysTick->VAL =0x00;//清空计数器 37 38 } 39 40 //ms 41 void delay_us(u16 nms)//nms<=2^24/9000=1864 42 { 43 u32 time; 44 SysTick->CTRL = 0x00; //关闭SysTick定时器 45 SysTick->LOAD =(u32)nms*fac_ms;//加载时间 46 SysTick->VAL =0x00; //清空计数器 47 48 //SysTick->CTRL |=0x01;//开定时器 49 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//使能定时器 50 51 do 52 { 53 time =SysTick->CTRL; 54 55 }while(time&0x01 && !(time&(1<<16)));//等待时间到达 56 57 SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;//失能定时器 58 //SysTick->CTRL = 0x00; //关闭SysTick定时器 59 SysTick->VAL =0x00;//清空计数器 60 61 }
(2)main函数
int main(void) { LED_INIT(); delay_init(); GPIOA->BRR |=1<<8; //点亮led //写1 reset GPIOA->BSRR |=1<<8;//关闭led //写1,set GPIOD->BRR |=1<<2; //点亮led //写1 reset GPIOD->BSRR |=1<<2;//关闭led //写1,set while(1) { GPIOA->ODR ^= GPIO_Pin_8; //LED_Toggle GPIOD->ODR ^= GPIO_Pin_2; delay_ms(500); } }