1、通信
1.1 通信分类及作用
通信的作用:数据交互,向外传输-传递给别的设备;向内传输-处理应用;
有线:USB线、网线、CAN、LIN、 USART、SPI、IIC等
无线:蓝牙、WIFI、GSM、4G、5G、Lora、NBIOT、Zigbee等
MCU有什么通信接口:
串行传输:数字信号是8位二进制数。按照次序一个位一个位的传送,每传送完8位为一个字节,只用1个引脚传输一字节,高位先出(MSB)/低位先出(LSB),速度较慢,一般用于通信不要求速度的地方,模块直接沟通
并行传输:多个IO同时传输数据,速度较快,占用引脚较多;一般用于屏驱动,外扩内存
异步:发送端只管发送,接收端扫描接收,发送端和接收端没有相同的时钟线,但会要求通信双方通信速率保持一致; (波特率 比特/秒 :每秒传输数据的位数)
同步:发送端发送,同时接收端读取数据,发送端和接收端有相同的时钟线,通信双方受到同一根时钟线的控制; (时钟线常见的标志:CLK SCK SCLK SCL)
单工:只能往一个方向传输数据;(一个设备只能发送或是只能接收)
双工:设备可以双向通信;
全双工:可以同一时刻进行双向;同一时间内,能发送也能接收
半双工:不可以同一时刻双向;同一时间内,只能发送或是接收(不能同时实现接收和发送)
1.2 串口通信的相关参数
USART:串行同步/异步全双工 (通常使用串行异步全双工)
UART:串行异步全双工
速度上:波特率:1S发送的数据位数;
传输协议:数据传输的格式
起始位 数据位 奇偶校验位 停止位
1位 8/9位 1/0位 0.5/1/1.5/2
常用: 1 8 0 1
波特率为115200,则1字节传输需要的时间?10/115200
奇偶校验位:高电平的位是否为奇数还是偶数
串口发送:发送器
1. 通过在USART_CR1寄存器上置位UE位来激活USART ---------------------使能串口
2. 编程USART_CR1的M位来定义字长-------------------------------8、9位字长
3. 在USART_CR2中编程停止位的位数--------------------------------停止位
4. 如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中
的描述配置DMA寄存器。
5. 利用USART_BRR寄存器选择要求的波特率---------------------------波特率
6. 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送------使能发生器
7. 把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况
下,对每个待发送的数据重复步骤7。 -----------------------------------循环发送
8. 在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的
传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏
最后一次传输。 等待完成,关闭串口
串口接收:
1.将USART_CR1寄存器的UE置1来激活USART。
2.编程USART_CR1的M位定义字长
3.在USART_CR2中编写停止位的个数
4.如果需多缓冲器通信,选择USART_CR3中的DMA使能位(DMAR)。按多缓冲器通信所 要求的配置DMA寄存器。
5.利用波特率寄存器USART_BRR选择希望的波特率。
6.设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。
当一字符被接收到时,
● RXNE位被置位。它表明移位寄存器的内容被转移到RDR。换句话说,数据已经被接收并且
可以被读出(包括与之有关的错误标志)。
波特率计算:
这里的fCK是给外设的时钟(PCLK1用于USART2、3、4、5:36MHZ,PCLK2用于USART1:72MHZ)
USARTDIV是一个无符号的定点数。这12位的值设置在USART_BRR寄存器。
USARTDIV=fck/(16*baud);
例:USART1,设波特率为115200,则USARTDIV=39.0625
整数部分:DIV_Mantissa[11:0]=39
小数部分:DIV_Fraction[3:0]=0.0625*16=1 16进制数转10进制数
例2: 要求 USARTDIV = 25.62
就有: DIV_Fraction = 16*0.62 = 9.92 最接近的整数是:10 = 0x0A
DIV_Mantissa = mantissa (25.620) = 25 = 0x19 于是,USART_BRR = 0x19A
CR1:发送器使能、接收器使能、UE激活串口---置1
CR2:停止位-00
BRR:USARTDIV填写
SR:TXE、TC、RXNE
DR:TDR、RDR
串口:
物理引脚:TX:发送引脚 RX:接收引脚
使用过程:
- 开时钟:端口和外设时钟
- 设置使用引脚的IO模式;
- 外设功能;
- 使用外设;
#include "usart1.h"
#include "Delay.h"
#include "stdio.h"
void USART1_Config(uint32_t baud)
{
//开时钟,找到stm32f10x_rcc.h文件开启端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);//开启GPIOA,USART1端口时钟 ①
//PA9:---USART1_TX:复用推挽,先找到stm32f10x_gpio.h文件,先GPIO_Init(),
GPIO_InitTypeDef GPIO_InitStruct;//定义一个结构体变量 ③
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct); // ②
//PA10:--USART_RX:浮空输入
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//配置串口:
/*CR1:发送器使能、接收器使能、UE激活串口---置1
CR2:停止位-00
BRR:USARTDIV填写*/
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate=baud; //波特率
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制
USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1, &USART_InitStruct);//IO一般Init之后就可以使用,但是外设需要进行使能或者激活
//特别注意:外设初始化后需 使能 或者 激活 后才可以使用
USART_Cmd(USART1,ENABLE);
}
void USART1_SendStr( uint8_t *str )
{
while((USART1->SR &(0x01<<7))==0);
while(*str !='\0')
{
USART1_SendData(*str);
str++;
}
}
int fputc(int ch,FILE *P) //实现printf打印
{
USART1_SendData(ch);
return ch;
}
uint8_t USART1_ReceiveStr(void)
{
uint8_t str=0;
if(USART1->SR &(0x01<<5))
{
str=USART1->DR;
}
return str;
}
void USART1_SendData(uint8_t dat)
{
while((USART1->SR &(0x01<<7))==0);
USART1->DR = dat;
}
uint8_t USART1_ReceiveData(void)
{
uint8_t dat=0;
if(USART1->SR &(0x01<<5))
{
dat = USART1->DR;
}
return dat;
}
XCOM串口调试助手: