历史上的今天
返回首页

历史上的今天

今天是:2025年04月25日(星期五)

正在发生

2020年04月25日 | Stm32 基于蓝牙的串口通信 详细篇

2020-04-25 来源:eefocus

1. HC-05蓝牙

在这里插入图片描述

1.1蓝牙模块使用介绍

蓝牙HC05是主从一体的蓝牙串口模块,简单的说,当蓝牙设备与蓝牙设备配对连接成功后,我们可以忽视蓝牙内部的通信协议,直接将将蓝牙当做串口用。当建立连接,两设备共同使用一通道也就是同一个串口,一个设备发送数据到通道中,另外一个设备便可以接收通道中的数据。


1.2蓝牙模块使用注意

hc-05支持从4800bps~1382400bps间的标准波特率,使用时波特率一定要匹配,vcc接3.3 或者 5V GND 接GND TX接单片机上的RX RX接TX。


2.Stm32F1串口通信

2.1串口通信介绍

STM32F103ZET6 最多可提供 5 路串口,


2.2串口通信算法思路

串口时钟使能,GPIO 时钟使能

串口复位

GPIO 端口模式设置

串口参数初始化

开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)

使能串口

编写中断处理函数


2.3步骤详解

1.串口时钟使能,使用哪个串口查手册使能哪个时钟,还有IO口时钟使能

2.串口复位。当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置 这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。

复位的是在函数 USART_DeInit()中完成:


void USART_DeInit(USART_TypeDef* USARTx);//串口复位 


复位很重要,根据情况选择


3.GPIO 端口模式设置 。在这可能很多人不知道,在中文手册110页有,对应着来就行

在这里插入图片描述

4.串口参数初始化

波特率,字长,停止位,奇偶校验位, 硬件数据流控制,模式(收,发)。我们可以根据需要设置这些参数,这里需要是你在串口助手或者说用别的设备通信时让两者保持一致就行。


5 .开启中断并且初始化 NVIC

这里推荐使用中断,使用中断好处是可以控制串口通信在代码中的优先级。


5.1 NVIC 中断使用

1.STM32 将中断分为 5 个组,组 0~4。

2.0 111 0: 4 0 位抢占优先级, 4 位响应优先级

1 110 1: 3 1 位抢占优先级, 3 位响应优先级

2 101 2: 2 2 位抢占优先级, 2 位响应优先级

3 100 3: 1 3 位抢占优先级, 1 位响应优先级

4 011 4: 0 4 位抢占优先级, 0 位响应优先级

3. 数值越小所代表的优先级就越高。

4.:第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

6.使能串口

这个没啥说的,不使能你死活用不了。

7.开启串口中断

比如在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断,那么我 们开启中断的方法是:

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,

我们在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是: USART_ITConfig(USART1,USART_IT_TC,ENABLE);

8.获取相应中断状态。

当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄 存器中的某个标志位。

比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这 个函数来判断到底是否是串口发送完成中断,方法是:

USART_GetITStatus(USART1, USART_IT_TC)

