GD32F470怎么用滴答定时器流动点亮4个LED 灯
时间: 2024-06-12 13:06:48 浏览: 69
以下是GD32F470使用滴答定时器流动点亮4个LED灯的代码示例:
```c
#include "gd32f4xx.h"
#define LED1_PIN GPIO_PIN_0
#define LED1_PORT GPIOC
#define LED2_PIN GPIO_PIN_1
#define LED2_PORT GPIOC
#define LED3_PIN GPIO_PIN_2
#define LED3_PORT GPIOC
#define LED4_PIN GPIO_PIN_3
#define LED4_PORT GPIOC
void gpio_init(void);
void timer_init(void);
int main(void)
{
gpio_init();
timer_init();
while(1);
return 0;
}
void gpio_init(void)
{
rcu_periph_clock_enable(RCU_GPIOC);
gpio_init(LED1_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED1_PIN);
gpio_init(LED2_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED2_PIN);
gpio_init(LED3_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED3_PIN);
gpio_init(LED4_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED4_PIN);
}
void timer_init(void)
{
rcu_periph_clock_enable(RCU_TIMER6);
timer_deinit(TIMER6);
timer_parameter_struct timer_init_parameter;
timer_init_parameter.prescaler = 7199; // 72MHz / (7199 + 1) = 10KHz
timer_init_parameter.alignedmode = TIMER_COUNTER_EDGE;
timer_init_parameter.counterdirection = TIMER_COUNTER_UP;
timer_init_parameter.period = 999; // 10KHz / (999 + 1) = 10Hz
timer_init_parameter.clockdivision = TIMER_CKDIV_DIV1;
timer_init_parameter.repetitioncounter = 0;
timer_init(TIMER6, &timer_init_parameter);
timer_interrupt_enable(TIMER6, TIMER_INT_UP);
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable(TIMER6_IRQn, 0, 0);
timer_enable(TIMER6);
}
void TIMER6_IRQHandler(void)
{
if (timer_interrupt_flag_get(TIMER6, TIMER_INT_UP)) {
timer_interrupt_flag_clear(TIMER6, TIMER_INT_UP);
static uint8_t led_index = 0;
switch (led_index) {
case 0:
gpio_bit_set(LED1_PORT, LED1_PIN);
gpio_bit_reset(LED2_PORT, LED2_PIN);
gpio_bit_reset(LED3_PORT, LED3_PIN);
gpio_bit_reset(LED4_PORT, LED4_PIN);
break;
case 1:
gpio_bit_reset(LED1_PORT, LED1_PIN);
gpio_bit_set(LED2_PORT, LED2_PIN);
gpio_bit_reset(LED3_PORT, LED3_PIN);
gpio_bit_reset(LED4_PORT, LED4_PIN);
break;
case 2:
gpio_bit_reset(LED1_PORT, LED1_PIN);
gpio_bit_reset(LED2_PORT, LED2_PIN);
gpio_bit_set(LED3_PORT, LED3_PIN);
gpio_bit_reset(LED4_PORT, LED4_PIN);
break;
case 3:
gpio_bit_reset(LED1_PORT, LED1_PIN);
gpio_bit_reset(LED2_PORT, LED2_PIN);
gpio_bit_reset(LED3_PORT, LED3_PIN);
gpio_bit_set(LED4_PORT, LED4_PIN);
break;
default:
break;
}
led_index++;
if (led_index >= 4) {
led_index = 0;
}
}
}
```
该代码使用了定时器6,并以10Hz的频率触发定时器中断。在中断处理函数中,使用一个静态变量led_index表示当前点亮的LED灯,每次中断时对它进行更新,并根据其值点亮对应的LED灯。最后,将led_index加1,如果超过4则重新从0开始。这样就实现了流动点亮4个LED灯的效果。注意,需要在主函数中初始化GPIO和定时器,并在定时器中断函数中清除中断标志位。
阅读全文