基于HAL库的stm32f103c8t6 串口通信实验(查询方式)

目录

一、串口一些基本知识

         1. 串口通信(Serial Communications)

          2. RS-232通信协议

       3. RS232电平与TTL电平的区别 

       4. "USB/TTL转232"模块(以CH340芯片模块为例)的工作原理

二、配置STM32CubeMX环境

        1.  选择stm32f03c8t6芯片

         2.  配置RCC

          3. 配置sys

          4. 配置UART1

            5.  配置时钟

       6. 工程配置

三、串口查询方式发送与接收函数介绍 

           1.  发送函数 HAL_UART_Transmit 

      2. 接收函数 HAL_UART_Receive

四、程序思路和编写

    1. 程序思路

     2. 程序编写

    五、烧录程序效果与仿真查看波特率

      1. 实物效果

      2. 仿真查看波特率

六、总结与参考


一、串口一些基本知识

         1. 串口通信(Serial Communications)

        串口通信指两个或两个以上的设备使用串口按位(bit)发送和接收字节。可以在使用一根线发送数据的同时用另一根线接收数据。 串口通信协议就是串口通讯时共同遵循的协议。 协议的内容是每一个bit 所代表的意义。 常用的串口通信协议 有以下几种
1         RS-232(ANSI/EIA-232标准) 只支持 点对点, 最大距离 50英尺。最大速度为128000bit/s, 距离越远 速度越慢。 支持全双工(发送同时也可接收)。
2         RS-422(EIA RS-422-AStandard),支持点对多一条平衡总线上连接最多10个接收器 将传输速率提高到10Mbps,传输距离延长到4000英尺(约1219米),所以在100kbps速率以内,传输距离最大。支持全双工(发送同时也可接收)。
3         RS-485(EIA-485标准)是RS-422的改进, 支持多对多(2线连接),从10个增加到32个,可以用超过4000英尺的线进行串行通行。速率最大10Mbps。支持全双工(发送同时也可接收)。2线连接时 是半双工状态。

c9d5df27905442ecb313be4ff98b4e69.png

          2. RS-232通信协议

          RS-232C 标准(协议)的全称是 EIA-RS-232C 标准,其中EIA (Electronic Industry Association)代表美国电子工业协会,RS(recommended standard)代表推荐标准,232是标识号,C代表RS232的最新一次修改(1969),在这之前,有RS232B、RS232A。它规定连接电缆和机械、电气特性、信号功能及传送过程。常用物理标准还有EIARS-422A、EIA RS-423A、EIARS-485。这里只介绍EIA RS-232C(简称232,RS232)。例如,目前在IBM PC机上的COM1、COM2接口,就是RS-232C接口。

        RS232的工作方式是单端工作方式,这是一种不平衡的传输方式,收发端信号的逻辑电平都是相对于信号地而言的,RS232最初是DTE(数字终端设备)和DCE(数据通信设备)一对一通信,也就是点对点,一般是用于全双工传送,也可以用于半双工传送。采用负逻辑传送,规定逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15 V。选用该电气标准的目的在于提高抗干扰能力,增大通信距离。RS -232的噪声容限为2V,接收器将能识别高至+3V的信号作为逻辑“0”,将低到-3 V的信号作为逻辑“1”。

如DB9接口:

9f4b38daf1814b7cb87fc8c38c45da88.png

  19bdf645bd01449aa98b66dbc446ff1e.png

 在进行通信时,需要接地,然后发送端的接收端RX、TX反向连接

       3. RS232电平与TTL电平的区别 

TTL电平标准:

输出 L: <0.8V ; H:>2.4V。

输入 L: <1.2V ; H:>2.0V

TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。

RS232标准:

采用负逻辑电平:
  逻辑1为-3~-15V的电压 
  逻辑0为3~15V的电压 

2735bfca0ec3469ebfa0b1838ed5428e.png


       4. "USB/TTL转232"模块(以CH340芯片模块为例)的工作原理

            CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。为了增加串口通讯的远距离传输及抗干扰能力,RS-232标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。常常会使用 MH340芯片对 USB/TTL与RS-232电平的信号进行转换。

          CH340驱动就是USB转串口的驱动的一种,因为我们现在的电脑上,已经不存在串口,所以我们一般使用USB转串口芯片,目的只有一个,把电脑的USB口映射为串口用。常用的USB转串口芯片有CH340、CP2102、PL2303、FT232等。芯片是CH340的均可以使用。安装CH340驱动之后,我们使用的开发板子(单片机)连接串口就可以正常发挥其功能了。电脑usb电平转为TTL电平。

           电路原理图:

