STM32F407用USART2与HC06蓝牙模块通信

发布者:NexusDream最新更新时间:2018-08-13 来源: eefocus关键字:STM32F407  USART2  HC06  蓝牙模块通 手机看文章 扫描二维码
随时随地手机看文章

笔者曾经使用STM32F103做过些小东西,想着迁移到F407应该很容易,未曾想事情并不简单,有很多坑被我踩到了。本文主要讲述利用建立STM32F407的USART2与HC06蓝牙模块进行通信。本文写的尽量详细简单,让初学ARM的新手也能看懂,同时也涉及到一些容易出错的细节,供大家参考和指正。

本文主要分下面几块来写:




串口通信原理

想必玩过一点单片机的人都懂一点串口通信,而恐怕我们印象中的串口通信不过如此,两个芯片通过串口通信,需要共地、Tx(发送)和Rx(接收)相互连接即可: 
串口通信 
而实际上,串口通讯种类繁多,即使是通用异步收发器UART也有RS-232RS-485等不同接口,有兴趣可以深入学习。 
首先串口通信指的是一种设备通信的协议而不是指接口。串口通信的概念非常简单,串口按位(bit)发送和接收字节。而我们所使用的USART和UART的区别是可以同步,你在STM32的datasheet里可以看到USART2_CK,而实际上我们很少使用,我们完全可以把USART当UART来用。

HC06蓝牙模块

无线蓝牙透传模块。 
默认名字HC06、波特率9600bps、配对密码00000。 
—— [ HC06的datasheet ]

HC06 
用Arduino的时候想必是很傻瓜式的,如果用STM32来做还是要了解一番的。 
首先好好看一下datasheet,看一下AT指令集,然后用一个USB转TTL的模块(这里用的是CH340)和电脑连接: 
CH340
可以看到HC06的指示灯一直在闪,说明蓝牙未连接。打开串口助手,试一试AT指令是否有效,然后你就可以设置波特率(建议就选默认的9600,据说快了会降低通信的稳定性),改名字和密码,详见datasheet。 
这里写图片描述

打开蓝牙串口APP,会自动连接,连接以后指示灯就从闪烁变成常亮了。在串口助手里把HEX显示给勾上,然后用APP发几条指令,会发现收到这样: 
收到
那就说明蓝牙这边不会出问题了,专心调试STM32吧 - -‘

STM32F407的USART2配置

相信自学STM32的同学入门都是看原子哥的教程,通俗易懂,还给源码,我也不例外。不过我之前比较熟悉的是F103,是Cortex-M3架构,而F407是M4架构,有些许不同,正是这点不同坑了我很久, 我应该直接抄原子哥的代码的 - -

首先查datasheet表,找USART2对应的是哪个GPIO: 
这里写图片描述

千万不要忘记查看总线! 
这里写图片描述 
这里写图片描述 
看了系统架构就会知道,F103和407的GPIO挂在不同的总线上。103挂在APB2上,而407挂在AHB1上,所以初始化时钟的时候千万要注意~

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);


另外在配置GPIO时的参数也有不同: 

我们查看GPIO_InitTypeDef的定义:


//STM32F103中的定义:

typedef struct

{

  uint16_t GPIO_Pin;  

  GPIOSpeed_TypeDef GPIO_Speed;

  GPIOMode_TypeDef GPIO_Mode; 

}GPIO_InitTypeDef;


//STM32F407中的定义:

typedef struct

{

  uint32_t GPIO_Pin;              

  GPIOMode_TypeDef GPIO_Mode;     

  GPIOSpeed_TypeDef GPIO_Speed;

  GPIOOType_TypeDef GPIO_OType;   

  GPIOPuPd_TypeDef GPIO_PuPd;     

}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:


#ifndef __USART2_H

#define __USART2_H

#include "stdio.h"  

#include "stm32f4xx_conf.h"

#include "sys.h" 


#define USART2_REC_LEN              200

