stm32入门——串口通信实验

stm32入门——串口通信实验

基础概念
同步:在时钟信号下进行信息的传输,比如在每个时钟的上升沿进行一次传输。
异步:不用与时钟一起传输,但若想传输成功,传送方与接收方必须约定好传送速度——波特率。
单工:单方向传输,传送方(A)与接收方(B)固定,信息只能由A到B。
双工:双向传输,可同时接收、发送。即A既可以是传送方也可以是接收方,且A可以在接收的同时发送信息。
半双工:双向传输,但不可以同时接收、发送信息。
奇偶校验:传送的一组二进制数中1的个数为奇数,即为奇校验;1的个数为偶数,即为偶校验。
本次实验采用的是异步 双工 无校验的模式。

串口初始化

void uart_init(u32 pclk2,u32 bound)//设pclk2为72,bound为9600
{  	 
	float temp;
	u16 mantissa;
	u16 fraction;	   
	temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
	mantissa=temp;				 //得到整数部分
	fraction=(temp-mantissa)*16; //得到小数部分	 
    mantissa<<=4;
	mantissa+=fraction; 
	RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
	RCC->APB2ENR|=1<<14;  //使能串口时钟 
	GPIOA->CRH&=0XFFFFF00F;//IO状态设置
	GPIOA->CRH|=0X000008B0;//IO状态设置 
	RCC->APB2RSTR|=1<<14;   //复位串口1
	RCC->APB2RSTR&=~(1<<14);//停止复位	   	   
	//波特率设置
 	USART1->BRR=mantissa; // 波特率设置	 
	USART1->CR1|=0X200C;  //1位停止,无校验位.(接收使能、发送使能、uart使能、禁止检验)
#if EN_USART1_RX		  //如果使能了接收
	//使能接收中断 
	USART1->CR1|=1<<5;    //接收缓冲区非空中断使能	    	
	MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级 
#endif
}

主要功能:设置串口传输的波特率。
步骤简介:计算波特率、配置GPIO口、复位串口、配置传输约定、开启中断。

计算波特率
说是计算波特率,但其实是计算一个跟波特率一一对应的数值,将这个数值赋值给BRR寄存器,这样,我们调用函数时只需要输入想要配置的波特率即可。计算公式:
stm32入门——串口通信实验
这是手册中给出的USARTDIV(即BRR的值)的计算公式,算出USARTDIV后将它放入BRR中
stm32入门——串口通信实验
整数部分放在[15:4],小数部分放在[3:0],这里在计算小数部分时给真实的小数乘了16,比如USARTDIV为25.62,则实际存入[3:0]的数为16*0.62 = 9.92,最接近的整数是:10 = 0x0A,所以最终存入BRR[15:4]的为25,存入[3:0]的为10。

使能时钟和GPIO口设置没什么好说的,我的开发板上,接收端(RXD)为PA9、发送端(TXD)为PA10。
复位串口也是非必要的。

配置传输约定
这步比较重要
stm32入门——串口通信实验
stm32入门——串口通信实验
2、3位设置发送、接收使能。
stm32入门——串口通信实验
13位使能串口,12位设置字长。
stm32入门——串口通信实验
10位禁止校验。
stm32入门——串口通信实验
5位接收缓冲区非空中断使能,即串口接收到输入时会产生中断。
这段配置对应代码
USART1->CR1|=0X200C
USART1->CR1|=1<<5

MY_NVIC_Init(3,3,USART1_IRQn,2);这是配置中断优先级和分组的操作,不理解的话参考定时器中断和中断优先级简介
到这里,串口通信的设置就结束了,具体接收到数据后要如何操作,就看你在中断函数里面如何设置了。