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
|
|