STM32之USART1串口:蓝牙接收字符控制LED亮灭
Posted linchengg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32之USART1串口:蓝牙接收字符控制LED亮灭相关的知识,希望对你有一定的参考价值。
基础的就不讲了,直接上配置文件,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按钮就是发送对应的数字给单片机,写中断程序的时候,进行相应的判断即可!
全家图:
蓝牙模块实图:
最后,作者也是第一次写博客,如有问题还请见谅并指出,以上纯属个人编程观点,如有疑问欢迎留言,谢谢!
以上是关于STM32之USART1串口:蓝牙接收字符控制LED亮灭的主要内容,如果未能解决你的问题,请参考以下文章
关于STM32串口接收中断,网上有如下中断方式接收数据的程序:
STM32单片机通过USART1接收到数据后,怎么把接收到的数据通过单片机的CAN口发送出去啊?