主要以LED闪灯为例:实现500msLED状态变化一次
方式一:
rcu_periph_clock_enable(RCU_GPIOE);
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_2);
(void)gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
(void)gpio_bit_reset(GPIOE, GPIO_PIN_2);
while(1)
{
gpio_bit_set(GPIOE, GPIO_PIN_2);//点亮LED
delay_1ms(500);//运行等待500ms
gpio_bit_reset(GPIOE, GPIO_PIN_2);//LED灭
delay_1ms(500);//运行等待500ms
}
方式二:
//获取系统时钟。系统滴答定时器每1ms触发一次中断,并使用g_systick进行记录。
uint32_t timer_get_system_ms(void)
{
return g_systick;
}
//初始化LED
void led_init(void)
{
rcu_periph_clock_enable(RCU_GPIOE);
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_2);
(void)gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
(void)gpio_bit_reset(GPIOE, GPIO_PIN_2);
}
//LED周期闪烁
/*在时间未达到500ms的时候CPU可以去执行其他的命令,不需要一直等待500ms,可以解放CPU*/
void led_process(void)
{
static uint32_t s_led_delay_time=0;
if(timer_get_system_ms() - s_led_delay_time > 500)
{ //当前的系统时间距离上一次LED状态变化的时间是否达到500ms
if(gpio_output_bit_get(GPIOE, GPIO_PIN_2) == RESET)
{
gpio_bit_set(GPIOE, GPIO_PIN_2);
}
else
{
(void)gpio_bit_reset(GPIOE, GPIO_PIN_2);
}
s_led_delay_time = timer_get_system_ms();//更新当前的系统时间
}
}
int main(void)
{
systick_config();
led_init();
while(1)
{
led_process();
}
return 0;
}
使用方式二的优势在于在时间未达到500ms的时候CPU可以去执行其他的命令,不需要一直等待500ms,可以解放CPU。