代码编织梦想


前言

本文将介绍如何在MM32F3270火龙果微控制器上使用Keil开发环境点亮LED。MM32F3270火龙果是一款功能强大的微控制器,具有丰富的外设和性能,适用于各种应用场景。LED点亮是嵌入式系统开发中的基础任务之一,通过本文的指导,读者将学习如何在MM32F3270上配置GPIO,并控制其输出状态以点亮LED。


GPIO的工作模式

GPIO是"General Purpose Input/Output"(通用输入/输出)的缩写。它是现代微控制器(MCU)或嵌入式系统中的一种重要接口,用于连接外部设备和传感器。每个GPIO引脚可以被配置为输入或输出,并且可以通过软件控制其电平状态。
GPIO就是我们开发板上的针脚

以下内容引用自我的博客GPIO

一、有哪些工作模式?

1.1 GPIO的详细介绍

GPIO是General-purpose and alternate-function I/Os的缩写
他的含义是:通用和复用的引脚

GPIO是分组的,每一组有很多引脚
比如说PA0、PA1…PA15,一组GPIO有16个引脚
组数是由芯片决定的,具体的组数可以看对应的芯片的原理图

1.2 GPIO的内部框图

我们可以在芯片手册中找到GPIO的对应框图,他说对于某一个引脚的:
在这里插入图片描述
他可以分为两部分,上部分就是输入,下部分就是输出

输入模式

输入模式的框图如下:
在这里插入图片描述
要理解他,我们可以看下面的图:
在这里插入图片描述

我们通过配置pin1让他为输入,然后我们读某个寄存器就可以得到他的状态。
当k1按下,接到电源,那么pin肯定状态是1高电平,如果没有按下,相当于这个引脚是悬空状态
那么你读这个值,你知道他是什么状态吗,可能读出来是1,可以是0

再比如,我们配置pin2让他为输入,和上面一样,我们也去读,按下时为0,那么没有按下是什么状态呢,就和上面的是一样的了

那么我们怎么解决他这个问题呢
对于pin1我们可以加一个下拉电阻
在这里插入图片描述
那么他按下时就就会是高电平,没按就是低电平

同样的对于pin2,就需要加上拉电阻了
在这里插入图片描述
那么他按下时就就会是低电平,没按就是高电平

所以上下拉电阻是需要看实际的情况来选择的。

这些电阻集成到了芯片,我们可以直接设置他,是上拉还是下拉,我们就不用每一个都搞一个电阻了

回到框图:
在这里插入图片描述
其中,里面的VDD为上拉电阻
Vss为下拉电阻,他在芯片中已经设计好的了

还有一种输入就是 Analog Input,模拟输入,那么模拟输入的话,他需要得到具体的电压值,所以我们不能设置上下拉电阻,完全由外部电路控制,要不然模拟输入和直接输入没两样了

那么输入就是这几部分:上拉输入、下拉输入、浮空输入、模拟输入

在最后我们通过读取输入寄存器:Input data register,得到1/0

如果说他有毛刺怎么办:他会在某一个范围电压内为1,某一个电压范围为0

输出部分

在这里插入图片描述
他这个GPIO可以接到一个灯,或者其他的芯片
如果是点灯,那么电压肯定是越高越好
如果是关灯,电压肯定是越低越好

当输出1时,I/O pin连接到P-MOS的VDD,然后就能点灯了
如果输出0,P-MOS断开,连接地,所以就关灯
推挽输出:当你要高电平,就推到VDD,如果要低电平,就推到VSS这样就是推挽输出,可以输出高低电平

开漏输出:
在开漏输出中,有两种状态:开和关。当开漏输出为开启状态时,它会将电路连接到地(或负极),使得电路的输出变为低电平。而当开漏输出为关闭状态时,它不会连接到任何地方,使得电路的输出由外部设备或其他电路来控制。

开漏输出一般是用来解决两个芯片通信的问题的
不至于把两个芯片搞坏

二、操作GPIO点亮led

2.1 初始化gpio

声明init结构体:GPIO_Init_Type gpio_init;
设置结构体成员:
在结构体中,里面有这些成员:

typedef struct
{
    uint16_t           Pins;    /*!< GPIO operating pins. */
    GPIO_Speed_Type    Speed;   /*!< GPIO pin speed mode. */
    GPIO_PinMode_Type  PinMode; /*!< GPIO pin input / output functional mode. */
} GPIO_Init_Type;

