你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407用USART2与HC06蓝牙模块通信

[复制链接]
STMCU 发布时间:2020-9-11 13:27
串口通信原理

想必玩过一点单片机的人都懂一点串口通信,而恐怕我们印象中的串口通信不过如此,两个芯片通过串口通信,需要共地、Tx(发送)和Rx(接收)相互连接即可:

而实际上,串口通讯种类繁多,即使是通用异步收发器UART也有RS-232RS-485等不同接口,有兴趣可以深入学习。


首先串口通信指的是一种设备通信的协议而不是指接口。串口通信的概念非常简单,串口按位(bit)发送和接收字节。而我们所使用的USART和UART的区别是可以同步,你在STM32的datasheet里可以看到USART2_CK,而实际上我们很少使用,我们完全可以把USART当UART来用。


HC06蓝牙模块

无线蓝牙透传模块。


默认名字HC06、波特率9600bps、配对密码00000。

20200911132052.c2fcce60a11c0132b003f6bdb980039c.jpg

用Arduino的时候想必是很傻瓜式的,如果用STM32来做还是要了解一番的。


首先好好看一下datasheet,看一下AT指令集,然后用一个USB转TTL的模块(这里用的是CH340)和电脑连接:

20200911132104.c20b96f20877ed8130f4ce849250e465.jpg


可以看到HC06的指示灯一直在闪,说明蓝牙未连接。打开串口助手,试一试AT指令是否有效,然后你就可以设置波特率(建议就选默认的9600,据说快了会降低通信的稳定性),改名字和密码,详见datasheet。





打开蓝牙串口APP,会自动连接,连接以后指示灯就从闪烁变成常亮了。在串口助手里把HEX显示给勾上,然后用APP发几条指令,会发现收到这样:


20200911132141.f2cdb8d542190c09c605c91d8f1cc7a6.png


那就说明蓝牙这边不会出问题了,专心调试STM32吧 - -‘


STM32F407的USART2配置

首先查datasheet表,找USART2对应的是哪个GPIO:

20200911132153.d2ad82e1743985b1db40e7c63d3916dc.png


千万不要忘记查看总线!

20200911132203.49bee1bf408bc0c820315fefed479010.png




看了系统架构就会知道,F103和407的GPIO挂在不同的总线上。103挂在APB2上,而407挂在AHB1上,所以初始化时钟的时候千万要注意~


  1. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
复制代码

另外在配置GPIO时的参数也有不同:
我们查看GPIO_InitTypeDef的定义:


  1. //STM32F103中的定义:
  2. typedef struct
  3. {
  4.   uint16_t GPIO_Pin;  
  5.   GPIOSpeed_TypeDef GPIO_Speed;
  6.   GPIOMode_TypeDef GPIO_Mode;
  7. }GPIO_InitTypeDef;

  8. //STM32F407中的定义:
  9. typedef struct
  10. {
  11.   uint32_t GPIO_Pin;              
  12.   GPIOMode_TypeDef GPIO_Mode;     
  13.   GPIOSpeed_TypeDef GPIO_Speed;
  14.   GPIOOType_TypeDef GPIO_OType;   
  15.   GPIOPuPd_TypeDef GPIO_PuPd;     
  16. }GPIO_InitTypeDef;
复制代码

可以看到F407多出了两个参数,即GPIO_OType和GPIO_PuPd。

在F103需要分别设置两个引脚的Mode为复用推挽输出(GPIO_Mode_AF_PP)和浮空输入(GPIO_Mode_IN_FLOATING);但是在F407,两个引脚可以一起设置为GPIO_Mode_AF,并且都设置为推挽输出即可(这个我研究了好半天,据说是因为F1和F4的GPIO复用功能不同,F4复用功能不是在配置IO口模式这儿去配置,而是需要单独配置复用模式,然后再映射,总之就是F407配置串口复用的时候不管Rx还是Tx统统设置为复用推挽输出就好了。)

剩下的USART2初始化、中断初始化等都和F1一样。

最后详细代码如下:

bluetooth.h:

  1. <font face="Tahoma" size="3">#ifndef __USART2_H
  2. #define __USART2_H
  3. #include "stdio.h"  
  4. #include "stm32f4xx_conf.h"
  5. #include "sys.h"

  6. #define USART2_REC_LEN              200
  7. #define EN_USART2_RX                1

  8. extern u8  USART2_RX_BUF[USART2_REC_LEN];
  9. extern u16 USART2_RX_STA;

  10. void bluetooth_init(u32 bound);
  11. #endif</font>
复制代码

bluetooth.c:

  1. <font face="Tahoma" size="3">#include "sys.h"
  2. #include "bluetooth.h"
  3. //这个是一个舵机控制板的驱动,感兴趣的可以看我下一篇博客
  4. #include "pcf8574.h"

  5. #if SYSTEM_SUPPORT_OS
  6. #include "includes.h"     
  7. #endif

  8. #if EN_USART2_RX

  9. u8 USART2_RX_BUF[USART2_REC_LEN];

  10. u16 USART2_RX_STA=0;

  11. void bluetooth_init(u32 bound){

  12.     GPIO_InitTypeDef GPIO_InitStructure;
  13.     USART_InitTypeDef USART_InitStructure;
  14.     NVIC_InitTypeDef NVIC_InitStructure;

  15.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
  16.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

  17.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);
  18.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);

  19.     //GPIOA2,3->USART2RxTx
  20.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  21.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  22.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  24.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  25.     GPIO_Init(GPIOA,&GPIO_InitStructure);

  26.     //USART2 init
  27.     USART_InitStructure.USART_BaudRate = bound;
  28.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  29.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  30.     USART_InitStructure.USART_Parity = USART_Parity_No;
  31.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  32.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  33.     USART_Init(USART2, &USART_InitStructure);

  34.     USART_Cmd(USART2, ENABLE);

  35.     //USART2_ClearFlag(USART2, USART2_FLAG_TC);

  36. #if EN_USART2_RX   
  37.     USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//interrupt

  38.     //USART2 NVIC
  39.     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//USART2 interrupt channel
  40.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
  41.     NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
  42.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IQR enable
  43.     NVIC_Init(&NVIC_InitStructure);

  44. #endif
  45. }


  46. void USART2_IRQHandler(void)
  47. {
  48.     u8 Res;
  49. #if SYSTEM_SUPPORT_OS
  50.     OSIntEnter();   
  51. #endif
  52.     if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  53.     {
  54.         Res =USART_ReceiveData(USART2);//(USART2->DR)
  55. //      USART_SendData(USART2,Res);
  56.         if(Res == 0x00)
  57.             down();
  58.         if(Res == 0x01)
  59.             up();
  60.   }
  61. #if SYSTEM_SUPPORT_OS
  62.     OSIntExit();                                             
  63. #endif
  64. }
  65. #endif  </font>
复制代码






20200911132212.1c266587734684e71c7bf9645795d60c.png
20200911132036.7bade6ae4897c8a7d6e98234a9521cf2.png
收藏 1 评论0 发布时间:2020-9-11 13:27

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版