【国民技术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> 删除Vitrual_COM_Port下面的main.c 与main.h</p>
<p>然后编译,会出很多报错,其中很多是n32g45x_it.c中的函数重复定义,删除重复函数。还有就是添加n32g45x.h头文件。编译通过后在applications的main.c中添加头文件以及USB初始化函数</p>
<pre>
<code>#include <stdint.h>
#include <rtthread.h>
#include <rtdevice.h>
#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> 用串口助手连接虚拟串口,向开发板发数据:开发板shell成功打印出来:</p>
<p> 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 < Nb_bytes; i++)
{
USART_SendData(USART1, *(data_buffer + i));
while(USART_GetFlagStatus(USART1, USART_FLAG_TXDE) == RESET);
}
}
</code></pre>
<p>大家可以根据需要去修改,用上usb_虚拟串口,省得个USB—TTL也是挺方便的。工程上传如下:</p>
<p>测试一下,发送大于64字节的数据,会有什么反应。</p>
<p>表示无压力:</p>
<p> </p>
<p>我就想象stm32那一样写成设备注册的样式,没找到资料。</p>
表示无压力:
&nbsp; &nbsp;
<p>他有拆成64字节为一包吗?</p> wangerxian 发表于 2022-2-9 22:06
他有拆成64字节为一包吗?
<p>我特意去翻了一下USB的接口buf,最长接收是64一包。</p>
<p>/* Private variables ---------------------------------------------------------*/<br />
uint8_t USB_Rx_Buffer;</p>
<p><strong>#define VIRTUAL_COM_PORT_DATA_SIZE 64</strong></p>
<p><strong>是DEMO的缘由吧,他直接就转去给rt_printf,所以没有什么问题。</strong></p>
页:
[1]