加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

第五章-V1.5 HC05藍牙模塊使用 STM32串口接受中斷 HC05藍牙模塊連手機

08/22 11:14
861
服務支持:
技術交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術大咖們分享疑惑和經(jīng)驗、收獲成長和認同、領取優(yōu)惠和紅包等。

虛擬商品不可退

當前內(nèi)容為數(shù)字版權作品,購買后不支持退換且無法轉移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
  • 方案介紹
  • 推薦器件
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

第五章-V1.5 HC05藍牙模塊使用 STM32串口接受中斷 HC05藍牙模塊連手機 HC05藍牙模塊STM32和手機 STM32HAL庫串口通訊協(xié)議 STM32串口收發(fā)數(shù)據(jù) STM32藍牙模塊配對

當前筆記版本1.5
現(xiàn)在有兩個版本小車
V1.5.0


[stm32入門教程][STM32實戰(zhàn)項目]STM32智能小車V1.5-stm32f103c8t6-stm32最小系統(tǒng)-手把手入門教程-嵌入式開發(fā)-嵌入式學習

V3.3.0-STM32智能小車
視頻鏈接


STM32智能小車V3-STM32入門教程-openmv與STM32循跡小車-stm32f103c8t6-電賽 嵌入式學習 PID控制算法 編碼器電機 跟隨

介紹:
V1.5.0:庫函數(shù)開發(fā)。功能:循跡、避障、跟隨、遙控、電池電壓顯示等。
V3:HAL庫開發(fā)、功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、視覺控制。

串口接收發(fā)送

STM32串口初始化

這里先初始化使用串口1

//串口1中斷服務程序
//注意,讀取USARTx->SR能避免莫名其妙的錯誤
u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個字節(jié).
//接收狀態(tài)
//bit15, 接收完成標志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字節(jié)數(shù)目
u16 USART_RX_STA=0; //接收狀態(tài)標記
void uart_init(u32 bound){
//GPIO端口設置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
//使能USART1,GPIOA時鐘
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優(yōu)先級3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優(yōu)先級3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器
//USART 初始化設置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟串口接受中斷
USART_Cmd(USART1, ENABLE); //使能串口1
}

在main中定義標志位

int g_USART1_FLAG1 = 0; //串口控制標志位

usart.h中聲明變量

extern int g_USART1_FLAG1 ;

在中斷服務函數(shù)添加處理

void USART1_IRQHandler(void) //串口1中斷服務程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數(shù)據(jù)必
須是0x0d 0x0a結尾)
{
Res =USART_ReceiveData(USART1); //讀取接收到的數(shù)據(jù)
if(Res == 'A') g_USART1_FLAG1 = 1 ; //根據(jù)接受的數(shù)據(jù) 置為標志位
if(Res == 'B')g_USART1_FLAG1 = 2 ;
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
else USART_RX_STA|=0x8000; //接收完成了
}
else //還沒收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數(shù)據(jù)錯
誤,重新開始接收
}
}
}
}
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
OSIntExit();
#endif
}

調(diào)用初始化函數(shù)

uart_init(115200); //串口初始化為115200

在main.c 的邏輯

while(1)
{
//串口
if(g_USART1_FLAG1 == 1){
LED =! LED;
}
if(g_USART3_FLAG1 == 2) {
LED =! LED;
}
}

測試單片機串口

TTL與單片機連接
在這里插入圖片描述
TTL插入電腦,使用串口助手->選擇端口->更改波特率115200->發(fā)送數(shù)據(jù)
在這里插入圖片描述
現(xiàn)象 發(fā)送A 或B 可以使小燈反轉、發(fā)送其他命令無現(xiàn)象。

配置藍牙

更改藍牙波特率
見硬件藍牙介紹
我們在AT模式下設置發(fā)送AT指令:AT+UART=115200,0,0
在這里插入圖片描述

測試藍牙

斷電重啟藍牙,更改軟件波特率為115200,打開手機藍牙與HC-05配對 (密碼:1234)
使用藍牙調(diào)試器(應用商店下載即可),發(fā)送aa 觀察電腦串口軟件
在這里插入圖片描述
手機APP-藍牙調(diào)試器的設置方法
調(diào)試成功 :藍牙軟件和串口軟件能夠通訊
在這里插入圖片描述

