STM32F103串口实验

实验原理

UART(Universal Asynchronous Receiver/Transmitter,通用异步接收器/发送器)是一种串行通信协议,它允许设备之间进行全双工通信。UART通信不需要外部时钟源,而是依赖于起止位来同步数据传输。

UART通信的基本原理:

1. 起始位:一个逻辑低电平的起始位标志着一帧数据的开始。

2. 数据位:紧跟起始位之后的是数据位,通常为8位或7位,表示要传输的数据。数据位可以是任何数值,由低位到高位依次传输。

3. 奇偶校验位(可选):如果启用,这一位用于错误检测。根据前面的数据位计算出一个值,使得数据位加上校验位后的1位数为奇数(奇校验)或偶数(偶校验)。

4. 停止位:一个或两个逻辑高电平的停止位标志着一帧数据的结束。

5. 流量控制(可选):UART还可以使用RTS(Request To Send)和CTS(Clear To Send)信号进行流量控制。这些信号可以防止数据溢出,并确保发送方和接收方都准备好进行数据传输。

UART通信不需要外部时钟源,因此两个设备可以在不同的波特率下工作,只要它们在传输开始和结束时保持同步即可。UART接口还支持多种错误检测机制,如奇偶校验、循环冗余校验(CRC)等,以提高数据传输的可靠性。

实验器材

材料方案一:STM32CubeMX、Keil5、学习板https://item.taobao.com/item.htm?abbucket=3&id=697575142917&ns=1&pisk=gm2SLdmTtUYStuOz69Iq1XqEvbkQFy6wPHiLjkpyvYH-JSZgR4ShZYPjRrUjyLSlZX3QrYh3a2urRvZ35i7NQOruqvDA7NWNKfzaYAvp9pLEDKnopT_VgEruqv0p0eCaMuABc_qMpD3dcxnEVQHpw0KAcDo9ev3-9EdxXq3KpyhKMqnZxLnJwbEAcciWyQp-2xnxA0iJyyHdcxHdHZicN4E5m6kEV2dIsu3XppeRKbgsDBJBdYi-NRqSlor4h0GSWjJj0Qw8ukezEjb6Wvq41yNL-1RmFkF-ecrlFKMT2SyI0JSeO4UuhoeoGh9sd7U79fVfICc-O4NYejtppoDYMfPQPaOoy7zjsmhvAOm47qEueSsHkuUZPYnxgOI_DXF4Ef2PkLMTsukz9yfwiYZLwxsyAdusQVABefvIcVSfcBAHtuXBm9xtXZG-mmyNciTWtbnmcVSfcBAnwmmq_isXPBf..&priceTId=214782ce17279620490354401e0c80&skuId=5115874051968&spm=a21n57.1.item.2.32e5523c6cxYgX&utparam=%7B%22aplus_abtest%22%3A%22ac63cbcfc837ee297a0577dd1e56451b%22%7D&xxc=taobaoSearch

材料方案二:STM32CubeMX、Keil5、STM32F103CBT6最小系统板

电路连接

引脚连接:

PA2-----UART2_TX

PA3-----UART2_RX

实验内容

1.STM32CubeMX生成配置模板

1.1芯片选择

1.11打开MX,选择选择MCU。

1.12左上角搜索开发板,搜索STM32F103C8T6。

1.13右下方看到MCU列表,选择自己的MCU,双击选择

1.2设置Debug

1.21Systerm core

1.22选择sys

1.23第一行Debug选择serval wire

1.3配置时钟

1.31Systerm core

1.32时钟设置

1.33选择外部高速时钟。第一行选择外部时钟

1.34时钟频率

改成72(因为外部晶振是8Mhz经过了9倍频),并且回车,两次窗口询问都选择OK,它会自己设置锁相环。

1.4通信协议选择

1.41connectivity

1.42选择USART2(通用同步/异步接收器/发送器),选择异步通信。最后PA2和PA3会亮起。并且显示用户标签。用户标签想要修改,可以右键修改。

此时下方有个Parameter setting(细节设置),记住波特率,多个设备想要通信他们的波特率需要相同。

1.5导出

项目管理

勾选自动生成对应的.c/.h文件

设置好项目名称、路径(使用外国软件尽量使用英文路径和文件名,避免不必要的麻烦)、选择

MDK-ARM,选择最小支持的keil版本。

导出,出现窗口选择close

2.单片机发送串口数据

2.1打开生成的代码工程文件。在MDK-ARM文件夹下。

2.2加载工程后,新文件要编译。

