当前位置:   article > 正文

stm32蓝牙遥控小车(hal库)_stm32cubemx小车

stm32cubemx小车

一.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

  1. #include "tim.h"
  2. #include "Car_Move.h"
  3. #include "gpio.h"
  4. void Motor1Forward(int16_t speed)
  5. {
  6. HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
  7. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
  8. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
  9. __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_1, speed);
  10. }
  11. void Motor2Forward(int16_t speed)
  12. {
  13. HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);
  14. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_RESET);
  15. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_SET);
  16. __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, speed);
  17. }
  18. void Motor3Forward(int16_t speed)
  19. {
  20. HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3);
  21. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_RESET);
  22. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,GPIO_PIN_SET);
  23. __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_3, speed);
  24. }
  25. void Motor4Forward(int16_t speed)
  26. {
  27. HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_4);
  28. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_RESET);
  29. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,GPIO_PIN_SET);
  30. __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_4, speed);
  31. }
  32. /************************************************/
  33. void Motor1Stop(void)
  34. {
  35. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,0);
  36. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,0);
  37. }
  38. void Motor2Stop(void)
  39. {
  40. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,0);
  41. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,0);
  42. }
  43. void Motor3Stop(void)
  44. {
  45. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
  46. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,0);
  47. }
  48. void Motor4Stop(void)
  49. {
  50. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,0);
  51. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,0);
  52. }
  53. /*********************************************/
  54. void Motor1Back(int16_t speed)
  55. {
  56. HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
  57. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
  58. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
  59. __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_1, speed);
  60. }
  61. void Motor2Back(int16_t speed)
  62. {
  63. HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);
  64. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_RESET);
  65. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_SET);
  66. __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, speed);
  67. }
  68. void Motor3Back(int16_t speed)
  69. {
  70. HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3);
  71. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,GPIO_PIN_RESET);
  72. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_SET);
  73. __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_3, speed);
  74. }
  75. void Motor4Back(int16_t speed)
  76. {
  77. HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_4);
  78. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,GPIO_PIN_RESET);
  79. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_SET);
  80. __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_4, speed);
  81. }
  82. /*********************************************/
  83. void Move_Forward(uint16_t speed)
  84. {
  85. Motor1Forward(speed);
  86. Motor2Forward(speed);
  87. Motor3Forward(speed);
  88. Motor4Forward(speed);
  89. }
  90. void Move_Back(uint16_t speed)
  91. {
  92. Motor1Back(speed);
  93. Motor2Back(speed);
  94. Motor3Back(speed);
  95. Motor4Back(speed);
  96. }
  97. void TurnLeft(uint16_t speed)
  98. {
  99. Motor1Back(speed);
  100. Motor2Forward(speed);
  101. Motor3Back(speed);
  102. Motor4Forward(speed);
  103. }
  104. void TurnRight(uint16_t speed)
  105. {
  106. Motor1Forward(speed);
  107. Motor2Back(speed);
  108. Motor3Forward(speed);
  109. Motor4Back(speed);
  110. }
  111. void Move_Stop(void)
  112. {
  113. Motor1Stop();
  114. Motor2Stop();
  115. Motor3Stop();
  116. Motor4Stop();
  117. }
  118. void Move_Right(uint16_t speed)
  119. {
  120. Motor1Forward(speed);
  121. Motor2Back(speed);
  122. Motor3Back(speed);
  123. Motor4Forward(speed);
  124. }
  125. void Move_Left(uint16_t speed)
  126. {
  127. Motor1Back(speed);
  128. Motor2Forward(speed);
  129. Motor3Forward(speed);
  130. Motor4Back(speed);
  131. }
  132. void Move_UpRight(uint16_t speed)
  133. {
  134. Motor1Forward(speed);
  135. Motor4Forward(speed);
  136. }
  137. void Move_UpLeft(int16_t speed)
  138. {
  139. Motor2Forward(speed);
  140. Motor3Forward(speed);
  141. }
  142. void Move_DownLeft(int16_t speed)
  143. {
  144. Motor1Back(speed);
  145. Motor4Back(speed);
  146. }
  147. void Move_DownRight(int16_t speed)
  148. {
  149. Motor2Back(speed);
  150. Motor3Back(speed);
  151. }

 

 Car_Move.h

  1. #ifndef __car_move_h__
  2. #define __car_move_h__
  3. void Motor1Forward(int16_t speed);
  4. void Motor2Forward(int16_t speed);
  5. void Motor3Forward(int16_t speed);
  6. void Motor4Forward(int16_t speed);
  7. void Motor1Stop(void);
  8. void Motor2Stop(void);
  9. void Motor3Stop(void);
  10. void Motor4Stop(void);
  11. void Motor1Back(int16_t speed);
  12. void Motor2Back(int16_t speed);
  13. void Motor3Back(int16_t speed);
  14. void Motor4Back(int16_t speed);
  15. void Move_Forward(uint16_t speed);
  16. void Move_Back(uint16_t speed);
  17. void TurnLeft(uint16_t speed); //ÆÕͨÂÖ×Ó
  18. void TurnRight(uint16_t speed); //ÆÕͨÂÖ×Ó
  19. void Move_Stop(void);
  20. /*Âó¿ËÄÉÄ·ÂÖ*/
  21. void Move_Right(uint16_t speed);
  22. void Move_Left(uint16_t speed);
  23. void Move_UpRight(uint16_t speed);
  24. void Move_UpLeft(int16_t speed);
  25. void Move_DownLeft(int16_t speed);
  26. void Move_DownRight(int16_t speed);
  27. #endif

 bluetooth.c

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

bluetooth.h

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

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

Control.c

  1. #include "gpio.h"
  2. #include "Car_Move.h"
  3. #include "Control.h"
  4. #include "bluetooth.h"
  5. int X,Y,Z;
  6. void Control(void)
  7. {
  8. if(Y==1)
  9. {
  10. Move_Forward(3000);
  11. }
  12. else if(Y==2)
  13. {
  14. Move_Back(3000);
  15. }
  16. else if(Z==1)
  17. {
  18. TurnRight(3000);
  19. }
  20. else if(Z==2)
  21. {
  22. TurnLeft(3000);
  23. }
  24. else if(X==1)
  25. {
  26. Move_Right(3000);
  27. }
  28. else if(X==2)
  29. {
  30. Move_Left(3000);
  31. }
  32. else
  33. {
  34. Move_Stop();
  35. }
  36. }

Control.h

  1. #ifndef __CONTROL_H
  2. #define __CONTROL_H
  3. extern int X,Y,Z;
  4. void Control(void);
  5. #endif

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

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

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

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

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

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/501040
推荐阅读
相关标签
  

闽ICP备14008679号