本人也是剛接觸stm32,在假期花了幾天時間去弄stm2與藍牙之間的通信過程,總算弄出來了。在此做一個筆記,分享一下過程。這第一次寫博客,希望不會太爛~~~
目錄介紹
*準備工作
*HC-05簡介
*STM32F429簡介
*代碼編寫
*視頻效果展示
*程序源碼包
準備工作
本次小實驗用到的開發板是正點原子的阿波羅STM32F429,藍牙是某寶上買的HC-05模塊,一臺安卓手機,藍牙APP,四根杜邦線
HC-05簡介
這款藍牙是比較通用的藍牙2.0模塊,在某寶上也比較常見,也比較便宜,適合學生黨開發,當然也可以選擇正點原子提供的藍牙模塊,只不過價格…使用藍牙通信有簡單方便等特點,在本次實驗所需要做的僅僅是修改波特率和接入開發板連通手機下面就是HC-05正面圖。
可以看到該藍牙模塊有6個引腳,其中需要用到有四個:VCC(+5V)、GND、RX、TX,與開發板的硬件連接如下:
下面開始修改波特率,藍牙模塊的默認波特率是38400,由於我需要的波特率是115200,因此需要先通過串口調試助手和USB轉TTL模塊更改波特率。接線也是按照:VCC---->VCC,GND---->GND,TX---->RX,RX---->TX。接好線後要長按藍牙上面的按鈕進入命令響應工作模式,就可以開始修改波特率了。用到的 AT指令是:AT+UART=115200,0,0。返回OK就說明修改成功了。詳細過程參考Yngz_Miao大神的博客
至此藍牙模塊的準備工作就完成了,下面開始介紹STM32F429。
STM32F429簡介
相信想學STM32的同學都對開發板有了初步的瞭解,我就不詳細介紹了。本次實驗需要用到的工程源碼是基於原子哥配套的串口發送和接收實驗的視頻教程來編寫的,主要用到的串口是USART1,在代碼部分我會貼出主要代碼,原理部分相信HAL庫的開發文檔有更詳細的介紹,就不解釋了。需要注意的是:在燒錄代碼的前要把USART1即PA9和PA10用跳線帽短接,如下圖。
代碼編寫
在建立工程時我主要編寫修改三個文件:main.c、uart1.c和led.c,其中的關鍵代碼是存放串口初始化及配置的uart1.c文件,由於我不是使用工程模板中的usart.c文件而是自己編寫了uart1.c文件,因此首先需要把SYSTEM文件夾下面的幾個函數註釋掉,如下圖:保留76行之前的代碼,後面的函數一個個註釋掉。
然後首先看看uart1.c文件的代碼:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "uart1.h"
#include "led.h"
u8 rdata[1];
UART_HandleTypeDef usart1_handler;//由HAL_UART_Init(UART_HandleTypeDef *huart),需要定義一個結構體成員指針
void uart1_init()
{
usart1_handler.Instance=USART1;//基地址
usart1_handler.Init.BaudRate=115200;//波特率
usart1_handler.Init.WordLength=UART_WORDLENGTH_8B;//字節長度
usart1_handler.Init.StopBits=UART_STOPBITS_1;//停止位
usart1_handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;//硬件流控制
usart1_handler.Init.Mode=UART_MODE_TX_RX;//開啓發送、接收模式
usart1_handler.Init.Parity=UART_PARITY_NONE;//奇偶校驗位
HAL_UART_Init(&usart1_handler);//函數需要包含句柄,因此需要在開頭定義此處調用
}
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef GPIO_Initure;
if(huart->Instance==USART1)
{
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA時鐘
__HAL_RCC_USART1_CLK_ENABLE(); //使能USART1時鐘
GPIO_Initure.Pin=GPIO_PIN_9; //PA9
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //複用推輓輸出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF7_USART1; //複用爲USART1
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9
GPIO_Initure.Pin=GPIO_PIN_10; //PA10
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10
HAL_NVIC_SetPriority(USART1_IRQn, 3, 3);//設置中斷優先級
HAL_NVIC_EnableIRQ(USART1_IRQn);//使能中斷通道
}
}
void USART1_IRQHandler(void)//中斷服務函數
{
HAL_UART_IRQHandler(&usart1_handler);//調用HAL庫提供的中斷處理函數
HAL_UART_Receive_IT(&usart1_handler, rdata, sizeof(rdata));//使能接收中斷
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//接收完成回調函數
{
u8 rec;
if(huart->Instance==USART1)
{
rec=rdata[0];//rec保存接收到的一位數據(u8 rdata[1];)
HAL_UART_Transmit(&usart1_handler, &rec, 1, 1000);//需要顯示在電腦串口助手上,需要調用HAL_UART_Transmit()函數
if(rec=='1')
{
LED0=0;
LED1=1;
}
if(rec=='2')
{
LED0=1;
LED1=0;
}
}
}
uart1.c中的代碼其實就是視頻教程中串口接收的教程,買了開發板的同學應該知道在哪,直接拿過來修改就可以了:
再貼出一下uart1.h的代碼:其實就是對uart1.c的幾個函數和變量的聲明
#ifndef UART1_H
#define UART1_H
#include "sys.h"
extern u8 rdata[1];
extern UART_HandleTypeDef usart1_handler;//聲明此變量在別的函數定義了
void uart1_init(void);
#endif
下面是led.c和led.h中的代碼:
#ifndef UART1_H
#define UART1_H
#include "sys.h"
extern u8 rdata[1];
extern UART_HandleTypeDef usart1_handler;//聲明此變量在別的函數定義了
void uart1_init(void);
#endif
#ifndef _LED_H
#define _LED_H
#include "sys.h"
#define LED0 PBout(1) //LED0
#define LED1 PBout(0) //LED1
void LED_Init(void);
#endif
最後看一下主函數main.c中的代碼:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "uart1.h"
#include "led.h"
int main(void)
{
u8 buffer[] ="test";
HAL_Init(); //初始化HAL庫
Stm32_Clock_Init(360,25,2,8); //設置時鐘,180Mhz
delay_init(180);
uart1_init();
LED_Init();
while(1)
{
HAL_UART_Transmit(&usart1_handler,buffer,sizeof(buffer),1000);//使能發送
printf("\r\n");
HAL_UART_Receive_IT(&usart1_handler, rdata, sizeof(rdata));//使能接收中斷
delay_ms(3000);
}
}
這些代碼都有詳細的註釋,跟原子哥視頻教學的一模一樣,無非是寄存器的使用函數的調用,看不懂的話可以去看視頻。
視頻效果展示:
跳轉百度網盤
程序源碼包:
跳轉百度網盤