32入门-串口通信-发送和接收数据

目录

通信方式

硬件电路

软件部分

USART外设(同步/异步收发器)

波特率

引脚复用

初始化基本流程

发送

接收

语言简述

常用的函数

使用的结构体

引脚模式

打印数据的三种方法

使用printf


在实际的串口中,只能发送二进制数,也就是十六进制的最直接数据。如果想发送字符,就需要一个数据->字符的映射表(如ASCII表)

通信方式

全双工:两根线,数据的发送和接收互不影响。

半双工:一根线,一发一收。

单工:数据只能从一个设备到另一个设备。

举例子->

全双工:打电话。半双工:对讲机。单工:广播

有时钟线,同步通信

无时钟线,异步,甚至需要添加帧头帧尾使数据对齐。

单端信号(电平):它们引脚的高低电平都是对GND的电压差,所以单端通信的双方都必须共地,就是把GND接到一起。

而差分信号则不用。

硬件电路

TX、RX、GND是必须要接的,而VCC若两个设备都有独立供电,可以不接。 

使用TTL电平。

软件部分

 俩种形式

 有校验位就是9位数据位,没有就是8位。

 数据低位先行

预发送数据 0x0f    (H)0000 1111(L)

L->H

检验位采用奇偶校验的方法(如果数据错了可以丢弃或者重传)

        校验3法 : 无校验 奇校验 偶校验

  1. 无校验 如1帧10位 没有校验位
  2. 奇校验 包括校验位会出现奇数个1
  3. 偶校验 包括校验位会出现偶数个1

如 奇校验 0000 1111 总共4个1,于是校验位就会补一个1,保证其是奇数。

奇偶校验只能保证一定程度上的验出率,更高级还是得了解CRC校验。

USART外设(同步/异步收发器)

【注意】USART1是挂在APB2总线上的,而其他是在APB1总线上的。

STM32F103C8T6 USART资源 :USART1(APB2)、USART2、USART3(APB1)

开启时钟的时候需要控制。

波特率

波特率发生器就是分频器,APB时钟进行分频,得到发送和接收移位的时钟。

USART1挂载在APB2【中文参考手册---系统架构】,所以就是PCLK2的时钟,一般是72M。其余的是APB1,也就是36M。

然后进行分频。晶振除以一个USARTDIV的分频系数,分频完之后还要再除以16

引脚复用

   

初始化基本流程

参考中文手册USART部分

发送

接收

语言简述

  1. 开启外设,开启时钟,把需要用的USART和GPIO的时钟打开
  2. GPIO初始化,把TX配置成复用输出,RX配置成输出
  3. 配置USART,直接使用一个结构体
  4. 如果只需要发送功能,直接开启USART初始化就结束了。如果还需要接收还需要开启中断。在开启中断之前,再加上ITConfig和NVIC的代码。

常用的函数

使用的结构体

USART_InitTypeDef、

USART_ClockInitTypeDef【同步时钟,但是我们一般使用的是异步通信,所以不怎么用】

引脚模式

        TX是USART外设控制输出脚,所以选择复用推挽输出(GPIO_Mode_AF_PP);

        RX是USART外设数据输入脚,所以选择输入模式。输入模式并不分什么普通输入、复用输入,一根线只能有一个输出,但可以有多个输入。所以输入脚外设、GPIO都可以使用。RX一般是浮空输入or上拉输入。因为串口波形空闲状态是高电平,所以不采用下拉输入。

void USART_Config(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//GPIO配置控制
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;		//TX
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;		//RX
	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_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_ITConfig(USART1, USART_IT_RXNE, ENABLE);	
	
	//NVIC配置控制
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART1, ENABLE);

}

ctrl+alt +space 开启联想

打印数据的三种方法

        1、printf

        2、sprintf

        3、封装sprintf(进阶学习--->C语言可变参数)

使用printf

 还要进行重定向导入 stdio.h

printf->单。意思是只有一个串口可以使用。

sprintf->多。可以指定打印位置,不涉及重定向的东西。

格式+内容。 

 MicroLIB是keil为嵌入式平台优化的精简库,在keil里面使用printf函数要使用这个,然后还需要重定向,将怕printf函数打印的东西输出到串口。先include ->stdio.h,然后重写fputc(这个是printf的底层)

  • 38
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32CUBEIDE是一种用于开发STM32微控制器的集成开发环境。它支持多种串口通信协议,包括USART和UART。根据引用,STM32微控制器具有多个USART和UART接口。其中,USART1的时钟来源于APB2总线时钟,最大频率为72MHz,而其他四个USART和UART接口的时钟来源于APB1总线时钟,最大频率为36MHz,如引用所述。 要在STM32CUBEIDE中进行串口通信,可以使用USART和UART接口。根据引用,USART接口支持同步单向通信和半双工单线通信,并且还支持LIN、智能卡协议和IrDA SIR ENDEC规范以及调制解调器操作 (CTS/RTS)。而UART接口只支持异步传输功能,因此没有SCLK、nCTS和nRTS功能引脚,如引用所述。 要在STM32CUBEIDE中配置和使用串口通信功能,您可以按照以下步骤进行操作: 1. 打开STM32CUBEIDE集成开发环境,并创建一个新的工程或打开现有的工程。 2. 在工程中选择要使用的STM32微控制器型号,并配置时钟和引脚设置。 3. 在配置文件中找到串口配置部分,并选择要使用的USART或UART接口。 4. 根据您的需求,配置串口的参数,例如波特率、数据位数、停止位数、校验位等。 5. 在代码中编写相应的初始化函数和发送/接收函数,以实现串口通信功能。 6. 构建和烧录代码到STM32微控制器中,并连接电脑与微控制器的串口进行通信。 请注意,具体的配置和代码实现可能会根据您使用的具体STM32微控制器型号和通信需求而有所不同。因此,建议您参考相关的STM32CUBEIDE文档和参考手册,以获取更详细的指导和示例代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32F1与STM32CubeIDE快速入门-USART/UART串口通信](https://blog.csdn.net/wujuxKkoolerter/article/details/123263120)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【CubeIDE】STM32 HAL库史上最详细教程(一):UART串口收发](https://blog.csdn.net/qq_42652838/article/details/107776265)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值