本次利用GD32L233C-START板载的四颗LED及“Wakeup”按键进行实验,通过简单的实验对GD32L233CCT6的GPIO及EXTI(外部中断资源)进行了解和学习。具体实验过程如下:
一、实验资源
1、GD32L233C-START;
2、Keil V5.36.0.0;
二、知识准备
1、GPIO
LQFP48封装的GD32L233CCT6为用户提供了高达43个GPIO接口,并且大部分IO口可容忍5V电压。IO端口具有多种可配置的输入输出功能,所有的IO端口都支持外部中断模式,当配置为外部中断模式时必须将对应的IO端口配置为输入模式;有些引脚如ADC、DAC、CMP具有附加功能,IO必须配置成模拟模式。除了通用的IO功能外还可通过配置使用IO端口的备用功能,这一点在后面的学习中会经常遇到。
2、EXTI
“EXTI”被称作中断、事件控制器,包括30个相互独立的边沿检测电路并且能够向处理器内核产生中断请求或唤醒事件。EXTI有三种触发类型:上升沿触发、下降沿触发和任意沿触发。EXTI中的每一个边沿检测电路都可以独立配置和屏蔽。这是基于Cortex-M23内部集成的嵌套式矢量型中断控制器(Nested Vectored Interrupt Controller (NVIC))来实现高效的异常和中断处理。NVIC实现了低延迟的异常和中断处理,以及电源管理控制。
三、实验内容
1、硬件资源
从上面局部电路图中可以看到板载的4颗LED(LED1、LED2、LED3、LED4)分别与GPIO端口的PA7、PA8、PC6、PC7相连接,且高电平有效,即当相应GPIO端口输出高电平时LED被点亮;按键开关一端接VCC,另一端连接PA0的同时并通过电阻下拉至GND,当按键按下时PA0端口会产生一个由“低”至“高”的电平变化,即传说中的上升沿,实验就是通过检测这一电平的变化来改变LED的运行状态,其所对应的EXTI触发源为“EXTI_0”
2、程序实现
程序主要分为两部分,其一是控制LED运行,程序中将LED对应的GPIO配置为推挽输出模式并输出低电平,使得开机时LED呈熄灭状态;
void LED_GPIO_Config(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOC);
gpio_mode_set(LED1_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED1_PIN);
gpio_output_options_set(LED1_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED1_PIN);
gpio_mode_set(LED2_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED2_PIN);
gpio_output_options_set(LED2_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED2_PIN);
gpio_mode_set(LED3_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED3_PIN);
gpio_output_options_set(LED3_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED3_PIN);
gpio_mode_set(LED4_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED4_PIN);
gpio_output_options_set(LED4_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED4_PIN);
gpio_bit_reset(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);
}
其二是对按键动作进行处理,主要是下面这个在“gd32l23x_it.c”中的中断处理。第一次按键按下LED呈流水灯状态运行;再次按下4颗LED呈熄灭状态。
void EXTI0_IRQHandler(void)
{
static uint8_t num=0;
if(RESET != exti_interrupt_flag_get(EXTI_0))
{
KEY_flag = 1;
num++;
if(num == 2)
{
num=0;
KEY_flag = 0;
}
exti_interrupt_flag_clear(EXTI_0);
}
}
主函数:
int main(void)
{
systick_config();
LED_GPIO_Config();
KEY_GPIO_Config();
while(1)
{
if(KEY_flag)
{
gpio_bit_toggle(LED1_PORT, LED1_PIN);
delay_1ms(300);
gpio_bit_toggle(LED2_PORT, LED2_PIN);
delay_1ms(300);
gpio_bit_toggle(LED3_PORT, LED3_PIN);
delay_1ms(300);
gpio_bit_toggle(LED4_PORT, LED4_PIN);
delay_1ms(300);
}
else
{
gpio_bit_reset(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);
}
}
}
四、实验成果
实验符合预期,并为后期的学习奠定了基础。
五:附件