STM32硬件USART——蓝牙与手机传输数据

硬件USART

传输方式:串行传输,低位先行。

传输类型:帧传输。有校验位则9位一帧,无校验位则8位一帧。

波特率:一秒钟能传输的bit个数。

                波特率 = 外设时钟÷ 分频系数 ÷16。

                外设时钟是指外挂载总线APB1或APB2的时钟,两者不同。

                要÷16是因为在读取数据时,一位bit需要16个时钟采样,来防止/判断噪音。所以÷16得到波特率,是为了保证系统时钟能够有足够快的频率,保证对每bit的传输都×16倍时间去检测,得到真正的一位bit发送接收时间。不然假设16MHz的外设时钟,不分频得到波特率,那么实际一位的时间需要16*16Mhz的时钟才能正确发送,但这已经远远超出了外设时钟的上限(个人理解)(1MHz = 1 000 000  Hz

停止位时间:发送一个字节数据(8bit)之后,停止位占多少个bit时钟周期(0.5,1,1.5,2),一般1个。

字节长度:8位、9位。一般8位不加校验位,9位加校验位。

DR寄存器:内分   发送数据寄存器+发送移位寄存器、接收寄存器+接收移位寄存器。

                对软件层USART传输而言,收发都是访问DR地址,不对其内部的地址进行细分。也就是一个地址两种功能,Rdata = DR就是接收;DR = Tdata就是发送。具体逻辑由硬件判断。

                发送流程:

                       ①调用函数判断发送数据移位寄存器是否空(标志位TXE—TE Empty空),判断数据有(1)没有(0)从发送数据寄存器被硬件自动转移到发送移位数据寄存器。

                       ②空的话则把数据发送给DR(赋值给DR :   DR = Tdata)。

                        ③为了下一次方便发送的话,可以在每次发送后等待TXE=1(即发送移位寄存器空),让下一次数据进来的时候不用等待,直接发送。

                接收流程:

                        ①调用函数判断接收数据寄存器是否非空(标志位TXNE — TX Not Empyt ),判断数据有(1)没有(0)从接收移位寄存器被硬件自动转移到接收数据寄存器

                        ②读取值为1(非空)的话,就要读取接收寄存器的数据(Rdata = DR)

                        ③在接收寄存器内数据时(RXNE == 1),对寄存器进行读取,会自动清除标志位

空闲状态:TX高电平

### STM32 连接 HC05 蓝牙模块至手机配置方法 #### 接线方式 对于 STM32F103C8T6 和 HC-05 的连接,具体接法如下: | STM32 Pin | HC-05 Pin | |-----------|------------| | PA9 (USART1_RX) | TXD | | PA10 (USART1_TX)| RXD | 注意:STM32 使用 3.3V 电源供电,而 HC-05 则采用 5V 供电。两者之间需要共地处理。 #### 修改蓝牙模块波特率 为了确保数据传输稳定,在进入 AT 命令模式后可以调整 HC-05 默认波特率为 115200 bps,并设置无校验位以及单个停止位。这可以通过向设备发送 `AT+UART=115200,0,1` 来完成[^2]。 #### 初始化串口通信 在程序中通过 HAL 库来初始化 USART 外设以便于接收来自蓝牙的数据包。下面是一个简单的 C 语言函数用于启动 UART 设备并开启中断服务例程(ISR),从而允许异步读取输入缓冲区中的字符流。 ```c void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; // 设置波特率HC-05一致 huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK){ Error_Handler(); } } ``` 当上述准备工作完成后,就可以编写应用程序逻辑部分了——即如何解析从移动终端传来的命令字符串或是其他形式的消息体;同样也可以构建响应机制反馈给客户端应用层协议栈。 #### 实现双向通讯测试 一旦完成了硬件连线和软件编程工作,则可通过任意一款支持 SPP(Serial Port Profile)特性的 Android 或 iOS App 对整个链路做初步验证。比如 Termux、Bluetooth Terminal 等工具型 app 就非常适合用来调试此类项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值