本帖最后由 璞玉 于 2021-8-28 17:36 编辑

【1】前言
        1. 简单说下,这是我第一次申请成功,所以也是第一次写什么测评报告,不会写,但是要努力,因为是小白所以只能从基础开始做起,努力多写几个实验练习一下使用
        2. 收到这个板子很开心,为什么申请他呢,因为大大的标题中科蓝讯AB32VG1 RISC-V开发板(国产芯+国产系统) 我爱中国
         3. 整体外观挺正常的,忽略一些丝印的小错误,看了文档介绍,功能也挺强大的
         4. 不多叨叨,马上按照说明的文档配置开发环境了,需要下载一个IDE:RT-Thread Studio,这个有点类似STCubeIDE的感觉,开发界面类似eclipse,装完也挺大的
         5. 安装完成只有有几个支持包需要下载一下,否则建工程都有问题,下载好之后要更新下编译工具支持包的位置,详见下图
             1.png
             2..png
         6. 之后点击锤子样子的编译就可以正确编译工程了

【2】点亮第一盏灯
         1. 这种操作就好比你学一个语言第一个工程一定是Hello world的感觉一样
         2. 查看开发板的丝印"LED"  -----> 查看原理图AB32VG1_Prougen_Schematic_V01.pdf
             找到LED的部分,可以看到有RGB三个LED共阳接到3.3V上,所以我需要给LED_R/G/B低电平的时候可以点亮
             电路图上的网络标号有电气连接特性,所以对应找到
             LED-R --- PE1
             LED-G --- PE4
             LED-B --- PA2
                3.PNG      
                  4.PNG

         3. 结论: 控制PE1,PE4, PA2引脚为低电平的时候,绿,蓝,红灯亮

【3】代码编写
         1.  在application上右击 选择new - 头文件,源文件
          5.png
        2. 在.c文件里写实现函数,并且包含头文件,上来函数不会写没关系,可以从他的main.c里获取一些基础的信息,选中函数后右键可以打开调用层次结构,从而一层层的往源码去追,追的时候看到了HAL_Driver,不知道是不是把HAL库的API再次封装成一个API接口来使用
          6.png
        3. 同时配置的时候我还有一个疑问就是,配置成输出模式,没有选择开漏还是推挽,也没有配置速度和上拉下拉,这时候有家选中引脚的模式可以打开引脚配置的头文件,从中我们可以看到GPIO的其他配置,基本照着英语猜测的,应该是这样
          7.png

          8.png
        4. 编写函数的时候遇到两个问题
        (1) 问题1
                 像是
                rt_pin_mode(myled.Led_R, PIN_MODE_OUTPUT);
                rt_pin_mode(myled.Led_G, PIN_MODE_OUTPUT);这样的两句代码是没办法写成一句的
                 rt_pin_mode(myled.Led_R | myled.Led_G, PIN_MODE_OUTPUT); //是不正确的
        (2)问题2
                开发手册上面的点灯实验,是把点灯的函数再次封装,作为一个线程添加进了系统初始化当中
                所以会使用到如下函数
                rt_thread_create //线程创建
                rt_thread_startup //线程启动
                INIT_APP_EXPORT //添加线程到启动文件
               我尝试过上述方式,顺利点灯,我上传的代码是直接主函数里调用的点灯函数,没有通过线程的方式

    【4】实验效果
             三色LED可以组合很多颜色,贵在变化。。。
             fc21c53b9ecf94b4d7f77cf9eba8a139(1).gif          

    【5】总结
作为一个最基础的实验,上手很简单,之后还会继续多写几篇这样的文章,记录新手小白的成长之路

    【6】源码
1. led.h
#ifndef APPLICATIONS_LED_H_
#define APPLICATIONS_LED_H_

#define LED_ON  1
#define LED_OFF 0

#include <rtthread.h>
#include "board.h"

struct Led_S{
    uint8_t Led_R;
    uint8_t Led_G;
    uint8_t Led_B;
};

