STM32寄存器配置USART1串口及USART->BRR值的计算

STM32寄存器配置串口USART1及USART->BRR值的计算

main.c

#include "stm32f10x.h" // Device header
#include "SYSCLK.h"
#include "USART.h"

int main()
{
    CLK_Init(); //时钟初始化
	Serial_Init();//串口初始化
	Serial_SendByte(0xaa);//串口初始化成功验证
    while (1)
    {
    }
}

Serial.c

#include "stm32f10x.h"                  // Device header

void Serial_Init()
{
	/*开启RCC->APB2上GPIOA、AFIO、USART1的时钟*/
	RCC->APB2ENR|=0x00004005;
	
	/*GPIOA9为复用推挽50MHz输出,8至15口在CRH寄存器中配置,0至7口在CRL寄存器中配置*/
	GPIOA->CRH|=0x000000b0;
	
	/*清除STOP[13:12]位,00:一个停止位,Clock, CPOL, CPHA and LastBit用默认的0 */
	USART1->CR2&=0xcfff;
	
	/* Clear M, PCE, PS, TE and RE bits */
	USART1->CR1&=0xe9f3;
	
	/* 字长8:0x0000 奇偶校验无:0x0000 发送模式:0x8000 */
	/*0x0000|0x0000|0x8000=0x8000*/
	USART1->CR1|=0x0008;
	
	/* Clear CTSE and RTSE bits */
	USART1->CR3&=0xfcff;
	
  /* 不启用硬件控制流:0x0000 */
	USART1->CR3|=0x0000;
	
	/*波特率设置:9600*/
	USART1->BRR=0x00001d4c;
	
	/*开启USART1*/
	USART1->CR1|=0x2000;
}

void Serial_SendByte(unsigned int Byte)
{
	/*等待发送完毕*/
	//写在上面更好,写完DR后CPU不需要等待,可以继续执行任务,由硬件自动发送,
	//如果下一次发送,硬件还在发送,这时cpu就会等待,如果放在下面,每次发送
	//CPU都要等待硬件发送完成。
	while((USART1->SR&0x80)==0x00);
	/*DR*/
	USART1->DR=Byte&0x01ff;
}

SYSCLK.c

#include "stm32f10x.h"                  // Device header

/*时钟源为外部晶振,9倍频,SYSCLK为72MHz,APB2不分频,APB1二分频*/
void CLK_Init()
{
  /*打开HSE*/
  RCC->CR |= RCC_CR_HSEON;
  /* 等待HSE等待完毕 */
  while ((RCC->CR & RCC_CR_HSERDY) == 0)
  {
  }
  /*时钟源选择为 HSE,进行9倍频 SYSCLK = HSE*9 = 8MHz*9 = 72MHz */
  RCC->CFGR |= RCC_CFGR_PLLMULL9;
  RCC->CFGR |= RCC_CFGR_PLLSRC;

  FLASH->ACR |= FLASH_ACR_LATENCY_2; // FLASH缓冲

  /* 使能PLL倍频器 */
  RCC->CR |= RCC_CR_PLLON;
  /* Wait till PLL is ready */
  while ((RCC->CR & RCC_CR_PLLRDY) == 0) // 等待PLL倍频器就绪
  {
  }
  /* SYSCLK预分频系数为1,即不分频 */
  RCC->CFGR |= RCC_CFGR_HPRE_DIV1;

  /* APB2预分频系数为1,即不分频 =SYSCLK */
  RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
  //
  //    /* APB1预分频系数为2,即 APB2 = SYSCLK/2 */
  RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;

  /* 复位时钟源选择,并将时钟源选择为PLL */
  RCC->CFGR &= (~(RCC_CFGR_SW));
  RCC->CFGR |= RCC_CFGR_SW_PLL;
  //
  /* 等待时钟源选择完成置位 */
  while ((RCC->CFGR & RCC_CFGR_SWS) != 0x08)
  {
  }
}

USART->BRR寄存器计算

BRR寄存器:

在这里插入图片描述

BRR计算

  1. fck是时钟频率,这里我们假设72000000Hz,如果需要设置的波特率为115200,那我们可以计算出USARTDIV = 39.0625
  2. 位4到位15表示整数部分也就是39(十进制)---->0x27
  3. 位0到位3表示小数部分也就是 0.0625 *16 ---->0x01
  4. 即 USART->BRR = 0x0271
  5. 同理,如果配置波特率为9600,fck =72MHz, USART->BRR = 0x1d4c
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱休息的kitty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值