极海APM32E103VET6测评之外部中断(EINT)
[复制链接]
在上次建立的工程基础上,我们添加相应的外部中断代码,实现按键外部中断,控制LED灯的亮灭。以下是按键原理图,一共有三个按键,分别为复位、B1和B2,我们使用B1即连接到PA0上的按键,该按键按下时呈低电平。因此,我们在程序中需配置PA0为上拉输入,使得在不按的情况下,IO口呈高电平。根据这个工作原理,开始配置相关代码。
1、配置GPIO为上拉输入
#define KEY1_PIN GPIO_PIN_0
#define KEY1_PORT GPIOA
#define KEY1_PORT_CLK_ENABLE() RCM_EnableAPB2PeriphClock( RCM_APB2_PERIPH_GPIOA );
GPIO_Config_T s_GPIO_InitStruct = { 0 };
/* ---Config the Clock of the Gpios--- */
KEY1_PORT_CLK_ENABLE();
/* ---Config the Clock of the Afio--- */
RCM_EnableAPB2PeriphClock( RCM_APB2_PERIPH_AFIO );
/* ---Config Key1 pin Parameters--- */
s_GPIO_InitStruct.pin = KEY1_PIN;
s_GPIO_InitStruct.mode = GPIO_MODE_IN_PU;//配置为上拉输入
GPIO_Config( KEY1_PORT, &s_GPIO_InitStruct );
2、配置外部中断
EINT_Config_T s_EINT_InitStruct = { 0 };
GPIO_ConfigEINTLine( GPIO_PORT_SOURCE_A, GPIO_PIN_SOURCE_0 );//配置外部中断线到PA0
s_EINT_InitStruct.line = EINT_LINE_0;
s_EINT_InitStruct.lineCmd = ENABLE;
s_EINT_InitStruct.mode = EINT_MODE_INTERRUPT;//中断模式
s_EINT_InitStruct.trigger = EINT_TRIGGER_FALLING;//下降沿触发
EINT_Config( &s_EINT_InitStruct );
NVIC_EnableIRQRequest( EINT0_IRQn, 1, 0 );//配置NVIC请求
3、编写中断服务函数
void EINT0_IRQHandler( void )
{
if( RESET != EINT_ReadIntFlag( EINT_LINE_0 ) )
{
if( RESET == GPIO_ReadInputBit( KEY1_PORT, KEY1_PIN ) )
{
LED1_PORT->ODATA_B.ODATA8 ^= 1;
}
EINT_ClearIntFlag( EINT_LINE_0 );
}
}
|