void myLed_Init(void);
void Led_Red(uint8_t sw);
void Led_Green(uint8_t sw);
void Led_Blue(uint8_t sw);
void Led_Purple(uint8_t sw);
void Led_Cyan(uint8_t sw);
void Led_White(uint8_t sw);

2. led.c
#include "led.h"
struct Led_S myled;

void myLed_Init(void)
{
    myled.Led_R = rt_pin_get("PE.1");
    myled.Led_G = rt_pin_get("PA.1");
    myled.Led_B = rt_pin_get("PE.4");

    rt_pin_mode(myled.Led_R, PIN_MODE_OUTPUT);
    rt_pin_mode(myled.Led_G, PIN_MODE_OUTPUT);
    rt_pin_mode(myled.Led_B, PIN_MODE_OUTPUT);
}

void Led_Red(uint8_t sw)
{
    rt_pin_write(myled.Led_G, PIN_HIGH);
    rt_pin_write(myled.Led_B, PIN_HIGH);
    if(sw == LED_ON)
        rt_pin_write(myled.Led_R, PIN_LOW);
    else
        rt_pin_write(myled.Led_R, PIN_HIGH);
}

void Led_Green(uint8_t sw)
{
    rt_pin_write(myled.Led_R, PIN_HIGH);
    rt_pin_write(myled.Led_B, PIN_HIGH);
    if(sw == LED_ON)
       rt_pin_write(myled.Led_G, PIN_LOW);
    else
       rt_pin_write(myled.Led_G, PIN_HIGH);
}

void Led_Blue(uint8_t sw)
{
    rt_pin_write(myled.Led_R, PIN_HIGH);
    rt_pin_write(myled.Led_G, PIN_HIGH);
    if(sw == LED_ON)
       rt_pin_write(myled.Led_B, PIN_LOW);
    else
       rt_pin_write(myled.Led_B, PIN_HIGH);
}

void Led_Purple(uint8_t sw)
{
    rt_pin_write(myled.Led_G, PIN_HIGH);
    if(sw == LED_ON)
    {
        rt_pin_write(myled.Led_R, PIN_LOW);
        rt_pin_write(myled.Led_B, PIN_LOW);
    }
    else
    {
        rt_pin_write(myled.Led_R, PIN_HIGH);
        rt_pin_write(myled.Led_B, PIN_HIGH);
    }
}

void Led_Cyan(uint8_t sw)
{
    rt_pin_write(myled.Led_R, PIN_HIGH);
    if(sw == LED_ON)
    {
        rt_pin_write(myled.Led_G, PIN_LOW);
        rt_pin_write(myled.Led_B, PIN_LOW);
    }
    else
    {
        rt_pin_write(myled.Led_G, PIN_HIGH);
        rt_pin_write(myled.Led_B, PIN_HIGH);
    }

}

void Led_White(uint8_t sw)
{
    if(sw == LED_ON)
    {
        rt_pin_write(myled.Led_R, PIN_LOW);
        rt_pin_write(myled.Led_G, PIN_LOW);
        rt_pin_write(myled.Led_B, PIN_LOW);
    }
    else
    {
        rt_pin_write(myled.Led_R, PIN_HIGH);
        rt_pin_write(myled.Led_G, PIN_HIGH);
        rt_pin_write(myled.Led_B, PIN_HIGH);
    }
}


3. main.c
int main(void)
{
    myLed_Init();
    while(1)
    {
        Led_Red(LED_ON);
        rt_thread_mdelay(1000);
        Led_Red(LED_OFF);
        Led_Green(LED_ON);
        rt_thread_mdelay(1000);
        Led_Green(LED_OFF);
        Led_Blue(LED_ON);
        rt_thread_mdelay(1000);
        Led_Blue(LED_OFF);
        Led_Purple(LED_ON);
        rt_thread_mdelay(1000);
        Led_Purple(LED_OFF);
        Led_Cyan(LED_ON);
        rt_thread_mdelay(1000);
        Led_Cyan(LED_OFF);
        Led_White(LED_ON);
        rt_thread_mdelay(1000);
        Led_White(LED_OFF);
        rt_thread_mdelay(1000);
    }
}