本篇文章将讲述正点原子stm32mini板的串行通信原理,小白总结,如有错误,请大神指教。
目录
一、通信双方的两种通信方式
(1)并行通信
传输原理:数据各个位同时传输
优点:速度快
缺点:占用引脚资源多
(2)串行通信
传输原理:数据按位顺序传输
优点:占用引脚资源较少
缺点:速度相对较慢
(3)串行通信分类:
<1>单工通信:数据传输只支持数据在一个方向上传输。
<2>半双工通信:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。
<3>全双工通信:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式结合,它要求发送设备和接收设备都有独立的接收和发送能力。
串行通信的三种传送方式:
(4)串行通信的通信方式
<1>同步通信:带时钟同步信号传输——SPI,IIC通信接口
<2>异步通信:不带时钟同步信号——UART(通用异步收发器),单总线
二、STM32的串口通信接口
UART:通用异步收发器
USART:通用同异步收发器
三、硬件连接
串口的连接要RX连接TX,TX连接RX。
四、STM32UART异步通信方式特点:
(1)全双工异步通信。
(2)分数波特率发生器系统,提供精准的波特率——发送和接受共用的可编程波特率,最高可达4.5Mbits/s。
(3)可编程的数据字长度(8位或者9位)。
(4)可配置的停止位(支持1或者2位停止位)。
(5)可配置的使用DMA多缓冲器通信。
(6)单独的发送器和接收器使能位。
(7)检测标志:①接收缓冲器②发送缓冲器空③传输结束标志
(8)多个带标志的中断源,触发中断。
(9)其他:校验控制,四个错误检测标志。
五、STM32串口异步通信需要定义的参数:
①起始位②数据位(8位或9位)③奇偶校验位(第9位)④停止位(1,15,2位)⑤波特率设置
六、STM32串口寄存器库函数配置
(1)常用的串口相关寄存器:USART_SR状态寄存器、USART_DR数据寄存器、USART_BRR波特率寄存器。
(2)波特率计算方法
可以使用这个公式来计算波特率
(3)串口操作相关库函数(省略入口参数):
void USART_Init();//串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断
void USART_SendData();发送数据到串口,DR
uint16_t USART_ReceiveData();//接收数据,从DR读取接收到的数据
FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志位
(4)串口配置的一般步骤(一般这些函数工程模板里有,这块写出来只是熟悉一下函数的功能)
①串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
②串口复位:USART_DeInit();//这一步不是必须的
③GPIO端口模式设置:GPIO_Init();模式设置为GPIO_Mode_AF_PP
④串口参数初始化:USART_Init();
⑤开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
NVIC_Init();
USART_ITConfig();
⑥使能串口:USART_Cmd();
⑦编写中断处理函数:USARTx_IRQHandle();
⑧串口传输状态获取:FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx,uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx,uint16_t USART_IT);
七、串口通信实验代码
main.c里
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "stdio.h"
//ALIENTEK Mini STM32¿ª·¢°å·¶Àý´úÂë3
//´®¿ÚʵÑé
//¼¼ÊõÖ§³Ö£ºwww.openedv.com
//¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
int main(void)
{
u8 t;
u8 len;
u16 times=0;
Stm32_Clock_Init(9); //ϵͳʱÖÓÉèÖÃ
delay_init(72); //ÑÓʱ³õʼ»¯
uart_init(72,9600); //´®¿Ú³õʼ»¯Îª9600
LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
printf("\r\nÄú·¢Ë͵ÄÏûϢΪ:\r\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//µÈ´ý·¢ËͽáÊø
}
printf("\r\n\r\n");//²åÈë»»ÐÐ
USART_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
printf("\r\nALIENTEK MiniSTM32¿ª·¢°å ´®¿ÚʵÑé\r\n");
printf("ÕýµãÔ×Ó@ALIENTEK\r\n\r\n\r\n");
}
if(times%200==0)printf("ÇëÊäÈëÊý¾Ý,ÒԻسµ¼ü½áÊø\r\n");
if(times%30==0)LED0=!LED0;//ÉÁ˸LED,ÌáʾϵͳÕýÔÚÔËÐÐ.
delay_ms(10);
}
}
}
然后剩下的就和模板一模一样就好。