这是一个结构体GPIO_Init_Type,用于配置GPIO引脚的初始化参数。让我们逐个介绍其成员的含义:

  • uint16_t Pins:这是一个16位的参数,用于指定操作的GPIO引脚。通常情况下,会使用GPIO_PIN_x(x为引脚号)的宏来表示具体的引脚。如果需要操作多个引脚,可以使用按位或(|)的方式将多个宏组合在一起。

  • GPIO_Speed_Type Speed:这是一个枚举类型的参数,用于指定GPIO引脚的速度模式。枚举类型GPIO_Speed_Type定义了不同的速度模式,比如GPIO_Speed_10MHz表示10MHz的速度模式、GPIO_Speed_50MHz表示50MHz的速度模式等。

typedef enum
{
    GPIO_Speed_50MHz = 1u,  /*!< Maximum speed is 50MHz. */
    GPIO_Speed_20MHz = 2u,  /*!< Maximum speed is 20MHz. */
    GPIO_Speed_10MHz = 3u,  /*!< Maximum speed is 10MHz. */
} GPIO_Speed_Type;
  • GPIO_PinMode_Type PinMode:这是一个枚举类型的参数,用于指定GPIO引脚的功能模式,即输入模式还是输出模式。枚举类型GPIO_PinMode_Type定义了不同的功能模式,包括输入模式(GPIO_PinMode_Input)、推挽输出模式(GPIO_PinMode_Out_PushPull)、开漏输出模式(GPIO_PinMode_Out_OD)等。
/*!
* @brief Port input / output mode.
*/
typedef enum
{
    GPIO_PinMode_In_Analog      = 0x00u,  /*!< Analog input. */
    GPIO_PinMode_In_Floating    = 0x04u,  /*!< Floating input. */
    GPIO_PinMode_In_PullDown    = 0x28u,  /*!< Pull down input. */
    GPIO_PinMode_In_PullUp      = 0x48u,  /*!< Pull up input. */
    GPIO_PinMode_Out_OpenDrain  = 0x14u,  /*!< Universal open drain output. */
    GPIO_PinMode_Out_PushPull   = 0x10u,  /*!< Universal push-pull output. */
    GPIO_PinMode_AF_OpenDrain   = 0x1Cu,  /*!< Multiplex open drain output. */
    GPIO_PinMode_AF_PushPull    = 0x18u,  /*!< Multiplexed push-pull output. */
} GPIO_PinMode_Type;

结构体GPIO_Init_Type的作用就是用于配置GPIO引脚的初始化参数,其中Pins成员用于指定操作的GPIO引脚,Speed成员用于指定引脚的速度模式,PinMode成员用于指定引脚的功能模式。

使能一组gpio:

void RCC_EnableAHB1Periphs(uint32_t ahb1_periphs, bool enable)

这个函数RCC_EnableAHB1Periphs是用来控制使能或禁用连接到AHB1总线上的外设时钟的函数。让我们来详细介绍一下它的参数含义:

  • uint32_t ahb1_periphs:这是一个32位的参数,用来指定要操作的外设。在函数内部,会根据传入的参数来设置相应的位,从而实现对特定外设时钟的使能或禁用。通常,使用预定义的宏来表示要操作的外设,比如RCC_AHB1_PERIPH_GPIOA表示GPIOA外设、RCC_AHB1_PERIPH_DMA1表示DMA1外设等。通过按位或(|)的方式可以同时使能多个外设。

他有这些取值:

#define RCC_AHB1_PERIPH_GPIOA  (1u << 0u) /*!< AHB1 peripheral GPIOA clock 0 bit. */
#define RCC_AHB1_PERIPH_GPIOB  (1u << 1u) /*!< AHB1 peripheral GPIOB clock 1 bit. */
#define RCC_AHB1_PERIPH_GPIOC  (1u << 2u) /*!< AHB1 peripheral GPIOC clock 2 bit. */
#define RCC_AHB1_PERIPH_GPIOD  (1u << 3u) /*!< AHB1 peripheral GPIOD clock 3 bit. */
#define RCC_AHB1_PERIPH_GPIOE  (1u << 4u) /*!< AHB1 peripheral GPIOE clock 4 bit. */
#define RCC_AHB1_PERIPH_GPIOF  (1u << 5u) /*!< AHB1 peripheral GPIOF clock 5 bit. */
#define RCC_AHB1_PERIPH_GPIOG  (1u << 6u) /*!< AHB1 peripheral GPIOG clock 6 bit. */
#define RCC_AHB1_PERIPH_GPIOH  (1u << 7u) /*!< AHB1 peripheral GPIOH clock 7 bit. */
#define RCC_AHB1_PERIPH_SDIO   (1u << 10u) /*!< AHB1 peripheral SDIO clock 10 bit. */
#define RCC_AHB1_PERIPH_CRC    (1u << 12u) /*!< AHB1 peripheral CRC clock 12 bit. */
#define RCC_AHB1_PERIPH_FLASH  (1u << 13u) /*!< AHB1 peripheral FLASH clock 13 bit. */
#define RCC_AHB1_PERIPH_SRAM   (1u << 14u) /*!< AHB1 peripheral SRAM clock 14 bit. */
#define RCC_AHB1_PERIPH_DMA1   (1u << 21u) /*!< AHB1 peripheral DMA1 clock 21 bit. */
#define RCC_AHB1_PERIPH_DMA2   (1u << 22u) /*!< AHB1 peripheral DMA2 clock 22 bit. */
#define RCC_AHB1_PERIPH_ETHMAC (1u << 25u) /*!< AHB1 peripheral ETHMAC clock 25 bit. */
  • bool enable:这是一个布尔类型的参数,用来指定是使能(true)还是禁用(false)所选外设的时钟。当enable为true时,函数会将相应外设的时钟使能;当enable为false时,函数会将相应外设的时钟禁用。

