[原创] STM32F769I-DISCO之利用STM32CubeMX配置串口

beyondvv   2017-1-3 23:11 楼主
前几篇内容写到关于 基于STM32F769I来车预警装置项目的硬件介绍,其中雷达模块,433Mhz模块和GPRS模块和STM32开发板都是使用串口进行通信,下面介绍下利用STM32CubeMX图像配置工具进行开发板串口配置。 STM32CubeMX是ST意法半导体近几年来大力推荐的STM32芯片图形化配置工具,允许用户使用图形化向导生成C初始化代码,可以大大减轻开发工作,时间和费用。STM32CubeMX几乎覆盖了STM32全系列芯片。它具有如下特性:① 直观的选择MCU型号,可指定系列、封装、外设数量等条件 ② 微控制器图形化配置 ③ 自动处理引脚冲突 ④ 动态设置时钟树,生成系统时钟配置代码 ⑤ 可以动态设置外围和中间件模式和初始化 ⑥ 功耗预测 ⑦ C代码工程生成器覆盖了STM32微控制器初始化编译软件,如IAR,KEIL,GCC。 ⑧ 可以独立使用或者作为Eclipse插件使用 STM32CubeMX安装之前电脑必须安装JAVA运行环境安装,在Java官网www.java.com下载最新的Java软件安装即可 安装STM32CubeMX后启动软件: QQ图片20170103164554.png 点击New Project创建一个新的项目: QQ图片20170103164618.png 选择开发板的型号STM32F769NIHX,双击即可进入配置界面: QQ图片20170103165600.png STM32F769I开发板的能引出的串口是UART6,我们就配置UART6 221916bcyypkqoogdlqpiw.png.thumb.jpg 在Point选项里面选择UART6,第一个选项Mode用来设置串口6的模式或者关闭串口6。 第二个选项Hardware Flow Control(RS232)用来开启/关闭串口1的硬件流控制,该选项只有在 Mode选项值为Asynchronous(异步通信)模式的前提下才有效。这里我们要开启串口1的异步模 式,并且不使用硬件流控制,所以这里我们直接选择Mode值为Asynchronous即可。 QQ图片20170103165619.png 使能串口后,在芯片位置可以看到串口6管脚已经变成绿色的,代表我们可以使用它 QQ图片20170103170003.png 点击USART6配置按钮,进入USART6详细参数配置界面。在弹出的USART6 Configuration界面会出现5个配置选项卡。 QQ图片20170103170014.png QQ图片20170103170057.png Parameter Settings选项卡用来配置USART6的初始化参数,包括波特率停止位等等。这里 我们将USART6配置为:波特率115200,8位字长模式,无奇偶校验位,1个停止位,发送/ 接收均开启。 User Constants是用来配置用户常量。 NVIC选项卡用来使能USART6中断。这里我们勾上Enabled选项。 DMA Setting是在使用USART6 DMA的情况才需要配置,这里我们不配置。 GPIO Setting便是查看和配置USART6相关的IO口,从图中可以看出UART6TXD和RXD对应的GPIO管脚为PG9和PG14. QQ图片20170103225001.png 配置完USART6相关IO口和USART6参数之后,如果我们使用到串口中断,那么我们还 需要设置中断优先级分组。接下来便是配置NVIC相关参数。同样的方法,进入Conguration 选项卡,点击NVIC按钮,配置UART6的中断优先级。 QQ图片20170103223332.png 配置完后点击菜单Project->Generate Code即可生成源码 QQ图片20170103224048.png QQ图片20170103224105.png QQ图片20170103224343.png 生成源码打开KEIL5后,我们会发现在程序里已经为我们添加好了初始化串口6的代码了 static void MX_USART6_UART_Init(void) { huart6.Instance = USART6; huart6.Init.BaudRate = 115200; huart6.Init.WordLength = UART_WORDLENGTH_7B; huart6.Init.StopBits = UART_STOPBITS_1; huart6.Init.Parity = UART_PARITY_NONE; huart6.Init.Mode = UART_MODE_TX_RX; huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart6.Init.OverSampling = UART_OVERSAMPLING_16; huart6.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart6) != HAL_OK) { Error_Handler(); } } 同时在stm32f4xx_hal_msp.c中,生成了串口MSP函数HAL_UART_MspInit内容如下,即初始化UART6对应的管脚。 void HAL_UART_MspInit(UART_HandleTypeDef* huart) { GPIO_InitTypeDef GPIO_InitStruct; if(huart->Instance==USART6) { /* USER CODE BEGIN USART6_MspInit 0 */ /* USER CODE END USART6_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_USART6_CLK_ENABLE(); /**USART6 GPIO Configuration PG14 ------> USART6_TX PG9 ------> USART6_RX */ GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF8_USART6; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); /* USER CODE BEGIN USART6_MspInit 1 */ /* USER CODE END USART6_MspInit 1 */ } } 在串口中断中程序中编写相应串口处理雷达数据的代码即可。 //串口1中断服务程序 void USART6_IRQHandler(void) { u8 Res; if((__HAL_UART_GET_FLAG(&UART6_Handler,UART_FLAG_RXNE)!=RESET)) //接收中断(雷达数据正好是以0x0d 0x0a结尾) { HAL_UART_Receive(&UART1_Handler,&Res,1,1000); if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0; //接收数据错误,重新开始接收 } } } } HAL_UART_IRQHandler(&UART6_Handler); } 点击此处,查看STM32F769I开发板官方资源。 本帖最后由 beyondvv 于 2017-1-3 23:13 编辑
  • QQ图片20170103165915.png
  • QQ图片20170103170134.png
  • QQ图片20170103170206.png
  • QQ图片20170103223332.png

回复评论 (4)

很详细。
点赞  2017-1-3 23:22
赞一个
加油!在电子行业默默贡献自己的力量!:)
点赞  2017-1-4 09:30
祝楼主节日快了,新年新气象
点赞  2017-12-29 21:27
祝楼主节日快乐,祝2018,大家一切都顺利
点赞  2017-12-30 13:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复