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

基于STM32的驱动BT-06蓝牙模块驱动经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-18 14:01
BT-06简介
BT06蓝牙模块是专为智能无线数据传输而打造,遵循V3.0 蓝牙规范。本模块支持UART接口,并支持SPP蓝牙串口协议,具有成本低、体积小、功耗低、收发灵敏性高等优点,只需配备少许的外围元件就能实现其强大功能。
BT-06蓝牙模块驱动简单,只需要4根线就可以驱动:
RXD
TXD
GND
VCC
将电源接在5V供电口上,TXD、RXD就是其数据传输的接口,BT-06是以串口的方式驱动的,只需要将蓝牙的TXD、RXD接口对应接在串口的RXD、TXD上,就可以进行数据传输。


数据透传
当BT-06上电,手机APP与蓝牙配对成功后,BT-06即进入数据透传模式。
数据透传:透传是指与传输网络的介质、调制解调方式、传输方式、传输协议无关的一种数据传送方式。数据透传即透明传送,是指在数据的传输过程中,通过无线的方式这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地到了最终接收者手里。
也就是说,连接好蓝牙后,从串口发送出的所有消息都可以原封不动的传输到手机APP中,注意!是原封不动,所以要想驱动BT-06,本质上是驱动串口来传输数据,所以接下来的主要任务就是驱动开发板上的串口进行数据传输。


配置串口
由于我是第一次搞蓝牙,所以比较谨慎,分了几步:
USART1作为向上位机打印调试信息的串口
USART2用来连接蓝牙接口,进行传输数据

USART1初始化函数
  1. void USART1_Init( void )
  2. {
  3.        
  4.         USART_InitTypeDef USART_InitStruct;
  5.         GPIO_InitTypeDef GPIO_InitStruct;
  6.        
  7.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE );
  8.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE );/* 开启时钟 USART1在APB2总线 USART2在APB1总线 */
  9.        
  10.        
  11.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  12.         /* USART1  Tx:PA9 */
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用输出
  14.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
  15.         GPIO_Init(GPIOA, &GPIO_InitStruct);
  16.         /* USART1  Rx:PA10 */
  17.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  18.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  19.         GPIO_Init(GPIOA, &GPIO_InitStruct);
  20.        
  21.         /* USART1配置 */
  22.         USART_InitStruct.USART_BaudRate = 9600;
  23.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  24.         USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
  25.         USART_InitStruct.USART_Parity = USART_Parity_No;
  26.         USART_InitStruct.USART_StopBits = USART_StopBits_1;
  27.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  28.         USART_Init(USART1, &USART_InitStruct);

  29.        
  30.         /* 使能串口 */
  31.         /* 容易忽略 */
  32.         USART_Cmd( USART1, ENABLE );
  33.        
  34.        
  35. }
复制代码

USART2初始化函数
  1. void USART2_Init( void )
  2. {
  3.         USART_InitTypeDef USART_InitStruct;
  4.         GPIO_InitTypeDef GPIO_InitStruct;
  5.        
  6.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );
  7.         RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE );
  8.        
  9.         USART_DeInit(USART2);
  10.        
  11.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  12.         /* USART2  Tx:PA2 */
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  14.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
  15.         GPIO_Init(GPIOA, &GPIO_InitStruct);
  16.         /* USART2  Rx:PA3 */
  17.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
  18.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  19.         GPIO_Init(GPIOA, &GPIO_InitStruct);
  20.        
  21.         /* USART2串口配置 */
  22.         USART_InitStruct.USART_BaudRate = 9600;
  23.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  24.         USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;//配置为发送和接收模式,实现发送接收数据
  25.         USART_InitStruct.USART_Parity = USART_Parity_No;
  26.         USART_InitStruct.USART_StopBits = USART_StopBits_1;
  27.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  28.         USART_Init(USART2, &USART_InitStruct);
  29.        
  30.         /* USART2的中断优先级配置 */
  31.         USART2_NVIC_Config();
  32.         /* 打开USART_IT_RXNE标志中断,即接收数据寄存器不为空中断,收到数据就进入中断 */
  33.         USART_ITConfig( USART2,  USART_IT_RXNE, ENABLE );
  34.        
  35.         /* 使能串口 */
  36.         USART_Cmd( USART2, ENABLE );
  37. }

复制代码



USART2的NVIC配置

  1. /* USART2 的中断优先级配置,需要在中断中处理数据的接收 */
  2. void USART2_NVIC_Config( void )
  3. {
  4.         NVIC_InitTypeDef  NVIC_InitStruct;
  5.        
  6.         NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );
  7.        
  8.         NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
  9.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  10.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
  11.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  12.        
  13.         NVIC_Init( &NVIC_InitStruct );
  14. }
复制代码



USART1串口重映射
  1. /* USART1 的重映射 */
  2. /* 1.勾选MicroLIB
  3.    2.添加头文件:stdio.h
  4. */
  5. int fputc( int ch, FILE *f )
  6. {
  7.         USART_SendData( USART1, ( uint8_t ) ch );
  8.        
  9.         /* 等待发送完成 */
  10.         while(  USART_GetFlagStatus( USART1, USART_FLAG_TXE) == RESET )
  11.                 ;
  12.         return ch;
  13. }
复制代码



————————————————
版权声明:Aspirant-GQ


收藏 评论0 发布时间:2023-3-18 14:01

举报

0个回答

所属标签

相似分享

官网相关资源

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