一.cubemx配置

我使用的板子是stm32f103rct6,这里我们使用串口1,选择异步模式,注意波特率的选择,一般是9600或者115200,如果波特率选择不对的话是不能进行通讯的(我小车怎么也动不了搞了好久最后发现是波特率选错了,气死了),我用的蓝牙模块是HC-05(ps:我的stm32f103rct6的板子的串口波特率时9600,stm32f407vgt6的板子的波特率是28800)

打开串口1的中断,中断优先级根据自己的实际需求选择。

这样就配置完了,连线的时候,注意蓝牙的RX连接PA9,TX连接PA10,不要连错了。

二.代码部分

代码直接从keil5里复制粘贴中文注释部分会乱码,过两天我再给修改一下,主函数循环前不要忘了开启串口1的接收中断。

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

Car_Move.c

#include "tim.h"
#include "Car_Move.h"
#include "gpio.h"void Motor1Forward(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_1, speed);
}void Motor2Forward(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, speed);
}
void Motor3Forward(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_3, speed);
}
void Motor4Forward(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_4);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_4, speed);
}
/************************************************/
void Motor1Stop(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,0);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,0);
}
void Motor2Stop(void)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,0);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,0);
}
void Motor3Stop(void)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,0);
}
void Motor4Stop(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,0);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,0);
}
/*********************************************/
void Motor1Back(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_1, speed);
}
void Motor2Back(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, speed);
}
void Motor3Back(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_3, speed);
}
void Motor4Back(int16_t speed)
{HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_4);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_4, speed);
}
/*********************************************/
void Move_Forward(uint16_t speed)
{   Motor1Forward(speed);Motor2Forward(speed);Motor3Forward(speed);Motor4Forward(speed);
}
void Move_Back(uint16_t speed)
{Motor1Back(speed);Motor2Back(speed);Motor3Back(speed);Motor4Back(speed);
}
void TurnLeft(uint16_t speed)
{Motor1Back(speed); Motor2Forward(speed);Motor3Back(speed); Motor4Forward(speed);
}
void TurnRight(uint16_t speed)
{Motor1Forward(speed);Motor2Back(speed);Motor3Forward(speed);Motor4Back(speed);
}
void Move_Stop(void)
{Motor1Stop();Motor2Stop();Motor3Stop();Motor4Stop();
}
void Move_Right(uint16_t speed)
{Motor1Forward(speed);Motor2Back(speed);Motor3Back(speed);Motor4Forward(speed);
}
void Move_Left(uint16_t speed)
{Motor1Back(speed);Motor2Forward(speed);Motor3Forward(speed);Motor4Back(speed);
}
void Move_UpRight(uint16_t speed)
{Motor1Forward(speed);Motor4Forward(speed);
}
void Move_UpLeft(int16_t speed)
{Motor2Forward(speed);Motor3Forward(speed);
}
void Move_DownLeft(int16_t speed)
{Motor1Back(speed);Motor4Back(speed);
}
void Move_DownRight(int16_t speed)
{Motor2Back(speed);Motor3Back(speed);
}

Car_Move.h

#ifndef __car_move_h__
#define __car_move_h__void Motor1Forward(int16_t speed);
void Motor2Forward(int16_t speed);
void Motor3Forward(int16_t speed);
void Motor4Forward(int16_t speed);void Motor1Stop(void);
void Motor2Stop(void);
void Motor3Stop(void);
void Motor4Stop(void);void Motor1Back(int16_t speed);
void Motor2Back(int16_t speed);
void Motor3Back(int16_t speed);
void Motor4Back(int16_t speed);void Move_Forward(uint16_t speed);
void Move_Back(uint16_t speed);
void TurnLeft(uint16_t speed); //ÆÕͨÂÖ×Ó
void TurnRight(uint16_t speed); //ÆÕͨÂÖ×Ó
void Move_Stop(void);
/*Âó¿ËÄÉÄ·ÂÖ*/
void Move_Right(uint16_t speed);
void Move_Left(uint16_t speed);
void Move_UpRight(uint16_t speed);
void Move_UpLeft(int16_t speed);
void Move_DownLeft(int16_t speed);
void Move_DownRight(int16_t speed);#endif

