rv-star RGB LED灯实验

2021-03-29 14:59:56 浏览数 (3)

  • 1.实验目的
  • 2.环境搭建
  • 3.实验结果与代码分析
  • 4.调用层次分析

1.实验目的

本实验主要在rv-star的板子上点亮RGB灯。

通过一个简单的GPIO操作实验,分析RISCV MCU目前的编程模型。

本实验的工程已经上传到

https://github.com/bigmagic123/RV-STAR

2.环境搭建

实验下载操作可以按照我之前的文章来操作

首先导入工程

然后选择工程

调试选择openocd

最后,直接下载即可。

3.实验结果与代码分析

入口在main函数

main函数中调用了led_config();函数

该函数的实现如下:

代码语言:javascript复制
void led_config(void)
{
    for(int i=0; i<LEDn; i  )
    {
        gd_rvstar_led_init(i);
        gd_rvstar_led_on(i);
        delay_1ms(1000);
        gd_rvstar_led_off(i);
    }
}

首先LEDn在gd32vf103_rvstar.h中

代码语言:javascript复制
/* rvstar board low layer led */
#define LEDn                             3U

定义了三个LED。

接着调用gd_rvstar_led_init初始化gpio。

其实际的实现可以看如下的代码

代码语言:javascript复制
/* Defines for LED functio/* Defines for LED / Key functions to new / general API */
#define gd_rvstar_led_init         gd_led_init
#define gd_rvstar_led_on           gd_led_on
#define gd_rvstar_led_off          gd_led_off
#define gd_rvstar_led_toggle       gd_led_toggle

实际上执行的是gd_led_init,现在看看该函数的实现

代码语言:javascript复制
/* eval board low layer private functions */
/*!
 *  brief      configure led GPIO
 *  param[in]  lednum: specify the led to be configured
 *  arg        LED1
 *  param[out] none
 *  retval     none
 */
void gd_led_init(led_typedef_enum lednum)
{
    /* enable the led clock */
    rcu_periph_clock_enable(`[lednum]);
    /* configure led GPIO port */
    gpio_init(GPIO_PORT[lednum], GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN[lednum]);
    GPIO_BOP(GPIO_PORT[lednum]) = GPIO_PIN[lednum];
}

首先调用rcu_periph_clock_enable初始化对于的GPIO时钟。

对于GPIO_CLK有如下的定义。

代码语言:javascript复制
static const rcu_periph_enum GPIO_CLK[LEDn] = {LEDG_GPIO_CLK,LEDB_GPIO_CLK,LEDR_GPIO_CLK};
代码语言:javascript复制
#define LEDG_PIN                         GPIO_PIN_1
#define LEDG_GPIO_PORT                   GPIOA
#define LEDG_GPIO_CLK                    RCU_GPIOA

#define LEDB_PIN                         GPIO_PIN_3
#define LEDB_GPIO_PORT                   GPIOA
#define LEDB_GPIO_CLK                    RCU_GPIOA

#define LEDR_PIN                         GPIO_PIN_2
#define LEDR_GPIO_PORT                   GPIOA
#define LEDR_GPIO_CLK                    RCU_GPIOA

简单的说,就是LED绿灯对应的是PA1,LED蓝灯对应PA3,LED红灯对应PA2。

查看原理图

对应芯片的引脚

不难看出,操作一个gpio的流程主要是三部分

1.设置GPIO时钟

2.设置初始化设置GPIO

3.操作对应的GPIO位

4.调用层次分析

main-->gd32vf103_rvstar-->gd32vf103_xx.c-->寄存器操作

所以如果需要自己实现板子的定义,只需要修改gd32vf103_rvstar中间层即可。

0 人点赞