【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,一经查实,立即删除!

相关文章

Java中使用FlatBuffers实现序列化

Java 中的 FlatBuffers有助于高速数据序列化/反序列化&#xff0c;消除解析开销。它由 Google 开发&#xff0c;为跨平台数据交换提供无模式、内存高效的解决方案。 Java 开发人员可以利用其直接内存访问来实现最佳性能和最小内存占用&#xff0c;从而提高应用程序速度、可扩展…

Kamailio openssl 3.0.x 需要注意的事项

我们留意到 Debian Bookworm 安装的 openssl 版本是 3.0.x 这里有几个地方要注意&#xff1a; modparam("tls", "init_mode", 1)核心参数 tls_threads_mode 配置为 1 或者 配置为 2版本建议用 v 5.8.1 参考链接&#xff1a; #3832#3765#3791 目前官方…

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

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

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

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

算法训练Day52 | ● 84.柱状图中最大的矩形

84.柱状图中最大的矩形 class Solution { public:int largestRectangleArea(vector<int>& heights) {stack<int> s;s.push(-1);s.push(0);int space 0;for(int i1; i<heights.size(); i){while(s.top()! -1 && (iheights.size() || heights[i]<…

SAF文件选择与真实路径转换

一、构建选择文件与回调方法 //文件选择回调ActivityResultLauncher<String[]> pickFile registerForActivityResult(new ActivityResultContracts.OpenDocument(), uri->{if (uri ! null) {Log.e("cxy", "返回的uri:" uri);Log.e("cxy&q…

【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的性能…

Gateway的基本配置

Gateway的基本配置通常涉及网络、路由、安全性以及其他一些关键元素。以下是一个关于Gateway基本配置的详细指南&#xff1a; 网络连接配置&#xff1a; 设备连接&#xff1a;确保网关设备与内部网络的交换机、集线器或服务器/计算机正确连接。网络拓扑结构应支持内外通信。IP地…

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

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

设计模式有哪些基本原则

目录 开闭原则(Open Closed Principle) 里氏替换原则(Liskov Substitution principle) 单一职责原则(Single Responsibility Principle,SRP)

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;最大的一个目标是在用户和网站间只…

PMP考试未通过该怎么办?如何补考?

2024年3月10日PMP考试成绩正在陆续分批次发布。没有考试通过的同学就会疑问&#xff0c;考试没考过怎么办&#xff1f;可不可以补考&#xff1f;面对PMP考试没通过的情况&#xff0c;我们应该如何应对呢&#xff1f; PMP考试没合格可以补考&#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站会发&#…

【YOLO改进】换遍MMDET主干网络之MobileNetv2(基于MMYOLO)

MobileNetv2 MobileNetV2是一种专为移动和嵌入式视觉应用设计的轻量化网络结构。它在MobileNetV1的基础上引入了两个主要的创新点&#xff1a;反转残差结构&#xff08;Inverted Residuals&#xff09;和线性瓶颈层&#xff08;Linear Bottlenecks&#xff09;。 反转残差结构…

Linux fsck.ext2命令教程:如何检查和修复ext2文件系统(附实例详解和注意事项)

Linux fsck.ext2命令介绍 fsck.ext2是一个用于检查和&#xff08;可选&#xff09;修复Linux ext2/ext3/ext4文件系统的命令。当ext2文件系统发生错误时&#xff0c;可以使用fsck.ext2命令尝试进行修复。 Linux fsck.ext2命令适用的Linux版本 fsck.ext2命令在大多数Linux发行…