编译软件:MDK5.38a,调试器使用板载的ST-linkV3(速度要快很多)
一:利用STM32cubeMX配置一下,串口的初始化;
查看一下原理图:
STM32H533RB使用的串口2,引脚使用PA3,PA4引脚
ST-linkV3调试器版图:
打开STM32cubeMX软件配置一下串口2的底层驱动部分
串口2配置完成后,点击“generate code”,底层驱动就配置好了;
(stm32cube软件的基本使用,在之前的帖子中已经介绍过这里就不过多的进行介绍)
二:代码编码的具体过程
首先串口时钟使能,GPIO时钟使能: __HAL_RCC_USART2_CLK_ENABLE();
GPIO端口模式设置: __HAL_RCC_GPIOA_CLK_ENABLE();
串口参数初始化: HAL_UART_Init(&huart2)
开启中断并且初始化 HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART2_IRQn);
串口初始化部分:
void MX_USART2_UART_Init(void)
{
/* USER CODE BEGIN USART2_Init 0 */
/* USER CODE END USART2_Init 0 */
/* USER CODE BEGIN USART2_Init 1 */
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
HAL_UART_Receive_IT(&huart2, &rxBuffer[0], 1); //再开启接收中断
/* USER CODE END USART2_Init 2 */
}
使能串口中断函数:
编写串口发送、接收中断函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口中断回调函数
{
uint8_t temp =0;
if (huart == &huart2)
{
temp = USART2->RDR;
HAL_UART_IRQHandler(&huart2);
HAL_UART_Receive_IT(&huart2, &rxBuffer[receivedIndex], 1); //开启接收中断
/*串口发送正常函数*/
HAL_UART_Transmit(&huart2, (uint8_t *)&temp, 1, 1);
/*利用串口发送中断,导致少发送字节,*/
// HAL_UART_Transmit_IT(&huart2,&temp,1);
// HAL_UART_Receive_IT(&huart2, &rxBuffer[receivedIndex], 1); //开启接收中断
}
}
注意需要在串口初始化中编写,串口接收中断函数,否则串口2的中断部分不能正常进入。
正常的交互如下所示:
用该函数发送会出现HAL_UART_Transmit_IT(&huart2,&temp,1);
然后我查了一下两个函数的区别:
HAL_UART_Transmit为阻塞式发送函数,意思就是说发送数据时候会一直等待数据发送完成后才会返回。
而HAL_UART_Transmit_IT 是非阻塞式的发送函数,即发送数据时候,不会等待数据发送完成,而是立即返回,数据发送完成后会触发中断函数。
因此,如果使用HAL_UART_Transmit发送数据时候,程序会一直阻塞在该函数处,直到数据发送完成后才会继续执行下一条指令,而如果使用HAL_UART_Transmit_IT发送数据,则程序会立即返回,可以指继续执行下一条质量,数据发送完成后会触发中断函数,在中断函数中进行数据发送完成后的处理。
所以在我们使用的串口发送数据,需要根据当前函数操作进行判断使用哪种发送函数,如果数据量不大的情况下,可以使用HAL_UART_Transmit,如果数据量较大的情况下,可以使用串口接收的空闲中断方式,待接收完成所有的数据包后,在进行数据的发送,或者是使用CPU资源,使用DMA的方式进行发送数据。
全部评论