【MM32F3270火龙果】点亮led

文章目录

  • 前言
  • GPIO的工作模式
  • 一、有哪些工作模式?
    • 1.1 GPIO的详细介绍
    • 1.2 GPIO的内部框图
      • 输入模式
      • 输出部分
  • 二、操作GPIO点亮led
    • 2.1 初始化gpio
    • 2.2 写gpio
  • 三、示例代码
  • 总结


前言

本文将介绍如何在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        GPIOAint 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) {// 点亮LEDGPIO_WriteBit(LED_PORT, LED_PIN, GPIO_PIN_SET);HAL_Delay(100);// 熄灭LEDGPIO_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的基本方法,为后续的应用开发打下基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/8701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北交所佣金费率标准是多少?北交所相关信息科普

北交所的佣金费率并非固定不变&#xff0c;而是可以根据投资者的需求和证券公司的政策进行调整。目前北交所的佣金费率最低是万分之二。 一般来说&#xff0c;北交所的佣金费率默认在万分之三左右&#xff0c;但这不是固定的费率。根据证券公司的不同&#xff0c;佣金费率可以…

绝地求生:PCL第五轮数据出炉,XDD与林树入选最佳阵容,韦神真在做事了

距离PCL季后赛开赛还有两天时间&#xff0c;小梦还沉浸在常规赛最后一场WCG和TSG争名额的关键之战&#xff0c;现在看来WCG硬贴PeRo房区那波真是没道理&#xff0c;只能解释为太想拿分导致上头了&#xff0c;导致决赛圈没有余力限制TSG&#xff0c;但这何尝不是TSG自己的剧本&a…

【JavaEE初阶系列】——利用Servlet API实现表白墙网站(1.6w字深刻了解前后端交互逻辑)

目录 &#x1f393;准备工作 &#x1f393;了解前端部分知识(主要JS&#xff09; &#x1f393;前后端交互部分 &#x1f388;主要思路 &#x1f6a9;提交信息 &#x1f36d;让前端发起一个ajax请求 &#x1f36d;服务器读取上述请求&#xff0c;并计算出响应 &#x1…

【Stylus详解与引入】

文章目录 Stylus详解与引入一、Stylus简介二、Stylus的特性1. 变量2. 嵌套规则3. 混合&#xff08;Mixins&#xff09;4. 函数5. 条件语句和循环 三、Stylus的引入与配置1. 安装Stylus和stylus-loader2. 配置Webpack3. 在Vue项目中使用Stylus4. 编译Stylus代码四、Stylus的性能…

2024-05-08 问AI: 在深度学习中,介绍一下RMSProp 优化器

文心一言 在深度学习中&#xff0c;RMSProp&#xff08;Root Mean Square Propagation&#xff09;优化器是一种常用的优化算法&#xff0c;主要用于神经网络训练的梯度下降算法的变体。它是对Adagrad优化器的一种改进&#xff0c;旨在解决Adagrad中学习率过快下降的问题。 R…

RAC GCS_SERVER_PROCESSES参数

参考文档&#xff1a; GCS_SERVER_PROCESSES (oracle.com) 在awr报告中&#xff0c;看到addm建议如下&#xff1a; 其中有Global Cache Messaging和 Global Cache Congestion Activity During the Analysis Period ----------------------------------- Total database tim…

Linux的编译器

程序编译的过程 程序的编译过程是将源代码转换为可执行文件的一系列步骤。这个过程涉及多个阶段&#xff0c;主要包括预处理、编译、汇编和链接。下面详细介绍每个阶段&#xff1a; 1. 预处理&#xff08;Preprocessing&#xff09; 在实际编译之前&#xff0c;源代码文件首…

Android bootchart 分析启动性能工具使用

bootchart简介 bootchart 可为整个系统提供所有进程的 CPU 和 I/O 负载细分。该工具不需要重建系统映像&#xff0c;可以用作进入 systrace 之前的快速健全性检查。 1. 板端配置&#xff1a; 在Android 板端启用 bootchart&#xff0c;请运行以下命令&#xff1a; 2. Bootch…

Git克隆仓库报错:HTTP/2 stream 1 was not closed

报错及原因 fatal: unable to access ‘https://github.com/xxx/’: HTTP/2 stream 1 was not closed cleanly before end of the underlying stream http/2 和 http/1.1之间有个区别是“HTTP2 基于 SPDY&#xff0c;专注于性能&#xff0c;最大的一个目标是在用户和网站间只…

编译官方原版的openwrt并加入第三方软件包

最近又重新编译了最新的官方原版openwrt-2305&#xff08;2024.3.22&#xff09;&#xff0c;此处记录一下以待日后参考。 目录 1.源码下载 1.1 通过官网直接下载 1.2 映射github加速下载 1.2.1 使用github账号fork源码 1.2.2 创建gitee账号映射github openwrt 2.编译准…

ChatGPT DALL-E绘图,制作各种表情包,实现穿衣风格的自由切换

DALL-E绘图功能探索&#xff1a; 1、保持人物形象一致&#xff0c;适配更多的表情、动作 2、改变穿衣风格 3、小女孩的不同年龄段展示 4、不同社交平台的个性头像创作 如果不会写代码&#xff0c;可以问GPT。使用地址&#xff1a;我的GPT4 视频&#xff0c;B站会发&#…

yolov8任务之目标检测

对象检测 对象检测是一项涉及识别图像或视频流中对象的位置和类别的任务。对象检测器的输出是一组包围图像中对象的边界框&#xff0c;以及每个框的类标签和置信度分数。当您需要识别场景中感兴趣的对象&#xff0c;但不需要确切知道对象在哪里或其确切形状时&#xff0c;对象检…

我独自升级崛起账号注册 我独自升级怎么注册账号

近期&#xff0c;《我独自升级》这部动画凭借爆棚的人气&#xff0c;在各大平台上掀起了一阵观看热潮&#xff0c;其影响力不容小觑。借此时机&#xff0c;韩国游戏巨头网石集团敏捷响应&#xff0c;顺势推出了同名游戏《我独自升级&#xff1a;ARISE》&#xff0c;为粉丝们搭建…

关闭vscode保存自动格式化的功能

1 首先打开设置 搜索&#xff1a;editor.formatOnSave 取消勾选框 2 再打开 settings.json 搜索 editor 找到 settings.json 设置&#xff1a; "editor.formatOnSave": false

算法day02

1、202. 快乐数 如上题所述&#xff1a; 在该题意规则下&#xff0c;所有的数字变化会有两种情况&#xff0c;其一最后是有的会变化成恒为1的数&#xff1b;其二是有的数会变化会呈现成有规律的环&#xff0c;分别如下图所示&#xff1a; 可以近似的理解为图一就是一个环&#…

JVM堆内存分析

jmap工具查看堆内存 jmap:全称JVM Memory Map 是一个可以输出所有内存中对象的工具&#xff0c;可以将JVM中的heap&#xff08;堆&#xff09;&#xff0c;以二进制输出成文本&#xff0c;打印出Java进程对应的内存 找到pid jmap -heap 19792 Attaching to process ID 19792…

(十五)Java 之方法

目录 一. 前言 二. Java 方法 2.1. 什么是方法 2.2. 方法的定义 2.3. 方法的调用 2.4. void 关键字 2.5. 通过值传递参数 2.6. 方法的重载 2.7. 变量作用域 2.8. 命令行参数的使用 2.9. 构造方法 2.10. 可变参数 2.11. finalize() 方法 三. 课后习题 一. 前言 方…

[Redis] 使用布隆过滤器和分布式锁实现用户注册

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种数据结构&#xff0c;用于快速判断一个元素是否可能存在于一个集合中。它通过使用多个哈希函数和一个位数组来表示一个集合&#xff0c;当一个元素被加入到集合时&#xff0c;通过哈希函数计算出多个哈希值&#xff0c;并…

怎么清理服务器的C盘?

有时候我们经常会遇到C盘被占满的情况&#xff0c;C盘被占满的原因有很多&#xff0c;下面我们就来分析下有可能导致C盘占满的原因&#xff1a; 第一种情况&#xff1a;中毒 打开服务器任务管理器选择进程&#xff0c;并且勾选显示所有用户的进程&#xff0c;我们可以点击映像…

Fastgpt知识库接入oneapi和自定义大模型

本期教程教大家训练自己的知识库回答chatgpt回答不了的问题 FastGPT 是一个知识库问答系统,可以通过调用大模型和知识库回答特定的问题 可以做成专属 AI 客服集成到现有的APP或者网站内当作智能客服支持网络爬虫学习互联网上的很多知识可以通过flow可视化进行工作流程编排 本期…