WHCSRL 技术网

STM32学习笔记(CubeMX with HAL)(第六天:对之前内容的综合训练)

现在我们再网上找了一个小小的例子。我们可以综合做一下:

首先:上电后LED1和LED2点亮,然后熄灭,高电平点亮(根据开发板电路来进行设定,比如野火的开发板就是低电平点亮的。)

之后,上电后,开发板向串口发送“hello world”

在然后,LED1进行一个秒闪灯。再字符发送完成后,开始每0.5秒一次的一个循环。并且启动时间的一个记录:“XX : XX : XX”

最后,通过输入0xF1这类似的格式,设定一个命令,使得我输入命令后。LED2可以开关。

比如0XA1开LED2

再比如0XA2关LED24

然后会返回“XX :  XX :XX”的信号。

首先我们需要学习一个新的东西,叫做sprintf();

主要用于字符串的格式化,可以用于把格式化的数据写入某个字符串中。

因为我自己的学习,总是把C++和C有写语法搞混,所以说,需要进行一定的区别。

要用这个函数的话,需要用到#include <stdio.h>

一般来说,使用sprintf();

          Int sprintf(char *string,char*format,[argument……]);

比如说,有一个表示温度的TMP,要将其格式化为字符串“温度是:XX摄氏度”,并且将它输入出去。就需要先进行定义,然后格式化输入

Uint8_t Str_buff[64];

Sprintf((char*)Str_buff,”温度是:%%%%d摄氏度”,TMP);

HAL_UART_Transmit(&huart1,Str_buff,sizeof(Str_buff),0xFF);

那么接下来。我把调整过的回调函数和主函数里的内容给大家展示在下面。

  1. #include "main.h"
  2. #include "tim.h"
  3. #include "usart.h"
  4. #include "gpio.h"
  5. #include "stdio.h"
  6. void SystemClock_Config(void);
  7. #define LED1_ON HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_RESET)
  8. #define LED1_OFF HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET)
  9. #define LED2_ON HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_RESET)
  10. #define LED2_OFF HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET)
  11. #define LED1_TOG HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
  12. #define LED2_TOG HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
  13. uint8_t str1[]="===================welcome===================== ";
  14. uint8_t hh = 0,mm = 0,ss = 0,ss05 = 0;
  15. uint8_t str_buff[64];//字符串缓冲数组
  16. uint8_t Rx_data[16];
  17. /*一些函数的定义*/
  18. void CheckLED()
  19. {
  20. LED1_ON;
  21. HAL_Delay(500);
  22. LED2_ON;
  23. HAL_Delay(500);
  24. LED1_OFF;
  25. HAL_Delay(500);
  26. LED2_OFF;
  27. HAL_Delay(500);
  28. }
  29. /*定时器的回调函数编写,主要是计算时间的*/
  30. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
  31. LED1_TOG;
  32. ss05++;
  33. if(ss05==2){
  34. ss05=0;
  35. ss++;
  36. if(ss==60){
  37. ss=0;
  38. mm++;
  39. if(mm==60){
  40. mm=0;
  41. hh++;
  42. }
  43. }
  44. }
  45. }
  46. /*串口接收的回调函数*/
  47. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  48. {
  49. if(huart->Instance == USART1)
  50. {
  51. if(Rx_data[0] == 0xBF && Rx_data[2] == 0xFB)
  52. {
  53. switch(Rx_data[1])
  54. {
  55. case 0xa1:
  56. LED2_ON;
  57. sprintf((char*)str_buff,"%%%%d:%%%%d:%%%%d LED2 OPEN!!! ",hh,mm,ss);
  58. break;
  59. case 0xa2:
  60. LED2_OFF;
  61. sprintf((char*)str_buff,"%%%%d:%%%%d:%%%%d LED2 OFF!!! ",hh,mm,ss);
  62. break;
  63. default:
  64. sprintf((char*)str_buff,"%%%%d:%%%%d:%%%%d 这是错哒! ",hh,mm,ss);
  65. break;
  66. }
  67. HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
  68. HAL_UART_Receive_IT(&huart1,Rx_data,3);
  69. }
  70. }
  71. }
  72. int main(void)
  73. {
  74. HAL_Init();
  75. SystemClock_Config();
  76. MX_GPIO_Init();
  77. MX_TIM2_Init();
  78. MX_USART1_UART_Init();
  79. /* 开机灯的闪烁 */
  80. CheckLED();
  81. /* 阻塞式发送 */
  82. HAL_UART_Transmit(&huart1,str1,sizeof(str1),10000);//阻塞式串口发送
  83. /*非阻塞式接收*/
  84. HAL_UART_Receive_IT(&huart1,Rx_data,3);
  85. /* 打开定时器2 */
  86. HAL_TIM_Base_Start_IT(&htim2);
  87. while (1)
  88. {
  89. }
  90. }

推荐阅读