[活动专区] 【AT-START-F423测评】+2.自定义USB虚拟串口的硬件配置

[复制链接]
1945|1
 楼主| hjl2832 发表于 2023-11-2 00:21 | 显示全部楼层 |阅读模式
1.在上一编文章中,我们测试了库文件的USB虚拟串口功能,也分析了为什么DEMO中要求短接PA2和PA3(USART2)来测试虚拟串口的数据收发,这一次我们根据上一次测试的分析结果来尝试修改硬件USART配置,将虚拟口数据转到其它的硬件串口上,比喻USART1(板载有单独引出USART1来做DEBUG调试信息输出)。
下面进入程序修改环节:
1。修改代码中USART端口初始化函数,将IO口改为相应的端口,这里我演示改为USART1,端口分别是PA9和PA10(即板子上引出的USART1调试端口),修改后的代码如下:
  1. void usart_gpio_config(void)
  2. {
  3.   gpio_init_type gpio_init_struct;
  4.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

  5.   /* configure the usart2 tx, rx pin */
  6.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  7.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  8.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  9.   gpio_init_struct.gpio_pins = GPIO_PINS_9 | GPIO_PINS_10;
  10.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  11.   gpio_init(GPIOA, &gpio_init_struct);
  12.   gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_7);
  13.   gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_7);
  14. }
注意,在端口复用功能设置这里参考用户手册IOMUX功能定义,选择正确的MUX号,这里根据手册上,PA9和PA10的USART1功能是MUX7,所以代码里要改为MUX7
1084654279321a10c.png
然后修改USB转UART的定义函数为对应的USART1:
  1. void usb_usart_config( linecoding_type linecoding)
  2. {
  3.   usart_stop_bit_num_type usart_stop_bit;
  4.   usart_data_bit_num_type usart_data_bit;
  5.   usart_parity_selection_type usart_parity_select;

  6.   /* enable the usart2 and gpio clock */
  7.   crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, FALSE);
  8.   crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);

  9.   /* stop bit */
  10.   switch(linecoding.format)
  11.   {
  12.     case 0x0:
  13.       usart_stop_bit = USART_STOP_1_BIT;
  14.       break;
  15.   /* to be used when transmitting and receiving data in smartcard mode */
  16.     case 0x1:
  17.       usart_stop_bit = USART_STOP_1_5_BIT;
  18.       break;
  19.     case 0x2:
  20.       usart_stop_bit = USART_STOP_2_BIT;
  21.       break;
  22.     default :
  23.       break;
  24.   }
  25.   
  26.   /* parity */
  27.   switch(linecoding.parity)
  28.   {
  29.     case 0x0:
  30.       usart_parity_select = USART_PARITY_NONE;
  31.       break;
  32.     case 0x1:
  33.       usart_parity_select = USART_PARITY_ODD;
  34.       break;
  35.     case 0x2:
  36.       usart_parity_select = USART_PARITY_EVEN;
  37.       break;
  38.     /* hardware usart not support parity for mark and space  */
  39.     case 0x3:
  40.     case 0x4:
  41.       break;
  42.     default :
  43.       break;
  44.   }
  45.   
  46.   if(USART_PARITY_NONE == usart_parity_select)
  47.   {
  48.     /* data bits */
  49.     switch(linecoding.data)
  50.     {
  51.       /* hardware usart not support data bits for 5/6 */
  52.       case 0x5:
  53.       case 0x6:
  54.         break;
  55.       case 0x7:
  56.         usart_data_bit = USART_DATA_7BITS;
  57.         break;
  58.       case 0x8:
  59.         usart_data_bit = USART_DATA_8BITS;
  60.         break;
  61.       /* hardware usart not support data bits for 16 */
  62.       case 0x10:
  63.         break;
  64.       default :
  65.         break;
  66.     }   
  67.   }
  68.   else
  69.   {
  70.     /* data bits */
  71.     switch(linecoding.data)
  72.     {
  73.       /* hardware usart not support data bits for 5/6 */
  74.       case 0x5:
  75.       case 0x6:
  76.         break;
  77.       case 0x7:
  78.         usart_data_bit = USART_DATA_8BITS;
  79.         break;
  80.       case 0x8:
  81.         usart_data_bit = USART_DATA_9BITS;
  82.         break;
  83.       /* hardware usart not support data bits for 16 */
  84.       case 0x10:
  85.         break;
  86.       default :
  87.         break;
  88.     }   
  89.   }

  90.   nvic_irq_enable(USART1_IRQn, 0, 0);

  91.   /* configure usart2 param */
  92.   usart_init(USART1, linecoding.bitrate, usart_data_bit, usart_stop_bit);
  93.   usart_parity_selection_config(USART1, usart_parity_select);
  94.   usart_transmitter_enable(USART1, TRUE);
  95.   usart_receiver_enable(USART1, TRUE);

  96.   /* enable usart2 interrupt */
  97.   usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);
  98.   usart_enable(USART1, TRUE);
  99. }
第三步修改相应的USART中断配置为USART1:
  1. void USART1_IRQHandler(void)
  2. {
  3.   if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
  4.   {
  5.     /* read one byte from the receive data register */
  6.     usart_rx_buffer[hw_usart_rx_index] = usart_data_receive(USART1);
  7.     hw_usart_rx_index = ( (hw_usart_rx_index+1) & (usart_buffer_size-1) );
  8.   }
  9. }
第四步,修改相应的USART数据发送函数为USART1:
  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(USART1, USART_TDBE_FLAG) == RESET);

  10.     usart_data_transmit(USART1, send_data[index]);
  11.   }
  12. }
第五步,代码修改完成后,用跳线短接开发板上J8排针口的TXD和RXD脚,用USB线插入开发板的TYPE-C口,给开发板供电后,PC上会弹出新的虚拟串口号出来,用串口调试助手进行串口数据发送接收测试,测试结果正常。
172706542787be34ff.png

最后,讲一下这次尝试修改出现的一个小插曲,我开始是尝试修改为USART6,使用PA11和PA12引脚,测试发现USART6没有反应,在这个地方卡住了几天,查看代码没有找到任何问题,今天仔细看用户手册,发现了一个小问题,其中有讲PA11和PA12复用功能,需要注意的事项。在这里提个醒,**以后有刚好想用PA11和PA12端口的伙伴们注意,所以改为USART1后测试正常才发贴子。
6844165427af910797.png

 楼主| hjl2832 发表于 2023-11-2 00:24 | 显示全部楼层
本帖最后由 hjl2832 于 2023-11-2 08:53 编辑

9004665427ba10c696.png
9135765427bbbad193.png
从手册上看,有好几个复用功能,在开了抢占优先级后,都是固定功能的,IOMUX里的设置是无效的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

1097

帖子

4

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