电赛入门实战:基于MSPM0G3507(MOG3507)的GPIO点灯实验

温馨提示:本节操作建立在 MSPM0 SDK 环境、Keil 芯片支持包已完整安装的基础上。SysConfig 配置保存后会自动生成底层初始化代码,切勿手动修改自动生成的 ti_msp_dl_config.c/h 文件,所有引脚、外设配置统一在图形界面内调整;修改配置后必须重新保存,工程才会同步更新代码。

一、硬件介绍 & 本实验要实现的功能

1.1 硬件平台:无名 MOG3507 开发板(主控 MSPM0G3507)

本次实验使用的核心板为无名MOG3507最小系统板,搭载 TI MSPM0G3507 微控制器,这是一颗基于 Arm Cortex-M0+ 内核的高性价比 MCU,主频可达 80MHz,内置 128KB Flash 和 32KB SRAM,非常适合电赛入门和各类单片机课程设计。以下为开发板实物图:

图1 无名 MOG3507最小系统板

1.2 本实验需要实现的功能

本次实验作为嵌入式入门的"Hello World",要实现的功能非常明确:

通过软件编程,使用按键控制MSPM0G3507板载的RGB灯点亮,关闭,切换颜色。

1.3 原理图

根据图4芯片引脚图上的红色框框选出来是控制RGB灯的引脚蓝色框框选的是按键的引脚可得知我们需要控制的RGB灯的引脚为

RGB灯:PB26(RGB_R),PB22(RGB_B),PB27(RGB_G)

按键:PB21(K1),PB23(K2),PB24(K3)

图2 RGB灯电路原理图

图3 按键电路原理图

图4 芯片引脚图

1.4简单讲解一下需要使用的硬件

**RGB 全彩 LED(输出外设):**对应 GPIO 输出高电平时,该颜色灯珠点亮;三路可独立控制,后续拓展 PWM 调光就能混合出多种彩色;

**独立按键 K1/K2/K3(输入外设):**按键松开时 IO 为高电平,按下时 IO 被直接拉低到地,通过检测电平跳变识别按键动作,配合 10ms 延时的软件消抖就能稳定读取;


二、配置与实验步骤(图文详解)

2.1 开发环境准备

|-----------|------------------|
| 软件工具 | 版本/说明 |
| Keil MDK | v5.36 及以上 |
| MSPM0 SDK | 最新版本(TI官网下载) |
| SysConfig | 图形化外设配置工具(SDK自带) |
| 烧录工具 | J-LINK |

2.2 步骤一:获取一个工程模板

CSDN M0G3507工程模板链接:https://download.csdn.net/download/2401_82419694/93119712

百度网盘M0G3507工程模板链接:

http://通过网盘分享的文件:GPIO点灯.zip 链接: https://pan.baidu.com/s/1adCTaumzgtFXw1dmQN3ngg?pwd=3n35 提取码: 3n35

2.3 步骤二:SysConfig 图形化配置 GPIO(关键步骤)

点击GPIO

以下是该界面每个选项大概是干什么的解释图

现在开始配置使用的是本文章的工程模板的可以先把小组全部删掉,点击REMOVE ALL

然后点击ADD添加一个小组

我们先设置RGB灯的引脚,这里把Name改成RGB

因为RGB灯的引脚全部在GPIOB上所以我们选择PORTB也就是GPIOB

这里的Lower是选择低16位(0~15),Upper是选择高16位,Any是都可以,因为板载RGB灯的控制IO口都在高16位所以选择Upper

因为板载RGB灯控制引脚有3个所以我们添加到3个小组成员

名字分别改成R,G,B

Output是输出模式,input是输入模式,因为RGB灯在电路图上画的是需要一个高电平产生电压差才能驱动的电子元件,而不是他给我们返回一个电平,所以我们选择Output

这里Initial Value,指的是该引脚初始上电,电平选择要高电平还是低电平,Cleared是低电平,Set是高电平,我们这里默认不让rgb灯点亮选择Cleared(低电平)

这里1.Any是默认自动适配

2.Standard(推挽输出)(标准推挽 IO,内部同时具备上拉、下拉驱动管)

3.Standard with Wake (带唤醒功能的标准推挽,额外支持电平变化唤醒 MCU 低功耗模式)

4.High-Drive (高驱动推挽,输出电流更大)

5.5V Tolerant Open Drain (5V 耐压开漏输出,内部只有下拉管无上拉)

6.High-Speed(高速推挽输出)

我们这边选择Standard推挽输出也可以默认选择Any

