STM32串口库函数配置

STM32串口库函数配置

什么是串口通信?

外部设备通过TXD,RXD两个端口和单片机进行通信。

STM32串口配置常用的相关库函数

USART_DeInit(); //复位
USART_Init(); //串口初始化
USART_Cmd(); //串口使能
USART_ITConfig(); //串口中断使能

USART_SendData(); //发送数据
USART_ReceiveData(); //接收数据

USART_GetFlagStatus(); //获取状态标志位
USART_ClearFlag(); //清除状态标志位

USART_GetITStatus(); //获取中断状态标志位
USART_ClearITPendingBit(); //清除中断状态标志位

串口配置过程(以USART1串口为例子,PA9和PA10)

①串口时钟使能

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);								//串口时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);								//复用功能时钟使能

②GPIO端口初始化

通过查表《stm32开发手册V10》的8.1.11查看端口复用为串口时,IO口应该设置成什么模式
在这里插入图片描述
PA9为TX,应该设置成推挽复用输出
PA10为RX,应该设置成浮空输入或上拉输入,这里我们选择浮空输入


	GPIO_InitTypeDef GPIO_Initstrue;

	GPIO_Initstrue.GPIO_Mode=GPIO_Mode_AF_PP;                        //推挽复用输出
	GPIO_Initstrue.GPIO_Pin=GPIO_Pin_9;
	GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_Initstrue);
																			
	GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;					//浮空输入
	GPIO_Initstrue.GPIO_Pin=GPIO_Pin_10;
	GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_Initstrue);

③串口复位(非必需)

USART_DeInit(USART1);

④串口参数初始化

	USART_InitTypeDef USART_Initstrue;

	USART_Initstrue.USART_BaudRate=115200;												//波特率为115200
	USART_Initstrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;     		//硬件流控制为无
	USART_Initstrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;								//收发使能
	USART_Initstrue.USART_Parity=USART_Parity_No;										//奇偶校验位为无
	USART_Initstrue.USART_StopBits=USART_StopBits_1;									//停止位为1
	USART_Initstrue.USART_WordLength=USART_WordLength_8b;								//字节数据长度为8为
	USART_Init(USART1,&USART_Initstrue);												//串口初始化函数

⑤使能串口

     USART_Cmd(USART1,ENABLE);

⑥开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)

	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	
	NVIC_InitTypeDef NVIC_Initstrue;
	NVIC_Initstrue.NVIC_IRQChannel=USART1_IRQn;						//在stm32f10x.h头文件里面找到
	NVIC_Initstrue.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Initstrue.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_Initstrue.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_Initstrue);

⑦编写中断处理函数

void USART1_IRQHandler(void)									//USART1_IRQHandler是在启动文件startup_stm32f10x_hd.s里面找到
	{															//该函数是一旦串口接收到数据,就进入到串口中断函数
		u8 flag;												//函数内再将接收到的数据原封不动的再发出去
		if(USART_GetITStatus(USART1,USART_IT_RXNE))
		{
			flag =USART_ReceiveData(USART1);
			USART_SendData(USART1,flag);
		}
	}

配置实例

void Init(void)
{
	GPIO_InitTypeDef GPIO_Initstrue;
	USART_InitTypeDef USART_Initstrue;
	NVIC_InitTypeDef NVIC_Initstrue;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);								//串口时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);								//复用功能时钟使能

	GPIO_Initstrue.GPIO_Mode=GPIO_Mode_AF_PP;                        //推挽复用输出
	GPIO_Initstrue.GPIO_Pin=GPIO_Pin_9;
	GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_Initstrue);
																			
	GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;					//浮空输入
	GPIO_Initstrue.GPIO_Pin=GPIO_Pin_10;
	GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_Initstrue);
	
	USART_DeInit(USART1);

	USART_Initstrue.USART_BaudRate=115200;												//波特率为115200
	USART_Initstrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;     		//硬件流控制为无
	USART_Initstrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;								//收发使能
	USART_Initstrue.USART_Parity=USART_Parity_No;										//奇偶校验位为无
	USART_Initstrue.USART_StopBits=USART_StopBits_1;									//停止位为1
	USART_Initstrue.USART_WordLength=USART_WordLength_8b;								//字节数据长度为8为
	USART_Init(USART1,&USART_Initstrue);												//串口初始化函数
	
	USART_Cmd(USART1,ENABLE);
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	
	NVIC_InitTypeDef NVIC_Initstrue;
	NVIC_Initstrue.NVIC_IRQChannel=USART1_IRQn;						//在stm32f10x.h头文件里面找到
	NVIC_Initstrue.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Initstrue.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_Initstrue.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_Initstrue);

}

void USART1_IRQHandler(void)									//USART1_IRQHandler是在启动文件startup_stm32f10x_hd.s里面找到
{															//该函数是一旦串口接收到数据,就进入到串口中断函数
		u8 flag;												//函数内再将接收到的数据原封不动的再发出去
		if(USART_GetITStatus(USART1,USART_IT_RXNE))
		{
			flag =USART_ReceiveData(USART1);
			USART_SendData(USART1,flag);
		}
}

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	Init();
	while(1);
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值