STM32F303 NUCLEO cubeMX串口收发例程

自从ST推出了cubeMX工具以后,开发STM32系列的项目就变得非常简单了。

以串口为例,只需要简单配置一下串口的属性,然后自动生成项目代码,就可以直接发送数据了。

串口属性中NVIC中需要enable串口中断,这样可以实现高效串口收发。

PERIPHERALS	MODES	FUNCTIONS	PINS
SYS	Serial Wire	SYS_JTCK-SWCLK	PA14
SYS	Serial Wire	SYS_JTMS-SWDIO	PA13
SYS	SysTick	SYS_VS_Systick	VP_SYS_VS_Systick
USART1	Asynchronous	USART1_RX	PA10
USART1	Asynchronous	USART1_TX	PA9

Pin Nb	PINs	FUNCTIONs	LABELs
21	PA5	GPIO_Output	
42	PA9	USART1_TX	
43	PA10	USART1_RX	
46	PA13	SYS_JTMS-SWDIO	
49	PA14	SYS_JTCK-SWCLK	

不过配置好的项目代码在需要接收的场合使用并不太完善。但是通过阅读配置好的代码发现,示例代码提供了__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart),既然是__weak,那就是我们可以重写这个函数,类似于C++的重载特性。所以只需要重构一下void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)这个回调函数,每次有接收中断产生后,程序就会自动调用这个回调函数。

所以我们只需要在这个回调函数中保存好接收的数据到接收缓冲区就能实现串口接收功能。

另外,在main函数增加接收数据结束判断UART1_ReceiveCHK(),以时间间隔大于30mS为结束条件,这样就可以实现完整的收发功能了。(当然,也可以参照AT命令的\R\N来判断结束,缺点是无法实现任意数据收发。)
int main(void){
  while (1) 
        UART1_ReceiveCHK();
}

参见如下代码:


/* USER CODE BEGIN 0 */
uint8_t uRxBuffer;              //接收中断缓冲
uint8_t Uart1_RxBuffer[256];    //接收缓冲
uint8_t Uart1_RxCnt = 0;        //接收缓冲计数
uint32_t Uart1_RxTime = 0;      //最后接收时间
uint8_t	cAlmStr[] = "Data Overflow(Max256)\r\n";

/***根据接收时间判断是否一次接收完成***/
void UART1_ReceiveCHK(void)
{
	if(Uart1_RxCnt>0)
	{
		if(HAL_GetTick()-Uart1_RxTime>10)//一次接收结束
		{	
			HAL_UART_Transmit(&huart1, Uart1_RxBuffer, Uart1_RxCnt,0xFFFF); //将收到的信息发送出去
			
			Uart1_RxCnt = 0;
			HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
			HAL_UART_Receive_IT(&huart1, &uRxBuffer, 1);   //使能接收中断
		}
	}
	else if(HAL_GetTick()-Uart1_RxTime>300)//长时间无接收,重新启动接收中断
	{
		Uart1_RxTime = HAL_GetTick();
		HAL_UART_Receive_IT(&huart1, &uRxBuffer, 1);   //使能接收中断
	}
}

/***重载RXCALLBACK函数,实现接收数据缓存***/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart != &huart1)return;
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
 
	if(Uart1_RxCnt >= 255)  //溢出判断
	{
		Uart1_RxCnt = 0;
		HAL_UART_Transmit(&huart1, cAlmStr, sizeof(cAlmStr),0xFFFF);	
	}
	else
	{
		Uart1_RxBuffer[Uart1_RxCnt++] = uRxBuffer;   	//接收数据
		Uart1_RxTime = HAL_GetTick();								//接收时间
	}
	
	HAL_UART_Receive_IT(&huart1,&uRxBuffer, 1);//使能接收中断
}
/* USER CODE END 0 */

实测功能OK,截图如下:STM32F303 NUCLEO cubeMX串口收发例程_第1张图片

你可能感兴趣的:(STM32F303 NUCLEO cubeMX串口收发例程)