**RGB灯:PB26(RGB_R),PB22(RGB_B),PB27(RGB_G)**引脚选择26

要设置G的话点击G就可以了其余操作和设置R一样,引脚设置27,B的引脚设置22

在添加一个小组Key按键点击ADD

修改Name为Key

按键引脚:PB21(K1),PB23(K2),PB24(K3)

因为按键引脚也全部都是GPIOB,并且是高16位,所以设置PORTB,Upper

因为有三个按键所以小组成员按ADD添加到3个,并且名字分别设置成ON,OFF,Toggle

因为按键是给我们一个电平所以我们设置input模式,IO Structure设置位Any

按下Digital IOMUX Features

因为按键按下给的电压是低电平,所以我们选择Pull-Up Resistor(上拉电阻按键没按下时为高电平)Pull-Down Resistor(下拉电阻按键没按下时为低电平)

引脚设置21,另外K2为OFF,K3为Toggle,引脚为PB23(K2),PB24(K3),操作按刚刚操作的来,K3的小组成员名改成大写因为这个名称配置好后在程序里是用宏定义写出来的格式为(小组名称_小组成员名称_PIN),C语言规范要求宏定义全部英文大写

写好后点击保存

保存到图片上的该工程文件下,最后点击选择文件夹

然后点击FILE

点击Save后就可以把该界面关掉了点击x

这里点击Yes to All (重载工程内所有被外部修改的文件)

2.4 步骤三:编写主程序代码

然后把while里面的全部删掉这是之前写的

DL_GPIO_setPins()是给该引脚置1(高电平)

DL_GPIO_clearPins是给该引脚置0(低电平)

DL_GPIO_readPins()读取该引脚电平状态

以下为该文档实现程序:

复制代码
#include "ti_msp_dl_config.h"

/*****************************************
 * 软件毫秒延时函数
 * @param ms: 需要延时的毫秒数
 * 适配80MHz系统主频,双层空循环阻塞延时
 * 用途:按键消抖,仅调试使用,会占用CPU
 *****************************************/
void delay_ms(uint32_t ms)
{
    uint32_t i,j;
    // 外层循环控制总毫秒数
    for(i=0;i<ms;i++)
        // 内层空循环消耗时钟周期实现1ms延时
        for(j=0;j<800;j++);
}

// 全局变量:存储当前选中的RGB颜色 1红/2绿/3蓝/4白
uint8_t g_LightState = 1;

/*****************************************
 * 按键扫描消抖函数
 * 返回值:0=无按键 1=K1开灯 2=K2关灯 3=K3切换颜色
 * 硬件特性:引脚内部上拉,无按键高电平,按下为低电平
 * 消抖逻辑:20ms延时+二次电平校验+等待松手
 *****************************************/
uint8_t Key_Scan(void)
{
    uint8_t keyVal = 0;
    // 检测K1 ON开灯按键
    if(DL_GPIO_readPins(Key_PORT, Key_ON_PIN) == 0)
    {
        delay_ms(20);               // 延时20ms过滤机械抖动
        // 二次校验电平,确认真实按下,排除瞬时干扰
        if(DL_GPIO_readPins(Key_PORT, Key_ON_PIN) == 0)
        {
            keyVal = 1;
            // 阻塞循环,等待按键松开后才退出扫描
            while(DL_GPIO_readPins(Key_PORT, Key_ON_PIN) == 0);
        }
    }
    // 未检测到K1时,检测K2 OFF关灯按键
    else if(DL_GPIO_readPins(Key_PORT, Key_OFF_PIN) == 0)
    {
        delay_ms(20);
        if(DL_GPIO_readPins(Key_PORT, Key_OFF_PIN) == 0)
        {
            keyVal = 2;
            while(DL_GPIO_readPins(Key_PORT, Key_OFF_PIN) == 0);
        }
    }
    // 未检测到K1/K2时,检测K3 颜色切换按键
    else if(DL_GPIO_readPins(Key_PORT, Key_TOGGLE_PIN) == 0)
    {
        delay_ms(20);
        if(DL_GPIO_readPins(Key_PORT, Key_TOGGLE_PIN) == 0)
        {
            keyVal = 3;
            while(DL_GPIO_readPins(Key_PORT, Key_TOGGLE_PIN) == 0);
        }
    }
    return keyVal;
}

/*****************************************
 * RGB灯光状态设置函数
 * @param state: 灯光状态码
 * 0=全灭 1=红色 2=绿色 3=蓝色 4=三色全亮白光
 * 执行逻辑:每次先熄灭所有灯,再点亮对应通道
 *****************************************/
