完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、目标
1、用STM32F103ZET6点亮LED灯(LED灯配置在PE4管脚上); 2、通过串口每秒向电脑发送一个“Heart!”。 二、步骤 1、创建环境 2.在LED.c中写入以下程序 在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。 GPIO 是挂载在 APB2 总线上的外设,相应的寄存器是:APB2 外设时钟使能寄存器(RCC_APB2ENR),见下图: GPIOE是在寄存器:RCC_APB2ENR的第六位。我们只需要把相应的位设置为1即可。见下图: 这样,我们可以使能GPIOE:RCC->APB2ENR |= 1<<6; 接着初始化IO模式,运用GPIOX->CRL. 选择模式:输出模式,最大速度50MHZ。复用推挽输出。 程序可以写成: 在我们设置相应的位之前,我们先把要设置的位清零。(利用和1相与不变,和0相与清零) GPIOE->CRL &=0xFFF0FFFF; 然后选择模式: GPIOE->CRL |=0x00030000; //PE4的工作模式 3.在test.c中写入以下程序 下面对delay_init() 函数 、delay_init() 函数、 uart_init(u32 pclk2,u32 bound)函数进一步详解: (1)Stm32_Clock_Init 函数 Stm32_Clock_Init 函数的介绍,该函数的主要功能就是初始化 STM32 的时钟。其 中还包括对向量表的配置,以及相关外设的复位及配置。其代码如下: 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 中断。具体代码如下: 可以看到,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 的各位定义如图 所示: 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 的分数波特率概念,其实就是在这个寄存器(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=160. 0625=1=0X01; DIV_Mantissa=39=0X27; 这样,我们就得到了 USART1->BRR 的值为 0X0271。只要设置串口 1 的 BRR 寄存器值为 0X0271 就可以得到 115200 的波特率。 接下来,我们就可以初始化串口了,需要注意的是这里初始化串口是按 8 位数据格式,1 位停止位,无奇偶校验位的。具体代码如下: 三,仿真与下载 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:21 , Processed in 0.840157 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号