4063926da0a647038c6e4b7cec0a47f6.png

二、配置STM32CubeMX环境

        1.  选择stm32f03c8t6芯片

0f78bb15158149009d0471dab7a785d9.png

         2.  配置RCC

51253c5c996f475da0d72c27108e2a88.png

          3. 配置sys

34d0c22ba06a413b87bdb2e848eba8b9.png

          4. 配置UART1

6113098f54424707b4ebb3050f0f4ebd.png

1892bde9772048ceafed645945df758e.png

            5.  配置时钟

86536071cf9649d0a3de44597c0bfa2b.png

       6. 工程配置

2297c5f129624f6ea7d897fc17976905.png

 7a6401756faf4bb1ae5368cccd3e9493.png 最后点击生成代码即可 

三、串口查询方式发送与接收函数介绍 

           1.  发送函数 HAL_UART_Transmit 

           HAL_UART_Transmit是HAl库中的UART接口的数据发送函数,用于将指定长度的数据发送到UART端口。该函数是调用底层的HAL_UART_Transmit_IT或者HAL_UART_Transmit_DMA函数实现,可以实现中断或者DMA方式发送。

 函数定义:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)

 该函数有四个参数

第一个参数是串口结构体,指明是哪个串口,如UART1

第二个参数是8bit位的的数据

第三个参数是指明发送数据的长度大小

第四个参数规定发送的时间,如果超时还没有发送完成,则返回超时标志(HAL_TIMEOUT)

常用的形式为:

const uint8_t len=4;//发送的数据大小
uint8_t SendBuff[16]="Hello Windows!\n";//发送的数据
HAL_UART_Transmit(&huart1,SendBuff,&len,100);//通过UART1发送,且超时限制为100

      2. 接收函数 HAL_UART_Receive

  HAL 库操作 USART_DR 寄存器读取串口接收到的数据的函数是:

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, 
uint8_t *pData, uint16_t Size, uint32_t Timeout);

 该函数和发送函数参数是差不多的,即将接收到的数据存储到 *pData位置,大小为size,同样也是时间管理机制,不能超过Timeout

例如需要接收大小为5的数据给接收数组:

const uint8_t len=5;//发送的数据大小
uint8_t ReBuff[5];//接收数组
HAL_UART_Transmit(&huart1,ReBuff,&len,100);//通过UART1接收,且超时限制为100

四、程序思路和编写

    1. 程序思路

            该程序是使用轮询模式进行串口通信,轮询模式是指一直在循环中判断接收,或者选择发送。实现一个简单的功能,如果电脑通过串口调试助手给单片机发送”*“,单片机就每隔1s给电脑发送”Hello Windows!“,如果PC发送”#“,单片机就停止发送。

     2. 程序编写

           1.  变量定义


char  SendBuff[16]="Hello Windows!\n"; //发送数组
char ReBuff[1];// 接收数组 1个字符

            2. 主函数编写 

