声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照正点原子的视频和文档的实际顺序梳理,转载请注明出处。
作者:sumjess
适用:这个视频我已经看过3遍了,总会有忘记的,所以来写这本书的随手笔记,记录重点、易忘点。该博客可以当做字典,也可以当做笔记。
目前内容:串口通信
 
一、常见的串行通信接口:

二、STM32的串口通信接口:

UART:通用异步收发器

USART:通用同步异步收发器

大容量STM32F10x系列芯片,包含3USART2UART

三、UART异步通信方式引脚连接方法:

-RXD:数据输入引脚。数据接受。

-TXD:数据发送引脚。数据发送。

四、UART异步通信方式引脚:

-RXD:数据输入引脚。数据接受。

-TXD:数据发送引脚。数据发送。

五、UART异步通信方式特点:
全双工异步通信。

分数波特率发生器系统,提供精确的波特率。

     -发送和接受共用的可编程波特率,最高可达4.5Mbits/s

可编程的数据字长度(8位或者9位);

可配置的停止位(支持1或者2位停止位);

可配置的使用DMA多缓冲器通信。

单独的发送器和接收器使能位。

检测标志:① 接受缓冲器  ②发送缓冲器空 ③传输结束标志

多个带标志的中断源。触发中断。

其他:校验控制,四个错误检测标志。

六、串口通信过程:

七、STM32串口异步通信需要定义的参数:

 起始位

 数据位(8位或者9位)

 奇偶校验位(第9位)

 停止位(1,15,2位)

 波特率设置

八、常用的串口相关寄存器:
USART_SR状态寄存器

USART_DR数据寄存器

USART_BRR波特率寄存器

九、串口操作相关库函数(省略入口参数):
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();//清除中断状态标志位

FlagStatus USART_GetFlagStatus(USART_TypeDefUSARTx, uint16_t USART_FLAG);

void USART_SendData(USART_TypeDefUSARTx, uint16_t Data);

uint16_t USART_ReceiveData(USART_TypeDefUSARTx);

void USART_Init(USART_TypeDefUSARTxUSART_InitTypeDefUSART_InitStruct);

十、波特率计算方法:

十一、串口配置的一般步骤:
①串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();

②串口复位:USART_DeInit(); 这一步不是必须的

③GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF_PP

④串口参数初始化:USART_Init();

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

      NVIC_Init();

      USART_ITConfig();

⑥使能串口:USART_Cmd();

⑦编写中断处理函数:USARTx_IRQHandler();

⑧串口数据收发:

void USART_SendData();//发送数据到串口,DR

uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

⑨串口传输状态获取:

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

十二、Printf支持:

//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ int handle; 
}; 
 
FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 
{ x = x; } 
 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
   return ch;
}
#endif 
复制

#define USART_REC_LEN   200    //定义最大接收字节数 200

 u8  USART_RX_BUF[USART_REC_LEN];

              //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符

u16 USART_RX_STA;           //接收状态标记 

define USART_REC_LEN   200    //定义最大接收字节数 200

程序要求,发送的字符是以回车换行结束(0x0D,0x0A)