工程的源码如下:
- /********************************** (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就会如约闪亮。
下载的时候,需要买现做如下的设置,否则可能无法正常运行:
而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次了。
通过上面的分析,我们可以在main()中,直接控制GPIO,来控制LED;我们也可以通过rt-thread的msh界面,来发送对应的指令,控制GPIO,从而控制led。
msh是一个非常方便的交互界面,通过它,我们可以开发简单的串口终端,来提供各种不同的交互指令,实现不同的功能,后续会进一步分享该功能。