【MC3172多线程开发板初体验2】---GPIO驱动RGB七彩灯

一、目的

        通过配置MC3172开发板的GPIO,多线程并行驱动RGB七彩灯

二、 资料分享:

1.Gitee库:MC3172: 厦门感芯科技公司的MC3172多线程开发板的开发资料和驱动文件 (gitee.com)

2.百度网盘:

链接:https://pan.baidu.com/s/1bD8frJq9RrVwL1AyDJVgHg 
提取码:5sui

 上述资料中Hardware文件为个人驱动,大家可自行添加。

三、准备过程

硬件平台:MC3172开发板

软件平台:MonuRiver Studio 1.81

四、实现原理简介

        给RGB七彩灯配置3个GPIO口,通过多线程分别控制R,G,B三种颜色,并且控制每种颜色的持续时间,从而根据颜色叠加产生七种颜色。

五、代码编写(函数功能可参考芯片手册)

1.新建GPIO驱动文件

#ifndef _GPIO_H_
#define _GPIO_H_

#include "../MC3172/MC3172.h"

void GPIO_Init(u32 gpio_sel , u32 gpio_pin , u32 IO);

#endif /* _GPIO_H_ */
#include "GPIO.h"

void GPIO_Init(u32 gpio_sel , u32 gpio_pin , u32 IO)
{
    //启动外设
    INTDEV_SET_CLK_RST(gpio_sel,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));

    if (IO == 1)
    {
        GPIO_SET_INPUT_EN_VALUE(gpio_sel , gpio_pin , GPIO_SET_DISABLE);    //输入使能
    }
    else
    {
        GPIO_SET_OUTPUT_EN_VALUE(gpio_sel,gpio_pin,GPIO_SET_ENABLE);      //输出使能
    }
}

2.新建Timer驱动文件,封装delay_us延时函数,详情可参考大佬文章

#ifndef HARDWARE_TIMER_H_
#define HARDWARE_TIMER_H_

#include "../MC3172/MC3172.h"

#define  SYS_CORE_CLK_MHZ  48

void delay_us(u32 nus);

#endif /* HARDWARE_TIMER_H_ */

#include "Timer.h"

void delay_us(u32 nus)
{
    u32 start,stop,ticks;
    start=CORE_CNT;
    ticks = nus * SYS_CORE_CLK_MHZ/4;     //内核定时器频率为内核时钟的1/4
    if(0xFFFFFFFF-start>=ticks){
        stop=start+ticks;
        while(CORE_CNT<stop && CORE_CNT>start){}
    }
    else{
        stop=ticks-(0xFFFFFFFF-start);
        while(CORE_CNT>start){}
        while(CORE_CNT<stop){}
    }
}

 3.编辑main.c函数


#include "../MC3172/MC3172.h"
//#include "./GPIO_GPCOM_TIMER_Example.c"
#include "../Hardware/printf.h"
#include "../Hardware/uart.h"
#include "../Hardware/GPIO.h"
#include "../Hardware/Timer.h"



void thread_end(void)
{
    while(1);
}



void thread0_main(void)
{
    Uart_Init(COM8, 115200);   //串口初始化
    GPIO_Init(GPIOA_BASE_ADDR, (GPIO_PIN0|GPIO_PIN2|GPIO_PIN4), 0);    //GPIO初始化
    GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR , (GPIO_PIN0|GPIO_PIN2|GPIO_PIN4));    //初始化R,G,B三引脚输出高电平
    while(1){
        //user code section
    }
    thread_end();
}



void thread1_main(void)
{
    while(1){
        delay_us(1000000);
        GPIO_SET_OUTPUT_PIN_INV(GPIOA_BASE_ADDR , GPIO_PIN0);    //电平翻转
        //user code section
    }
    thread_end();
}



void thread2_main(void)
{
    while(1){
        delay_us(2000000);
        GPIO_SET_OUTPUT_PIN_INV(GPIOA_BASE_ADDR , GPIO_PIN2);    //电平翻转
        //user code section
    }
    thread_end();
}



void thread3_main(void)
{
    while(1){
        delay_us(4000000);
        GPIO_SET_OUTPUT_PIN_INV(GPIOA_BASE_ADDR , GPIO_PIN4);    //电平翻转
        //user code section
    }
    thread_end();
}

4.配置时钟及栈空间

        可自行根据需要进行配置

5.编译烧录(可参考文章1的编译烧录部分

六、实验现象

多线程RGB七彩灯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Luminescence

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值