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亮滅