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

2023-10-23 10:40

本文主要是介绍【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  48void 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/4if(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七彩灯

这篇关于【MC3172多线程开发板初体验2】---GPIO驱动RGB七彩灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/267326

相关文章

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

JAVA- 多线程

一,多线程的概念 1.并行与并发 并行:多个任务在同一时刻在cpu 上同时执行并发:多个任务在同一时刻在cpu 上交替执行 2.进程与线程 进程:就是操作系统中正在运行的一个应用程序。所以进程也就是“正在进行的程序”。(Windows系统中,我们可以在任务管理器中看 到进程) 线程:是程序运行的基本执行单元。当操作系统执行一个程序时, 会在系统中建立一个进程,该进程必须至少建立一个线