2.3发现在主函数中生成了MX_USART2_UART_Init()函数。

在它下方的Bigan end对中输入

char message[] = "Hello world";//定义字符数存放要显示的字符

在循环中输入

HAL_UART_Transmit(&huart2,message,strlen(message),100);//(地址,指针内容,长度(strlen取长度),超时时间ms如果HAL_MAX_DELAY(0XFFFFFFFF)表示无限等待)
HAL_Delay(1000);//延迟等待1秒

声明函数

在开头声明#include<strlen.h>,如果不声明会报错。

#include "string.h"
#include <stdio.h>

串口函数改掉,因为函数需要message为uint*_t类型

HAL_UART_Transmit(&huart2,(uint8_t*)message,strlen(message),100);

编译下载即可。

USB连接电脑,下载串口调试助手即可查看,串口调试助手在线网站serial.keysking.com

左下角下载对应的串口驱动,设置波特率115200(ch343芯片)

3.单片机接收串口数据。

注释掉原来的HELLO WORD代码

//HAL_UART_Transmit(&huart2, (uint8_t*)message,strlen(message),100);
//HAL_Delay(1000);

1.数组不用char了,把char换掉

uint8_t receiveData[2];//数组长度设置为2

2.死循环中的代码

HAL_UART_Receive(&huart2, receiveData, 2, HAL_MAX_DELAY);//地址,接收指针,接收长度,超时时间(永久等待)
HAL_UART_Transmit(&huart2, receiveData, 2, 100);//单片机返回电脑发送的信息

编译下载。打开串口助手开始调试。发送RO试试,单片机成功返回R0。实验成功

拓展实验(串口控制小灯)

回到MX中,点亮PA6 PA7 PB0,分别设置用户标签为LED_BLUE,LED_GREEN,LED_RED,保存并生成代码。

把循环中的代码改成

        HAL_UART_Receive(&huart2, receiveData, 2, HAL_MAX_DELAY);//接收函数
        HAL_UART_Transmit(&huart2, receiveData, 2, 100);发送函数
        
        GPIO_PinState state = GPIO_PIN_SET;//端口电平默认高电平
        if (receiveData[1] == '0'){//如果数组第1位是0
            state = GPIO_PIN_RESET;//端口电平变低
        }
        if (receiveData[0] == 'R'){//如果数组第1位是R
            HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, state);//LED_RED_GPIO_Port端口电平变低
        }
        else if (receiveData[0] == 'G'){//如果数组第1位是G
             HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, state);//LED_GREEN_GPIO_Port端口电平变低
        }
        else if (receiveData[0] == 'B'){//如果数组第1位是B
                HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, state);//LED_BLUE_GPIO_Port端口电平变低
        }

编译下载,测试。发送R1、R0、B1、B0、G1、G0试试

STM32F103是一款基于ARM Cortex-M3内核的微控制器,而OpenMV 是一款以STM32为核心的低成本、高性能图像传感器的集成开发环境。串口通信实验是通过串口STM32F103和OpenMV进行数据的传输与接收。 在进行STM32F103串口通信实验时,首先需要进行硬件连接。将STM32F103串口引脚(TX和RX)分别与OpenMV的串口引脚(TX和RX)相连接。接下来,在STM32F103的代码中,需要设置串口的波特率、数据位、停止位和奇偶校验位等参数。在OpenMV的代码中,需要设置相应的串口参数。 接下来,在STM32F103的代码中,使用相应的函数进行数据的发送和接收。通过函数将要发送的数据传送到串口发送缓冲区,并设置发送标志位,使得数据被发送出去。在接收方面,可以使用中断方式进行数据的接收,即当接收到数据时,自动触发接收中断,将数据存储到接收缓冲区。 在OpenMV的代码中,可以使用相应的函数进行数据的发送和接收。通过函数将要发送的数据传送到串口发送缓冲区,并设置发送标志位,使得数据被发送出去。在接收方面,可以使用循环轮询的方式进行数据的接收,即不断检查串口接收缓冲区是否有数据,如果有,则将数据读取出来并进行相应的处理。 通过以上步骤,即可实现STM32F103与OpenMV之间的串口通信实验。通过串口可以实现双向数据的传输与接收,在实际应用中可以灵活使用串口进行各种数据的交互操作,例如传输图像数据、控制外设等。需要注意的是,在进行串口通信时,要确保两端的串口参数设置一致,才能正确地进行数据的传输与接收。同时,还需要处理好错误检测与纠正机制,以确保数据的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值