初始化gpio:

void GPIO_Init(GPIO_Type  * GPIOx, GPIO_Init_Type * init);
  • GPIO_Type *GPIOx:这是一个指向GPIO_TypeDef类型结构体的指针,用于指定要初始化的GPIO端口。在MM32F3270系列的芯片中,GPIO_TypeDef结构体定义了每个GPIO端口的寄存器映射,用于控制对应端口的操作。比如,如果要初始化GPIOA端口,则将此参数设置为GPIOA,如果要初始化GPIOB端口,则将此参数设置为GPIOB,依此类推。

  • GPIO_Init_Type *init:这是一个指向GPIO_Init_Type结构体的指针,用于指定GPIO引脚的初始化参数。GPIO_Init_Type结构体定义了如何配置GPIO引脚的初始化参数,包括要操作的引脚、引脚的速度模式以及功能模式等。

2.2 写gpio

我们可以使用下面这个函数写gpio的高低电平:

void GPIO_WriteBit(GPIO_Type * GPIOx, uint16_t pins, uint16_t val);
  • GPIO_Type *GPIOx:这是一个指向GPIO_TypeDef类型结构体的指针,用于指定要操作的GPIO端口。在MM32F3270系列的芯片中,GPIO_TypeDef结构体定义了每个GPIO端口的寄存器映射,用于控制对应端口的操作。例如,如果要操作GPIOA端口,则将此参数设置为GPIOA,如果要操作GPIOB端口,则将此参数设置为GPIOB,以此类推。

  • uint16_t pins:这是一个16位的参数,用于指定要设置状态的GPIO引脚。通常情况下,会使用GPIO_PIN_x(x为引脚号)的宏来表示具体的引脚。如果需要操作多个引脚,可以使用按位或(|)的方式将多个宏组合在一起。

  • uint16_t val:这是一个16位的参数,用于指定要设置的输出状态值。在MM32F3270系列中,GPIO引脚的输出状态可以是逻辑高电平(1)或逻辑低电平(0)。因此,可以将此参数设置为GPIO_PIN_SET表示设置为逻辑高电平,或者设置为GPIO_PIN_RESET表示设置为逻辑低电平。

三、示例代码

#include "mm32f327xx.h"  // 包含MM32F3270芯片的头文件

// 定义LED引脚所在的GPIO端口和引脚号
#define LED_PIN         GPIO_PIN_0
#define LED_PORT        GPIOA

int main() {
    // 使能GPIOA端口的时钟
    RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOA, true);

    // 配置LED引脚为推挽输出模式
    GPIO_Init_Type gpio_init;
    gpio_init.Pins = LED_PIN;
    gpio_init.Speed = GPIO_Speed_50MHz;
    gpio_init.PinMode = GPIO_PinMode_Out_PushPull;
    GPIO_Init(LED_PORT, &gpio_init);

    while (1) {
        // 点亮LED
        GPIO_WriteBit(LED_PORT, LED_PIN, GPIO_PIN_SET);
        HAL_Delay(100);

        // 熄灭LED
        GPIO_WriteBit(LED_PORT, LED_PIN, GPIO_PIN_RESET);
        HAL_Delay(100);
    }

    return 0;
}

在这里插入图片描述


总结

通过本文的介绍,我们学习了如何在MM32F3270火龙果微控制器上使用Keil开发环境点亮LED。首先,我们详细介绍了MM32F3270微控制器的基本特性和外设。接着,我们讲解了如何在Keil中创建一个新的工程,并配置GPIO以控制LED的引脚。然后,我们编写了简单的代码,通过设置GPIO的输出状态来控制LED的亮灭。最后,我们进行了代码的编译、下载和调试,并验证了LED的点亮效果。通过本文的学习,读者将掌握在MM32F3270火龙果微控制器上点亮LED的基本方法,为后续的应用开发打下基础。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_62599305/article/details/138582181

