当前位置:   article > 正文

STM32+USB串口通信+printf函数功能HAL库函数+cubemax配置+部分解释_stm32 usb通信

stm32 usb通信

1.USB有很多功能:目前文章只讲虚拟串口的使用

——用到的管脚:PA12——USB_OTG_HS_DP,PA11——USB_OTG_HS_DM。

——芯片:STM32H723ZGT6型号。
————————————————

2.STM32Cubemax配置

——新建工程——选择对应芯片类型

——选择对应芯片——STM32H723ZGT6——

——选yes——

——配置管脚——PA12——USB_OTG_HS_DP 。PA11——USB_OTG_HS_DM。

——配置USB——

——配置时钟——设置完之后,点击上面那个刷新圈圈自动配置——

——配置USB时钟——选择设定USB时钟48MHZ——

——生成文件——

——最后生成代码——

3.编辑程序需要添加的程序

  1. int main(void)
  2. {
  3. /* USER CODE BEGIN 1 */
  4. /* USER CODE END 1 */
  5. /* Enable I-Cache---------------------------------------------------------*/
  6. SCB_EnableICache();
  7. /* MCU Configuration--------------------------------------------------------*/
  8. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  9. HAL_Init();
  10. /* USER CODE BEGIN Init */
  11. // USB_Status_Init();
  12. /* USER CODE END Init */
  13. /* Configure the system clock */
  14. SystemClock_Config();
  15. /* Configure the peripherals common clocks */
  16. PeriphCommonClock_Config();
  17. /* USER CODE BEGIN SysInit */
  18. /* USER CODE END SysInit */
  19. /* Initialize all configured peripherals */
  20. MX_GPIO_Init();
  21. MX_DMA_Init();
  22. MX_BDMA_Init();
  23. MX_USB_DEVICE_Init();
  24. /* USER CODE BEGIN 2 */
  25. adc_init();//————————————————————————————主函数+代码//
  26. /* USER CODE END 2 */
  27. /* Infinite loop */
  28. /* USER CODE BEGIN WHILE */
  29. while (1)
  30. {
  31. /* USER CODE END WHILE */
  32. /* USER CODE BEGIN 3 */
  33. Scan_ADC();//—————————————————————————+代码,处理ADC的数据,然后USB打印//
  34. // USB_Transmit();//———————————————————+代码,需要哪个功能放开,调试看/
  35. USB_Receive();//——————————————————————+代码,也可以一起看,两个串口工具//
  36. }
  37. /* USER CODE END 3 */
  38. }
  39. //————————————————————————————————————————————————————————————————————//
  40. //——USB_RX.h文件——创建的独立的文件模块化,
  41. //自己新建一个文件夹来存放USB的功能部分,把USB打印封装成函数,
  42. #include "main.h"
  43. #include <stdarg.h> //printf函数。
  44. #include "usb_device.h"
  45. #define USB_RX_LEN 50//接收数据长度
  46. #define USB_TX_LEN 50//发送数据长度
  47. uint8_t TX_data[USB_TX_LEN];//发送函数的数据缓冲区
  48. char RX_data[USB_RX_LEN];//接收函数的数据缓冲区
  49. uint16_t USB_RX_CBK_FLAG = 0;//接收完成标志
  50. int8_t CDC_Receive_HS(uint8_t* Buf, uint32_t *Len);//提前声明
  51. uint8_t CDC_Transmit_HS(uint8_t* Buf, uint16_t Len);//提前声明
  52. const char Array[20]={"ADC2 PA5 V"};//封装字符串
  53. //———————————————————————————————————————————————————————————————————//
  54. //——USB_RX.c文件——创建的独立的文件模块化
  55. #include "usb_rx.h"
  56. void USB_Receive(void)
  57. {
  58. if(CDC_Receive_HS((uint8_t*)RX_data ,(uint32_t*)sizeof(RX_data))!=USBD_OK)
  59. {
  60. Error_Handler();
  61. }
  62. USB_RX_CBK_FLAG=1;//利用这个标志做数据处理,数据已经存在RX_data数组之中。
  63. //或者直接写函数封装起来放这里。后续我会贴一个处理数据的,便于移植的代码。
  64. }
  65. void USB_printf(char*fmt,...)
  66. {
  67. va_list ap;
  68. va_start(ap,fmt);
  69. vsprintf((char*)TX_data,fmt,ap);
  70. va_end(ap);
  71. if(CDC_Transmit_HS((uint8_t*)TX_data ,sizeof(TX_data))!=USBD_OK)
  72. {
  73. Error_Handler();
  74. }
  75. }
  76. void USB_Transmit(void)
  77. {
  78. int8_t i=9;
  79. USB_printf("%s %d\r\n",Array,i);//类似printf功能使用
  80. }
  81. //——————————————————————————————————————————————————————————————————//
  82. //这部分代码模拟电平,可以在主函数里头初始化部分写,
  83. //我个人没有写这一部分代码,我手动调试。如果写在主函数我注释掉的地方。
  84. void USB_Status_Init(void)
  85. {
  86. GPIO_InitTypeDef GPIO_InitStruct = {0};
  87. __HAL_RCC_GPIOA_CLK_ENABLE();
  88. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
  89. GPIO_InitStruct.Pin = GPIO_PIN_12;
  90. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  91. GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  92. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  93. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  94. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
  95. HAL_Delay(100);
  96. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);
  97. HAL_Delay (100);
  98. }

——需要注意的地方——

——函数需要提前声明

——主要用到两个函数——USB发送和USB接收函数。

——最后编译一下,有些数据错误警告处理一下,主要流程就是这样,然后调试处理一下细节,

连接USB调试,就可以看到现象收到你所写的内容,

——我这里显示的是我自己编写的内容,至于你想显示什么,自己改变打印的字符串的格式。

——这个是接收数据的窗口,用上一个28DMA数据通过USB打印出来显示效果。

需要注意清理错误警告,一些变量使用在头文件声明,局部变量和全局变量注意,

——接收数据的数组一次接收的数组,再一次来数据的时候会覆盖掉之前数据,需要我们及时处理

RX_data数据,或者做第三个变量存起来处理。

以上仅仅属于本人学习心得,可供学习参考,禁止商用~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/877843
推荐阅读
相关标签
  

闽ICP备14008679号