打印
[AT32F423]

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

[复制链接]
2307|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hjl2832|  楼主 | 2023-10-25 20:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hjl2832 于 2023-10-25 23:45 编辑

#有奖活动# #每日话题# #申请原创# 【AT-START-F423测评】+官方库文件测试之USB虚拟串口实验1非常感谢雅特力这次推出的AT32F423的开发板活动,测试将基于官方库文件进行,如有理解错误的地方,望大家指正教诲!
一、首先是AT-START-F423开发板的板载硬件资源分析:

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官网资料主页
进入主页后点下载资源就可跳转的相关的文件下载页,然后可以根据个人需求下载相应的文件。

三、AT32F423驱动库文件分析
官方的驱动库文件已经包含了大部分应用所需的基础模板文件。方便用户进行基础的程序开发移植。
相关的模板工程文件路径:AT32F423_Firmware_Library_V2.0.2\project\at_start_f423\examples
模板工程包含MCU所有内部功能的基础功能演示,主要列表如下:

因为模板工程很多,这里不一一进行分析。
四、开发板开发环境的搭建
AT32F423芯片开发环境的搭建,论坛里也有很多贴子介绍 ,这里也不进行讲解了。
五、开发板第一个例程测试
因为本人此次申请开发板的主要目的是进行USB设备开发,所以测试主要针对USB相关的例程进行。
1.USB虚拟串口测试
1.1 板载USB从机硬件电路

从硬件原理图可以看到,USB接口是连接到MCU的PA11和PA12脚的。
1.2 例程分析
从官网下载驱动库文件后,转到模板工程文件夹,选择usb_device文件夹并打开,可以看到里面包含了许多的基础例程模板。

  这里我们选择virtual_comport文件夹里面的内容,即开发板的USB虚拟串口例程。
1.3 例程测试
  将virtual_comport文件夹复制到电脑的其它盘非中文目录下,打开例程文件夹,选择mdk_v5工程目录并打开工程,注意这里官方只提供的Keil V5下的测试工程。
  打开工程后,首先进入工程设置选项,设置编绎环境为V6,注意,这里因为选择的V6版本进行编绎,所以勾选了使用微库。

设置好编绎环境后,再设置调试工具,因为AT-LINK的属性是CMSIS-DAP设备,所以我们要选择CMSIS-DAP.

保存设置,然后编绎,编绎成功后下载到开发板,然后用USB线连接开发板的USB从机接口与电脑,打开电脑的设备管理器后会发现电脑中出现了一个USB转串口的虚拟串口号出来。在我的电脑上显示的串口号是8。

根据例程的使用说明,用杜邦线短接开发板上扩展IO接口的PA2和PA3。

打开电脑上的串口调试助手,发送数据,测试结果发送接收正常。

1.4 例程分析
?为什么是短接开发板上的PA2和PA3?
关于USB虚拟串口的例程相关文件说明,可以参考USB库文件使用手册AN0097的说明(AN0097_AT32_MCU_USB_Device_Library_Application_Note_ZH_V2.0.2.pdf)

打开例程的main.c,分析代码,在主函数开始,主要执行了串口端口定义、USB端口定义、USB虚拟串口初始化、相关的中断函数等功能,这里主要的函数有USB虚拟串口设置函数,在其中进行了相关的串口功能配置。
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  this function handles usart2 gpio config.
  * @param  none
  * @retval none
  */
void usart_gpio_config(void)
{
  gpio_init_type gpio_init_struct;
  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

  /* configure the usart2 tx, rx pin */
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_pins = GPIO_PINS_2 | GPIO_PINS_3;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE2, GPIO_MUX_7);
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE3, GPIO_MUX_7);
}
这其中 的关键就在于IO口复用功能的定义,上面选择PA2和PA3的复用配置位为MUX7,查AT32F423的技术手册可知,选择的是UASRT2功能

而关于虚拟串口的配置,代码如下:


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

    case GET_LINE_CODING:
      buff[0] = (uint8_t)pcdc->linecoding.bitrate;
      buff[1] = (uint8_t)(pcdc->linecoding.bitrate >> 8);
      buff[2] = (uint8_t)(pcdc->linecoding.bitrate >> 16);
      buff[3] = (uint8_t)(pcdc->linecoding.bitrate >> 24);
      buff[4] = (uint8_t)(pcdc->linecoding.format);
      buff[5] = (uint8_t)(pcdc->linecoding.parity);
      buff[6] = (uint8_t)(pcdc->linecoding.data);
      break;

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

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

    usart_data_transmit(<font color="#ff0000">USART2</font>, send_data[index]);
  }
}
同理,USART接收数据处理函数:
 /* send data to host */
          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);
          if(usb_vcp_send_data(&otg_core_struct.dev, (uint8_t *)usb_tx_buffer, usart_rx_data_len) == SUCCESS)
          {
            hw_usart_read_index = hw_usart_read_index + usart_rx_data_len;

            break;
          }




  

775986539132d84090.png (302.51 KB )

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也常用

使用特权

评论回复
5
单片小菜| | 2023-11-1 10:08 | 只看该作者
CAN也可以使用的。

使用特权

评论回复
6
ssy123321| | 2024-12-13 17:41 | 只看该作者
mark

使用特权

评论回复
7
沉浮的茶叶| | 2024-12-18 14:59 | 只看该作者
正好用到这个,能不能给个源码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

1028

帖子

4

粉丝