int main(void)
{

   char ch;
   uint8_t flag;
   HAL_Init();
   SystemClock_Config();
   MX_GPIO_Init();
   MX_USART1_UART_Init();
   while (1)
  {
	HAL_UART_Receive(&huart1,(uint8_t *)ReBuff,1,100);
		ch=ReBuff[0];
		if(ch=='#')
		flag=0;
		if(ch=='*')
		{
		flag=1;
		}
		if(flag==1)
		{
    HAL_UART_Transmit(&huart1,(uint8_t *)SendBuff,sizeof(SendBuff),100);
		HAL_Delay(500);
	  }
  }

    五、烧录程序效果与仿真查看波特率

      1. 实物效果

b718440aae474110b81cb588b520631a.gif

      2. 仿真查看波特率

      修改主函数,直接500ms发送一次“Hello Windows!”:

while (1)
  {
		 HAL_UART_Transmit(&huart1,(uint8_t *)SendBuff,16,100);
		 HAL_Delay(500);
  }

      仿真查看波形需要修改一下源码,直接在while1中调用流水灯程序,查看电平持续时间,仿真需要的MDK配置:

ac0a2abb1c0f40fabd543f7b39a5c405.png

  f0d60eae12f94911b572131ce51aafed.png

 波形:38f32cad914e4795b3654612255e1041.png

建立窗口查看查看输出:

c989b071cbd940959bf2736311db8824.png

4059955cf1944c6999d455454d197e66.png

分析:

            9c5f9cde635040bf99e886f6807926d7.png 从仿真波形上可以看出,发送总共花费时间1.402347ms

在程序中,总共发送“Hello World!\n”共16个字符,一个字符8个bit,在次实验中,包含停止位1位,开始位1位,因此一个字符的帧结构总共10bit

所以上面的那一段波形总共发送了160bit,花费时间1.402347ms

那么波尔率为;

160000/1.402347

398c8ffea1f340bc91c49985192ea3c9.png

 通过计算出波特率为114094hz,这与我们配置的115200hz

误差将近1khz

六、总结与参考

        1. 通过此次实验成功完成了串口通信的轮询模式,轮询模式是指在循环中一直判断接收到的信息,判断是否是我们想要的结果,然后取执行我们需要执行的内容。但是这样是十分占用CPU的资源的,就和之前的流水灯实验一样,一直判断某个端口是否为高电平,是就执行流水灯,这两种做法都是十分占用CPU资源的,后面可以通过中断或者DMA的方式进行改进,最好的方式是DMA(直接内存访问),该方式是不用通过CPU的,中断还需要通过CPU。

         2. 通过仿真查看波形,我们计算出发送160个bit总共花费时间1.402347ms,计算出波特率为114094hz,分析误差的原因:在查看发送开始和完成的时间差时,是通过标线的方式查看的,因此这里会出现一些小的偏差,还有一方面的原因是仿真本身的原因,但是通过串口查看窗口可以看出,我们发送的信息的确是“Hello Windows!\n”,逻辑上面是没有出现错误的,但是也存在一些问题,无法通过波形

         3. 通过此次实验,熟悉了一些串口通信的常识和通信协议。

参考:

【精选】RS-232/RS-485/RS-422通信协议介绍_rs422-CSDN博客

了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别,了解“USB/TTL转232“模块(以CH340芯片模块为例)的工作原理。_ch340c转232原理图_毛哥的博客的博客-CSDN博客

源码下载:

交流群 :456948834

<think>嗯,用户想要找关于STM32F103C8T6使用HAL配置USART2的资料或代码示例,以及初始化与使用的教程。首先,我需要回忆一下STM32HAL配置串口的一般步骤,特别是USART2的具体配置。 首先,用户提到的STM32F103C8T6,这款芯片属于STM32F1系列,USART2对应的引脚应该是PA2和PA3,因为根据数据手册,USART2_TX是PA2,USART2_RX是PA3。所以在配置的时候需要确认这两个引脚是否正确配置为复用推挽输出和浮空输入模式。 接下来,使用HAL的话,通常会用STM32CubeMX工具来生成初始化代码,这样可以简化配置过程。用户可能已经知道这一点,但作为教程,还是需要详细说明步骤。比如在CubeMX中选择USART2,设置模式为异步,配置波特率、数据位、停止位、校验位和流控制等参数。然后生成代码,这样HAL_UART_Init()函数就会被自动生成,同时时钟配置和GPIO初始化也会完成。 然后需要考虑中断和DMA的问题。如果用户需要中断接收,就需要在CubeMX中使能USART2的中断,并实现相应的回调函数,比如HAL_UART_RxCpltCallback。如果是DMA方式,需要配置DMA通道,这可能涉及到DMA1的通道6或7,具体要看参考手册。这部分可能需要进一步确认,确保DMA配置正确,避免数据冲突或者传输错误。 接下来是代码示例部分。用户可能需要发送和接收的基本函数,比如使用HAL_UART_Transmit和HAL_UART_Receive,或者中断方式的接收。在示例代码中,需要展示初始化后的发送和接收流程,比如在main函数中发送字符串,然后在中断回调中处理接收到的数据。同时,可能需要提到错误处理,比如检查HAL函数的返回值,确保传输正常。 另外,用户提供的参考引用中有实验报告和移植uC/OS-III的内容,可能需要考虑是否涉及操作系统下的串口使用,但用户当前的问题可能更基础,所以先专注于基本的配置和使用。不过如果有需要,也可以提到在RTOS环境下需要注意的事项,比如使用信号量或队列来管理串口数据,但可能这属于进阶内容,暂时不需要深入。 还需要注意HAL的一些常见问题,比如在使用中断或DMA时,需要确保相应的中断服务函数被正确实现,并且在中断向量表中注册。例如,USART2的全局中断服务函数是USART2_IRQHandler,这里HAL已经处理好了,但用户需要确保在CubeMX中正确开启中断,并在代码中处理回调函数。 此外,用户可能在配置时钟时遇到问题,尤其是STM32F1的时钟树配置,需要确保USART2的时钟源正确,比如APB1的时钟是否使能,因为USART2挂在APB1总线上,最大时钟频率为36MHz。所以波特率的计算是否正确,比如如果APB1时钟是36MHz,那么波特率115200对应的分频系数是否正确。 可能还需要提到如何验证串口是否正常工作,比如使用串口调试助手发送数据,观察回显或者接收的数据是否正确。同时,检查硬件连接是否正确,比如PA2和PA3是否连接到USB转TTL模块,是否需要交叉连接TX和RX,以及地线是否共地。 最后,用户可能需要示例代码,所以需要提供一个简单的发送和接收的代码片段,包括初始化、发送字符串、中断接收处理等。同时,提醒用户在使用HAL_UART_Receive_IT函数启动接收中断后,需要在回调函数中重新启动接收,以持续接收数据。 总结一下,回答的结构应该是先介绍配置步骤,包括CubeMX的设置,然后给出代码示例,说明发送和接收的实现,最后提到注意事项和常见问题。同时,根据用户提供的引用资料,引用相关的实验报告和移植案例作为参考,帮助用户进一步学习。</think>### STM32F103C8T6 HAL USART2配置教程 #### 一、硬件与开发环境 1. **硬件要求** - STM32F103C8T6开发板(USART2引脚:`PA2(TX)`、`PA3(RX)`) - USB转TTL模块(如CH340/CP2102) 2. **开发工具** - STM32CubeMX(配置HAL) - Keil MDK-ARM(代码编写与调试)[^1] #### 二、STM32CubeMX配置步骤 1. **创建工程** - 打开STM32CubeMX,选择芯片型号`STM32F103C8T6`。 - 配置时钟源:`HSE`(外部高速晶振)[^2]。 2. **USART2参数设置** - 左侧导航栏选择`USART2`,模式选择`Asynchronous`。 - 配置参数: - Baud Rate(波特率):115200 - Word Length(数据位):8 bits - Parity(校验位):None - Stop Bits(停止位):1 - GPIO配置: - `PA2`设为`Alternate Function Push-Pull` - `PA3`设为`Input floating mode`。 3. **生成代码** - 点击`Project > Generate Code`生成Keil工程。 #### 三、代码实现(Keil MDK-ARM) 1. **初始化与发送数据** ```c // main.c中自动生成的初始化函数 MX_USART2_UART_Init(); // 调用CubeMX生成的初始化代码 // 发送字符串示例 char msg[] = "Hello USART2!\r\n"; HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 1000); ``` 2. **接收数据(中断模式)** ```c // 启动接收中断 uint8_t rx_buffer[1]; HAL_UART_Receive_IT(&huart2, rx_buffer, 1); // 中断回调函数(重写于stm32f1xx_hal_uart.c) void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART2) { // 回显接收到的字符 HAL_UART_Transmit(&huart2, rx_buffer, 1, 100); HAL_UART_Receive_IT(&huart2, rx_buffer, 1); // 重新启动接收 } } ``` #### 四、关键注意事项 1. **GPIO复用功能** - 必须确认`PA2/PA3`未被其他外设占用。 2. **波特率误差** - 使用STM32CubeMX的自动计算功能避免误差。 3. **中断优先级** - 若需实时响应,需在CubeMX中调整`USART2_IRQn`的优先级[^2]。 #### 五、验证与调试 1. **硬件连接** - 开发板`PA2`接USB转TTL模块的`RX`,`PA3`接`TX`,共地。 2. **串口助手测试** - 使用工具(如XCOM、PuTTY)发送数据,观察回显。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值