void RGB_SetState(uint8_t state)
{
    // 统一熄灭RGB三路LED
    DL_GPIO_clearPins(RGB_PORT, RGB_R_PIN);
    DL_GPIO_clearPins(RGB_PORT, RGB_G_PIN);
    DL_GPIO_clearPins(RGB_PORT, RGB_B_PIN);

    switch(state)
    {
        case 0:
            // 全灭,无需额外操作
            break;
        case 1:
            DL_GPIO_setPins(RGB_PORT, RGB_R_PIN); // 点亮红色通道
            break;
        case 2:
            DL_GPIO_setPins(RGB_PORT, RGB_G_PIN); // 点亮绿色通道
            break;
        case 3:
            DL_GPIO_setPins(RGB_PORT, RGB_B_PIN); // 点亮蓝色通道
            break;
        case 4:
            // 红、绿、蓝同时点亮,合成白光
            DL_GPIO_setPins(RGB_PORT, RGB_R_PIN);
            DL_GPIO_setPins(RGB_PORT, RGB_G_PIN);
            DL_GPIO_setPins(RGB_PORT, RGB_B_PIN);
            break;
        default:
            // 非法状态,保持全灭
            break;
    }
}

/*****************************************
 * RGB颜色循环切换函数
 * 切换规则:红→绿→蓝→白→红 循环往复
 * 切换后立刻刷新灯光显示效果
 *****************************************/
void RGB_ToggleColor(void)
{
    g_LightState++; // 颜色序号自增,切换下一个颜色
    // 超过白色序号4,重置回红色1,实现循环
    if(g_LightState > 4)
    {
        g_LightState = 1;
    }
    RGB_SetState(g_LightState); // 更新灯光显示
}

/*****************************************
 * 程序主入口函数
 * 功能:初始化硬件,循环扫描按键并响应按键逻辑
 *****************************************/
int main(void)
{
    // SysConfig自动生成初始化代码:时钟、GPIO按键、RGB引脚初始化
    SYSCFG_DL_init();
    // 上电默认RGB全部熄灭
    RGB_SetState(0);
    uint8_t Key_Num = 0; // 存储按键扫描结果

    // 主死循环,程序持续运行
    while(1)
    {
        Key_Num = Key_Scan(); // 扫描按键,获取按下的按键编号

        // K1按键:开灯,显示上一次切换好的预选颜色
        if(Key_Num == 1)
        {
            RGB_SetState(g_LightState);
        }

        // K2按键:关灯,全部熄灭,不修改预选颜色缓存
        if(Key_Num == 2)
        {
            RGB_SetState(0);
        }

        // K3按键:循环切换RGB灯光颜色,实时刷新显示
        if(Key_Num == 3)
        {
            RGB_ToggleColor();
        }
    }
}

三、编译下载 & 验证

代码写好后,按以下步骤烧录验证:

1.编译:点击 Keil 的 Build(F7),确保 0 Error,0 Warning。

2.烧录:点击 Download(F8),将程序烧录进芯片。

3.验证 :视频链接:https://live.csdn.net/v/535122


如果你觉得有帮助,欢迎点赞、收藏、评论,让更多人看到!

相关推荐
蓝斯49710 小时前
从.到实现一个Windows上的虚拟hid键盘设备
windows·单片机·计算机外设
熙芯XiChip11 小时前
硬实时与软实时RTOS核心区别
嵌入式硬件
伟大的前程11 小时前
unsigned int 定义的变量 在 电脑的 64 位系统中 和 32 位 cortex-m0 和 8 位的 51 单片机
单片机·嵌入式硬件
小渔村的拉线工11 小时前
1.HPM6E80 解析芯片整体工作原理和存储架构
单片机·嵌入式硬件·mcu·架构·hpm6e80
熙芯XiChip12 小时前
CAN与CANopen的本质区别
单片机
lilihewo13 小时前
Altium Designer 封装库的创建(分享pcb 3D封装库)
嵌入式硬件·51单片机
神罚天下ET14 小时前
典型arm位单片机启动流程(从上电到main.c)
c语言·arm开发·单片机
碧海银沙音频科技研究院14 小时前
蓝牙耳机使用WSDF5361锂保芯片进入船运模式实现方法
嵌入式硬件·算法
Zevalin爱灰灰15 小时前
模拟信号链电路——基于TL431的电压基准电路
单片机·嵌入式硬件
csdn杰哥16 小时前
瑞萨单片机开发教程[二十七] DTC 外部中断触发传输实验
单片机·嵌入式硬件·mongodb·瑞萨·ra6m5