使用RT-Thread Stuido新建基于CH32V307V-R1的模板工程时,系统会自动使用模板建立对应的工程。
image.png

工程的源码如下:
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name          : main.c
  3. * Author             : WCH
  4. * Version            : V1.0.0
  5. * Date               : 2021/06/06
  6. * Description        : Main program body.
  7. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
  8. * SPDX-License-Identifier: Apache-2.0
  9. *******************************************************************************/
  10. #include "ch32v30x.h"
  11. #include <rtthread.h>
  12. #include <rthw.h>
  13. #include "drivers/pin.h"
  14. #include <board.h>
  15. #include <drv_gpio.h>
  16. /* Global typedef */
  17. /* Global define */
  18. #define LED0_PIN  35   //PC3
  19. /* Global Variable */
  20. /*********************************************************************
  21. * @fn      main
  22. *
  23. * @brief   Main program.
  24. *
  25. * @return  none
  26. */
  27. int main(void)
  28. {
  29.     rt_kprintf("MCU: CH32V307\n");
  30.         rt_kprintf("SysClk: %dHz\n",SystemCoreClock);
  31.     rt_kprintf("www.wch.cn\n");
  32.         LED1_BLINK_INIT();
  33.         GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  34. while(1)
  35.         {
  36.             GPIO_SetBits(GPIOA,GPIO_Pin_0);
  37.             rt_thread_mdelay(500);
  38.             GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  39.             rt_thread_mdelay(500);
  40.         }
  41. }
  42. /*********************************************************************
  43. * @fn      led
  44. *
  45. * @brief   gpio operation by pins driver.
  46. *
  47. * @return  none
  48. */
  49. int led(void)
  50. {
  51.     rt_uint8_t count;
  52.     rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
  53.     rt_kprintf("led_SP:%08x\r\n",__get_SP());
  54.     for(count = 0 ; count < 10 ;count++)
  55.     {
  56.         rt_pin_write(LED0_PIN, PIN_LOW);
  57.         rt_kprintf("led on, count : %d\r\n", count);
  58.         rt_thread_mdelay(500);
  59.         rt_pin_write(LED0_PIN, PIN_HIGH);
  60.         rt_kprintf("led off\r\n");
  61.         rt_thread_mdelay(500);
  62.     }
  63.     return 0;
  64. }
  65. MSH_CMD_EXPORT(led,  led sample by using I/O drivers);

上述源码中,包含了点灯的代码,以及msh shell环境的演示代码。

点灯的代码部分,输出的GPIO端口是GPIOA-GPIO_Pin_0,对应的也就是PA0。
要使得该输出生效,需要将开发板上的LED1与PA0引脚连接起来,那么编译下载后,LED1就会如约闪亮。

下载的时候,需要买现做如下的设置,否则可能无法正常运行:
image.png


而led()函数的定义,就是msh对应命令的定义。
其有 MSH_CMD_EXPORT(led, led sample by using I/O drivers); 进行设置关联。


需要注意的是,在led()中,操作GPIO使用的是rtt的调用,如rt_pin_mode、rt_pin_write等。
而使用rt_pin_mode和rt_pin_write的时候,需要使用正确的对应引脚编号。
打开libraries/hal_drivers/drv_gpio.c,可以看到如下的信息:
  1. #if defined(GPIOA)
  2.     __CH32_PIN(0 ,  A, 0 ),
  3.     __CH32_PIN(1 ,  A, 1 ),
  4.     __CH32_PIN(2 ,  A, 2 ),
  5.     __CH32_PIN(3 ,  A, 3 ),
  6.     __CH32_PIN(4 ,  A, 4 ),
  7.     __CH32_PIN(5 ,  A, 5 ),
  8.     __CH32_PIN(6 ,  A, 6 ),
  9.     __CH32_PIN(7 ,  A, 7 ),
  10.     __CH32_PIN(8 ,  A, 8 ),
  11.     __CH32_PIN(9 ,  A, 9 ),
  12.     __CH32_PIN(10,  A, 10),
  13.     __CH32_PIN(11,  A, 11),
  14.     __CH32_PIN(12,  A, 12),
  15.     __CH32_PIN(13,  A, 13),
  16.     __CH32_PIN(14,  A, 14),
  17.     __CH32_PIN(15,  A, 15),
  18. #if defined(GPIOB)
  19.     __CH32_PIN(16,  B, 0),
  20.     __CH32_PIN(17,  B, 1),
  21.     __CH32_PIN(18,  B, 2),
  22.     __CH32_PIN(19,  B, 3),
  23.     __CH32_PIN(20,  B, 4),
  24.     __CH32_PIN(21,  B, 5),
  25.     __CH32_PIN(22,  B, 6),
  26.     __CH32_PIN(23,  B, 7),
  27.     __CH32_PIN(24,  B, 8),
  28.     __CH32_PIN(25,  B, 9),
  29.     __CH32_PIN(26,  B, 10),
  30.     __CH32_PIN(27,  B, 11),
  31.     __CH32_PIN(28,  B, 12),
  32.     __CH32_PIN(29,  B, 13),
  33.     __CH32_PIN(30,  B, 14),
  34.     __CH32_PIN(31,  B, 15),

此处,__CH32_PIN(0 , A, 0 ),就表示GPIOA-GPIO_Pin_0对应rtt中的0。
因为GPIOA-GPIO_Pin_0已经被main()中的循环进行了处理,那么我们在led()中使用PA1好了。
修改 #define LED0_PIN 35 为 #define LED0_PIN 1 即可。


重新编译并下载,LED1还是会继续闪动,但我们还可以使用串口工具连接到开发板,然后发送led指令,就能使LED2闪动10次了。
image.png


通过上面的分析,我们可以在main()中,直接控制GPIO,来控制LED;我们也可以通过rt-thread的msh界面,来发送对应的指令,控制GPIO,从而控制led。

msh是一个非常方便的交互界面,通过它,我们可以开发简单的串口终端,来提供各种不同的交互指令,实现不同的功能,后续会进一步分享该功能。