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

工程的源码如下:
/********************************** (C) COPYRIGHT *******************************
  • * File Name          : main.c
  • * Author             : WCH
  • * Version            : V1.0.0
  • * Date               : 2021/06/06
  • * Description        : Main program body.
  • * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
  • * SPDX-License-Identifier: Apache-2.0
  • *******************************************************************************/
  • #include "ch32v30x.h"
  • #include <rtthread.h>
  • #include <rthw.h>
  • #include "drivers/pin.h"
  • #include <board.h>
  • #include <drv_gpio.h>
  • /* Global typedef */
  • /* Global define */
  • #define LED0_PIN  35   //PC3
  • /* Global Variable */
  • /*********************************************************************
  • * @fn      main
  • *
  • * @brief   Main program.
  • *
  • * @return  none
  • */
  • int main(void)
  • {
  •     rt_kprintf("MCU: CH32V307\n");
  •         rt_kprintf("SysClk: %dHz\n",SystemCoreClock);
  •     rt_kprintf("www.wch.cn\n");
  •         LED1_BLINK_INIT();
  •         GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  • while(1)
  •         {
  •             GPIO_SetBits(GPIOA,GPIO_Pin_0);
  •             rt_thread_mdelay(500);
  •             GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  •             rt_thread_mdelay(500);
  •         }
  • }
  • /*********************************************************************
  • * @fn      led
  • *
  • * @brief   gpio operation by pins driver.
  • *
  • * @return  none
  • */
  • int led(void)
  • {
  •     rt_uint8_t count;
  •     rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
  •     rt_kprintf("led_SP:%08x\r\n",__get_SP());
  •     for(count = 0 ; count < 10 ;count++)
  •     {
  •         rt_pin_write(LED0_PIN, PIN_LOW);
  •         rt_kprintf("led on, count : %d\r\n", count);
  •         rt_thread_mdelay(500);
  •         rt_pin_write(LED0_PIN, PIN_HIGH);
  •         rt_kprintf("led off\r\n");
  •         rt_thread_mdelay(500);
  •     }
  •     return 0;
  • }
  • 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,可以看到如下的信息:
    #if defined(GPIOA)
  •     __CH32_PIN(0 ,  A, 0 ),
  •     __CH32_PIN(1 ,  A, 1 ),
  •     __CH32_PIN(2 ,  A, 2 ),
  •     __CH32_PIN(3 ,  A, 3 ),
  •     __CH32_PIN(4 ,  A, 4 ),
  •     __CH32_PIN(5 ,  A, 5 ),
  •     __CH32_PIN(6 ,  A, 6 ),
  •     __CH32_PIN(7 ,  A, 7 ),
  •     __CH32_PIN(8 ,  A, 8 ),
  •     __CH32_PIN(9 ,  A, 9 ),
  •     __CH32_PIN(10,  A, 10),
  •     __CH32_PIN(11,  A, 11),
  •     __CH32_PIN(12,  A, 12),
  •     __CH32_PIN(13,  A, 13),
  •     __CH32_PIN(14,  A, 14),
  •     __CH32_PIN(15,  A, 15),
  • #if defined(GPIOB)
  •     __CH32_PIN(16,  B, 0),
  •     __CH32_PIN(17,  B, 1),
  •     __CH32_PIN(18,  B, 2),
  •     __CH32_PIN(19,  B, 3),
  •     __CH32_PIN(20,  B, 4),
  •     __CH32_PIN(21,  B, 5),
  •     __CH32_PIN(22,  B, 6),
  •     __CH32_PIN(23,  B, 7),
  •     __CH32_PIN(24,  B, 8),
  •     __CH32_PIN(25,  B, 9),
  •     __CH32_PIN(26,  B, 10),
  •     __CH32_PIN(27,  B, 11),
  •     __CH32_PIN(28,  B, 12),
  •     __CH32_PIN(29,  B, 13),
  •     __CH32_PIN(30,  B, 14),
  •     __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是一个非常方便的交互界面,通过它,我们可以开发简单的串口终端,来提供各种不同的交互指令,实现不同的功能,后续会进一步分享该功能。