一、说明:写本文的目的是抛弃一些比较专业的描述,从一些刚接触的小白角度出发,帮助此类朋友解决一些问题,所以内容都是用比较通俗的白话来写,网上已经有许多的比较专业的描述教程,若你想要一些比较专业性的描述,本人建议你看其他朋友的。

二、概论:本文内容主要是介绍如何在STM32上添加、使用蓝牙模块,介绍怎么将蓝牙与STM32联系起来,文章最后介绍一个实例。

三、硬件连接

1、连接图

Android命令查看蓝牙地址信息_java

实物连接图(看线的颜色)

Android命令查看蓝牙地址信息_stm32_02

Android命令查看蓝牙地址信息_java_03

Android命令查看蓝牙地址信息_c语言_04

如上图所示,该STM32具有三组串口管脚,自己选一组(具体看自己STM32板子的电路图,下面内容我只以RX1/TX1这组为例,不同组接下来的代码配置也会不同),至于VCC管脚和GND管脚自己找,板子上有标志。

首先说一下STM32板子在这里实现的功能本质——“串口通信”,和蓝牙模块在这里充当的角色——“串口客户端”

这个怎么理解呢? 简单来说,STM板子和蓝牙模块进行“微信聊天”,即都具有发送接收功能。

三、串口内容:

接完管脚了,接下来就是代码部分,串口功能总共五个函数(建议复制粘贴)

(1)通信初始化

void USART_Config(void)  
{  
    GPIO_InitTypeDef x;
    USART_InitTypeDef y;

   //打开时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

    x.GPIO_Pin=GPIO_Pin_9;
    x.GPIO_Mode=GPIO_Mode_AF_PP;
    x.GPIO_Speed=GPIO_Speed_50MHz;
    //初始化发送管脚
    GPIO_Init(GPIOA,&x);                  

    x.GPIO_Pin=GPIO_Pin_10;
    x.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    //初始化接收管脚
    GPIO_Init(GPIOA,&x);                  

    //注意波特率,否则会出现乱码
    y.USART_BaudRate=9600;      
    y.USART_WordLength=USART_WordLength_8b;
    y.USART_Parity=USART_Parity_No;
    y.USART_StopBits=USART_StopBits_1;
    y.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    y.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    //串口配置(波特率等)
    USART_Init(USART1,&y);                

    //打开串口接收中断
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);    
    USART_Cmd(USART1,ENABLE);

    //配置串口中断的优先级
    NVIC_Configuration();    
}

(2)配置串口中断优先级

void NVIC_Configuration()
{
    NVIC_InitTypeDef NVIC_InitStruct;    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    
    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

(3)写一下中断处理函数

void USART1_IRQHandler(void)
{
    uint8_t ucTemp;
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
    {
        ucTemp=USART_ReceiveData(USART1);
        USART_SendData(USART1,ucTemp);
    }
}

(4)重写输出输入函数(记得添加#include "stdio.h"哦)

#include "stdio.h"
int fputc(int ch,FILE *f)
{
    USART_SendData(USART1,(uint8_t)ch);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    return (ch);
}
int fgetc(FILE *f)
{
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    return (int)USART_ReceiveData(USART1);
}

(5)最后当然是主函数了(记得包括上面的头文件总共有两个头文件哦)

#include "stm32f10x.h"
int main(void)  
{  
    USART_Config();
    while(1);
}

四、功能例子(在手机端通过蓝牙控制STM32板子小灯)

(1)配置串口(就是上面的代码)

(2)初始化小灯(我的STM32控制LED灯的管脚为PC13)

Android命令查看蓝牙地址信息_Android命令查看蓝牙地址信息_05

void LED_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);    
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStruct);
}

(3)小灯控制函数

//LED_G(0): 灯亮 | LED_G(1):灯灭
void LED_G(uint8_t n)                
{
    if(n)
        GPIO_SetBits(GPIOC, GPIO_Pin_13);
    else
        GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}

(4)修改主函数

#include "stm32f10x.h"
int main(void)  
{  
    USART_Config();
    LED_GPIO_Config(); 
    while(1);
}

(5)修改串口中断函数

//如果手机蓝牙发送‘0’则灯亮,(若其他数据)否则灯灭
void USART1_IRQHandler(void)  
{  
    u8 res;  
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  
    { 
        res= USART_ReceiveData(USART1);   
        USART_SendData(USART1,res);
        if(res=='0')
        {
            LED_G(0);
        }
        else
        {
            LED_G(1);
        }        
    }  
}

五、效果

Android命令查看蓝牙地址信息_Android命令查看蓝牙地址信息_06

Android命令查看蓝牙地址信息_Android命令查看蓝牙地址信息_07

Android命令查看蓝牙地址信息_Android命令查看蓝牙地址信息_08

Android命令查看蓝牙地址信息_c语言_09

六、资源

完整工程 链接:https://pan.baidu.com/s/18EuSGRANwR2XbEAwpQLwbg  提取码:x6v4

测试软件 链接:https://pan.baidu.com/s/1rX6GbTvHRU3Mb18tgwEjHg  提取码:td1d

七、后文

制作手机App:通过手机蓝牙(Bluetooth)与STM32上的低功耗蓝牙(HC-42)连接通信,实现手机端对单片机的控制。