实验原理:
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不至于呀?
最后,感谢论坛某个网友提供的工程,刚刚准备@他却找不到名字了。
我在他的工程上进行调试了。
|