#define EN_USART2_RX                1


extern u8  USART2_RX_BUF[USART2_REC_LEN];

extern u16 USART2_RX_STA;


void bluetooth_init(u32 bound);

#endif


bluetooth.c:


#include "sys.h"

#include "bluetooth.h"

//这个是一个舵机控制板的驱动,感兴趣的可以看我下一篇博客

#include "pcf8574.h"


#if SYSTEM_SUPPORT_OS

#include "includes.h"     

#endif


#if EN_USART2_RX


u8 USART2_RX_BUF[USART2_REC_LEN];


u16 USART2_RX_STA=0;


void bluetooth_init(u32 bound){


    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;


    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);


    GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);


    //GPIOA2,3->USART2RxTx

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(GPIOA,&GPIO_InitStructure);


    //USART2 init

    USART_InitStructure.USART_BaudRate = bound;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No;

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART2, &USART_InitStructure);


    USART_Cmd(USART2, ENABLE); 


    //USART2_ClearFlag(USART2, USART2_FLAG_TC);


#if EN_USART2_RX    

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//interrupt


    //USART2 NVIC

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//USART2 interrupt channel

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IQR enable

    NVIC_Init(&NVIC_InitStructure);


#endif

}



void USART2_IRQHandler(void)

{

    u8 Res;

#if SYSTEM_SUPPORT_OS

    OSIntEnter();    

#endif

    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)

    {

        Res =USART_ReceiveData(USART2);//(USART2->DR)

//      USART_SendData(USART2,Res);

        if(Res == 0x00)

            down();

        if(Res == 0x01)

            up();

  } 

#if SYSTEM_SUPPORT_OS

    OSIntExit();                                             

#endif

#endif  


关键字:STM32F407  USART2  HC06  蓝牙模块通 引用地址:STM32F407用USART2与HC06蓝牙模块通信

上一篇:STM32F4之USART【库函数操作】
下一篇:STM32F4 开发笔记4: UART的使用方法

推荐阅读最新更新时间:2024-03-16 16:10

