因为想做一个蓝牙控制的小车,跑通电机驱动程序了,但还缺少一个蓝牙控制,所以想着做一个简单的控制实验。
实验目的:手机端发送数据后,不仅能在开发板显示屏上显示数据内容,还可以控制LED灯的开关。
硬件需求:一个正点原子的开发板(带显示屏),一个蓝牙模块
硬件连接:将蓝牙模块的收发引脚与开发板上USART1的发收引脚相连接
软件需求:在手机上下载一个“蓝牙调试器”APP,提前让其与蓝牙模块相连
需求分解:
(1)在STM32开发板上接收到手机端通过蓝牙发送的信息
主函数如下图所示:
将代码下载到开发板上,运行效果如下图所示:
(2)将接收到的信息显示到LCD屏幕上
直接利用正点原子套件中写得lcd驱动代码,然后利用lcd_show_string()函数,这部分代码如下:
结合(1)中的代码,整体效果如下:
(3)根据显示信息(开发板接收到的信息)进行LED控制
这部分的代码如下:
此时的实验结果时:输入b后,LED0快速闪烁,输入非b值后,LED0灯关闭。
以下为详细代码
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/USART_SELF/usart_self.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟,72M */
delay_init(72); /* 初始化延时函数 */
led_init(); /* 初始化LED */
usart_init(9600);
lcd_init();
char ledCont = 'b';
char bufDate;
while(1)
{
if(g_usart_rx_flag == 1)
{
//printf("The char is:");
//HAL_UART_Transmit(&usart_handle, (uint8_t *)g_rx_buffer, 1, 1000);
while(__HAL_UART_GET_FLAG(&usart_handle, UART_FLAG_TC) != 1);
g_usart_rx_flag = 0;
}
else
{
delay_ms(10);
}
lcd_show_string(10, 20, 240, 32, 32, "BlueConTest", BLACK);
lcd_show_string(10, 60, 240, 24, 24, "The data is:", BLACK);
lcd_show_string(160, 60, 240, 24, 24, (char *)g_rx_buffer, BLACK);
bufDate = g_rx_buffer[0];
if( bufDate == ledCont )
{
LED0_TOGGLE();
}
else
{
LED0(0);
}
}
}
usart_self.c(这是在正点原子的USART驱动代码的基础上写的)
void USART1_IRQHandler(void);
uint8_t g_rx_buffer[1];
uint8_t g_usart_rx_flag = 0;
UART_HandleTypeDef usart_handle;
/* 串口1初始化 */
/* 设置串口参数,并初始化串口 */
void usart_init( uint32_t baudrate )
{
usart_handle.Instance = USART1;
usart_handle.Init.BaudRate = baudrate ;
usart_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
usart_handle.Init.Mode = UART_MODE_TX_RX;
usart_handle.Init.Parity = UART_PARITY_NONE;
usart_handle.Init.StopBits = UART_STOPBITS_1;
usart_handle.Init.WordLength = UART_WORDLENGTH_8B;
HAL_UART_Init(&usart_handle);
HAL_UART_Receive_IT(&usart_handle, (uint8_t*)g_rx_buffer, 1);
}
/* 串口MSP回调函数 */
/* 什么是MSP? Main Stack Pointer:主堆栈指针 */
/* 使能串口、引脚时钟;初始化引脚;设置中断优先级并使能 */
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if(huart -> Instance == USART1)
{
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
gpio_init_struct.Pin = GPIO_PIN_9;
gpio_init_struct.Mode = GPIO_MODE_AF_PP;
gpio_init_struct.Pull = GPIO_PULLUP;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &gpio_init_struct);
gpio_init_struct.Pin = GPIO_PIN_10;
gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &gpio_init_struct);
HAL_NVIC_SetPriority(USART1_IRQn, 2, 2);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
}
/* 串口1中断服务函数 */
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&usart_handle);
HAL_UART_Receive_IT(&usart_handle, (uint8_t*)g_rx_buffer, 1);
}
/* 串口数据接收完成回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
g_usart_rx_flag = 1;
}