[GD32F310评测]中断测试和GPIO使用
[复制链接]
在本节我们将就上一次实现的按键功能进行改进,并提供一个按键响应函数,目前只是实现一个呼吸灯点亮和熄灭的切换功能,在之后将会起到其他的作用。
本节最核心的目标在于分析GD32芯片的中断机制,GPIO的使用和寄存器分析,并将代码进行整理。
中断配置
中断的设置对应使用指南的3.10节。301这款芯片能够支持24个独立配置的中断。其中给出了中断配置的函数概要,编程测或过程中可以通过查阅此手册来确定函数的调用。
但是在具体应用中需要关注用户手册中6.3节中的中断向量表。在本项目中采用的中断配置和端口配置函数如下:
void peripheral_init()
{
// RCU:
rcu_periph_clock_enable(RCU_GPIOA); // GPIO A
rcu_periph_clock_enable(RCU_CFGCMP); // CFGCMP clock
// System tick
systick_config();
// GPIO config
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_0); // Input Key
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1); // Output Key
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_1);
gpio_bit_reset(GPIOA, GPIO_PIN_1);
// NVIC
nvic_irq_enable(EXTI0_1_IRQn, 2U, 0U); // GPIO A0 -> EXTI 0
syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0); // GPIO A0 Interrupt enable
exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_0);
}
接下来我们要在主函数中实现一个非常简单粗暴的PWM灯光渐变,这个例程将会一直保持到后面的各个例程中,作为判定是否出现系统死机的直观判定。
主循环中的PWM呼吸灯
下面给出PWM灯的主要逻辑
static uint8_t pwmset;
static uint16_t time;
static uint8_t timeflag;
static uint8_t timecount;
static uint32_t tick_old;
if ((tick - tick_old >= 1)) // 减少不要的循环
{
tick_old = tick;
if (timeflag == 0)
{
time++;
if (time >= 1600) timeflag = 1;
}
else
{
time--;
if (time == 0) timeflag = 0;
}
// duty
pwmset = time / 80;
// generate PWM which width is 20ms
if (timecount > 20) timecount = 0;
else timecount++;
if (timecount >= pwmset) gpio_bit_set(GPIOA, GPIO_PIN_1);
else gpio_bit_reset(GPIOA, GPIO_PIN_1);
}
以上这段代码需要在主循环中调用。接下来定义系统滴答时钟,在文件gd32f3x0_it.c 中定义
uint32_t tick = 0;
void SysTick_Handler(void)
{
delay_decrement();
tick += 1;
}
在main.c 中需要给出外部变量的声明
extern uint32_t tick;
|