历史上的今天
今天是: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就好了
下一篇:stm32f103 串口通讯
史海拾趣
|
WINCE 6.0中怎么没有Office组件呢,怎么才能够加入呢 WINCE 6.0中怎么没有Office组件呢,怎么才能够加入呢 就是能够看Office所有格式文档的Viewer也可以啊, 我见到Windows Mobile中有,但是CE中为什么就没有呢, 要怎么才能有呢,谢谢!… 查看全部问答> |
|
投影机灯泡的类型 灯泡是投影机的耗材,直接关系着投影影像。 目前,无论是哪种投影灯泡,都有一定的使用寿命。 随着投影机工作时间的延长,其亮度会不断降低,投影的影像也就会越来越不清晰,当投影灯泡老化到一定程度时就必须更换了。 不过,目 ...… 查看全部问答> |
|
stm32F103能否连接100M网络?因为开发板中都是10M的。 现在的项目是把一些视频数据通过网络传给各个设备(设备都是STM32F103的cpu),设备接受到数据之后,然后处理。… 查看全部问答> |
|
我在使用MC35I模块时出现了一些疑问,紧急求助,不盛感谢! 1.请问六脚的SIM卡插座与MC35I模块应该如何硬件连接,SIM卡的VPP引脚需要使用吗? 2.我使用单片机控制该模块,每次模块启动后,当模块搜索网络时,模块就掉电了,我给模块提供的电压是4.2 ...… 查看全部问答> |
|
程序中:DCOCTL = CALDCO_1MHZ; // Use internally calibrated DCO settings BCSCTL1 = CALBC1_1MHZ;头文件宏定义:#define CALDCO_1MHZ_ (0x10FEu) /* DCOCTL Calibration Data ...… 查看全部问答> |
|
求助 CCS下是否可以加载DLL库?如果可以,如何实现? 如果不行,可否加载其他库?如何实现? 实际上我是想将自己编写的某个模块做成一个库,然后加载进CCS的工程中。 求助高手!… 查看全部问答> |




