[AT32F423] 【AT-START-F423测评】+1.官方库文件测试之USB虚拟串口

[复制链接]
 楼主| hjl2832 发表于 2023-10-25 20:40 | 显示全部楼层 |阅读模式
<
本帖最后由 hjl2832 于 2023-10-25 23:45 编辑

#有奖活动# #每日话题# #申请原创# 【AT-START-F423测评】+官方库文件测试之USB虚拟串口实验1非常感谢雅特力这次推出的AT32F423的开发板活动,测试将基于官方库文件进行,如有理解错误的地方,望大家指正教诲!
一、首先是AT-START-F423开发板的板载硬件资源分析:
886366539133d87098.png
1.开发板上自带有AT-Link仿真开发工具,对于开发仿真程序应用情况非常方便,硬件USB输入接口使用TYPE-C接口.
2.开发板MCU仿真下载接口,用于代码仿真调试。
3.板载复位按键,用于复位MCU。
4.板载用户按键,用于调试IO按键等功能。
5.板载MCU的IO口扩展引出,方便用户外接其它模块或设备进行程序开发。
6.板载MCU的IO口扩展引出,方便用户外接其它模块或设备进行程序开发。
7.板载MCU电流测试端口,默认板子上用0欧电阻短接了,所以没装排针,用户如果需要进行MCU的电流测试,需要将板子上的R13电阻拆掉,再在排针两端串入电流表进行电流测试。个人觉得这点做的非常好,很多开发板都没有这个电流测试端口,如果需要调试程序的低功耗等模式,需要割开板子上的电源线路铜皮才能测试,非学不方便。
8.USB从机接口,用于仿真USB设备,例如HID,虚拟串口,虚拟U盘等。
9.USB主机接口,用于仿真USB主机,例如U盘读写。
10.板载串口1输出,开发板特别单独引出了串口1(包含电源输出),方便用户进行仿真调试。比喻ISP下载,外接功能模块调试。
更多开发板的功能设置介绍,可以参考官方的开发板用户手册“UM_AT_START_F423_V1.00.pdf”
二、开发板相关文件下载,这个可以直接去官方网站下载,介绍的贴子很多,这里不再详述。
下载链接:AT32F423官网资料主页
进入主页后点下载资源就可跳转的相关的文件下载页,然后可以根据个人需求下载相应的文件。
1119865391729deb14.png
三、AT32F423驱动库文件分析
官方的驱动库文件已经包含了大部分应用所需的基础模板文件。方便用户进行基础的程序开发移植。
相关的模板工程文件路径:AT32F423_Firmware_Library_V2.0.2\project\at_start_f423\examples
模板工程包含MCU所有内部功能的基础功能演示,主要列表如下:
63006653918388a10a.png
因为模板工程很多,这里不一一进行分析。
四、开发板开发环境的搭建
AT32F423芯片开发环境的搭建,论坛里也有很多贴子介绍 ,这里也不进行讲解了。
五、开发板第一个例程测试
因为本人此次申请开发板的主要目的是进行USB设备开发,所以测试主要针对USB相关的例程进行。
1.USB虚拟串口测试
1.1 板载USB从机硬件电路
8405665391aef2aaa6.png
从硬件原理图可以看到,USB接口是连接到MCU的PA11和PA12脚的。
1.2 例程分析
从官网下载驱动库文件后,转到模板工程文件夹,选择usb_device文件夹并打开,可以看到里面包含了许多的基础例程模板。
9092665391cf1c0fa0.png
  这里我们选择virtual_comport文件夹里面的内容,即开发板的USB虚拟串口例程。
1.3 例程测试
  将virtual_comport文件夹复制到电脑的其它盘非中文目录下,打开例程文件夹,选择mdk_v5工程目录并打开工程,注意这里官方只提供的Keil V5下的测试工程。
  打开工程后,首先进入工程设置选项,设置编绎环境为V6,注意,这里因为选择的V6版本进行编绎,所以勾选了使用微库。
7326965391fdfc2930.png
设置好编绎环境后,再设置调试工具,因为AT-LINK的属性是CMSIS-DAP设备,所以我们要选择CMSIS-DAP.
64376539207c39ea4.png
保存设置,然后编绎,编绎成功后下载到开发板,然后用USB线连接开发板的USB从机接口与电脑,打开电脑的设备管理器后会发现电脑中出现了一个USB转串口的虚拟串口号出来。在我的电脑上显示的串口号是8。
88919653921e9955eb.png
根据例程的使用说明,用杜邦线短接开发板上扩展IO接口的PA2和PA3。
98662653926fcd8968.png
打开电脑上的串口调试助手,发送数据,测试结果发送接收正常。
20918653922c00649d.png
1.4 例程分析
?为什么是短接开发板上的PA2和PA3?
关于USB虚拟串口的例程相关文件说明,可以参考USB库文件使用手册AN0097的说明(AN0097_AT32_MCU_USB_Device_Library_Application_Note_ZH_V2.0.2.pdf)
1901065392a18c6b38.png
打开例程的main.c,分析代码,在主函数开始,主要执行了串口端口定义、USB端口定义、USB虚拟串口初始化、相关的中断函数等功能,这里主要的函数有USB虚拟串口设置函数,在其中进行了相关的串口功能配置。
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  this function handles usart2 gpio config.
  3.   * @param  none
  4.   * @retval none
  5.   */
  6. void usart_gpio_config(void)
  7. {
  8.   gpio_init_type gpio_init_struct;
  9.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

  10.   /* configure the usart2 tx, rx pin */
  11.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  12.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  13.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  14.   gpio_init_struct.gpio_pins = GPIO_PINS_2 | GPIO_PINS_3;
  15.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  16.   gpio_init(GPIOA, &gpio_init_struct);
  17.   gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE2, GPIO_MUX_7);
  18.   gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE3, GPIO_MUX_7);
  19. }