bluetooth.c

#include "bluetooth.h"
#include "control.h"uint8_t USART1_RX_BUF[USART1_REC_LEN];//接收缓冲,最大USART1_REC_LEN个字节
uint16_t USART1_RX_STA=0;//接收状态标记//bit15:接收完成标志,bit14~0:接收到的有效数字
uint8_t USART1_NewData;//当前串口中断接收的1个字节数据缓存void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart)//串口中断回调函数
{if(huart ==&huart1){if((USART1_RX_STA&0x8000)==0)//接收未完成{if(USART1_NewData==0x5A)//接收到了0x5A{USART1_RX_STA|=0x8000;   //接收完成了,将USART1_RX_STA中的bit15置1}else{USART1_RX_BUF[USART1_RX_STA&0X7FFF]=USART1_NewData; //将接收到的数据放入数组USART1_RX_STA++;  //数据长度计数加1if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收}}HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1); //因为每执行完一次中断回调函数会将接收功能关闭,所以最后要再次开启中断}if(USART1_RX_STA&0x8000)         //判断中断接受标志位(蓝牙模块使用USART1)    {if((USART1_RX_STA&0x7FFF)==5 //判断接收数量                        && USART1_RX_BUF[0]==0xA5     //判断接接收第一个数据是不是包头0xA5&& USART1_RX_BUF[4]==(USART1_RX_BUF[1]+USART1_RX_BUF[2]+USART1_RX_BUF[3])%0x100)   //判断接受校验码是不是原数据之和低8位{X=USART1_RX_BUF[1];     //接受并读取蓝牙发送过来的数据Y=USART1_RX_BUF[2];Z=USART1_RX_BUF[3];} USART1_RX_STA=0;        //标志位清0,准备下一次接收}}

bluetooth.h

#ifndef __BLUETOOTH_H__
#define __BLUETOOTH_H__#include "main.h" //HAL库文件声明extern UART_HandleTypeDef huart1;//声明USART2的HAL库结构体#define USART1_REC_LEN  200//定义USART2最大接收字节数extern uint8_t  USART1_RX_BUF[USART1_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节.末字节为校验和
extern uint16_t USART1_RX_STA;//接收状态标记
extern uint8_t USART1_NewData;//当前串口中断接收的1个字节数据的缓存void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart);//串口中断回调函数声明#endif 

蓝牙部分代码参考自这篇文章蓝牙小车(基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图)

Control.c

#include "gpio.h"
#include "Car_Move.h"
#include "Control.h"
#include "bluetooth.h"int X,Y,Z;void Control(void)
{if(Y==1){Move_Forward(3000);}else if(Y==2){Move_Back(3000);}else if(Z==1){TurnRight(3000);}else if(Z==2){TurnLeft(3000);}          else if(X==1){Move_Right(3000);}else if(X==2){Move_Left(3000);}             else{Move_Stop();}
}

Control.h

#ifndef __CONTROL_H
#define __CONTROL_Hextern int X,Y,Z;void Control(void);#endif

以上就是主要的代码了,主要我还是新手,代码有很多要改进的地方,后期我会再慢慢修改完善代码。

三.手机蓝牙调试app使用方法

蓝牙小车(基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图)

还是这篇文章,文章后半部分详细地讲解了app的使用方法。

(本片文章主要用于记录我的代码和其他一些东西以提醒我自己)

stm32蓝牙遥控小车(hal库)相关推荐

  1. 5.39 综合案例2.0 - STM32蓝牙遥控小车2(语音控制)

    综合案例2.0 - 蓝牙遥控小车1- 语音控制 成品展示 案例说明 器件说明 小车连线 小车源码 语音模块遥控 语音遥控连线 模块使用说明 1.MLT-BT05 4.0 蓝牙模块 2.ASRPRO-2 ...

  2. 简单的STM32蓝牙遥控小车完整项目及资料分享,超全

    自学新手的第一个项目,做的时也在论坛查了许多大佬的文章,但还是有许多疑问,我就从一个小白的角度出发来和大家分享,应该对许多自学不久的萌新来说比较友好易懂.欢迎大家交流,大佬轻喷~~ 简单的蓝牙小车,目 ...

  3. 基于HAL库-蓝牙遥控小车

    stm32+HAL库制作蓝牙遥控小车 材料及其接线 蓝牙模块:HC05/6 材料均可在某宝上进行购买. 注意:蓝牙模块可进行串口调试也可不调试(及为默认设置),本文使用的为未调试状态下的蓝牙串口,有关 ...

  4. 基于STM32的最简易蓝牙遥控小车

    基于STM32的最简易蓝牙遥控小车 硬件准备 硬件连接 STM32cubeMX配置 代码部分 视频演示 本篇博客主要针对的读者为有一定单片机基础,但是第一次自制蓝牙遥控小车的小白同学,所用物件型号选择 ...

  5. 【STM32】F103C8T6 蓝牙遥控小车

    STM32F103C8T6 蓝牙遥控小车 前言 硬件部分 连线部分 软件部分 代码 问题与解决... 前言 本次项目使用的是STM32F103C8T6核心板作为主控,通过连接蓝牙模块,实现和手机APP ...

  6. 蓝牙遥控小车2.0版发布啦

    蓝牙遥控小车2.0版发布啦! 蓝牙模块的主从机模式 1.主从机模式 2.设置主从机模式 蓝牙遥控器 1.硬件接线 2.程序设计 蓝牙小车 1.硬件接线 2.程序设计 今天要跟大家分享的是两个蓝牙模块之 ...

  7. MSP432蓝牙遥控小车

    目录 前言 搭建 硬件 软件 原理 源码 前言 这个小车是去年电赛的时候准备的,很遗憾我们赛区因为疫情被取消了比赛,我们也都已经大二大三了,因此我们没有机会再参加两年一次的电赛了.但是这些成果总不能放 ...

  8. Arduino mega2560蓝牙遥控小车简介

    Arduino mega2560蓝牙遥控小车简介 小车一览 主要模块如下: 一.电源 (1)BOM表:18650电池两节(单节3.6v,6800mAh) 18650 电池盒(两节带开关) 二.电机驱动 ...

  9. stm32直流电机PID控制hal库(Cubemx)

    stm32直流电机PID控制hal库(Cubemx),一步步手把手教你怎么配置cubemx怎么写代码. 未对pid就行深入解析,不过相信您通过配置和写代码以后大概可以知道pid的主要作用. 文章目录 ...

最新文章

  1. Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)(转载)
  2. web图片铺满网页_web单页面实现多个echarts图表铺满整个div(柱状图,折线图,饼形图……)...
  3. 这周,我们作前端,实现统一的过滤搜索
  4. Linux中文件查找技术大全
  5. 霍尔传感器和直流无刷电机
  6. 生成模型与判别模型的区别
  7. Kettle计算器的使用以及字符串格式化
  8. 打不开gitHub的解决方法
  9. MySQL游标循环取出空值的BUG
  10. 计算机辅助药物设计中的分子动力学模拟
  11. JAVA基础知识点大全之一
  12. Windows系统下查询本机IP地址和MAC地址
  13. 用户需求变更和确认的注意事项
  14. 电子科技大学计算机考研题,电子科技大学820计算机考研真题题库
  15. python小游戏 记忆翻牌小游戏设计与实现
  16. Pytorch:基于转置卷积解码的卷积自编码网络
  17. Pycharm 小技巧-- filewacher+black自动格式化
  18. 咸鱼Micropython—GPIO
  19. 第七周项目5排队看病模拟
  20. 【Java培训】 IT行业是什么

热门文章

  1. cmi编码实验_CMI码型变换实验
  2. 【闲聊杂谈】深入剖析Java8新特性
  3. 想知道录音转文字哪个软件好吗?来看看这篇文章
  4. 机器学习——线性回归实践
  5. maven报错: previously initiated loading for a different type with name servlet/http/HttpServletReq
  6. 黑龙江省高级职称英语计算机,2017年起黑龙江基层专业技术人员取消职称英语能力要求...
  7. 想和太阳肩并肩?扒一扒那些上天入海的阿里小二
  8. Golang Go 安装 使用 VSCode
  9. LDO稳压出现振荡问题
  10. 局部变量和静态局部变量