正点原子STM32F4笔记 串口使用

在这里插入图片描述
1、初始化

  • 时钟
    串口时钟,引脚时钟
	RCC->AHB1ENR|=1<<0;   	//使能PORTA口时钟  
	RCC->APB2ENR|=1<<4;  	//使能串口1时钟 
  • 引脚复用初始化
	GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
	
 	GPIO_AF_Set(GPIOA,9,7);	//PA9,AF7
	GPIO_AF_Set(GPIOA,10,7);//PA10,AF7  	
  • 波特率设置
	//波特率设置
 	USART1->BRR=mantissa; 	//波特率设置	 
	USART1->CR1&=~(1<<15); 	//设置OVER8=0 
	USART1->CR1|=1<<3;  	//串口发送使能 
  • 是否使用中断
#if EN_USART1_RX		  	//如果使能了接收
	//使能接收中断 
	USART1->CR1|=1<<2;  	//串口接收使能
	USART1->CR1|=1<<5;    	//接收缓冲区非空中断使能	    	
	MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级 
#endif
  • 串口使能
	USART1->CR1|=1<<13;  	//串口使能

波特率设置 BRR寄存器
(尾数即整数部分)
在这里插入图片描述
计算公式
在这里插入图片描述
代码:USARTDIV=(float)(pclk21000000)/(bound16);//得到USARTDIV@OVER8=0

如果使用USART1,系统时钟为72MHZ,USART1使用PCLK2时钟,也定义为72MHz.

定义波特率=9600,fPCLK2=72MHz,则: 计算USARTDIV=72MHz/9600/16=468.75

取整数468=0x1D4. 小数0.75*16=12=0x0C. 所以写入寄存器USART_BRR中的值为:
0x1D4|0x0C=0x1D4C

USART_BRR=0x1D4C.

**说明一下:0.75*16=12=0x0C.
这是小数转十六进制的方法,乘16取整,一般省略后面的小数。
**

如果使用USART2,USART2使用PCLK1时钟,PCLK1时钟为36MHz.

定义波特率=9600,fPCLK1=36MHz,则: 计算USARTDIV=36MHz/9600/16=234.375

取整数234=0xEA.小数0.375*16=6=0x06.所以写入寄存器USART_BRR中的值为:USART_BRR=0xEA6.

正点原子计算代码

	float temp;
	u16 mantissa;
	u16 fraction;	  	
	temp=(float)(pclk2*1000000)/(bound*16);//得到**USARTDIV**@OVER8=0
	
	mantissa=temp;				 //得到整数部分(float变int,只取整数)
	fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0 
    mantissa<<=4;  //  整数部分在BRR寄存器的4-15位
	mantissa+=fraction; 
发布了82 篇原创文章 · 获赞 72 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/fzf1996/article/details/95878630