编写测试程序有时会用到延时函数,下面使用systick定时器做延时测试。
一、systick时钟框图
二、程序
2.1、初始化
void delay_init()
{
fac_us=CLOCK_SYS_FREQ/8000000;
fac_ms=(uint16_t)fac_us*1000;
}
2.2、延时函数
void delay_us(uint32_t nus)
{
uint32_t temp;
SysTick->LOAD=nus*fac_us;
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(uint16_t nms)
{
uint32_t temp;
SysTick->LOAD=(uint32_t)nms*fac_ms;
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;
}
2.3、主程序
int main(void)
{
BOARD_Init();
delay_init();
init_led();
init_key();
printf("\r\nled test.\r\n");
while(1)
{
GPIO_WriteBit(BOARD_LED0_GPIO_PORT, BOARD_LED0_GPIO_PIN, 1u);
delay_ms(1);
GPIO_WriteBit(BOARD_LED0_GPIO_PORT, BOARD_LED0_GPIO_PIN, 0u);
delay_ms(1);
}
}
三、程序测试
LED4指示灯电平输出,1ms间隔翻转。
输出电平波形: