Foreword
开发一下CH32,快速移植一个EasyConAPI上去
CH32环境
先从官网拉下来所有相关资料
https://www.wch.cn/search?t=all&q=ch32f103
安装
查看官方评估版资料,例程中的模拟HID和CDC串口就刚好是我们需要的,稍微修改一下应该就能用了。
先要安装Keil.WCH32F1xx_DFP.1.0.1.pack
才能用keil正常打开工程,直接更新是没有WCH的
后来发现ISP软件也支持添加库,不过比起DFP还是麻烦了一点
编译器不兼容
直接测试Demo USB工程,会发现编译直接报错了
ch32f103 ../../SRC/CMSIS/core_cm3.c(445): error: non-ASM statement in naked function is not supported
仔细看一下,其实是Keil版本更新了,最新的Keil只有Compiler 6,而没有5了,ch32是基于老版本构建的
安装V5
两个办法,一个是直接下一个老版的ARM Compiler
https://developer.arm.com/downloads/view/ACOMP5
这里很容易被恶心到,ARM必须要注册才能下载,并且注册还必须手机验证、邮箱验证,搞不好还会被提示地区要被审查,你暂时无法登录,就是不给你下载,所以我下了一个放到了我的工具里,直接下载就行了,这个东西官方也不会更新了,所以以后也不需要考虑换什么的。
https://github.com/elmagnificogi/MyTools/tree/master/ARMCompiler_506
- 一定要安装在这个目录中,否则会提示你没有授权
然后就能看到V5版本了
修改工程
还有一个修改一下工程即可
修改语言标准
移除报错文件core_m3.c
,再进行编译就完全正常了。
下载
安装WCHISPTool_Setup.exe
需要板子进入boot模式,boot0接VCC,boot1接GND,然后重启连接,USB插HUSB,这个口默认是ISP接口
识别到以后还需要再安装一个驱动,CH32F103对应的是CH375的串口,所以要一个对应驱动就行了,官网就能下到(其实安装ISP的时候就带了,眼瞎没看到)
https://www.wch.cn/downloads/CH372DRV_ZIP.html
软件有点问题,太老了,高分辨率会导致UI错乱,只能全屏用了
选好程序以后,直接就能下载了,还是比较方便的。
这里要注意,把读保护关闭,否则后面可能debug或者用st-link下载会出现无法烧写校验等情况
后来发现新版的ISP下载软件有点挫,如果是老版本的UI就很ok,建议还是用老版的吧
USB例程问题
可能其他例程都能正常跑,但是CDC的例程只要连上,就提示无法识别
代码中推荐用串口2作为调试串口,把串口1用来CDC转发。默认代码中是使用串口1作为调试串口的。我以为不改也没关系,就没管,然后怎么都不识别CDC串口。
官方论坛又看到官方回复,取消串口2作为调试口
,更坚定了我的想法。然而事实是,要用串口2作为调试串口,然后这个CDC例程才能正常工作,真是坑爹啊。
再仔细一看这个debug,是所有例程公用的,一改全改了。
USB无法识别
如果在代码初始化的过程中,优先去执行一些耗时的操作
int main(void)
{
Delay_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
USART_Printf_Init(115200);
EasyCon_script_init();
Delay_ms(1000)
/* USB20 device init */
UART1_ParaInit(1);
USBHD_RCC_Init( );
USBHD_Device_Init( ENABLE );
/* Timer init */
TIM2_Init();
ledb_test();
/* USBD init */
Set_USBConfig();
USB_Init();
USB_Interrupts_Config();
}
比如delay了1秒或者是操作了flash,就会导致usb初始化直接失败。原因是USB的引脚在默认上电的情况下,就已经自带上拉了,会导致主机直接识别了USB插入,就会开始准备USB初始化了,而实际的MCU还在干别的事情,等MCU忙完了去初始化USB就会直接失败了。
解决这个问题也很简单,初始化第一步就是先把USB的引脚挂起,让他无法被识别即可,后续再让他初始化就行了。
int main(void)
{
Delay_Init();
USB_Port_Set(DISABLE, DISABLE);
USBHD_Device_Init( DISABLE );
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
USART_Printf_Init(115200);
EasyCon_script_init();
/* USB20 device init */
UART1_ParaInit(1);
USBHD_RCC_Init( );
USBHD_Device_Init( ENABLE );
/* Timer init */
TIM2_Init();
ledb_test();
/* USBD init */
Set_USBConfig();
USB_Init();
USB_Interrupts_Config();
}
USB移植修改
USB移植修改的时候,基本上这里的文件大部分都要改动,官方例程写的不是很好,很多很细节的东西都在一个个小函数里,不对比很难看出来问题
特别是Reset中设置了ENDP口,其他都改对了,但是这里不改的话是不能正常工作的
/*********************************************************************
* @fn USBD_Reset
*
* @brief Virtual_Com_Port Mouse reset routine
*
* @return none
*/
void USBD_Reset(void)
{
pInformation->Current_Configuration = 0;
pInformation->Current_Feature = USBD_ConfigDescriptor[7];
pInformation->Current_Interface = 0;
SetBTABLE(BTABLE_ADDRESS);
SetEPType(ENDP0, EP_CONTROL);
SetEPTxStatus(ENDP0, EP_TX_STALL);
SetEPRxAddr(ENDP0, ENDP0_RXADDR);
SetEPTxAddr(ENDP0, ENDP0_TXADDR);
Clear_Status_Out(ENDP0);
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
SetEPRxValid(ENDP0);
_ClearDTOG_RX(ENDP0);
_ClearDTOG_TX(ENDP0);
SetEPType(ENDP1, EP_INTERRUPT);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxStatus(ENDP1, EP_TX_NAK);
_ClearDTOG_TX(ENDP1);
_ClearDTOG_RX(ENDP1);
SetEPType(ENDP2, EP_INTERRUPT);
SetEPRxAddr(ENDP2, ENDP2_RXADDR);
SetEPTxStatus(ENDP2, EP_RX_DIS);
SetEPRxStatus(ENDP2,EP_RX_DIS);
_ClearDTOG_TX(ENDP2);
_ClearDTOG_RX(ENDP2);
SetDeviceAddress(0);
bDeviceState = ATTACHED;
}
USB HID查看工具
HIDDemonstrator_V1.0.2
他必须要vc++ 2005才能正常打开,实际上我打开了也用不了。不推荐
MyUSB.exe
这个只能看个大概,不能打开USB看不到具体包,也不推荐
HID调试助手.exe
直接打不开设备,淘汰
纸飞机
收费软件,也不是很贵,20多,第一次试用直接给了1个月,可以直接打开设备,也能调整分包什么的,简单用用还是不错的。
他的其他功能比较强大,画图什么的
USBlyzer
这就比较强大了,可以查看各种包,会分类什么的
同时也能看到对应的USB描述符、配置等等内容,可以用来审查是否和自己的设置不同
EasyMCU_CH32
已经移植完成了
https://github.com/EasyConNS/EasyMCU_CH32
Summary
WCH不愧是专业搞USB相关的,确实很多东西做的很简单。
Quote
https://www.cnblogs.com/milton/p/15840921.html
https://blog.csdn.net/CAImoontion/article/details/112565011
https://www.yourcee.com/newsinfo/2928217.html
https://blog.csdn.net/weixin_44775687/article/details/126843414
CH32F103评估板说明书.pdf
https://www.keil.com/appnotes/files/apnt_298.pdf
https://www.wch.cn/bbs/thread-97775-1.html