外部中断到单片机的输入口是PA8
正文:
1、打开STM32CubeMX
2、点击“PA8”,选中“GPIO_EXTI8”,如下图
3、选择中断产生方式,我这里选择的是下降沿,如图
4、选择IO的方式,我选择的是既不上拉也不下拉
5、选择优先级,如图
6、配置完成,生成代码,打开代码,编译一下,无错误无警告
7、修改代码-在“AppTask.h”文件中添加代码,由于我这个外部中断是用于模拟外部时间,所以我用指针的形式的写的虚拟时钟,如下
typedef struct
{
unsigned char second;
unsigned char minute;
unsigned char hour;
unsigned short day;
}vinTime;
extern vinTime VRtime;
8、在“AppTask.c”文件中申明指针变量,如下
#include "AppTask.h"
vinTime VRtime;
//任务注册表
static TaskCtrl_t TaskCtrl[] = //执行优先级程度 从上到下依次逐渐,第一个优先级最高,所有的任务函数都不能打断其它的任务函数
{
/* 【实时任务】 【上电立即运行】 【初始counter】 【任务周期ms】 【任务指针】*/ //时间调度最好是cycle_task的整数倍
{ 1, 0, 0, 100/cycle_task, taskTestTime},
{ 0, 0, 0/cycle_task, 500/cycle_task, taskTest},
{ 0, 0, 0/cycle_task, 50/cycle_task, SigLED},
};
9、在“stm32f1xx_it..c”文件中,找到外部中断位置补充以下代码,如下
/**
* @brief This function handles EXTI line[9:5] interrupts.
*/
void EXTI9_5_IRQHandler(void)
{
/* USER CODE BEGIN EXTI9_5_IRQn 0 */
/* USER CODE END EXTI9_5_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
/* USER CODE BEGIN EXTI9_5_IRQn 1 */
VRtime.second++;
if(VRtime.second >= 60)
{
VRtime.second -= 60;
VRtime.minute++;
if(VRtime.minute >= 60)
{
VRtime.minute -= 60;
VRtime.hour++;
if(VRtime.hour >= 24)
{
VRtime.hour -= 24;
VRtime.day ++;
}
}
}
/* USER CODE END EXTI9_5_IRQn 1 */
}
10、编译、下载、在线仿真“Debug”,并把外部中断引脚连在呼吸灯上,观察指针变量在增长
成功,结束