1324浏览
查看: 1324|回复: 1

[进阶] Ch32V305 上使用 Arduino

[复制链接]
最近拿到一块 Ch32V305 EVT 板子,芯片的具体型号是CH32V305FBP6 ,作为 Ch32V3XX 系列的成员,它是 TSSOP20 封装,对于DIY 非常友好。

Ch32V305 上使用 Arduino图1

特别注意:和其他芯片不同,这款芯片必须使用 WCK LinkE 进行烧录去(无法像其他芯片一样直接使用 USB烧录,有点莫名其妙)。注意引脚接线,PA13SWDIOPA14SWCLK。【参考1
换句话,正常情况下对于这款开发板,USB供电外加额外三根线连接起来 SWDIO /SWCLK/GND 就足够下载代码了。

Ch32V305 上使用 Arduino图2

Ch32V305 上使用 Arduino图3


烧写之后后面还可能出现 Failed,the chip type is not matched or statusof chip is wrong! ”的问题(出现这种问题的一个原因是:你代码使用了 UART1,然后对于这个芯片来说 UART1 和烧录接口是在一起的会冲突),这种情况下解决方法是:断开开发板USB 供电,然后将 LinkE RST 和开发板 NRST连接(多说一句,对于这个板子在烧写的时候有2 Reset 方式:一种是By Power Off 如果使用这种方式需要对开发板使用 LinkE 3.3V供电);另外一种方法是By Pin NRST,具体就是将 LinkE RST 和开发板 NRST连接在一起。因为大多数时候我们需要调试 USB 功能,因此推荐后面这种方法)。然后使用 WCH-LinkUtility 这个工具下面这个功能先 Clear 一次,然后就可以烧录了。

Ch32V305 上使用 Arduino图4

接下来介绍如何使用 Arduino 编写代码,不过需要明确的一点是:目前 Arduino 支持还并不完善,在使用时会遇到各种各样的问题。项目地址在  https://github.com/openwch/arduino_core_ch32

首先,将这个项目加入到"Additional Boards Managers URLs"中:
Ch32V305 上使用 Arduino图5

接下来在 Board Manger 中搜索安装这个板子:


Ch32V305 上使用 Arduino图6

之后就可以进行使用了。
原始的库并不支持 USB 设备,这里需要我们直接编程:

  1. #include "src\\userUsbKB\\ch32v30x_usbhs_device.h"
  2. #include "src\\userUsbKB\\usbd_composite_km.h"
  3. uint8_t  KeyPress[8] = {0x08, 0, 0, 0, 0, 0, 0, 0};
  4. uint8_t  KeyRelease[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  5. void setup() {
  6.   Serial.begin(115200);
  7.   Serial.println("Start");
  8.   pinMode(D18, INPUT_PULLUP);
  9.   /* Initialize system configuration */
  10.   SystemCoreClockUpdate( );
  11.   NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );
  12.   //Delay_Init( );
  13.   /* Initialize USBHS interface to communicate with the host  */
  14.   USBHS_RCC_Init( );
  15.   USBHS_Device_Init( ENABLE );
  16.   USB_Sleep_Wakeup_CFG( );
  17. }
  18. unsigned long PressElsp = 0;
  19. unsigned long ReleaseElsp = 0;
  20. void loop() {
  21.   if ( USBHS_DevEnumStatus )
  22.   {
  23.     /* Handle keyboard lighting */
  24.     KB_LED_Handle( );
  25.     if ((digitalRead(D18) == LOW) && (PressElsp == 0) &&(millis()-ReleaseElsp>100)) {
  26.       USBHS_Endp_DataUp( DEF_UEP1, KeyPress, sizeof( KeyPress ), DEF_UEP_CPY_LOAD );
  27.       PressElsp = millis();
  28.       Serial.println("a");
  29.     }
  30.     if ((PressElsp != 0) && (millis() - PressElsp > 1000)) {
  31.       USBHS_Endp_DataUp( DEF_UEP1, KeyRelease, sizeof( KeyRelease ), DEF_UEP_CPY_LOAD );
  32.       PressElsp = 0;
  33.       ReleaseElsp=millis();
  34.       Serial.println("b");
  35.     }
  36.   }
  37. }
复制代码

关键的代码如下,简单的说就是如果D18 触发,那么就发送键盘数据给PC,相当于按下了 Win键;1秒之后,再发送全为0的数据包,这个相当于发送抬起信息:

  1.     if ((digitalRead(D18) == LOW) && (PressElsp == 0) &&(millis()-ReleaseElsp>100)) {
  2.       USBHS_Endp_DataUp( DEF_UEP1, KeyPress, sizeof( KeyPress ), DEF_UEP_CPY_LOAD );
  3.       PressElsp = millis();
  4.       Serial.println("a");
  5.     }
  6.     if ((PressElsp != 0) && (millis() - PressElsp > 1000)) {
  7.       USBHS_Endp_DataUp( DEF_UEP1, KeyRelease, sizeof( KeyRelease ), DEF_UEP_CPY_LOAD );
  8.       PressElsp = 0;
  9.       ReleaseElsp=millis();
  10.       Serial.println("b");
  11. }
复制代码

有兴趣的朋友不妨尝试一下这个芯片,主要的优点是:速度足够快(最高 144Mhz),资源比较多(128KB Flash32K 内存),体积小(TSSOP20封装),内置了USB High Speed (真 2.0)。目前的缺点是 Arduino开发环境并不完善,很多需要自己摸索。



参考:



zoologist  高级技匠
 楼主|

发表于 2024-4-24 11:05:54

工作的测试视频


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail