1. 中断模式
CH573芯片的所有 I/O 管脚都具有中断功能,并可实现睡眠唤醒。为了使用外部中断,端口位必须配置成输入模式。并提供 4 种触发模式:高电平、低电平、上升沿、下降沿。
(位于CH57x_gpio.h文件中)
2. 创建工程
复制粘贴上一节的按键工程,并命名为:CH573F-03-interrupt
3. 中断初始化与中断函数
在这里我们将外部中断配置为按键的一种,在上一节的key.h和key.c中完成补充
1) 补充按键定义,定义PB4为外部中断触发按键引脚
#define KEY3_PIN GPIO_Pin_4
2) 中断初始化
在key.h中声明按键初始化函数void KEY_interrupt_init(void);
void KEY_interrupt_init(void);
在key.c中补充函数KEY_interrupt_init的实体:
/*
* 函数名:KEY_interrupt_init
* 参数:无
* 返回值:无
* 功能说明:按键中断初始化
*/
void KEY_interrupt_init(void)
{
GPIOB_ModeCfg(KEY3_PIN, GPIO_ModeIN_PU); //KEY3_PIN设置为上拉输入
GPIOB_ITModeCfg(KEY3_PIN,GPIO_ITMode_FallEdge);//KEY3_PIN下降沿触发中断
PFIC_EnableIRQ(GPIO_B_IRQn); //使能GPIOB端口中断
}
3) 重写中断函数
在main.c文件中重写中断函数
//设置外部中断相关函数属性,指定声明相关特征
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
/*
* 函数名:GPIOB_IRQHandler
* 参数:无
* 返回值:无
* 功能说明:GPIOB端口的中断处理函数
*/
void GPIOB_IRQHandler(void)
{
//判断GPIOB端口的中断标志
if(GPIOB_ReadITFlagBit(KEY3_PIN))
{
LED_Toggle();
}
//清空中断标志位
GPIOB_ClearITFlagBit(KEY3_PIN);
}
4. main函数
/*********************************************************************
* @fn main
*
* @brief 主函数
*
* @return none
*/
int main()
{
SetSysClock(CLK_SOURCE_PLL_60MHz);
LED_init();//LED初始化
KEY_init();//按键初始化
KEY_interrupt_init(); //中断初始化
while(1)
{
DelayMs(50);
}
}
5. 编译烧录运行
编译无错误无警告并生成hex文件后,使用WCH单片机编程工具完成程序下载。
实验现象:
将PB4引脚接入一个按键,并将按键的导通引脚接到GND上,快速按下(未消抖)按键观察LED现象;或者接将PB4引脚通过杜邦线连接GND,做插拔来模拟按键;此时LED会出现翻转变化。
如果按键中断控制LED正常,即达到本实验的目的,如果异常(按键消抖的问题属正常现象),请检查源代码,如有疑问,可关注公众号 “IOT趣制作”,将您遇到的问题描述出来,平台收到您的留言后会第一时间进行解决。