实验一:按键中断<key3按键按下进行中断处理(串口输出/灯亮灭)>
1. 看原理图:key3按键对应 PI9,cubemx设置为exit中断,configuration->nvic中断gpio配置为较低(低于时钟中断)优先级.
cubemx具体设置:
1.1 PI9(Key3)设置为外部中断
1.2 GPIO-->configuration设置为下降沿<注意点击APPLY>
1.3 GPIO设置为低优先级(防止抢占主进程)
1.4USART1设置为异步通信(Asy...)
1.5 PF7设置为output(灯光)
3.步骤
从stm32f4xx_it.c找到中断入口<一般在最下面>,右键查看定义直到回调函数(中断应自己重写的函数)
在GPIO.c中重写
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_9)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_9) == GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_7);//电平取反
printf("KEY3 INT\n");
}
}
}
main.c中重写print函数<串口输出使用>
int fputc(int ch, FILE *p)
{
while(!(USART1->SR & (1<<7)));
USART1->DR = ch;
return ch;
}
注意main.c函数while(1){}循环什么也不写,就是中断时候自己调用了上述回调函数
实验二:串口中断
- 实验要求:串口接收中断,串口发送中断
- cubemx创建工程
2.1 USART1串口
2.2 USART1串口NVIC中断配置
步骤:(从startup_stm32f407xx.s找到中断入口,右键查看定义直到回调函数,重写回调函数)
问题:为什么上面是在stm32f4xx_it.c中找中断回调函数,而这里是startup_stm32f407xx.s中找?
因为startup_stm32f407xx.s中放的是全部中断函数的位置
从startup_stm32f407xx.s中找到串口中断,也就进入stm32f4xx.it.c中了,本质上一样.
1.main.c中(在while()循环之外)
串口发送中断HAL库函数
HAL_UART_Transmit_IT(&huart1, (uint8_t *)"UART SEND\n", 10);
<参数1>&huart1:串口1
<参数2>(uint8_t *)"UART SEND\n":发送数据
<参数3>10:发送数据字节多少
串口接收中断HAL库函数
HAL_UART_Receive_IT(&huart1, REV, 2);
<参数1>&huart1:串口1
<参数2> REV:接收数据,定义uint8_t REV[2]
<参数3>2:接收多少字节发出中断
2.由于上述函数是..._IT,代表是中断函数,usart.c中 重写接收与发送成功时的回调函数
//发送成功回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance == USART1){//句柄判断是否为串口1
printf("uart send end int\n");
}
}
2.1仍在usart.c中
//接收成功回调函数
extern uint8_t REV[2];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance == USART1){
printf("REV DATA: REV[0]=%x,REV[1]=%x\n",REV[0],REV[1]);
HAL_UART_Receive_IT(&huart1, REV, 2);
//使用中断后再次使能中断才可以再次使用.
}
}
查找回调函数
1.it.c中找到串口中断
2.进入hal_usart.c中
3.在hal_usart.c中找到
4.找到正确回调函数
注意:一般有end或者success就表示是正确结束的,就进入这个函数里,里面的回调函数就是目标函数