練一練–藍牙控制小燈

連接如圖
在這里插入圖片描述
通過發(fā)送A或者B 控制單片機小燈反轉
那么上面我們就完成了藍牙的基本控制
然后我們就可以藍牙反轉燈的時候控制小車前行停止

//串口
if(g_USART1_FLAG1 == 1){
g_USART1_FLAG1 = 0;
//左電機慢速正轉
AIN1=0;
AIN2=1;
TIM_SetCompare4(TIM1,1700); //設置
//右邊電機慢速執(zhí)行
BIN1 =1;
BIN2 =0;
TIM_SetCompare1(TIM1,1700);
LED =! LED;
}
if(g_USART1_FLAG1 == 2) {
g_USART1_FLAG1 = 0;
//雙電機停止
BIN1 = 0;
BIN2 = 0;
AIN1 = 0;
AIN2 =0;
LED =! LED;
}

上面是通過串口一(PA9 PA10)
藍牙硬件是串口三(PB10 PB11)下面我們通過串口三實現(xiàn)
初始化使用串口3

//初始化串口3
void uart_init_3(u32 bound){
//GPIO端口設置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能USART3
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //,GPIOB時鐘
//USART3_TX GPIOB.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10
//USART3_RX GPIOB.11初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11
//Usart3 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優(yōu)先級3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優(yōu)先級3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器
//USART 初始化設置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式
USART_Init(USART3, &USART_InitStructure); //初始化串口3
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開啟串口接受中斷
USART_Cmd(USART3, ENABLE); //使能串口3
}

在main中定義標志位

int g_USART3_FLAG1 = 0; //串口3控制標志位

在usart.h中聲明變量

extern int g_USART3_FLAG1 ;

在中斷服務函數(shù)添加處理

//串口3 中斷處理函數(shù)
void USART3_IRQHandler (void)
{
u8 Res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART3); //讀取接收到的數(shù)據(jù)
if(Res == 'A') g_USART3_FLAG1 = 1 ; //根據(jù)接受的數(shù)據(jù) 置為標志位
if(Res == 'B')g_USART3_FLAG1 = 2 ;
}
}

調(diào)用初始化函數(shù)

uart_init_3(115200); //初始化串口3

在main.c 編寫邏輯

while(1)
{
//串口
if(g_USART3_FLAG1 == 1){
g_USART3_FLAG1 = 0;
//左電機慢速正轉
AIN1=0;
AIN2=1;
TIM_SetCompare4(TIM1,1700); //設置
//右邊電機慢速執(zhí)行
BIN1 =1;
BIN2 =0;
TIM_SetCompare1(TIM1,1700);
LED =! LED;
}
if(g_USART3_FLAG1 == 2) {
g_USART3_FLAG1 = 0;
//雙電機停止
BIN1 = 0;
BIN2 = 0;
AIN1 = 0;
AIN2 =0;
LED =! LED;
}
}

把藍牙安裝順序連接到STM32
跳線帽改至藍牙
在這里插入圖片描述
手機連接藍牙 使用藍牙調(diào)試器發(fā)送 A 或者 B
現(xiàn)象:發(fā)送A 小車直行、發(fā)送B小車停止。

練一練–藍牙控制小車運動

USART中斷服務函數(shù)

//串口3 中斷處理函數(shù)
void USART3_IRQHandler (void)
{
u8 Res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART3); //讀取接收到的數(shù)據(jù)
if(Res == 'A') g_USART3_FLAG1 = 1 ; //根據(jù)接受的數(shù)據(jù) 置為標志位
if(Res == 'B')g_USART3_FLAG1 = 2 ;
if(Res == 'C') g_USART3_FLAG1 = 3 ; //根據(jù)接受的數(shù)據(jù) 置為標志位
if(Res == 'D')g_USART3_FLAG1 = 4 ;
if(Res == 'E')g_USART3_FLAG1 = 5;
}
}

main 中的邏輯

