【全能小网关|CH32V208】--3.按键中断
[复制链接]
本篇讲述按键IO外部中断。
一.按键原理与准备
由下原理图知用户按键下降沿低电平触发,我们这里用PA0作为按键检测IO口,并在杜邦线连接排针PA0与KEY引脚。
图1:按键原理
二.代码准备
1.初始化配置PA0外部中断,下降沿触发。
void EXTI0_INT_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
EXTI_InitTypeDef EXTI_InitStructure = {0};
NVIC_InitTypeDef NVIC_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* GPIOA ----> EXTI_Line0 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
2.中断函数。这里简单就打印下日志
/*********************************************************************
* @fn EXTI0_IRQHandler
*
* [url=home.php?mod=space&uid=159083]@brief[/url] This function handles EXTI0 Handler.
*
* [url=home.php?mod=space&uid=784970]@return[/url] none
*/
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
{
printf("Run at EXTI\r\n");
EXTI_ClearITPendingBit(EXTI_Line0); /* Clear Flag */
}
}
3.主函数
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
SystemCoreClockUpdate();
Delay_Init();
USART_Printf_Init(115200);
printf("Uart Initr\n");
printf("SystemClk:%d\r\n", SystemCoreClock);
printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
printf("EXTI0 Test\r\n");
EXTI0_INT_INIT();
printf("INT Init\n");
while(1)
{
Delay_Ms(1000);
//printf("Run at main\r\n");
}
}
三.测验
编译烧录,上电运行,查看日志有初始化,当按下用户按键S2,可以看到触发IO中断。
图2:按键中断日志
至此,实现按键IO外部中断功能。
|