stm32基于hal库的蓝牙串口通信

余生长醉 提交于 2020-01-13 05:15:43

关于stm32的学习记录

stm32基于hal库的蓝牙串口通信

先简单记录一下用到的工具:
   stm32f103c8t6,st-link,usb-ttl,蓝牙模块hc-05、hc-06

本次设计模型使用手机蓝牙APP向蓝牙发送指令,stm32最小系统通过串口接收到的指令选择要执行的步骤以控制小车运动。鉴于本次仅仅使用蓝牙接收指令,并不需要用单片机来调试蓝牙模块,所以没有写相关代码,如有需要后续补充。

1、通过cubemx配置stm32

设置外部晶振
设置四线调试模式
设置时钟在这里插入图片描述
其余设置(中断,定时器配置pwm)按需要配置
2、添加相关自定义代码,以实现串口通信,pwm调速功能
1.开启pwm

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);

2,设置串口重定向,后面可以用于测试代码,测试单片机接收数据的格式


int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xffff);
  return ch;
}

int fgetc(FILE * f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1,&ch,1, 0xffff);
  return ch;
}

3.设置一些全局变量,位置应该按自己的思路定,因为我把中断设置在it.c文件里,其余配置和本次实验的主要功能设置在main.c文件里,所以我的全局变量设置仅供参考

//main.c
int res=0;
extern uint8_t * msg;
extern uint8_t msg_buff[MAX_RECV_LEN];


//stm32f1xx_it.c
#define MAX_RECV_LEN 1024
uint8_t msg_buff[MAX_RECV_LEN] = {0};
uint8_t * msg = msg_buff;
extern uint16_t speed;

4.在主函数中,要先开启第一次中断

HAL_UART_Receive_IT(&huart1, (uint8_t *)msg, 1); 

5.编写hal库的串口回调函数,主要功能在这个函数里面
注意memset函数,代码上有要注意的内容

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_RxCpltCallback could be implemented in the user file
   */
	uint8_t ret=HAL_OK;
	uint8_t res=0;
	msg++;
	if(msg==msg_buff+MAX_RECV_LEN)
	{
		msg=msg_buff;//msg指针指向msg_buff首部
	}
	
	do
	{
		ret=HAL_UART_Receive_IT(&huart1,(uint8_t*)msg,1);	
	}while(ret!=HAL_OK);
	
	if(*(msg-1)=='\n')
	{
//	    flag  = true;
//		printf("msg_buff: %s",msg_buff);
		res=*(msg_buff);
//		printf("res: %d",res);
//	 可以在这个区域添加功能代码,根据发送的res值,实现自己的功能
     }
	 memset(msg_buff,0,sizeof(msg_buff));//注意这个函数,初始化函数
	 //按字节对内存块进行初始化
	 //需要调用头文件#include string.h“”
	 msg=msg_buff;
	 (&huart1)->pRxBuffPtr = msg;
	}
}

6.主函数里也可以按自己的需要调用res,或者使用flag,实现自己的功能

3、通过usb-ttl连接蓝牙串口,调试蓝牙模块
使用蓝牙助手配置好蓝牙模块,然后连接单片机测试在这里插入图片描述
4、连接单片机与蓝牙模块
5、用手机蓝牙APP连接蓝牙模块,发送指令测试
可以在代码中添加printf,检验代码,并且判断单片机接收到的数据类型和数据内容
注意部分APP发送的指令需手动添加回车键才能正常结束中断
6、连接所有模块,供电,测试
完成以上步骤可以测试所有功能

暂时先写这么多,有时间会逐步完善

参考:https://blog.csdn.net/xld_19920728/article/details/78214359

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!