一、新建工程
1、选择芯片型号
2、配置时钟RCC
选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
3、时钟树配置
在clock Configuration中将HCLK配置为最高频率然后回车
4、选择调试模式
SYS 设置,选择 Debug 为 Serial Wire
Timebase Source时钟源可以选择SysTick
二、EXIT外部中断配置
1、引脚配置
在右边芯片引脚图选择按键对应引脚
点击引脚选择GPIO_EXTIx,x指的是 GPIO_EXTI0 挂载在中断线0上。
2、模式选择
- 开启下降沿触发中断:即在 按下按键时 电平由高变为低时触发,则在 GPIO mode 中选择 External Interrupt Mode with Falling edge trigger detection
- 开启上升沿触发中断:即在 按下按键后松开时 电平由低变为高时触发,则在 GPIO mode 中选择 External Interrupt Mode with Rising edge trigger detection
- 开启下降沿上升沿都触发中断:即在 按下时触发,松开时再次触发,则在 GPIO mode 中选择 External Interrupt Mode with Rising/Falling edge trigger detection
- 如果硬件上已外部上拉或下拉,则在GPIO Pull-up/Pull-down 中选择 No pull-up and no pull-down 既不上拉也不下拉。
- 如果硬件外部没有上拉,则在GPIO Pull-up/Pull-down 中选择 Pull-up 内部上拉电阻。
需要查看自己开发板的原理图和自身需求:
3、配置NVIC
中断优先级分组 Priority Group 默认为4个比特位;
勾选刚刚配置的外部中断线3和4,并配置抢占优先级 Preemption Priority 和响应优先级 Sub Priority。
三、生成代码
命名项目名称选择存放路径,选择IDE为MDK-ARM
Code Generator勾选.c/.h
点击GENERATE CODE生成代码。
四、编写逻辑程序
在stm32f1xx_hal_gpio.c
文件中找到外部中断服务函数,发现里面调用了HAL_GPIO_EXTI_IRQHandler(KEY0_Pin)我们跳转到这个函数里
里面有判断几号线中断,清除标志位操作,然后调用了HAL_GPIO_EXIT_Callback(GPIO_Pin),这个函数的作用是外部中断后会执行此回调函数
这个函数的类型是__weak,weak是弱化标识,说明这个函数是弱化函数,我们可以在其它地方定义一个一模一样的函数,在编译时系统就会忽略掉这个weak函数。
我们可以在gpio.c里面自己定义一个回调函数HAL_GPIO_EXTI_Callback()(注意在USER CODE BEGIN和USER CODE END之间添加自己编写的代码,防止重新生成代码时自己的代码被覆盖)
在自定义应用程序编写自己要实现的外部中断操作:
/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==KEY1_Pin) //判断是哪个中断引脚被触发
{
// 自定义应用程序
}
}
/* USER CODE END 1 */
我们要通过外部中断来实现按键快速响应,并且按键需要进行消抖,我们可以在回调函数里进行一个标志位的切换,原因是中断函数不宜进行过多的操作,避免影响到系统的稳定。我们可以通过下面的操作来实现:
//按钮中断函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == switch_interrupt_Pin)//判断外部中断源
{
update = 1;
}
}
/*在主函数里进行标志位的判断*/
if(update==1){
HAL_Delay(20);
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9) == GPIO_PIN_SET)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);//翻转PA5状态
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);//翻转PA5状态
manufacture_sum++;
printf("AT+MQTTPUB=0,\"/sys/j092L3Wv0td/IntelligentPlant/thing/event/property/post\",\"{params:{\\\"E_OutPut_UP\\\":%u}}\",0,0\r\n",manufacture_sum);
// HAL_Delay(100);
// update = 0;
}
update = 0;
}
参考链接:https://blog.csdn.net/qq_36347513/article/details/112508465