1. 程式人生 > >STM32之USART1串口:藍牙接收字符控制LED亮滅

STM32之USART1串口:藍牙接收字符控制LED亮滅

字長 謝謝 rate 退出 下載 bit ref 提取 功能

基礎的就不講了,直接上配置文件,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亮滅