STM32单片机通信-串口通信编程实例学习(1)

 

STM32单片机通信-串口通信学习(0)

 

STM32串口编程

参考官方文档

串口常用的相关寄存器

USART_SR 状态寄存器

USART_DR数据寄存器

USART_BRR波特率寄存器

串口波特率配置

波特率计算公式

 

fPCLKx:串口的时钟,从手册中Memory map和Clock tree可得知,

fpclkx分为:fpclk1用于AHB1中USART2、USART3、USART4、USART5 ,fpclk2 用于AHB2中USART1

 

 

Baud Rate:需要设定的波特率

USARTDIV:一个无符号浮点数值

 

举例:

最大fPCLK2 = 72M   Baud Rate = 115200

USARTDIV = 72000000/(16*115200)=39.0625

查看手册

 

DIV_Mantissa=16*0.0625≈1=0x01

DIV_Fraction=39=0x27

因此我们就可以设置USART1->BRR = 0x0271,也就是我们配置了此时的串口波特率为115200

串口编程常用库函数

详细信息查看官方库函数stm32f10x_usart.hstm32f10x_usart.c文件

/*串口初始化:波特率,数据字长,奇偶校验等等*/
void USART_Init(); 
/*使能串口 */
void USART_Cmd();
/*使能相关中断 */
void USART_ITConfig();
/*发送数据到串口,DR寄存器*/
void USART_SendData();
/*接受数据,从DR读取接受到的数据 */
uint16_t USART_ReceiveData();
/*获取状态标志位 */
FlagStatus USART_GetFlagStatus();
/*清除状态标志位*/
void USART_ClearFlag();
/*获取中断状态标志位*/
ITStatus USART_GetITStatus();
/*清除中断状态标志位*/
void USART_ClearITPendingBit();

实例编程

void Demo_USART1_Init(void)
{
	/*GPIO_InitStrue通用IO口相关参数配置*/
	GPIO_InitTypeDef GPIO_InitStrue;
	/*USART_InitStrue串口参数相关配置*/
	USART_InitTypeDef USART_InitStrue;
	/*NVIC_InitStrue中断优先级相关参数配置*/
	NVIC_InitTypeDef NVIC_InitStrue;

	/*使能RCC_APB2Periph_GPIOA时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	/*使能RCC_APB2Periph_USART1时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

	/*配置GPIO_Pin_9参数*/
	GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
	/*初始化GPIO_Pin_9*/
	GPIO_Init(GPIOA,&GPIO_InitStrue);

	/*配置GPIO_Pin_10参数*/
	GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
	/*初始化GPIO_Pin_10*/
	GPIO_Init(GPIOA,&GPIO_InitStrue);

	/*配置串口参数:波特率,数据字长,奇偶校验*/
	USART_InitStrue.USART_BaudRate=115200;/*使用库函数的好处就是不用程序员亲自计算BRR寄存器设置*/
	USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
	USART_InitStrue.USART_Parity=USART_Parity_No;
	USART_InitStrue.USART_StopBits=USART_StopBits_1;
	USART_InitStrue.USART_WordLength=USART_WordLength_8b;
	/*初始化串口*/
	USART_Init(USART1,&USART_InitStrue);
	/*使能串口1USART1中断*/
	USART_Cmd(USART1,ENABLE);
	/*如果想要开启中断,则开启接收接收中断*/
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

	/*配置中断优先级参数*/
	NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
	/*初始化中断响应优先级*/
	NVIC_Init(&NVIC_InitStrue);	
}

/*实现中断函数*/
void USART1_IRQHandler(void)
{
	u8 rec_data;
	if(USART_GetITStatus(USART1,USART_IT_RXNE))
	{
		rec_data= USART_ReceiveData(USART1); 
		USART_SendData(USART1,rec_data);   
	}
}
 
int main(void)
{	
	/*必须在配置中断之前初始化中断优先级分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	Demo_USART1_Init();
	while(1);
}

猜你喜欢

转载自blog.csdn.net/yuupengsun/article/details/107054457