STM32之USART1串口:蓝牙接收字符控制LED亮灭

时间:2024-01-21 20:49:24

基础的就不讲了,直接上配置文件,led.c  led.h  usart.c  usart.h  stm32f10x_it.c   延时函数这些都自己写吧,网上搜索一大把,本次用到的蓝牙模块为 不知什么系列,具体见文末图,蓝牙的RXD连接单片机的TXD,蓝牙的TXD连接单片机的RXD,还有两个口,VCC和GND,接5V电源,还有配套自己写的安卓app,文末贴上百度网盘下载地址,实现的功能就是手机蓝牙app里面发送‘A’字符到单片机灯亮,发送‘B’字符灯灭;

led.c文件所包含的内容:

void LED_Config(void){ //LED灯的接口初始化
GPIO_InitTypeDef GPIO_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 
GPIO_InitStruct.GPIO_Pin =GPIO_Pin_8; //选择端口号(0~15或all) 
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式 
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz) 
GPIO_Init(GPIOA, &GPIO_InitStruct);

}

 

 

 

led.h文件所包含的内容:

#ifndef __LED_H
#define __LED_H     
#include "stm32f10x.h"


void LED_Config(void);//初始化


#endif

 

 

 

 

usart.c文件所包含的内容:

static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

/* 嵌套向量中断控制器组选择 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;    /* 配置USART为中断源 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    /* 抢断优先级*/
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;    /* 子优先级 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    /* 使能中断 */


/* 初始化配置NVIC */
NVIC_Init(&NVIC_InitStructure);
}

void USART_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

// 打开串口GPIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

// 打开串口外设的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

// 将USART Tx的GPIO配置为推挽复用模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// 将USART Rx的GPIO配置为浮空输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// 配置串口的工作参数
// 配置波特率
USART_InitStructure.USART_BaudRate = 9600;  //蓝牙模块出厂默认9600 波特率
// 配置 针数据字长
USART_InitStructure.USART_WordLength = USART_WordLength_8b;    //8位
// 配置停止位
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(USART1, &USART_InitStructure);

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

// 使能串口接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);    

// 使能串口
USART_Cmd(USART1, ENABLE);    
}

 

 

 

usart.h文件所包含的内容:

#ifndef __USART_H
#define __USART_H     
#include "stm32f10x.h"

void USART_Config(void);

#endif

 

 

 

stm32f10x_it.c中编写中断服务函数为:

注意:stm32f10x_it.c 中需要包含某些头文件,比如 usart.h 和你调用的函数:延时函数,也可直接写在stm32f10x_it.c 文件中,但是不推荐,可以自己建立一个delay.c和delay.h,然后直接包含头文件即可

void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Receive_Data = 0;
if(USART_GetITStatus(USART1, USART_IT_RXNE)) //由于只设置了一种接收中断,判断可以省略
{
Receive_Data = USART_ReceiveData(USART1);//保存接收到的数据,RXNE自动清零

/*下面的语句就是自己想实现的功能,比如简单的灯亮灯灭程序,下面程序就是单片机收到 A 字符就灯亮,收到 B 字符就灯灭*/

if(Receive_Data==\'A\'){
GPIO_SetBits(GPIOA, GPIO_Pin_8);
SysTick_Delay_ms(1000);
}

if(Receive_Data==\'B\'){
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
SysTick_Delay_ms(1000);
}
//USART_ClearFlag(USART1,USART_IT_RXNE); //手动清零
}
}

 

 

 

 手机蓝牙软件下载地址:

链接:https://pan.baidu.com/s/1kmt-AHwPHnqiELMrNLqPiQ
提取码:9cj4

自己写的蓝牙软件,可能安装的时候会误报为有病毒,可以放心使用,当然不保证所有的蓝牙芯片都能用,但是我写的串口程序是可以用的,可以自己在淘宝上买蓝牙芯片且附带蓝牙APP的。

简述一下蓝牙的使用步骤:先不打开我写的蓝牙APP,手机设置里面先和蓝牙模块配对成功后,打开蓝牙APP,点击蓝牙设备选择,选择配对时候的地址,就行了,蓝牙模块的灯常亮就是连接成功了。当然,退出软件的时候最好还是点击 断开连接 后再退出软件。

蓝牙APP软件截图:

注:图中的1~8按钮就是发送对应的数字给单片机,写中断程序的时候,进行相应的判断即可!

 

全家图:

 

蓝牙模块实图:

最后,作者也是第一次写博客,如有问题还请见谅并指出,以上纯属个人编程观点,如有疑问欢迎留言,谢谢!