本帖学习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口外围电路必须加上上拉电阻。
本来想着继续使用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翻转。
我要赚赏金
