3.stm32实验三中断实验<文章结尾:查找回调函数>

实验一:按键中断<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){}循环什么也不写,就是中断时候自己调用了上述回调函数


实验二:串口中断

  1. 实验要求:串口接收中断,串口发送中断
  2. 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就表示是正确结束的,就进入这个函数里,里面的回调函数就是目标函数 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值