• STM32f103入门(12)USART串口信息发送+接收


    介绍

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

    TTL电平:+3.3V或+5V表示1,0V表示0
    RS232电平:-3-15V表示1,+3+15V表示0
    RS485电平:两线压差+2+6V表示1,-2-6V表示0(差分信号)

    串口参数
    波特率:串口通信的速率
    起始位:标志一个数据帧的开始,固定为低电平
    数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
    校验位:用于数据验证,根据数据位计算得来
    停止位:用于数据帧间隔,固定为高电平

    在这里插入图片描述
    在这里插入图片描述

    USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器
    USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
    自带波特率发生器,最高达4.5Mbits/s
    可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
    可选校验位(无校验/奇校验/偶校验)
    支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN
    STM32F103C8T6 USART资源: USART1、 USART2、 USART3
    在这里插入图片描述

    串口发送

    使用工具

    USB TO TTL

    初始化

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //初始化USART外设
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //由于USART外设在GPIOA 所以初始化GPIO
    	GPIO_InitTypeDef GPIO_InitStructure;		
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // TX 输出设置为复用推挽输出  这里只用到了发送 
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    ///usart初始化
    	USART_InitTypeDef USART_InitStructure;
    	USART_InitStructure.USART_BaudRate = 9600;  // 波特率
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    	USART_InitStructure.USART_Mode = USART_Mode_Tx; //需要发送还是接收  都可以选择
    	USART_InitStructure.USART_Parity = USART_Parity_No;  //校验位  不选择
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;  //停止位 1
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b; //不需要校验 所以字长选择8
    	USART_Init(USART1, &USART_InitStructure);
    	
    //开启usart
    	USART_Cmd(USART1, ENABLE);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    发送数据

    void Serial_SendByte(uint8_t Byte)
    {
    	USART_SendData(USART1, Byte);  //发送数据byte 到 USARTDR   然后再发送给移位寄存器 最后一位一位的移出TX引脚
    	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //等待传送到移位寄存器   
    	//不需要清零  在send data时自清零
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    重定向printf 使得printf输出到串口

    int fputc(int ch, FILE *f)  //由于 fputc是printf的底层 所以修改foutc函数
    {
    	Serial_SendByte(ch);
    	return ch;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    发送数组跟字符串

    void Serial_SendArray(uint8_t *Array, uint16_t Length)  //
    {
    	uint16_t i;
    	for (i = 0; i < Length; i ++)  
    	{
    		Serial_SendByte(Array[i]);
    	}
    }
    
    void Serial_SendString(char *String)
    {
    	uint8_t i;
    	for (i = 0; String[i] != '\0'; i ++)
    	{
    		Serial_SendByte(String[i]);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    接收数据

    初始化输入RX

    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5

    接收

    	while (1)
    	{
    		if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    	{
    			RxData = USART_ReceiveData(USART1); 
    			OLED_ShowHexNum(2, 1, RxData,2);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Centos部署Docker
    微信小程序能给花店带来哪些作用_分享花店微信小程序开发优势
    Java多线程详解
    上海市青少年算法2022年11月月赛(丙组)
    C#(Csharp)我的基础教程(三)(我的菜鸟教程笔记)-控件对象与窗体容器集合(Control)的探究与学习
    软件设计师_计算机网络_学习笔记
    计算机系统中丢失MSVCR100.dll的解决方法,三个方法快速搞定
    SpringMVC的工作流程及入门
    noise levels descript
    jQuery常用API--效果
  • 原文地址:https://blog.csdn.net/qq_52172364/article/details/132826684