前言
之前在蓝桥杯比赛的时候没有仔细研究过外部中断,现在需要使用外部中断来采集,解调模块的匹配信号,所以现在来学一下。
1.CubeMx的配置步骤
设置主频之后
点击GENERATE CODE生成代码
至此工程就建立完毕了。
3.测试代码
但是关闭中断可以使用:
void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);
参数可以选择:
EXTI0_IRQn
EXTI1_IRQn
EXTI2_IRQn
EXTI3_IRQn
EXTI4_IRQn
EXTI9_5_IRQn
EXTI15_10_IRQn
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_0)
{
if(EXTItrigger == FALL)
{
LEDfloatFlag = 0;
EXTItrigger = RISE;
HAL_NVIC_DisableIRQ(EXTI0_IRQn);
EXTI_GPIO_ModeChange(RISE);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
else if(EXTItrigger == RISE)
{
LEDfloatFlag = 1;
EXTItrigger = FALL;
HAL_NVIC_DisableIRQ(EXTI0_IRQn);
EXTI_GPIO_ModeChange(FALL);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
}
}
自己编写的变换触发方式的函数:
void EXTI_GPIO_ModeChange(unsigned char TriggerMode)
{
if(TriggerMode == RISE)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
else if(TriggerMode == FALL)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
main.c的测试内容:
void main(void)
{
while(1)
{
if(LEDfloatFlag)
{
LED = 0x01 << i++;
i %= 8;
}
else
{
LED = 0xaa;
}
LED_Disp(LED);
HAL_Delay(200);
}
}
4.演示效果
总结
工程链接
以上就是外部中断的配置过程,测试代码以及测试效果