通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的 外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据 组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。 使用多缓冲器配置的DMA方式,可以实现高速数据通信。物理层1.通讯结构串口通讯的物理层的主要标准是RS-232标准,其规定了信号的用途、通讯接口及信号的电平标准,其通讯结构如下:在设备内部信号是以TTL电平标准传输的,设备之间是通过RS-232电平标准传输的,而且TTL电平需要经过电平转换芯片才能转化为RS-232电平,RS-232电平转TTL电平也是如此。2.电平标准根据使用的电平标准不同,串口通讯可分为 RS-232标准 及TTL标准,具体标准如下:在电子电路中常使用TTL的电平标准,但其抗干扰能力较弱,为了增加串口的通讯距离及抗干扰能力,使用RS-232电平标准在设备之间传输信息,经常使用MA3232芯片对TTL电平及RS-232电平进行相互转换。协议层--RS232协议
开始位 +数据位 +奇偶检验位 +停止位数: 1 5~8 0~1 1~2 电平: 0 0/1 0/1 1
开始位:产生 1 个下降沿,通知接收设备,准备接收数据。 数据位:7/8 位 -- 存储字节为单位/ascii 码 -- 8 位为主 奇偶校验位:奇偶校验 -- 判断数据在发送过程中是否出现错误 -- 一般不使用(现在使用 CRC 校验) ,判断数据位中 1 的个数+奇偶位中 1 的个数。奇校验:位数必须为奇数 偶校验:位数必须为偶停止位:1~2 位,高电波特率的计算公式:PCLK2 -- APB2 时钟 -- 72MHz 公式中已知量:fck 和波特率 求得USARTDIV = fck/(波特率16) 例如:假设波特率为 9600USARTDIV = 468.75波特率寄存器:电脑连接串口需要用到usb转串口模块,带闹闹需要安装CH340的驱动实现串口通信的基本步骤:1,配置 GPIO 口模式2,配置 USART1 2.1 打开 USART1 的时钟 2.2 USART1:全双工、RS232 协议+波特率 2.3 使能串口3,编写数据收发函数
oid Usart_Config(void){//配置端口 PA9 PA10RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//2.配置端口GPIO_InitTypeDef GPIO_PortA;//定义结构体变量GPIO_PortA.GPIO_Speed = GPIO_Speed_50MHz;//速度GPIO_PortA.GPIO_Mode = GPIO_Mode_IN_FLOATING;//模式GPIO_PortA.GPIO_Pin = GPIO_Pin_10; //引脚GPIO_Init(GPIOA,&GPIO_PortA);GPIO_PortA.GPIO_Mode = GPIO_Mode_AF_PP;//模式GPIO_PortA.GPIO_Pin = GPIO_Pin_9;//引脚GPIO_Init(GPIOA,&GPIO_PortA);//USART配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);USART_InitTypeDef USART_InitStructure;//定义结构体USART_InitStructure.USART_BaudRate = 115200; //定义波特率USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_Init(USART1, &USART_InitStructure);//初始化USART_Cmd(USART1, ENABLE);//使能}//发送函数void Usart1_Tx(uint16_t data){//发送数据时,确保前面的数据发送完成while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==0) {};USART_SendData(USART1,data);}//接受数据uint16_t Ustart1_Rx(void){uint16_t data;//接受数据时,确保前面的数据接受完成while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==0) {};data = USART_ReceiveData(USART1);return data;}int fputc(int c, FILE str){Usart1_Tx(c);return c;}
重写fputc函数可以实现像串口输出数据的功能,同时需要在设置中进行以下配置,然后我们就可以在程序中使用printf函数像串口调试软件输出数据。
0 评论