本文主要是介绍STM32CubeMX学习(二) USB CDC 双向通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
STM32CubeMX学习(二) USB CDC 双向通信
- 简介
- CubeMX新建工程(串口+LED)
- 测试串口和LED
- 串口接收
- 测试USB CDC通信
简介
利用正点原子F407探索者开发板,测试基于USB CDC的双向数据通信。
CubeMX新建工程(串口+LED)
设置时钟源
设置调试器
设置LED
设置串口
设置USB OTG
Pinout预览
工程管理
在上图里,可以把Heap Size和Stack Size改大点,使得USB数据通信更流畅。
选中红框里的选项主要是为了工程打包后给他人直接使用。
最后点击GENERATE CODE
生成工程。
测试串口和LED
在usart.h
中引入头文件stdio.h
/* USER CODE BEGIN Includes */
#include "stdio.h" //引入此文件,为重定向printf
/* USER CODE END Includes */
在usart.c
中添加重定向代码
/* USER CODE BEGIN 1 */
// 重定向printf函数
int fputc(int ch,FILE *f)
{uint8_t temp[1]={ch};HAL_UART_Transmit(&huart1,temp,1,2);return 0;
}
/* USER CODE END 1 */
为了方便调试,在main.c中加入以下宏定义
/* USER CODE BEGIN PD */
#define USER_MAIN_DEBUG#ifdef USER_MAIN_DEBUG
#define user_main_printf(format, ...) printf( format "\r\n",##__VA_ARGS__)
#define user_main_info(format, ...) printf("main.info:" format "\r\n",##__VA_ARGS__)
#define user_main_debug(format, ...) printf("main.debug:" format "\r\n",##__VA_ARGS__)
#define user_main_error(format, ...) printf("main.error:" format "\r\n",##__VA_ARGS__)
#else
#define user_main_printf(format, ...)
#define user_main_info(format, ...)
#define user_main_debug(format, ...)
#define user_main_error(format, ...)
#endif
/* USER CODE END PD */
在main.c
中添加代码
/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("Enter main while loop!\r\n");user_main_debug("Main debug!\n");HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);HAL_Delay(500);}/* USER CODE END 3 */
设置下载后自动运行,编译运行,连接串口调试助手,观察现象
编译下载后,重启发现LED1(绿灯)在闪烁,串口收到字符数据。
如果程序没有反应或者仿真后发现程序一直卡死在 BEAB BKPT 0xAB,解决方法:MDK选择设置,TARGET ,勾选Use MicroLIB
串口接收
在usbd_cdc_if.c中,有发送函数和接收函数。发送函数CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)不需要修改,接收函数CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)需要修改再使用。
在usbd_cdc_if.c中定义变量
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/unsigned char CDC_Receive_Buffer[64]; //数据缓冲区数组的大小可以根据你想要的收发的数据大小变更unsigned char CDC_Receive_Length;
/* USER CODE END PV */
修改CDC_Receive_FS函数
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{/* USER CODE BEGIN 6 */memcpy(CDC_Receive_Buffer, Buf, *Len);CDC_Receive_Length = *Len;USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);return (USBD_OK);/* USER CODE END 6 */
}
测试USB CDC通信
在main.c
中,添加如下代码:
...
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "usb_device.h"
#include "gpio.h"
...
/* USER CODE BEGIN PV */
unsigned char CDC_Transmit_Buffer[64] = {1,2,3,4,5,6,7,8,9,}; //USB发送缓存
unsigned char CDC_Transmit_Count = 0;//USB发送数据计数
extern unsigned char CDC_Receive_Buffer[];
extern unsigned char CDC_Receive_Length;
extern uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
/* USER CODE END PV */
...
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MX_USB_DEVICE_Init();while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */CDC_Transmit_FS(CDC_Transmit_Buffer, 64);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);HAL_Delay(500);CDC_Transmit_FS(CDC_Receive_Buffer,CDC_Receive_Length);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);HAL_Delay(500);}/* USER CODE END 3 */
}
编译后下载,点击发送
按钮,测试结果如下图:
Bus Hound捕获情况如下:
这篇关于STM32CubeMX学习(二) USB CDC 双向通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!