STM32学习——串口通信,LED点灯(寄存器版本)

STM32学习——串口通信,LED点灯(寄存器版本)

一、目标
1、用STM32F103ZET6点亮LED灯(LED灯配置在PE4管脚上);
2、通过串口每秒向电脑发送一个“Heart!”。

二、步骤

1、创建环境

STM32学习——串口通信,LED点灯(寄存器版本)_第1张图片

STM32学习——串口通信,LED点灯(寄存器版本)_第2张图片
2.在LED.c中写入以下程序
STM32学习——串口通信,LED点灯(寄存器版本)_第3张图片
在这里插入图片描述
在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。 GPIO 是挂载在 APB2 总线上的外设,相应的寄存器是:APB2 外设时钟使能寄存器(RCC_APB2ENR),见下图:
STM32学习——串口通信,LED点灯(寄存器版本)_第4张图片
GPIOE是在寄存器:RCC_APB2ENR的第六位。我们只需要把相应的位设置为1即可。见下图:
在这里插入图片描述
这样,我们可以使能GPIOE:RCC->APB2ENR |= 1<<6;

接着初始化IO模式,运用GPIOX->CRL.
STM32学习——串口通信,LED点灯(寄存器版本)_第5张图片
选择模式:输出模式,最大速度50MHZ。复用推挽输出。
程序可以写成:

在我们设置相应的位之前,我们先把要设置的位清零。(利用和1相与不变,和0相与清零)

GPIOE->CRL &=0xFFF0FFFF;

然后选择模式:

GPIOE->CRL |=0x00030000; //PE4的工作模式

3.在test.c中写入以下程序

STM32学习——串口通信,LED点灯(寄存器版本)_第6张图片
下面对delay_init() 函数 、delay_init() 函数、 uart_init(u32 pclk2,u32 bound)函数进一步详解:

(1)Stm32_Clock_Init 函数
在这里插入图片描述
Stm32_Clock_Init 函数的介绍,该函数的主要功能就是初始化 STM32 的时钟。其 中还包括对向量表的配置,以及相关外设的复位及配置。其代码如下:
STM32学习——串口通信,LED点灯(寄存器版本)_第7张图片
Stm32_Clock_Init 函数中,我们设置了 APB1 为 2 分频,APB2 为 1 分频,AHB 为 1 分频, 同时选择 PLLCLK 作为系统时钟。该函数只有一个参数 PLL,就是用来配置时钟的倍频数的, 比如当前所用的晶振为 8Mhz,PLL 的值设为 9,那么 STM32 将运行在 72M 的速度下。

(2).delay_init() 函数
在这里插入图片描述
delay_init() 函数 用来初始化 2 个重要参数:fac_us 以及 fac_ms;同时把 SysTick 的时钟源选择为外 部时钟,如果需要支持操作系统(OS),只需要在 sys.h 里面,设置 SYSTEM_SUPPORT_OS 宏 的值为 1 即可,然后,该函数会根据 delay_ostickspersec 宏的设置,来配置 SysTick 的中断时间, 并开启 SysTick 中断。具体代码如下:
STM32学习——串口通信,LED点灯(寄存器版本)_第8张图片
可以看到,delay_init 函数使用了条件编译,来选择不同的初始化过程,如果不使用 OS 的 时候,只是设置一下 SysTick 的时钟源以及确定 fac_us 和 fac_ms 的值。而如果使用 OS 的时候, 则会进行一些不同的配置,这里的条件编译是根据 SYSTEM_SUPPORT_OS 这个宏来确定的, 该宏在 sys.h 里面定义。 SysTick 是 MDK 定义了的一个结构体(在 core_m3.h 里面),里面包含 CTRL、LOAD、VAL、 CALIB 等 4个寄存器, SysTick->CTRL 的各位定义如图 所示:STM32学习——串口通信,LED点灯(寄存器版本)_第9张图片
SysTick-> LOAD 的定义如图所示:
在这里插入图片描述
SysTick-> VAL 的定义如图所示:
在这里插入图片描述
SysTick->CTRL&=0xfffffffb;这一句把 SysTick 的时钟选择外部时钟,这里需要注意的是: SysTick 的时钟源自 HCLK 的 8 分频,假设我们外部晶振为 8M,然后倍频到 72M,那么 SysTick 的时钟即为 9Mhz,也就是 SysTick 的计数器 VAL 每减 1,就代表时间过了 1/9us。

(3)uart_init(u32 pclk2,u32 bound)函数
在这里插入图片描述
uart_init(u32 pclk2,u32 bound)函数是串口 1 初始化函数。该函数有 2 个参数,第一个为 pclk2,是系统的时钟频率。第二个参数为需要设置的波特率,例如 9600,115200 等。而这个 函数的重点就是在波特率的设置,由于 STM32 采用了分数波特率,所以 STM32 的串口波特率 设置范围很宽,而且误差很小。 STM32 的每个串口都有一个自己独立的波特率寄存器 USART_BRR,通过设置该寄存器就 可以达到配置不同波特率的目的。其各位描述如图所示:
STM32学习——串口通信,LED点灯(寄存器版本)_第10张图片
前面提到 STM32 的分数波特率概念,其实就是在这个寄存器(USART_BRR)里面体现的。 USART_BRR 的最低 4 位(位[3:0])用来存放小数部分 DIV_Fraction,紧接着的 12 位(位[15: 4])用来存放整数部分 DIV_Mantissa,最高 16 位未使用。 这里,我们简单介绍一下波特率的计算,STM32 的串口波特率计算公式如下:
在这里插入图片描述
上式中, 是给串口的时钟(PCLK1 用于 USART2、 3、 4、 5,PCLK2 用于 USART1); USARTDIV 是一个无符号定点数。我们只要得到 USARTDIV 的值,就可以得到串口波特率寄 存器 USART1->BRR 的值,反过来,我们得到 USART1->BRR 的值,也可以推导出 USARTDIV 的值。但我们更关心的是如何从 USARTDIV 的值得到 USART_BRR 的值,因为一般我们知道 的是波特率,和 PCLKx 的时钟,要求的就是 USART_BRR 的值。 下面我们来介绍如何通过 USARTDIV 得到串口 USART_BRR 寄存器的值。假设我们的串 口 1 要设置为 115200 的波特率,而 PCLK2 的时钟为 72M。这样,我们根据上面的公式有:
USARTDIV=72000000/(11520016)= 39.0625
那么得到: DIV_Fraction=16
0. 0625=1=0X01;
DIV_Mantissa=39=0X27;
这样,我们就得到了 USART1->BRR 的值为 0X0271。只要设置串口 1 的 BRR 寄存器值为 0X0271 就可以得到 115200 的波特率。
接下来,我们就可以初始化串口了,需要注意的是这里初始化串口是按 8 位数据格式,1 位停止位,无奇偶校验位的。具体代码如下:
STM32学习——串口通信,LED点灯(寄存器版本)_第11张图片
三,仿真与下载

STM32学习——串口通信,LED点灯(寄存器版本)_第12张图片
STM32学习——串口通信,LED点灯(寄存器版本)_第13张图片

STM32学习——串口通信,LED点灯(寄存器版本)_第14张图片

STM32学习——串口通信,LED点灯(寄存器版本)_第15张图片

你可能感兴趣的:(STM32学习——串口通信,LED点灯(寄存器版本))