这其中 的关键就在于IO口复用功能的定义,上面选择PA2和PA3的复用配置位为MUX7,查AT32F423的技术手册可知,选择的是UASRT2功能
6939965392ca55d459.png
而关于虚拟串口的配置,代码如下:


然后是USB设备信息描述相关的代码,因为USB的知识面很多,这个暂时先不分析,留待以后慢慢消化。这里先分析USB数据转虚拟串口数据的接口函数。
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  usb device function
  3.   * @param  udev: to the structure of usbd_core_type
  4.   * @param  cmd: request number
  5.   * @param  buff: request buffer
  6.   * @param  len: buffer length
  7.   * @retval none
  8.   */
  9. static void usb_vcp_cmd_process(void *udev, uint8_t cmd, uint8_t *buff, uint16_t len)
  10. {
  11.   usbd_core_type *pudev = (usbd_core_type *)udev;
  12.   cdc_struct_type *pcdc = (cdc_struct_type *)pudev->class_handler->pdata;
  13.   switch(cmd)
  14.   {
  15.     case SET_LINE_CODING:
  16.       pcdc->linecoding.bitrate = (uint32_t)(buff[0] | (buff[1] << 8) | (buff[2] << 16) | (buff[3] <<24));
  17.       pcdc->linecoding.format = buff[4];
  18.       pcdc->linecoding.parity = buff[5];
  19.       pcdc->linecoding.data = buff[6];
  20. #ifdef USB_VIRTUAL_COMPORT
  21.       /* set hardware usart */
  22. <font color="#ff0000">      usb_usart_config(pcdc->linecoding);</font>
  23. #endif
  24.       break;

  25.     case GET_LINE_CODING:
  26.       buff[0] = (uint8_t)pcdc->linecoding.bitrate;
  27.       buff[1] = (uint8_t)(pcdc->linecoding.bitrate >> 8);
  28.       buff[2] = (uint8_t)(pcdc->linecoding.bitrate >> 16);
  29.       buff[3] = (uint8_t)(pcdc->linecoding.bitrate >> 24);
  30.       buff[4] = (uint8_t)(pcdc->linecoding.format);
  31.       buff[5] = (uint8_t)(pcdc->linecoding.parity);
  32.       buff[6] = (uint8_t)(pcdc->linecoding.data);
  33.       break;

  34.     default:
  35.       break;
  36.   }
  37. }
在USB控制端口代码cdc_class.c里,class_ept0_rx_handler函数调用了上述USB->USART串口配置函数。然后在main.c中,利用while循环不断调用USB数据转USART数据函数,其中,USART数据发送代友如下:
  1. /* get usb vcp receive data */
  2.     data_len = usb_vcp_get_rxdata(&otg_core_struct.dev, (uint8_t *)usb_buffer);

  3.     /* send data to hardware usart */
  4.     if(data_len > 0)
  5.     {
  6.       usart_send_data((uint8_t *)usb_buffer, data_len);
  7.     }
可以看到,在代码中通过不断查询USB状态获取USB接收的数据长度,然后通过USART转发出去,而此处的usart_send_data函数,调用的正是USART2串口。
  1. void usart_send_data(uint8_t *send_data, uint16_t len)
  2. {
  3.   uint16_t index = 0;
  4.   for(index = 0; index < len; index++ )
  5.   {
  6.     do
  7.     {
  8.       ;
  9.     }while(usart_flag_get(USART2, USART_TDBE_FLAG) == RESET);

  10.     usart_data_transmit(<font color="#ff0000">USART2</font>, send_data[index]);
  11.   }
  12. }
同理,USART接收数据处理函数:
  1. /* send data to host */
  2.           memcpy((uint8_t *)<font color="#ff0000">usb_tx_buffer</font>, &<font color="#ff0000">usart_rx_buffer</font>[hw_usart_read_index], usart_rx_data_len);
  3.           if(usb_vcp_send_data(&otg_core_struct.dev, (uint8_t *)usb_tx_buffer, usart_rx_data_len) == SUCCESS)
  4.           {
  5.             hw_usart_read_index = hw_usart_read_index + usart_rx_data_len;

  6.             break;
  7.           }




  
775986539132d84090.png
mandzy 发表于 2023-10-30 20:47 | 显示全部楼层
为什么要连接PA2和PA3
 楼主| hjl2832 发表于 2023-10-31 08:33 | 显示全部楼层
mandzy 发表于 2023-10-30 20:47
为什么要连接PA2和PA3

为了调试方便,把串口的TX和RX短接,自收发。验证发送和接收是不是一致,快速判断发送和接收程序有没有问题。
 楼主| hjl2832 发表于 2023-10-31 08:34 | 显示全部楼层
同样的调试方法,CAN也常用
单片小菜 发表于 2023-11-1 10:08 | 显示全部楼层
CAN也可以使用的。
ssy123321 发表于 2024-12-13 17:41 | 显示全部楼层
沉浮的茶叶 发表于 2024-12-18 14:59 | 显示全部楼层
正好用到这个,能不能给个源码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

1069

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

26

主题

1069

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部