((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) ||

((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) ||

返回值是 SET,说明是串口发送完成,中断发生。

7.编写中断函数

!!!!这个很重要,一点一点慢慢讲

中断函数一般格式是

void USART1_IRQHandler(void)

使用串口一就要写成T1,2就是T2。

发送

STM32 库函数操作 USART_DR 寄存器发送数据的函数是:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

通过该函数向串口寄存器 USART_DR 写入一个数据。

读取

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

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

通过该函数可以读取串口接受到的数据


Res=USART_ReceiveData(USART1);//接受数据Res=对用串口发送的数据

b=Res;

USART_SendData(USART1,b);//发送数据,发送数据b


发送和读取都要建立在判别串口状态的基础上

这里介绍下串口状态

RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并 且可以读出来了。

TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。

例如我们要判断读寄存器是否非空(RXNE),操作库函数的方法是: USART_GetFlagStatus(USART1, USART_FLAG_RXNE);

我们要判断发送是否完成(TC),

操作库函数的方法是:

USART_GetFlagStatus(USART1, USART_FLAG_TC);

判定他们是否为零来确定串口状态。


总结

1.参考正点原子的教程

2.讲解的不好,配置有一个可用的用蓝牙控制跑马灯的基础调试代码

!!!!


补充

手机蓝牙发送 a 模式非Hex

实际上是0x61 ‘a’

经过调试发现,有时候发送的是乱码,把模式调成非Hex就好了

在这里插入图片描述

推荐阅读

史海拾趣

Global Communications公司的发展小趣事
温度传感器的输出与温度之间的线性关系也很重要,因为这直接影响到补偿电路的准确性和稳定性。
BURGESS公司的发展小趣事

随着时间的推移,BURGESS不断扩展其业务范围,并于1984年首次开发租船服务。这一创新举措不仅满足了客户多样化的需求,也进一步巩固了其在行业内的领先地位。此后,BURGESS继续其国际化步伐,成功进驻美国市场,进一步扩大了其全球影响力。

Habia Cable公司的发展小趣事

BURGESS公司于1975年3月13日在伦敦正式成立,这标志着它在游艇经纪行业的起点。创立之初,BURGESS就凭借其专业的知识和敏锐的市场洞察力,在短短四年内成功进驻摩纳哥这一游艇行业的重镇。更令人瞩目的是,在同一年,BURGESS成功售出了当时世界上最大的游艇,这一成就不仅彰显了其卓越的实力,也为其在行业内赢得了极高的声誉。

Dytran Instruments Inc公司的发展小趣事

作为一家技术驱动型企业,Dytran始终将技术创新作为公司的核心竞争力。公司不断投入研发资源,推动传感器技术的升级和产业升级。在单轴和三轴IEPE加速度计、超高温充电模式传感器、高冲击传感器、电容式MEMS传感器等领域,Dytran都取得了显著的技术突破。这些新技术不仅提高了传感器的性能和精度,还拓展了其应用领域和市场空间。

同时,Dytran还注重与其他行业的合作与交流。通过与航空航天、汽车等行业的合作,Dytran将传感器技术应用于更多领域,推动了相关产业的发展。此外,公司还积极参与国际标准的制定和推广工作,为传感器技术的国际化和标准化做出了贡献。

Eutech公司的发展小趣事

在电源适配器和服务器电源市场,EUtech公司凭借技术创新迅速崛起。他们不断优化产品设计,提高产品性能,同时注重节能环保。随着下游AI行业的快速发展,公司及时抓住机遇,推出了一系列高性能、高可靠性的电源产品,赢得了市场的广泛认可。

CTC [Compact Technology Corp.]公司的发展小趣事

CTC公司在创立初期便致力于半导体技术的研发。一次偶然的实验中,公司团队成功研发出了一种新型的晶体管结构,这一创新使得晶体管的工作效率大大提升,同时降低了能耗。这一技术突破迅速引起了行业的关注,CTC公司的名字开始在电子行业中崭露头角。随着该技术的普及和应用,CTC公司的业务逐渐扩大,奠定了在电子行业的重要地位。

问答坊 | AI 解惑

字符输出有误!

程序实现若输入“abcdefg”,则输出将其完全反向输出,应为“gfedcba”,但下面程序输出无结果,忘大家告知下!哪里有错误#include \"stdio.h\"#include \"string.h\"   int main(){char pstr[10];strcpy(pstr, \"abcdefg\");char tmp ...…

查看全部问答>

WINCE 6.0中怎么没有Office组件呢,怎么才能够加入呢

WINCE 6.0中怎么没有Office组件呢,怎么才能够加入呢 就是能够看Office所有格式文档的Viewer也可以啊, 我见到Windows Mobile中有,但是CE中为什么就没有呢, 要怎么才能有呢,谢谢!…

查看全部问答>

在EVC中如何给按钮贴图?

我想在EVC中如何给按钮贴图,可是setbitmap函数evc不能用,应该怎么办啊?麻烦哪位给解答一下,谢谢了~~~~~~…

查看全部问答>

投影机灯泡的类型及真假分辨方法解析

投影机灯泡的类型 灯泡是投影机的耗材,直接关系着投影影像。 目前,无论是哪种投影灯泡,都有一定的使用寿命。 随着投影机工作时间的延长,其亮度会不断降低,投影的影像也就会越来越不清晰,当投影灯泡老化到一定程度时就必须更换了。 不过,目 ...…

查看全部问答>

stm32F103能否连接100M网络?

stm32F103能否连接100M网络?因为开发板中都是10M的。 现在的项目是把一些视频数据通过网络传给各个设备(设备都是STM32F103的cpu),设备接受到数据之后,然后处理。…

查看全部问答>

求助关于MC35I模块的问题

我在使用MC35I模块时出现了一些疑问,紧急求助,不盛感谢! 1.请问六脚的SIM卡插座与MC35I模块应该如何硬件连接,SIM卡的VPP引脚需要使用吗? 2.我使用单片机控制该模块,每次模块启动后,当模块搜索网络时,模块就掉电了,我给模块提供的电压是4.2 ...…

查看全部问答>

isp 烧录

对于stc单片机和atmel单片机的烧录硬件是否一样? 为何用相同的硬件烧录不进去?…

查看全部问答>

DCO头文件宏定义问题~求教!!

 程序中:DCOCTL  = CALDCO_1MHZ; // Use internally calibrated DCO settings BCSCTL1 = CALBC1_1MHZ;头文件宏定义:#define CALDCO_1MHZ_          (0x10FEu)  /* DCOCTL  Calibration Data ...…

查看全部问答>

CCS3.3下,如何加载库

求助 CCS下是否可以加载DLL库?如果可以,如何实现? 如果不行,可否加载其他库?如何实现? 实际上我是想将自己编写的某个模块做成一个库,然后加载进CCS的工程中。 求助高手!…

查看全部问答>

感觉ST 的MO 最近要火

  感觉ST 的MO 最近要火 …

查看全部问答>