2407|8

305

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

[新版中科蓝讯AB32VG1 RISC-V开发板] - 4:线程版的Blink [复制链接]

  本帖最后由 MianQi 于 2021-8-12 13:37 编辑

整个程序从功能上,按照逻辑顺序,分成这样几部分:

 

1、管脚相关类的声明、定义与实例化

2、定义管脚

3、定义管脚的驱动程序

4、定义线程的主体(入口)函数

5、定义线程的初始化(启动)函数

6、调用启动线程的函数

7、修改项目的入口函数(main.c)

 

首先要指出(二、中科蓝讯AB32VG1上的GPIO实践 - https://docs.qq.com/doc/DTVVWWXpLRVl6cER2?_t=1626260921919)跟实测结果不一致的地方:

pin2 ➡ 3.3v

pin1 ➡ R20(470Ω)➡ PA1

pin3 ➡ R17(1kΩ)➡ PE4

pin4 ➡ R18(470Ω)➡ PE1

 

 

 

最新回复

哈哈,汇编,,,牛。   详情 回复 发表于 2021-8-18 17:48
点赞 关注
个人签名

“Everyone wants the project to be good, fast, and cheap... pick two.”

- Unknown

 
 

回复
举报

305

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
本帖最后由 MianQi 于 2021-8-12 13:49 编辑

整个项目在创建的基础上做过改动的只有三个文件:

1、在“applications”目录下添加了“LED.c”和“LED.h”两个文件。

2、对“applications”目录下的“main.c”做了改动。

 

其中,“LED.h”实际上有效内容为空:

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-08-11     MQ       the first version
 */

 

“main.c”的内容接近为空:

/*
 * Copyright (c) 2020-2021, Bluetrum Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2020/12/10     greedyhao    The first version
 */

/**
 * Notice!
 * All functions or data that are called during an interrupt need to be in RAM.
 * You can do it the way exception_isr() does.
 */

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

int main(void)
{
/*
    uint8_t pin = rt_pin_get("PE.1");

    rt_pin_mode(pin, PIN_MODE_OUTPUT);
    rt_kprintf("Hello, world\n");
*/

    while (1)
    {
/*
        rt_pin_write(pin, PIN_LOW);
        rt_thread_mdelay(500);
        rt_pin_write(pin, PIN_HIGH);
        rt_thread_mdelay(500);
        */
    }
}

 

个人签名

“Everyone wants the project to be good, fast, and cheap... pick two.”

- Unknown

 
 
 

回复

305

帖子

0

TA的资源

纯净的硅(初级)

板凳
 

几乎全部的有效内容都在“LED.c”中:

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

//定义一个结构体类型
struct LED_RGB
{
    uint8_t LED_R;
    uint8_t LED_G;
    uint8_t LED_B;
};

//实例化一个结构体对象
struct LED_RGB led_rgb;


//结构体对象的初始化
void LED_RGB_Init(void){

    //将结构体对象的成员对应到管脚
    led_rgb.LED_R = rt_pin_get("PE.1");
    led_rgb.LED_G = rt_pin_get("PE.4");
    led_rgb.LED_B = rt_pin_get("PA.1");

    //设置结构体对象的成员管脚的输出方式
    rt_pin_mode(led_rgb.LED_R, PIN_MODE_OUTPUT);
    rt_pin_mode(led_rgb.LED_G, PIN_MODE_OUTPUT);
    rt_pin_mode(led_rgb.LED_B, PIN_MODE_OUTPUT);
}

//RGB三色LED各自的驱动程序
//if(toggle==1) LED亮
//if(toggle==0) LED灭

void RGB_Red(rt_bool_t toggle){
    rt_pin_write(led_rgb.LED_G, PIN_HIGH);
    rt_pin_write(led_rgb.LED_B, PIN_HIGH);

    if(toggle){
        rt_pin_write(led_rgb.LED_R, PIN_LOW);
    } else{
        rt_pin_write(led_rgb.LED_R, PIN_HIGH);
    }
}

void RGB_Green(rt_bool_t toggle){
    rt_pin_write(led_rgb.LED_R, PIN_HIGH);
    rt_pin_write(led_rgb.LED_B, PIN_HIGH);

    if(toggle){
        rt_pin_write(led_rgb.LED_G, PIN_LOW);
    } else{
        rt_pin_write(led_rgb.LED_G, PIN_HIGH);
    }
}

void RGB_Blue(rt_bool_t toggle){
    rt_pin_write(led_rgb.LED_R, PIN_HIGH);
    rt_pin_write(led_rgb.LED_G, PIN_HIGH);

    if(toggle){
        rt_pin_write(led_rgb.LED_B, PIN_LOW);
    } else{
        rt_pin_write(led_rgb.LED_B, PIN_HIGH);
    }
}

//编写线程入口函数(主程序文件)
static void led_rgb_thread_entry(void* p){
    LED_RGB_Init();

    while(1){
        RGB_Red(1);
        rt_thread_mdelay(1000);
        RGB_Red(0);
        rt_thread_mdelay(1000);
        RGB_Red(1);
        rt_thread_mdelay(1000);
        RGB_Red(0);
        rt_thread_mdelay(1000);

        RGB_Green(1);
        rt_thread_mdelay(1000);
        RGB_Green(0);
        rt_thread_mdelay(1000);
        RGB_Green(1);
        rt_thread_mdelay(1000);
        RGB_Green(0);
        rt_thread_mdelay(1000);

        RGB_Blue(1);
        rt_thread_mdelay(1000);
        RGB_Blue(0);
        rt_thread_mdelay(1000);
        RGB_Blue(1);
        rt_thread_mdelay(1000);
        RGB_Blue(0);
        rt_thread_mdelay(1000);
    }
}

//创建线程启动函数,用于启动此前创建的线程主体
static int Thread_led_rgb(void){
    rt_thread_t thread = RT_NULL;
    thread = rt_thread_create("led_rgb", led_rgb_thread_entry, RT_NULL, 512, 10, 10);

    if(thread == RT_NULL){
        rt_kprintf("Thread_led_rgb initiate ERROR");
        return RT_ERROR;
    }

    rt_thread_startup(thread);
}

//将线程的初始化加入系统初始化,启动线程
INIT_APP_EXPORT(Thread_led_rgb);

 

个人签名

“Everyone wants the project to be good, fast, and cheap... pick two.”

- Unknown

 
 
 

回复

305

帖子

0

TA的资源

纯净的硅(初级)

4
 

演示效果:


 

个人签名

“Everyone wants the project to be good, fast, and cheap... pick two.”

- Unknown

 
 
 

回复

2万

帖子

71

TA的资源

管理员

5
 

条理清晰,谢谢分享。

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

6
 

while(1)里面可以优化一下呀,这个看着好难受。。。

点评

想延续一下汇编风格——主线程留空,任务都在分块中完成。  详情 回复 发表于 2021-8-18 10:31
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

305

帖子

0

TA的资源

纯净的硅(初级)

7
 
freebsder 发表于 2021-8-17 20:37 while(1)里面可以优化一下呀,这个看着好难受。。。

想延续一下汇编风格——主线程留空,任务都在分块中完成。

点评

哈哈,汇编,,,牛。  详情 回复 发表于 2021-8-18 17:48
个人签名

“Everyone wants the project to be good, fast, and cheap... pick two.”

- Unknown

 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

8
 
MianQi 发表于 2021-8-18 10:31 想延续一下汇编风格——主线程留空,任务都在分块中完成。

哈哈,汇编,,,牛。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

305

帖子

0

TA的资源

纯净的硅(初级)

9
 

之前想在沁恒的板子上尝试一下汇编,资料不全。这次,看到蓝讯的这个板子依然没有提供指令集和寄存器地址。

个人签名

“Everyone wants the project to be good, fast, and cheap... pick two.”

- Unknown

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表