)
串口通信1、串口是一种应用十分广泛的通讯接口串口成本低、容易使用、通信线路简单可实现两个设备的互相通信。2、单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信极大地扩展了单片机的应用范围增强了单片机系统的硬件实力串口参数及时序波特率决定了每隔多少秒发送一位数据。校验可以选择三种方式无校验位奇校验位偶校验位判断发送数据出现1次数例如如果选择偶校验发送一个字节如果数据为0000 0111这时校验位要补1本节展示串口收发的功能通常使用波特率为96008位数据位即无校验位停止位长度为1的时序。USART简介USARTUniversal Synchronous/Asynchronous Receiver/Transmitter通用同步 / 异步收发器USART 是 STM32 内部集成的硬件外设可根据数据寄存器的一个字节数据自动生成数据帧时序及转化为协议规定的波形发送出去从 TX 引脚发送出去也可自动接收 RX 引脚的数据帧时序拼接为一个字节数据存放在数据寄存器里自带波特率发生器最高达 4.5Mbits/s可配置数据位长度8/9、停止位长度0.5/1/1.5/2可选校验位无校验 / 奇校验 / 偶校验支持同步模式、硬件流控制、DMA、智能卡、IrDA、LINSTM32F103C8T6 USART资源:USART1、USART2、USART3USART1是APB2总线的设备剩下的是APB1的设备USART基本结构初始化模板RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//把PA9配置为复用推挽输出供USART的TX使用GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;//复用推挽输出GPIO_InitStructure.GPIO_PinGPIO_Pin_9;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);//初始化PA10引脚GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;//可选浮空或上拉输入GPIO_InitStructure.GPIO_PinGPIO_Pin_10;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);//初始化USART 9600波特率 无流控 无校验 8位字长 1位停止位 选择发送和接收模式USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate9600;//波特率USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;//硬件流控制USART_InitStructure.USART_ModeUSART_Mode_Tx|USART_Mode_Rx;//串口模式同时开启接收和发送USART_InitStructure.USART_ParityUSART_Parity_No;//校验位选择无校验USART_InitStructure.USART_StopBitsUSART_StopBits_1;//停止位长度USART_InitStructure.USART_WordLengthUSART_WordLength_8b;//字长选择8位USART_Init(USART1,USART_InitStructure);//开启RXNE标志位到NVIC的输出USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//优先级分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannelUSART1_IRQn;//中断通道NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;NVIC_InitStructure.NVIC_IRQChannelSubPriority1;NVIC_Init(NVIC_InitStructure);USART_Cmd(USART1,ENABLE);代码为CSDN博主「sakabu」的 原文链接https://blog.csdn.net/sakabu/article/details/135857053由图可见USART1的TX和RX分别对应PA9和PA10引脚初始化PA9时要配置成复用推挽输出模式。关于USART的结构体参数USART_Mode需要接收或发送的哪一个功能就选哪一个两个都要就用“|”操作或起来。接受一个数据方法方法一查询在主函数里不断判断RXNE标志位如果置1了就说明收到数据了那再调用ReceiveData读取DR寄存器就行了。这里说明读完DR寄存器会自动帮我们清楚标志位无需再手动清除标志位。这里与发送数据同理也是等待发送寄存器TXE标志位置1说明已经发送一个数据就可以继续发送数据避免数据覆盖发送一个数据代码示例voidSerial_SendByte(uint8_tByte){USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET);//等待标志位为1}方法二模板里使用中断触发来接收数据首先开启RXNE到中断的通道用USART_ITConfig函数再配置NVIC优先级分组等参数中断函数示例voidUSART1_IRQHandler(void)//中断入口函数{if(USART_GetITStatus(USART1,USART_IT_RXNE))//读取中断标志位{//进入中断进行的操作Serial_RXDataUSART_ReceiveData(USART1);Serial_RXFlag1;USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}注意如果你读取了DR数据寄存器它会自动帮你清楚标志位如果没有读取需要手动清除