实验原理:
uart3 定时发送数据 ,uart4 中断接收,接收到之后,用lpuart打印输出。
1.先看几个关键的初始化:
- MX_GPIO_Init();
- MX_I2C1_Init();
- MX_LPUART1_UART_Init();
- MX_UART4_Init();
- MX_USART3_UART_Init();
- MX_TIM3_Init();
- /* USER CODE BEGIN 2 */
- //HAL_TIM_Base_Start_IT(&htim3);
- //HAL_UART_Receive_IT(&huart3,&uart3sv[0],1);
-
- <font color="#ff0000"> HAL_UART_Receive_IT(&huart4,uart4buf,1/*sizeof(buf_T)*/); // 必须执行一次,顺带开启中断功能</font>
这里需要初始化一次,否则中断接收无法开启,注释是我自己理解的,不知道是否正确;
2. 再看中断回调函数:
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- // if(huart->Instance == USART3)
- // {
- // uart3buf[0] = uart3sv[0];
- // HAL_UART_Receive_IT(&huart3,&uart3sv[0],1);
- // HAL_UART_Transmit(&hlpuart1,uart3buf,1,0xffff);
- // }
-
- if(huart->Instance == UART4)
- {
- //HAL_UART_Receive_IT(&huart4,uart4buf,sizeof(uart4buf));
- //HAL_UART_Transmit(&hlpuart1,uart4buf,strlen((char *)uart4buf),0xffff);
-
- <font color="#ff0000"> HAL_UART_Receive_IT(&huart4,uart4buf,1);
- HAL_UART_Transmit(&hlpuart1,uart4buf,1,0xffff); </font>
-
- //memset(uart4buf,0,sizeof(uart4buf));
- cnt++;
- }
-
-
-
- }
中断里面啥都不做,接收到了一个字节后直接打印输出:
发现偶尔会丢失一个字节。
一开始,我用sscom,后来换成secureCRT,发现不是pc软件的问题。
难道是hal库的效率太低了?170Mhz的主频的mcu不至于呀?
最后,感谢论坛某个网友提供的工程,刚刚准备@他却找不到名字了。
我在他的工程上进行调试了。
|