目录
1.配置三盏灯
2.配置六个中断
3.配置uart
实验现象;
1.当按下KEY1按键之后,LED1灯状态取反,并且串口工具打印一句话key1 down
2.当按下KEY2按键之后,LED2灯状态取反,并且串口工具打印一句话key2 down
3.当光电开关中断触发时,LED3灯状态取反,并且串口工具打印一句话guang dian kai guan chu fa
gpio.c
/* USER CODE BEGIN 2 */
// 下降沿触发
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin){
switch(GPIO_Pin){
case GPIO_PIN_9:
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8); // KEY1 --> LED3
printf("KEY1 down\n");
break;
case GPIO_PIN_7:
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10); // KEY2 --> LED2
printf("KEY2 down\n");
break;
case GPIO_PIN_8:
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_10); // KEY3 --> LED1
printf("KEY3 down\n");
break;
}
}
// 上升沿触发
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin){
switch(GPIO_Pin){
case GPIO_PIN_15:
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8); // 光电开关 --> LED3
printf("guang dian kai guan chu fa\n");
break;
case GPIO_PIN_5:
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10); // 火焰 --> LED2
printf("huo yan kai guan chu fa\n");
break;
case GPIO_PIN_12:
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_10); // 人体红外 --> LED1
printf("ren ti hong wai chu fa\n");
break;
}
}
/* USER CODE END 2 */
uart.c
/* USER CODE BEGIN 0 */
int fputc(int ch, FILE* stream){
// 判断发送数据寄存器是否为空
while(!(huart4.Instance->ISR & (0x1 << 7)));
huart4.Instance->TDR = ch;
// 判断是否为'\n'
if(ch == '\n'){
// 判断发送数据寄存器是否为空
while(!(huart4.Instance->ISR & (0x1 << 7)));
huart4.Instance->TDR = '\r';
}
return ch;
}
/* USER CODE END 0 */
实验现象
注:LED灯正确点亮了