stm 32 串口通信 蓝牙篇
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就好了
发送的是1 收到0x31 我把代码传上去供有需要的朋友下载
。。。。
本人比较懒,最近会一直更新些32的使用,,,至于之前没写完的,,,以后有时间补充,32写完打算再写个树莓派舵机控制的飞思卡尔小车
不知道为啥。。。。F4就不会乱码,,,这个我也很纳闷。。。
F4代码请看我之前的蓝牙篇
欢迎各位一起来讨论