本人也是刚接触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);
}
}
这些代码都有详细的注释,跟原子哥视频教学的一模一样,无非是寄存器的使用函数的调用,看不懂的话可以去看视频。
视频效果展示:
跳转百度网盘
程序源码包:
跳转百度网盘