KL25的USB CDC虚拟串口与UART串口对比

       在之前的博客里,电机阶跃波形和速度需要实时显示在上位机上,方便整定参数和观测,之前用的是串口发送一定的协议到虚拟示波器上,如图,做个广告:山外调试助手,以前和野火一家的。

        但是单片机串口的发送过程对于程序执行过程来说算是个delay(),之前测过在9600波特率的情况下,发送几个字节的数据动辄几ms,在本项目中需要频繁发送实时速度数据到上位机,串口干扰了单片机的实时性。因此在追求实时性的场合必须替换掉串口方式,由于KL25是带USB外设的,而且demo板也提供了USB口,所以整合了USB通信到电机PID程序中。由于程序是把USB列举为CDC类,在设备管理器中显示的就是传统串口,驱动官方提供了 Freescale_CDC_Driver_Kinetis.inf  ,你也可以浏览计算机手动安装——从已安装的设备驱动列表选择—–厂商—–Freescale,P&E Micro—–型号—–选择open cdc serial驱动安装。安装完就是个新串口com9:

        既然用了USB通信功能,速度有没有变快呢?为此进行了验证,在CDC初始化时设定了和之前串口相同的波特率115200,测试只从下位机语句执行时间角度考虑,上位机的响应时间不包括 也不是重点。测试直接利用引脚取反,示波器直接观测,首先在两种情况加入测试引脚:

PTB8_OUT = 0;
EP_IN_Transfer( EP2 ,wave ,5 ); //USB方式
PTB8_OUT = 1;
PTB8_OUT = 0;
uart_sendN(UART0, wave, 5); //UART方式
PTB8_OUT = 1;

     示波器设置triger查看:

 

     上图为UART方式 峰宽 268 us,下图USB方式峰宽 6.6 us,用时大为缩短,USB通信带来的实时性得到极大提升。且USB 中断方式支持错误重传,在可靠性上也比UART高。之后又测试了CDC虚拟串口波特率提升到256000,用时并没有减短,仍然为6.6 us,认为这是USB的发送处理时间,与虚拟波特率无关。  上位机只需换到com9打开,原样显示波形。

2018.12.23更新:  所有单片机串口发送函数有个 while(发送缓冲区空 ==1) 再发送   的过程,所以费时很长,而USB发送函数,把数据扔给USB外设寄存器就不管了,等于是没有阻塞,当然快很多,测的6.6us只是引脚语句执行时间和行时间。

STM32使用FSMC驱动8080时序CH395的一些问题

      CH395L是带并口的版本,支持串口、SPI、并口三种模式,网卡类似于内置TCP协议的W5500,用户只需读取一些参数设置socket就可以完成网络通信。CH395具有并口模式,这是个特色,在对速度要求高的场合,并口比SPI等串行方式快很多,在使用stm32f103以fsmc硬件并口驱动ch395时参考秉火和战舰的驱动LCD的例程,因为都是8080时序的设备,方法相似。

       在配置过程中,发现在以杜邦线连接ch395模块的情况下,

readWriteTiming.FSMC_AddressSetupTime      = 0x03;  
readWriteTiming.FSMC_DataSetupTime         = 0x08;  

这两个值不能再小于此数值,整个读写周期达到 (3+1 +8+1)*1/72MHz = 182ns,没达到手册的写模式极限值41ns




值改小的话读出的数据会重复 出错,只能调大,原因可能是杜邦线的稳定性问题,波形奇丑:

与LCD配置不同的是,需要加上以下:FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait             = FSMC_AsynchronousWait_Disable;

同步等待需要关闭,之前测试失败是因为读写周期不一致,示波器观察 写周期太短,周期与写不一致,FSMC_AccessMode_B下,写周期的参数似乎不受控制,周期过短,切换为FSMC_AccessMode_A ,读写分别配置,示波器查看 读写周期一致,驱动成功。没有再深入研究,具体配置如下:

    readWriteTiming.FSMC_AddressSetupTime = 0x03;  
    readWriteTiming.FSMC_DataSetupTime = 0x08;    
    readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;    
    readWriteTiming.FSMC_AddressHoldTime  = 0x00;     
    readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
    readWriteTiming.FSMC_CLKDivision = 0x00;
    readWriteTiming.FSMC_DataLatency = 0x00;    
    FSMC_NORSRAMInitStructure.FSMC_Bank   = FSMC_Bank1_NORSRAMx;
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
    FSMC_NORSRAMInitStructure.FSMC_MemoryType   = FSMC_MemoryType_NOR;
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth   = FSMC_MemoryDataWidth_8b;
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode  = FSMC_BurstAccessMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity  = FSMC_WaitSignalPolarity_Low;
    FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait  = FSMC_AsynchronousWait_Disable;    
    FSMC_NORSRAMInitStructure.FSMC_WrapMode  = FSMC_WrapMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive   =   FSMC_WaitSignalActive_BeforeWaitState;
    FSMC_NORSRAMInitStructure.FSMC_WriteOperation   = FSMC_WriteOperation_Enable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignal   = FSMC_WaitSignal_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode   = FSMC_ExtendedMode_Disable;  
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst   = FSMC_WriteBurst_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct  = &readWriteTiming;  

此外参考CH395官方demo–exam0,移植了stm32平台下串口、硬件SPI、模拟并口、硬件FSMC并口的驱动程序,4个Socket分别工作在TCP 客户端、服务器、UDP、IPRAW模式。资源下载: 

STM32分别以串口,硬件SPI,模拟并口驱动CH395,4个socket连接

STM32以FSMC硬件并口驱动CH395,4个socket连接, 原路返回上位机发送的数据