[研电赛技术支持] RT-Thread环境GD32F103外部GPIO中断程序

[复制链接]
544|0
荣陶陶 发表于 2025-10-10 18:09 | 显示全部楼层 |阅读模式
RT-Thread 环境 GD32F103 外部 GPIO 中断配置
一、 硬件准备
◦ GD32F103 开发板
◦ 确认外部中断对应的 GPIO 引脚(例如 PA0)
二、软件准备
◦ 安装 RT-Thread Studio 或配置好的 RT-Thread 开发环境
◦ 确保 GD32F103 的 BSP 支持包已正确安装
三、程序源码实现

将PA0设置为下降沿触发,按键每按下一次,供电状态发生改变。
2.程序源码

#include "task.h"
#include <power.h>
#include "key.h"
//#include <rtthread.h>
//#include <rtdevice.h>

extern POWER power;

rt_uint8_t key_test;
KEY key;

// 定义中断输入GPIO引脚,急停按键
#define INT_PIN    GET_PIN(A, 0)  // 假设中断信号接在PA0引脚上
/* 线程控制块 */
static rt_thread_t key_power_thread = RT_NULL;

/*1*  * @brief GPIO中断服务函数  * @param args 中断处理函数参数  */
static void gpio_int_callback(void *args)
{
  key_test++;
  key.SWITCH_flag=1;
}

/*2*  * @brief 初始化GPIO中断  */
static int gpio_interrupt_init(void)
{
    // 配置中断引脚为输入模式,带上拉电阻
    rt_pin_mode(INT_PIN, PIN_MODE_INPUT_PULLUP);
    // 注册中断回调函数,下降沿触发
    rt_pin_attach_irq(INT_PIN, PIN_IRQ_MODE_FALLING, gpio_int_callback, RT_NULL);
    // 使能中断
    rt_pin_irq_enable(INT_PIN, PIN_IRQ_ENABLE);
    return RT_EOK;
}
void KEY_task(void)
{
    /*****************************急停/唤醒开关*****************************/
      if(key.SWITCH_flag==1)//下降沿触发 即有按键按下
      {
          if(power.SWITCH_FLAG==0)//开机状态 按下按键 清各标志位 停电机 关机
          {
              power.STATE=SHUTDOWN; //关机 掉电
          }
          if(power.SWITCH_FLAG==1)//停机状态 按下按键 清各标志位 停电机 关机
          {
              power.STATE=TOTAL_POWER_ON;//开机 上电
          }

          key.SWITCH_flag=0;
      }
}
/* 线程入口函数 */
static void key_power_thread_entry(void *parameter)
{
    while (1)
    {
        KEY_task();
        /* 线程休眠,让出CPU */
        rt_thread_mdelay(10);
    }
}
/* 初始化函数 */
int key_power_thread_init(void)
{
    /* 配置KEY引脚为外部中断模式 */
    gpio_interrupt_init();

    /* 创建线程 */
    key_power_thread = rt_thread_create("key_led",
                                      key_power_thread_entry,
                                      RT_NULL,
                                      512,        // 线程栈大小
                                      10,         // 线程优先级
                                      10);        // 线程时间片

    /* 启动线程 */
    if (key_power_thread != RT_NULL)
    {
        rt_thread_startup(key_power_thread);
        rt_kprintf("按键控制LED线程创建成功!\n");
        return RT_EOK;
    }
    else
    {
        rt_kprintf("按键控制LED线程创建失败!\n");
        return -RT_ERROR;
    }
}
/* 导出为自动初始化函数 */
INIT_APP_EXPORT(key_power_thread_init);



四、仿真测试
PA0按键每按一次,供电状态会发生改变。
————————————————
版权声明:本文为CSDN博主「兴园电子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36598085/article/details/150927566

您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

266

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部