STM32 串口通信(库函数操作)

2018/4/5

1.说在前面:

清明三天小假期,放松一下无可厚非,但是,依旧要完成自己的学习任务

2.串口通信的简单介绍:

1.将串口作为一个沟通的渠道,可以和外界进行接收和发送信号

2.STM32和串口相关的寄存器:

2-1:USART_SR(状态寄存器):存储着MCU的一些状态

2-2:USART_DR(数据寄存器):暂存着一些数据信息

2-3:USART_BRR(波特率寄存器:暂存波特率信息

2-4:USART_CRI(控制寄存器):用于给usart进行使能

 

3.注:波特率的计算方法:



只要给出相应的时钟频率和设置usartdiv,就可以计算出波特率

3.串口通讯的简单配置和使用

1.其实基于库函数而言:需要有一个理顺的思路,知道每一步需要做什么,然后去寻找相应的库函数

2.怎样实现串口通讯呢?

1.串口时钟和GPIO时钟使能

2.串口复位(不必须)

3.GPIO设置:注意rxd和txd在设置过程中设置输入输出方法的不同(AF_PP|IN_FLOATING)

4.串口参数初始化(这里面要初始化蛮多参数的,但是要记住每个参数的设定,通信双方要约定参数一致)

5.开启中断,使能 NVIC

6.实现串口的使能

7.编写中断处理函数

8.实现串口数据的收发

9.实现串口传输状态获取

#include"stm32f10x.h"

void my_USART_Init()
	{
		GPIO_InitTypeDef GPIO_InitStruct;
		USART_InitTypeDef USART_InitStruct;
		NVIC_InitTypeDef  NVIC_InitStruct;
	//1.时钟使能
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//ENABLE THE GPIOA
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//ENABLE THE USART1
		
		//2.GPIOA9 init
		
		GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复位推挽输出
		GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9 ;
		GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
		GPIO_Init(GPIOA,&GPIO_InitStruct);
		//2.GPIOA10 init
		GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
		GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
		GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
		GPIO_Init(GPIOA,&GPIO_InitStruct);
		//3.usart init
		
		USART_InitStruct.USART_BaudRate=115200;//设置波特率
		USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//设置硬件流设置
		USART_InitStruct.USART_Mode= USART_Mode_Rx | USART_Mode_Tx;//设置模式
		USART_InitStruct.USART_Parity=USART_Parity_No;//不采用奇偶校验
		USART_InitStruct.USART_StopBits=USART_StopBits_1;//1位停止位
		USART_InitStruct.USART_WordLength=USART_WordLength_8b;//8位数据位
		
		USART_Init(USART1,&USART_InitStruct);
		
		//初始化某串口
		USART_Cmd(USART1,ENABLE);//´串口使能
		
		USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//实现中断
		//中断优先级
		
		NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
		NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
		NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
		NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
		NVIC_Init(&NVIC_InitStruct);
		
	}
	//中断处理函数
	void USART1_IRQHandler(void)
		{
			u8 res;
					if(USART_GetITStatus(USART1,USART_IT_RXNE))//ÅжÏÖжÏģʽ
					{
						res= USART_ReceiveData(USART1);
						USART_SendData(USART1,res);
					}
			
		}
	
int main()
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级
	my_USART_Init();
	while(1);
}

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值