提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


文章目录

  • 前言`
  • 1.STM32CubeMx创建工程
  • 2.Pinout&Configuration配置
  • 3.ClockConfiguration配置
  • 4.Project Manager配置
  • 5.生成代码修改
  • 总结



前言`

本文主要记录了stm32CubeMx创建配置串口通信过程,包含了工程的创建、引脚的配置和串口的配置;所用mcu芯片型号为STM32F407VET6。实现的功能是串口助手和mcu的自发自收。


1.STM32CubeMx创建工程

打开File/New Project,弹出如下图页面,然后第一步搜索MCU型号芯片,第二步选择芯片型号,最后开始工程配置。

CubeMX生成串口接收_嵌入式硬件

2.Pinout&Configuration配置

下来配置工程参数,首先配置RCC时钟源,HSR和LSE均选用外部的晶振/陶瓷模式,通常我们都使用的是此模式。

CubeMX生成串口接收_单片机_02


然后配置SYS(程序调试烧写方式),本文根据实验板的烧写接口,选用的JTAG(4 pin)。如图所示

CubeMX生成串口接收_CubeMX生成串口接收_03


进行串口功能的配置,以USART3为例,如图所示,选用Asynchronous(异步)模式,波特率设置9600Bit/s,字长8位,无奇偶校验位,1位停止位。

CubeMX生成串口接收_嵌入式硬件_04


添加DMA功能的配置,如图所示,接收选用循环模式(circular),发送选用正常模式(normal),

CubeMX生成串口接收_串口_05


CubeMX生成串口接收_stm32_06


最后进行串口的中断配置,如图所示:

CubeMX生成串口接收_stm32_07

3.ClockConfiguration配置

试验对象的外部晶振采用的是16MHz,具体时钟配置如下图所示。

CubeMX生成串口接收_嵌入式硬件_08


然后配置SYS(程序调试烧写方式),本文根据实验板的烧写接口,选用的JTAG(4 pin)。如图所示

4.Project Manager配置

依次配置工程的名称、位置、应用结构、IDE环境和.c.h文件。如图所示:

CubeMX生成串口接收_嵌入式硬件_09


CubeMX生成串口接收_CubeMX生成串口接收_10


最后,点击"GENERATE CODE",生成工程代码

CubeMX生成串口接收_嵌入式硬件_11

5.生成代码修改

指示灯程序添加到main.c中:

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	
		HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);
		HAL_Delay(1000);
  }

串口程序修改内容主要到uart.c中,其中函数“BSP_USART3_Init”由main函数调用,功能主要初始化为空闲中断,配置DMA接收缓存;函数“BSP_USART3_IdleCallback”由USART3_IRQHandler函数调用,中断触发该功能,实现串口接收数据,并回调发送到上位机。

void BSP_USART3_Init(void)
{
	memset(Usart2.uc_RxBuffer,0x00,USART_DATA_SIZE);
	__HAL_UART_ENABLE_IT(&huart3,UART_IT_IDLE); 
	HAL_UART_Receive_DMA(&huart3,Usart3.uc_RxBuffer,USART_DATA_SIZE);
}
void BSP_USART3_IdleCallback(void)
{
    /*判断是否是空闲中断*/    
  //  if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE) != RESET)
		{
      if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE) != RESET)
			{ 
				/* Clean the input path */
				__HAL_UART_CLEAR_IDLEFLAG(&huart3);        
				__HAL_UART_FLUSH_DRREGISTER(&huart3);
				HAL_UART_DMAStop(&huart3); 
				/*获取接收数据长度*/
				uint8_t data_length = USART_DATA_SIZE- __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);
				/*数据处理函数*/
				USART3_USER_Callback (Usart3.uc_RxBuffer , data_length);
				memset (Usart3.uc_RxBuffer ,0x00, data_length);
				HAL_UART_Receive_DMA(&huart3,Usart3.uc_RxBuffer,USART_DATA_SIZE);
			}
    }
}
void BSP_USART3_SendData(u8 *TxBuff,u16 BuffLen)
{
	HAL_UART_Transmit(&huart3, TxBuff,BuffLen,0xFFFF);
	while(HAL_UART_GetState(&huart3) == HAL_UART_STATE_BUSY_TX);    
}
void USART3_USER_Callback (u8 * RxBuff , u16 RxLenth)
{
	u32 baudvalue = 0;
	u8 baudlen =0;
	if(RxLenth > USART_DATA_SIZE) 
		return;
	else 
	{
		Uart3_Msg.us_DataLen = RxLenth;
		for( u16 i =0; i<RxLenth ;i++ )
		{
			Uart3_Msg.uc_RxBuffer [i] = *(RxBuff + i);
		} 
		BSP_USART3_SendData(Uart3_Msg.uc_RxBuffer,Uart3_Msg.us_DataLen);
	}
}
指示灯程序添加到main.c中:
while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	
		HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);
		HAL_Delay(1000);
  }

该处使用的url网络请求的数据。

总结

以上就是今天要讲的内容,本文主要介绍了cube配置串口流程,目的是熟悉cube创建程序的过程。