STM32入门笔记——串口通信

Posted 若你遇见她

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32入门笔记——串口通信相关的知识,希望对你有一定的参考价值。

通信基础知识

我们常见的单片机常见的通讯方式有:UART、IIC、SPI等等。按照其特点可以做一下分类。(个人理解的方式、若要深究并不一定与其完全一致。)

1、工作方式

单工只能单向传递信息。如接受端就只能接收,不能发送。
半双工:**可以双向通信,当是不能同时双向通信。**即同一时刻,一段只能接收或者发送。IIC
全双工可以实现同时双向的通信。UART、ISP

2、通讯方式

串行通信:把一组数据拆分为一位一位的传递,所使用的引脚的数量少、速度慢。(USRT、IIC等)
**并行通信:**一次性发送一组数据,需要的引脚数量多,速度快。

3、内部时钟

**同步方式:**带有时钟 IIC、SPI
**异步方式:**不带时钟 UART

则可以知道UART属于串行通信的异步全双工模式

STM32的UART

1、UART基础知识

stm10系列的串口引脚和配置图如下


经常使用的函数

1、USART_Init() 初始化串口
2、USART_ReceiveData() 读取数据函数
3、USART_SendData() 发送数据函数
。。。。还有很多暂时知道这么多
函数入口参数可以 goto 其定义查看

2、操作步骤

3、实例代码

void USB_Init(void)

	GPIO_InitTypeDef GPIO_InitStrue;               		          //声明GPIO结构体
	USART_InitTypeDef USART_InitStrue;						 //声明串口结构体
	NVIC_InitTypeDef  NVIC_InitStrue;                            //声明中断结构体 NVIC_InitStrue这部分是自己命名
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);     //GPIO时钟的使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);	 //串口1的时钟使能
	
	
	GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP;				 //设置为复用推挽
	GPIO_InitStrue.GPIO_Pin = GPIO_Pin_9;				                    //9号IO口
	GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz;			   //输出速率
    GPIO_Init(GPIOA,&GPIO_InitStrue);					                    	 //TX9的配置状态
	
	GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;      //浮空输入
	GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10;                                 //10号IO
	GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz;			  //输出速率
    GPIO_Init(GPIOA,&GPIO_InitStrue);				                		 //RX10的配置
	
	
	USART_InitStrue.USART_BaudRate = 115200;                 //波特率设置为115200
	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;	   //字长为8
	USART_Init(USART1,&USART_InitStrue);                                      //调用其Init函数
	
	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);                         //调用NVIC_INIT函数,将我们定义的结构体地址作为入口参数	


void USART1_IRQHandler(void)    **//只能使用这个函数名,具体查看STM32踩坑笔记**:

	u8 data;                                       //定义变量存储读取到的数据
	
	if(USART_GetFlagStatus(USART1,USART_IT_RXNE))  //判断中断是不是我们之前设置的中断,如果是值为1
	
		data  =  USART_ReceiveData(USART1);             //读取串口函数,并将其赋值
		USART_SendData(USART1,data);                    //将读取到的数据发送出去
		
	

主函数
 int main(void)
 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //在中断函数前就要调用
	 //2号分组,两位抢占优先级,两位响应优先级,其他具体分组查看参考手册
    USB_Init();
	 while(1);
	 
 

//关于指明中断的通道,详情见STM32F10x.h文件开头

其他中断服务函数入口参数(如GPIO的中断服务函数),参考以下文件

代码讲解:改代码实现的作用是使用串口与电脑通信,当电脑向发版发送数据就进入中断,让开发板将收到的数据发送回电脑。

敲黑板:1、对其GPIO使能后还需要对其串口使能,即需要使能两次。
2、中断部分,如果没有中断需要就可以不做配置

4、稀碎寄存器知识

1、u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记 在程序末尾必须手动置0
这里可以参考大佬文章:https://blog.csdn.net/JackCrum/article/details/99864683

可以通过USART_RX_BUF来按位读取接收到的字符
eg: s=USART_RX_BUF[0]-‘0’; 末尾减去这个’0‘的用法我还没摸透。百度好多也没有。
个人使用总结如下:
当串口返回值需要提取后再发送到电脑时。若要保证数据正常,正常必须去掉-’0‘
当该值是需要取出来做其他操作:数值运算就必须带上-’0‘,字符比较时就要去掉。

2、len=USART_RX_STA&0x3fff; //得到此次接收到的数据长度

3、USART_GetFlagStatus(USART1,USART_FLAG_TC) TC中断,用于判断寄存器数据是否发送完毕。

以上是关于STM32入门笔记——串口通信的主要内容,如果未能解决你的问题,请参考以下文章

K210学习笔记 K210与STM32串口通信相关

基于STM32F103入门4——串口通信

基于STM32F103入门4——串口通信

基于STM32F103入门4——串口通信

K210学习笔记 K210与STM32进行串口通信,K210收,STM32发

STM32学习笔记 二基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发