lugl4313820 发表于 2022-2-9 15:05

【国民技术N32G457评测】RT_Thread Studio 移植USB虚拟串口

<p>利用 N32G45 自带的 USB 功能,连接电脑 USB,虚拟出一个 USB 串口,实现电脑和开发板的数据通信。官方提供的MDK提供了例子,利用RT_Thread Studio,配置成USB后不能工作,现在就把例子中的MDK程序移植到rt_thread_studio。</p>

<p>1、在packages中新建usb_drvier文件夹,把例程中的Virtual_COM_Port文件夹拷到这里目录下面。再把Nationstech.N32G45x_Library.1.1.1\firmware\n32g45x_usbfs_driver文件夹拷到目录下面。</p>

<p></p>

<p>在工程目录中添加编译的目录:</p>

<p>&nbsp;&nbsp;删除Vitrual_COM_Port下面的main.c 与main.h</p>

<p>然后编译,会出很多报错,其中很多是n32g45x_it.c中的函数重复定义,删除重复函数。还有就是添加n32g45x.h头文件。编译通过后在applications的main.c中添加头文件以及USB初始化函数</p>

<pre>
<code>#include &lt;stdint.h&gt;
#include &lt;rtthread.h&gt;
#include &lt;rtdevice.h&gt;
#include "hw_config.h"
#include "usb_lib.h"
#include "usb_pwr.h"

/* defined the LED1 pin: PB5 */
#define LED1_PIN    100

int main(void)
{
    uint32_t Speed = 200;
    /* set LED1 pin mode to output */
    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
    USB_Interrupts_Config();
    Set_USBClock();
    USB_Init();
    while (1)
    {
      rt_pin_write(LED1_PIN, PIN_LOW);
      rt_thread_mdelay(Speed);
      rt_pin_write(LED1_PIN, PIN_HIGH);
      rt_thread_mdelay(Speed);
    }
}
</code></pre>

<p>编译通过后下载到开发板重启:电脑成功检测到串口端口:</p>

<p>&nbsp;用串口助手连接虚拟串口,向开发板发数据:开发板shell成功打印出来:</p>

<p>&nbsp;USB虚拟串口接收函数为usb_endp.c中的void EP3_OUT_Callback(void),如果需要处理数据在这里处理。</p>

<pre>
<code>/*******************************************************************************
* Function Name: EP3_OUT_Callback
* Description    :
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void EP3_OUT_Callback(void)
{
uint16_t USB_Rx_Cnt;

/* Get the received data buffer and update the counter */
USB_Rx_Cnt = USB_SilRead(EP3_OUT, USB_Rx_Buffer);

/* USB data will be immediately processed, this allow next USB traffic being
NAKed till the end of the USART Xfer */

USB_To_USART_Send_Data(USB_Rx_Buffer, USB_Rx_Cnt);

/* Enable the receive of data on EP3 */
USB_SetEpRxValid(ENDP3);
}</code></pre>

<p>USB虚拟串口发送函数为hw_config.c的</p>

<pre>
<code>/*******************************************************************************
* Function Name: USB_To_USART_Send_Data.
* Description    : send the received data from USB to the UART 0.
* Input          : data_buffer: data address.
                   Nb_bytes: number of bytes to send.
* Return         : none.
*******************************************************************************/
void USB_To_USART_Send_Data(uint8_t* data_buffer, uint8_t Nb_bytes)
{

uint32_t i;

for (i = 0; i &lt; Nb_bytes; i++)
{
    USART_SendData(USART1, *(data_buffer + i));
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXDE) == RESET);
}
}
</code></pre>

<p>大家可以根据需要去修改,用上usb_虚拟串口,省得个USB&mdash;TTL也是挺方便的。工程上传如下:</p>

wangerxian 发表于 2022-2-9 17:36

<p>测试一下,发送大于64字节的数据,会有什么反应。</p>

lugl4313820 发表于 2022-2-9 19:52

<p>表示无压力:</p>

<p> &nbsp; &nbsp;</p>

lugl4313820 发表于 2022-2-9 19:54

<p>我就想象stm32那一样写成设备注册的样式,没找到资料。</p>

wangerxian 发表于 2022-2-9 22:06

表示无压力:

&amp;nbsp; &amp;nbsp;


<p>他有拆成64字节为一包吗?</p>

lugl4313820 发表于 2022-2-12 08:51

wangerxian 发表于 2022-2-9 22:06
他有拆成64字节为一包吗?

<p>我特意去翻了一下USB的接口buf,最长接收是64一包。</p>

lugl4313820 发表于 2022-2-12 08:55

<p>/* Private variables ---------------------------------------------------------*/<br />
uint8_t USB_Rx_Buffer;</p>

<p><strong>#define VIRTUAL_COM_PORT_DATA_SIZE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;64</strong></p>

<p><strong>是DEMO的缘由吧,他直接就转去给rt_printf,所以没有什么问题。</strong></p>
页: [1]
查看完整版本: 【国民技术N32G457评测】RT_Thread Studio 移植USB虚拟串口