GD32F103系列是国产MCU中具有较高性价比的一款,采用Cortex-M3内核,主频高达108MHz,同时兼容STM32F103的引脚布局和外设资源。在本篇文章中,我们将介绍如何利用GD32F103实现LED流水灯效果,并通过按键进行控制,熟悉GPIO的基本用法与中断功能。
开发环境及工具- MCU型号:GD32F103C8T6
- 开发工具:Keil uVision 5
- 编程语言:C语言
- 烧录工具:GD-Link仿真器
- 硬件平台:GD32F103最小系统板
实现功能- 实现8个LED以流水灯形式循环点亮。
- 按下按键时,切换LED的流水方向(顺时针或逆时针)。
硬件连接- LED:连接在GPIOA的0~7号引脚上。
- 按键:连接在GPIOB的12号引脚,并配置为上拉输入模式。
代码实现- #include "gd32f10x.h"
- // 定义LED和按键的GPIO端口及引脚
- #define LED_PORT GPIOA
- #define BUTTON_PORT GPIOB
- #define BUTTON_PIN GPIO_PIN_12
- // 定义全局变量用于控制LED方向
- volatile uint8_t led_direction = 1; // 1: 顺时针, 0: 逆时针
- // 初始化GPIO
- void gpio_init(void) {
- rcu_periph_clock_enable(RCU_GPIOA); // 使能GPIOA时钟
- rcu_periph_clock_enable(RCU_GPIOB); // 使能GPIOB时钟
- // 配置GPIOA的0~7为推挽输出模式
- gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_ALL);
- gpio_bit_reset(LED_PORT, GPIO_PIN_ALL); // 关闭所有LED
- // 配置GPIOB的12号引脚为输入模式并上拉
- gpio_init(BUTTON_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, BUTTON_PIN);
- }
- // 初始化按键中断
- void exti_init(void) {
- rcu_periph_clock_enable(RCU_AF); // 使能AF时钟
- gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_12);
- exti_init(EXTI_12, EXTI_INTERRUPT, EXTI_TRIG_FALLING); // 设置下降沿触发
- nvic_irq_enable(EXTI10_15_IRQn, 2, 0); // 使能中断,优先级设为2
- }
- // 按键中断服务函数,切换LED方向
- void EXTI10_15_IRQHandler(void) {
- if (exti_interrupt_flag_get(EXTI_12)) {
- led_direction = !led_direction; // 切换方向
- exti_interrupt_flag_clear(EXTI_12); // 清除中断标志
- }
- }
- // LED流水灯逻辑
- void led_run(void) {
- static uint8_t led_pos = 0;
-
- gpio_bit_reset(LED_PORT, GPIO_PIN_ALL); // 关闭所有LED
- // 根据方向点亮对应的LED
- if (led_direction) {
- gpio_bit_set(LED_PORT, (1 << led_pos));
- led_pos = (led_pos + 1) % 8; // 顺时针
- } else {
- gpio_bit_set(LED_PORT, (1 << led_pos));
- led_pos = (led_pos == 0) ? 7 : (led_pos - 1); // 逆时针
- }
- }
- // 主函数
- int main(void) {
- gpio_init(); // 初始化GPIO
- exti_init(); // 初始化外部中断
- while (1) {
- led_run(); // 执行LED流水逻辑
- delay_1ms(200); // 延时200ms
- }
- }
代码讲解- GPIO初始化:将LED连接的GPIOA引脚配置为推挽输出模式,按键连接的GPIOB引脚配置为上拉输入模式。
- 按键中断处理:通过EXTI10_15_IRQHandler()切换LED流水方向,按键按下即触发中断。
- LED流水逻辑:在led_run()函数中,根据当前方向依次点亮LED,并延时200ms。
功能扩展- LED颜色控制:可以增加RGB灯,实现颜色变化的流水效果。
- PWM调光:通过PWM信号调节LED的亮度,增强视觉效果。
- 多按键控制:增加多个按键,实现更多模式的切换,如闪烁模式或随机点亮。
小结通过这篇文章,我们学习了如何使用GD32F103 MCU实现LED流水灯和按键控制。该项目不仅让我们掌握了GPIO的使用,还了解了外部中断的配置与应用。这类基础项目对于深入理解MCU的外设资源和开发流程非常有帮助。
|