双stm32f407zgt6单片机蓝牙模块HC05通信hal库
前言
此文章为原创文章,转载请注明
一 蓝牙模块的配置
进入AT模式进行设置
AT进入AT模式
AT+ROLE配置主从模式
AT+PSWD配置蓝牙配对密码,密码必须加双引号
AT+UART配置蓝牙波特率
可以参考收藏链接 ——》edge移动收藏夹注意
如果用串口调试助手调试时出现ERROR(0)
将蓝牙模块的EN引脚连接串口的3.3v可以使蓝牙模块一直保持AT模式
二、步骤
1.stm32cudemax
两个工程的配置相同。
接受段不开pe4按键引脚
xc
串口开启dma,点击add,添加tx和rx。
2.代码
工程1(发送端)
main.c
#define key0 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)
uint8_t TX[30];
uint8_t RX[30];
uint8_t num=0;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(key0==GPIO_PIN_RESET)
{
num=1;
}
HAL_Delay(100);
if(num==1&&key0==GPIO_PIN_SET)
{
num=0;
uint8_t TX[30]="A\r\n";
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_UART_Transmit_DMA(&huart1,(unsigned char *)TX, strlen((char*)TX));
}
HAL_Delay(100);
}
工程2(接受)
main.c
uint8_t RX[50];
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1, (uint8_t *)RX, 50);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// HAL_UART_Transmit_DMA(&huart1,(unsigned char *)RX, strlen((char*)RX));
// HAL_Delay(1000);
if(RX[0]=='A')
{
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
RX[0]='B';
}
// if(RX[0]=='B')
// HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET);
}
usart.c
/* USER CODE BEGIN 0 */
uint8_t RecCount = 0 ;
extern uint8_t RX[50] ;
/* USER CODE END 0 */
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
RecCount=50-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
RecCount=0;
HAL_UART_Receive_DMA(&huart1, RX, 50);
// RX_Deal = 1 ;
}
usart.h 让stm32f4xx.it.c能够使用
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart);
stm32f4xx_it.c
#include "usart.h"
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1);
HAL_UART_IdleCpltCallback(&huart1);
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
以下是
发送端的使用systick_rcc每3秒发送的代码,
因为后面写定时器的时候没有再建工程,这里的部分代码注释了
mian.c (while是主函数内的)
/* USER CODE BEGIN PV */
uint8_t TX[30]="A\r\n";
uint8_t RX[30];
//uint8_t num=0;
uint32_t tx_tim=0;
//uint32_t tx_ref=0;
/* USER CODE END PV */
//void time_sis(void)
//{
// if(++tx_tim==3000)
// {
// tx_tim=0;
// tx_ref=1;
// }
//}
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//sis_time
// if(tx_ref==1)
// {
// tx_ref=0;
// HAL_UART_Transmit_DMA(&huart1,(unsigned char *)TX, strlen((char*)TX));
// }
}
将写好的tim_sis()放到void error_handler(void),
记得在main.h里对tim_sis()定义,然后在stm32f4xx.it.c里放一个main.h的头文件
以下是
发送端的使用time2每3秒发送的代码,
main.c
uint8_t TX[30]="A\r\n";
uint8_t RX[30];
//uint8_t num=0;
uint32_t tx_tim=0;
//uint32_t tx_ref=0;
/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(++tx_tim==3000)
{
tx_tim=0;
HAL_UART_Transmit_DMA(&huart1,(unsigned char *)TX, strlen((char*)TX));
}
}
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);
__HAL_TIM_CLEAR_IT(&htim2,TIM_IT_UPDATE);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}