【STM32单片机_(HAL库)】6-6-2【串口通信UART、USART】【蓝牙遥控插座项目】项目实现
1.项目需求
手机通过蓝牙模块远程遥控风扇。
2.硬件
- STM32单片机最小系统
- 继电器模块
- 蓝牙模块
硬件接线
STM32 | 蓝牙模块 | 继电器 |
---|---|---|
PA2 | RX | |
PA3 | TX | |
PB6 | I/O | |
3V3 | VCC | |
5V | VCC | |
GND | GND | GND |
- 项目框图
3.软件
- bluetooth、plugin驱动文件添加
- main.c程序
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "bluetooth.h"
#include "plugin.h"int main(void)
{HAL_Init(); /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init(); /* 初始化LED灯 */uart1_init(115200);bt_init(115200);plugin_init();printf("hello world!\r\n");// uint8_t i = 0;while(1){
// bt_send("hello, bt%d\r\n", i++);
// delay_ms(500);
// led1_on();
// led2_off();
// delay_ms(500);
// led1_off();
// led2_on();
// delay_ms(500);}
}
- bluetooth.c程序
#include "sys.h"
#include "bluetooth.h"
#include "string.h"
#include "stdarg.h"
#include "plugin.h"UART_HandleTypeDef uart2_handle; /* uart2句柄 */uint8_t uart2_rx_buf[UART2_RX_BUF_SIZE]; /* uart2接收缓冲区 */
uint16_t uart2_rx_len = 0; /* uart2接收字符长度 *//*** @brief 串口1初始化函数* @param baudrate: 波特率, 根据自己需要设置波特率值* @retval 无*/
void bt_init(uint32_t baudrate)
{/*uart2 初始化设置*/uart2_handle.Instance = USART2; /* USART1 */uart2_handle.Init.BaudRate = baudrate; /* 波特率 */uart2_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 字长为8位数据格式 */uart2_handle.Init.StopBits = UART_STOPBITS_1; /* 一个停止位 */uart2_handle.Init.Parity = UART_PARITY_NONE; /* 无奇偶校验位 */uart2_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */uart2_handle.Init.Mode = UART_MODE_TX_RX; /* 收发模式 */HAL_UART_Init(&uart2_handle); /* HAL_UART_Init()会使能uart2 */
}/*** @brief uart2接收缓冲区清除* @param 无* @retval 无*/
void uart2_rx_clear(void)
{memset(uart2_rx_buf, 0, sizeof(uart2_rx_buf)); /* 清空接收缓冲区 */uart2_rx_len = 0; /* 接收计数器清零 */
}/*** @brief 串口2中断服务函数* @note 在此使用接收中断及空闲中断,实现不定长数据收发* @param 无* @retval 无*/
void USART2_IRQHandler(void)
{uint8_t receive_data = 0; if(__HAL_UART_GET_FLAG(&uart2_handle, UART_FLAG_RXNE) != RESET){ /* 获取接收RXNE标志位是否被置位 */if(uart2_rx_len >= sizeof(uart2_rx_buf)) /* 如果接收的字符数大于接收缓冲区大小, */uart2_rx_len = 0; /* 则将接收计数器清零 */HAL_UART_Receive(&uart2_handle, &receive_data, 1, 1000); /* 接收一个字符 */uart2_rx_buf[uart2_rx_len++] = receive_data; /* 将接收到的字符保存在接收缓冲区 */}if (__HAL_UART_GET_FLAG(&uart2_handle, UART_FLAG_IDLE) != RESET) /* 获取接收空闲中断标志位是否被置位 */{printf("bt recv: %s\r\n", uart2_rx_buf); /* 将接收到的数据打印出来 */if(strstr((char *)uart2_rx_buf, "on") != NULL)//on不等于NULL,接收到"on"plugin_on(); //继电器打开else if(strstr((char *)uart2_rx_buf, "off") != NULL)//接收到"off"plugin_off();//继电器闭合uart2_rx_clear();__HAL_UART_CLEAR_IDLEFLAG(&uart2_handle); /* 清除UART总线空闲中断 */}
}//void bt_send(char *send_buf, uint8_t size)
//{
// HAL_UART_Transmit(&uart2_handle, (uint8_t *)send_buf, size, 100);
//}void bt_send(char * format, ...)
{uint8_t send_buf[128] ={0};va_list arg;va_start(arg, format);vsprintf((char *)send_buf, format, arg);va_end(arg);HAL_UART_Transmit(&uart2_handle, send_buf, sizeof(send_buf), 100);
}
- bluetooth.h程序
#ifndef __BLUETOOTH_H__
#define __BLUETOOTH_H__#include "stdio.h"
#include "sys.h"/* UART收发缓冲大小 */
#define UART2_RX_BUF_SIZE 128
#define UART2_TX_BUF_SIZE 64void bt_init(uint32_t bound); /* 串口初始化函数 */
//void bt_send(char *send_buf, uint8_t size);
void bt_send(char * format, ...);#endif
- plugin.c
#include "plugin.h"
#include "sys.h"//初始化GPIO函数
void plugin_init(void)
{GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟//调用GPIO初始化函数gpio_initstruct.Pin = GPIO_PIN_6; // 继电器对应的引脚gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出gpio_initstruct.Pull = GPIO_PULLUP; // 上拉gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速HAL_GPIO_Init(GPIOB, &gpio_initstruct);//关闭LEDplugin_off();
}//闭合继电器的函数
void plugin_on(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); // 拉低LED1引脚,点亮LED1
}//松开继电器的函数
void plugin_off(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET); // 拉高LED1引脚,熄灭LED1
}//获取继电器状态的函数
uint8_t plugin_status_get(void)
{return (uint8_t)HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6);
}
- plugin.h
#ifndef __PLUGIN_H__
#define __PLUGIN_H__#include "stdint.h"#define PLUGIN_STATUS_ON 0
#define PLUGIN_STATUS_OFF 1void plugin_init(void);
void plugin_on(void);
void plugin_off(void);
uint8_t plugin_status_get(void);#endif
4.实物效果
ST-Link下载方式