灵动MM32 MCU MM32F3277G9P CoreMark 跑分 MM32F3270 MM32F3277-爱代码爱编程

MM32F3270 MM32F3277G9P 测试环境 IAR 7.80.4 主频:120 MHz 优化等级: Low / No Size Limit / SRAM 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 58735

灵动微推出全新主流型MM32F3270系列32位MCU-爱代码爱编程

上海灵动微电子推出全新主流型MM32F3270系列32位MCU,此款MM32F3270系列是基于M3内核的32位微控制器,MM32F3270适用于要求高集成度的高性能控制领域,如:工业控制、消防监控、家电、电源管理、打印机和扫描仪、通信转换模块等应用领域范围。MM32F3270系列支持工业级(-40℃至85℃)和扩展工业级(-40℃~105℃)工作温度。内

【国产MCU移植】MM32F3270 EVBoard-爱代码爱编程

本文由RT-Thread论坛用户Zain 原创发布:https://club.rt-thread.org/ask/article/2950.html 环境搭建 安装MDK、rt-thread env、IAR等工具 克隆RT-Thread源码 git clone https://github.com/RT-Thread/rt-thread.git

在mm32f3270上为micropython创建SPI模块-爱代码爱编程

在mm32f3270上为micropython创建SPI模块 文章目录 在mm32f3270上为micropython创建SPI模块IntroductionArchitectureextmod/machine_spi.c软件SoftSPI硬件SPIports/xx/machine_spi.c Introduction 在machine中实现

分享灵动微MM32F3270微控制器的音频类产品参考方案-爱代码爱编程

音频设备主要是对音频输入输出设备的总称,其包括的产品类型也很多,一般可以分为以下几种:功放机、音箱、多媒体控制台、数字调音台、音频采样卡、合成器、中高频音箱、话筒,PC中的声卡、耳机等,其他周边音频设备:专业话筒系列、耳机、收扩音系统等。 基于灵动微MM32F3270微控制器的音频类产品参考方案,具有以下特点: -通过SDIO进行读取SD、TF卡内的音频

基于keil环境下mm32f327单片机rtthread的移植-爱代码爱编程

基于keil环境下mm32f327单片机rtthread的移植 文章目录 基于keil环境下mm32f327单片机rtthread的移植前言一、所需资源二、创建工程目录三、复制所需文件到相应文件夹四、创建keil工程五、添加文件到工程六、更改相应的.c文件七、编译运行 前言 第十七届智能车竞赛赛前准备,为 mm32f3277G9p 移植rt

灵动微32位单片机LQFP64引脚MM32F3273G7P-爱代码爱编程

灵动微MM32F3273G7P采用ARM®Cortex®-M3内核的高性能32位单片机,工作频率高达120兆赫兹,内置512KB Flash和128KB RAM的高速存储器,具有丰富的I/O端口和外设连接到外部总线。 MM32F3273G7P包含标准的通信接口:2个I2C接口、3个I2S接口、3个SPI接口、1个USBOTG全速接口、1个CAN接口、1个

mm32f3270通讯板之lin接口主从通讯分享_21ic电子工程师的博客-爱代码爱编程

MM32F3270系列MCU的UART(通用异步收发器)支持全双工数据传输,可以通过分数波特率发生器,选择宽范围的通讯波特率,也可以通过波特率自适应功能来自动判别通讯波特率,其通讯速率的容忍度可以达到±3%;另外还支持5/6/7/8/9位数据通讯、支持数据奇/偶校验方式以及接收空闲中断等功能;还可以通过复用端口引脚CTS/RTS来实现数据收发的流控功能。除

[mm32软件]【灵动微电子mm32f5330测评】+开箱_mm32f3模组-爱代码爱编程

前天收到的MM32F5333开发板,下面就是开箱的照片:   MM32F5330 是一款搭载了基于 Arm v8-M 架构 32 位 Star-MC1 内核(兼容 Cortex-M33)的 MCU 产品,最高工作频率可达180MHz。内置了128KB Flash,32KB SRAM,并集成了丰富的I/O端口和外设模

【mm32f3270火龙果】keil安装mm32f3270-爱代码爱编程

文章目录 前言一、下载pack包二、安装pack三、keil选择MM32F3270 cpu四、编译烧写总结 前言 在嵌入式系统开发中,选择适合的开发工具和微控制器平台至关重要。本文将介绍如何在K