1、前言
官方的demo用的阻塞方式点灯,即就是死等,在等待期间mcu干不了其他事情(中断除外),这种方式不太友好,本文使用非阻塞方式点灯。
2、硬件连接
3、思路
利用定时器中断,每1ms中断一次,整个系统维护一个tick计数;
记录某一时刻的tick,用A表示,再获取当前的tick,用B表示,如果当前的B-A大于等于500(这里500ms闪烁一次),那么就执行一次led翻转,同时也更新A的值。
4、软件实现
(1)利用定时器中断,每1ms中断一次,整个系统维护一个tick计数
代码语言:javascript复制static uint32_t SystemTick=0;
void Timer1Config(void)
{
nvic_irq_enable(TIMER1_IRQn, 0);
timer_parameter_struct timer_initpara;
/* enable the peripherals clock */
rcu_periph_clock_enable(RCU_TIMER1);
/* deinit a TIMER */
timer_deinit(TIMER1);
/* initialize TIMER init parameter struct */
timer_struct_para_init(&timer_initpara);
/* TIMER2 configuration */
timer_initpara.prescaler = 63;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = 999;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_init(TIMER1, &timer_initpara);
/* clear channel 0 interrupt bit */
timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
/* enable the TIMER interrupt */
timer_interrupt_enable(TIMER1, TIMER_INT_UP);
/* enable a TIMER */
timer_enable(TIMER1);
}
代码语言:javascript复制void TIMER1_IRQHandler(void)
{
if(SET == timer_interrupt_flag_get(TIMER1, TIMER_INT_UP))
{
timer_interrupt_flag_clear(TIMER1, TIMER_INT_UP);
SystemTick ;
}
}
代码语言:javascript复制uint32_t SystemGetTick(void)
{
return SystemTick;
}
(2)LED翻转
代码语言:javascript复制void LedInit(void)
{
/* enable the LED GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOC);
/* configure LED GPIO pin */
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7 | GPIO_PIN_8);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8);
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6 | GPIO_PIN_7);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
/* reset LED GPIO pin */
gpio_bit_reset(GPIOA, GPIO_PIN_7 | GPIO_PIN_8);
gpio_bit_reset(GPIOC, GPIO_PIN_6 | GPIO_PIN_7);
}
代码语言:javascript复制void SystemRun(void)
{
static uint32_t tick=0;
if(SystemGetTick()-tick>500)
{
tick=SystemGetTick();
gpio_bit_toggle(GPIOA, GPIO_PIN_7 | GPIO_PIN_8);
gpio_bit_toggle(GPIOC, GPIO_PIN_6 | GPIO_PIN_7);
}
}
(3)主函数轮询
代码语言:javascript复制int main(void)
{
Timer1Config();
LedInit();
while(1)
{
SystemRun();
}
}
5、现象