Bootstrap

STM32CubeIDE学习记录-基于STM32F407ZGT6(第一章)

 一、前言

初学时,很多细节没注意就会卡很久。因此每次碰到坑时都应该记录下来。

本节学习使用STM32CubeIDE配置STM32F407ZGT6探索者开发板,并实现串口通信功能

二、STM32CubeIDE配置工程环境

2.1 新建工程

选择芯片STM32F407ZGT6,工程名称:uart1。

2.2配置芯片

配置顺序按照:SYS调试——>RCC晶振时钟源——>配置时钟树

第一步:SYS调试

这一步必须配置,debug模式默认关闭,如果不配置,烧录一次程序后会自锁芯片。

解锁操作:断电,BOOT0接高电平,上电后烧录一个正常例程,再将boot0恢复原位置(正点原子一键下载电路好像不用改BOOT0,之后我再看一下这里)

第二部:RCC晶振时钟源

选择高速外部时钟源,选择晶振:Crystal/Ceramic Resonator(晶体/陶瓷谐振器)

LSE不用配置

第三部:配置时钟树

配置时钟树首先要选择②处和⑤处勾选。②选择外部告诉时钟源,⑤选择锁相环

之后要根据芯片外围晶振HSE的数值填写①处的值,这里看到正点原子接的8MHZ,所以①填8,之后③④处可以搭配着来,使SYSCLK是168MHz就行(芯片支持的最大时钟频率),小于168也可以。

⑥选择四分频

⑦选择二分频

2.3工程代码管理

对于生成代码还需要一些配置

第二页勾选这里,生成.c和.h文件并将生成的.c和.h文件分开存放,便于管理

到此点击Ctrl+S保存并自动生成代码,如果没有自动生成就点这里生成代码

三、串口通信

串口通信是跟B站UP主操作的,附上链接

【keysking的STM32教程】 第8集 STM32的串口通信_哔哩哔哩_bilibili

博主教的不错很细致。

实现功能:每秒向电脑发送一次"Hello World"

 MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  char message[] = "Hello World";//存储要发送的信息
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_UART_Transmit(&huart1, (uint8_t*)message, strlen(message), 100);//HAL库函数,功能是通过指定的串口发送信息。
	  HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

形参1是串口地址,要有取地址符号。

形参2是发送的信息的地址。

形参3是发送信息的长度,用strlen函数取数组的长度。使用此函数要在最开始加上#include<string.h>

形参4是发送的最大时间,超过则不再发送

编译无错误后,点击运行下载进单片机。

之后在串口助手或者UP主的串口网站:波特律动 串口助手 (keysking.com)中连接串口,波特率152000,即可接收到数据,要调整为接受ASCII码形式。

四、踩过的坑

本节用来介绍过程中遇到的问题

1. 我是使用的USB线接的开发板串口端,因此串口只能选择串口1,因为正点原子是将串口1连接到USB端的,使用其他串口需要外界别的GPIO口。

2. 时钟树配置,一定要根据原理图与芯片直接相连的晶振大小值,不然不论你怎么写程序,都会产生错误,因为系统工作时钟和时钟树不一样。

我当初选择HSE是25MHZ(实际是8MHZ),因此我下载程序后,串口接受到的信息全是乱码,并且一次发送的十六进制数有20多个,"Hello World"也就11个吧。所以明显有错误。

3. 程序下载好后,连接串口结果没有信息传回。只有下载后先断电,再上电,重新连接串口才有数字。不知道为什么,一般不是直接复位就好了,但是我复位后程序就不发信息了,必须断电重启才行。

;