这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【CH582M】通用GPIO的中断处理

共1条 1/1 1 跳转至

【CH582M】通用GPIO的中断处理

专家
2026-08-11 22:20:02     打赏

本帖学习GPIO口中断功能。设置GPIO中断有效,以PA5为例,需要执行以下代码

    GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_Floating);     // 浮空。上拉也可以,但外部仍需要加上拉电阻。
    GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge);   // 下降沿唤醒,按钮按下时起作用。
    GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_RiseEdge);   // 上升沿唤醒,按钮抬起时起作用。
    PFIC_EnableIRQ(GPIO_A_IRQn);            // 启用A口中断


另外就是书写中断处理代码,形如:

// GPIOA_IRQHandler
__INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)
{
    // 中断处理代码,如LED翻转、建立标志等
 
    // 清除中断标志
    GPIOA_ClearITFlagBit(GPIO_Pin_5);
}


为了使GPIO口中断能用,在电路上,GPIO口外围电路必须加上上拉电阻。

image.png 

本来想着继续使用RESET(PB23)做实验,结果没成功。PB22和PB23的处理上稍微复杂些,设计中断端口共享问题程序代码如下:

#include "CH58x_common.h"
 
// 假设 LED 接在 PB4(开发板常见位置,若实际接法不同请修改)
#define LED_PIN     GPIO_Pin_4
 
int main(void)
{
    // 1. 设置系统时钟为 60MHz(必须)
    SetSysClock(CLK_SOURCE_PLL_60MHz);
 
    // 2. 初始化 GPIO
    // 先置高电平(LED 灭,假设低电平点亮),再配置为推挽输出
    GPIOB_SetBits(LED_PIN);
    GPIOB_ModeCfg(LED_PIN, GPIO_ModeOut_PP_5mA);
 
     /* 配置唤醒源为 GPIO - PA5 */
    GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_Floating);
    //GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge); // 下降沿唤醒,按钮按下时起作用
    GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_RiseEdge);   // 上升沿唤醒,按钮抬起时起作用
    PFIC_EnableIRQ(GPIO_A_IRQn);   
 
    while(1)
    {
    }
}
 
// GPIOA_IRQHandler
__INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)
{
    // 翻转LED
    GPIOB_InverseBits(LED_PIN);
    // 清除中断标志
    GPIOA_ClearITFlagBit(GPIO_Pin_5);
}


 编译后下载程序到开发板,运行。

如果选择的是下降沿中断,则按钮按下瞬间,蓝色LED翻转。

如果选择的是上升沿中断,则按钮抬起瞬间,蓝色LED翻转。





关键词: CH582M     GPIO     中断    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]