while(1)
{
if(g_USART3_FLAG1 == 1) //前進
{
g_USART3_FLAG1=0;
Forward();
delay_ms(500);
}
if(g_USART3_FLAG1 == 2) //向右
{
g_USART3_FLAG1=0;
Rightward();
delay_ms(500);
}
if(g_USART3_FLAG1 ==3) //向左
{
g_USART3_FLAG1=0;
Leftward();
delay_ms(500);
}
if(g_USART3_FLAG1 ==4) //向后
{
g_USART3_FLAG1=0;
Backward();
delay_ms(500);
}
if(g_USART3_FLAG1 ==5) //停止
{
g_USART3_FLAG1=0;
AIN1=0;
AIN2=0;
BIN1=0;
BIN2=0;
delay_ms(500);
}
}

手機中藍牙調(diào)試助手的設計
在這里插入圖片描述

練一練–把數(shù)據(jù)發(fā)送給電腦串口助手和手機APP

前面我們介紹了,如何通過電腦或者藍牙APP,向單片機發(fā)送數(shù)據(jù),下面我們介紹如何:單片機如何向
電腦和藍牙APP發(fā)送數(shù)據(jù)。
庫函數(shù)提供了相關串口函數(shù),但是每次只能發(fā)送一個字節(jié)

USART_SendData(USART1,'X');//通過庫函數(shù)發(fā)送字節(jié)數(shù)據(jù)
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);//判斷發(fā)送標志位,是否發(fā)送
結束

在正點原子例程中完成了對printf的重映射,所以我們可以輕松的通過printf ()函數(shù)向串口1 發(fā)送不定長
數(shù)據(jù),這是正點原子的例程

struct __FILE
{
int handle;
};
FILE __stdout;
//定義_sys_exit()以避免使用半主機模式
void _sys_exit(int x)
{
x = x;
}
//重定義fputc函數(shù)
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢 通過SR寄存器判斷是否發(fā)送完成
USART1->DR = (u8) ch; //通過DR寄存器發(fā)送數(shù)據(jù)
return ch;
}

那么我們?nèi)绾螌崿F(xiàn)任意串口都可以任性發(fā)送那?
這里我們使用vsprintf 格式化字符串來完成
需要包含的頭文件

#include "stdarg.h"
void UsartPrintf(USART_TypeDef * USARTx,char * fmt ,...)
{
unsigned char UsartPrintfBuf[256]; //定義一個字符串數(shù)組
va_list ap;//初始化指向參數(shù)列表的指針
unsigned char *pStr = UsartPrintfBuf; //指針指向數(shù)組首地址
va_start(ap,fmt);//將第一個可變參數(shù)的地址付給ap,即ap 指向可變參數(shù)列表的開始
vsprintf((char *)UsartPrintfBuf, fmt,ap);
//將參數(shù)fmt、ap 指向的可變參數(shù)一起轉化成格式化字符串,放string數(shù)組中,作用同sprintf
(),只是參數(shù)類型不同
va_end(ap); //清除指針
while(*pStr != 0) //判斷是否發(fā)送完字符串
{
//while(USART_GetFlagStatus(USART3,USART_FLAG_TC == RESET));//判斷發(fā)送標志
位,是否發(fā)送結束
USART_SendData(USARTx,*pStr++);//通過庫函數(shù)發(fā)送字符串
//pStr ++;
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == RESET);//判斷發(fā)送標志
位,是否發(fā)送結束
}
}

參考資料:
在main 中調(diào)用函數(shù)

UsartPrintf(USART3,"Distance:%dMode:%d",TCRT5000_Dist(),Mode);

在手機APP顯示數(shù)據(jù)
在這里插入圖片描述

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
XRCGB25M000F3A00R0 1 Murata Manufacturing Co Ltd Parallel - Fundamental Quartz Crystal, 25MHz Nom, ROHS AND REACH COMPLIANT, SMALL, SMD, 3 PIN

ECAD模型

下載ECAD模型
$0.34 查看
M25P05-AVMN6P 1 Rochester Electronics LLC 64KX8 FLASH 2.7V PROM, PDSO8, 0.150 INCH, ROHS COMPLIANT, PLASTIC, SOP-8
$0.79 查看
S29GL256P10FFI020 1 AMD Flash, 16MX16, 100ns, PBGA64,
$9.29 查看

相關推薦

電子產(chǎn)業(yè)圖譜