本文主要是介绍【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七彩灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!