STM32F103RC USART2串口查询方式接收数据
现有一个小需求,使用STM32F1系列单片机做串口2的收发数据的功能,通过PC上的串口调试助手给单片机发一串数据,单片机收到数据后再给PC的串口调试助手发回去。 看似简单的功能,调试了好久才调好,记录一下供大家参考。 STM32使用USART2,对应单片机的PA1控制方向,PA2发送,PA3接收。 代码如下: z_hardware_usart2.h #ifndef __STM32F10X_H #define __STM32F10X_H #include stm32f10x.h #endif #ifndef __Z_UTIL_TIME_H #define __Z_UTIL_TIME_H #include z
[单片机]
STM32F103RC <font color='red'>USART2</font>串口查询方式接收数据
STM32F407--编写跑马灯
一、跑马灯硬件连接 二、库函数版--程序编写 1、库函数 // 头文件:stm32f4xx_gpio.h 源文件:stm32f4xx_gpio.c // 2、初始化函数 3、GPIO_Init函数初始化样例 // GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟 //GPIOF9,F10初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口 GPIO_InitStru
[单片机]
STM32F407--编写跑马灯
STM32F407 周期唤醒功能
1.下图是STM32F407的中文参考手册中,RTC介绍部分。因为我想实现单片机每秒自动唤醒自己一次,开始打算用闹钟中断,但是每次唤醒以后都要自己设置下次唤醒的时间,简单的方法是秒+1,但是要考虑是不是59秒的情况,比较麻烦。所以就选择唤醒中断的方式。 2.时钟图分析: (1)通过寄存器RTC_CR WUCKSESEL 设置唤醒时钟,为了方式我选择的是10X(1HZ)。 标准库代码:RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits); (2)通过RTC_WUTR寄存器设置周期唤醒的时间 标准库代码:RTC_SetWakeUpCounter(X-1);/
[单片机]
<font color='red'>STM32F407</font> 周期唤醒功能
STM32F407之TF卡HAL库的使用
一、初始化SD卡 需要定义两个类型句柄,SD卡句柄SD_InitTypeDef类型和SD卡信息句柄HAL_SD_CardInfoTypeDef类型,然后初始化SD卡句柄参数,其中首先必须初始化SD卡数据宽度1Bit,然后初始化完其他参数后,通过HAL_SD_Init()函数吃实话,这里有两个参数,分别为上面的两个参数,会将SD卡信息储存在HAL_SD_CardInfoTypeDef类型中,然后注意,需要重新使能SD卡数据宽度,HAL_SD_WideBusOperation_Config(),两个参数,一个句柄,一个宽度。同其他初始化一样,调用HAL_SD_Init时会调用回调函数,回调函数中,需要使能SD和GPIO的时钟,然后初始
[单片机]
STM32F407定时器编码器模式简介
void encoder_left_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//开启TIM3时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);//开启GPIOB时钟 GPIO_PinAFConfig(GPIOD,
[单片机]
<font color='red'>STM32F407</font>定时器编码器模式简介
基于STM32F407的永磁同步电机伺服控制器设计
自20世纪90年代以来,随着现代电机技术、现代电力电子技术、微电子技术、控制理论及计算机技术等支撑技术的快速发展,交流伺服控制技术得到极大的发展,使得先前困扰着交流伺服系统的电机控制复杂、调速性能差等问题取得了突破性的进展。交流伺服系统的性能日渐提高,价格趋于合理,使得交流伺服系统取代直流伺服系统,尤其是在高精度、高性能、智能化、模块化和网络化要求的伺服控制领域成了一个发展趋势。 在伺服控制器中,为了保证伺服控制良好的实时性、准确性及灵活性,常采用专用于电机控制的DSP(DSC)或FPGA作为控制核心,这些芯片都针对电机控制做了大量的优化,如:带死区的互补型PWM,多种触发、同步方式的快速ADC,高可靠性和抗干扰性。但它们都不约
[单片机]
基于<font color='red'>STM32F407</font>的永磁同步电机伺服控制器设计
富士最新低功耗蓝牙模块及解决方案
富士通利用 FRAM 的低功耗,高速写入,放射线耐性等特点研发的独具特色的 FRAM RFID 的芯片,可广泛应用于面向 FA,生化,医疗电子设备等领域提供创新的应用解决方案。 在 2018 第十届国际物联网博览会(春季展)的富士通展台上,您看到的是 FRAM RFID 的无线无源应用—— 二 薄型二氧化锰锂一次性电池 薄型二氧化锰锂一次性电池,就像纸一样又薄又轻,可做到不受电池厚度限制的应用薄型设计。 三 Mesh-Beacon模块/智能网络模块 Mesh Beacon,仅用 Beacon 就能够组建 Mesh 网络。利用富士通智能网络所擅长的网络自动修复属性属性,可以自动修复因单个节点故
[模拟电子]
STM32F407 纯寄存器操作GPIO,串口,中断(专治花里胡哨)
配置时钟,延时函数,均使用正点原子的SYSTEM文件 硬件:正点原子探索者,STLINK调试 系统时钟配置步骤 正点原子,时钟配置函数(我都是直接把sys.c和sys.h拷贝过来,直接使用) //设置向量表偏移地址 //NVIC_VectTab:基址 //Offset:偏移量 void MY_NVIC_SetVectorTable(u32 NVIC_VectTab,u32 Offset) { SCB- VTOR=NVIC_VectTab|(Offset&(u32)0xFFFFFE00);//设置NVIC的向量表偏移寄存器,VTOR低9位保留,即 保留。 } //时钟设置函数 //Fvco=Fs*(
[单片机]
<font color='red'>STM32F407</font> 纯寄存器操作GPIO,串口,中断(专治花里胡哨)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved