HPM6750开发笔记《GPIO例程深度解析》

news2024/11/24 13:53:03

目录

创建工程:

代码分析:

1.头文件包含:

2.宏定义:

3.中断服务程序(ISR):

清除中断标志:

处理 LED 状态切换:

处理用户按键状态:

处理其他情况:

4.void test_gpio_input_interrupt(void):

打印提示信息:

初始化 LED GPIO:

配置 GPIO 引脚为输入模式:

配置中断触发类型:

启用 GPIO 中断:

设置中断优先级:

进入低功耗模式:

5.void test_gpio_toggle_output(void):

打印提示信息:

初始化 LED GPIO:

循环切换 LED 状态:

打印测试完成信息:

6.int main(void)

初始化板级硬件:

测试 GPIO 输出状态切换:

测试 GPIO 输入中断:

进入无限循环:

运行现象:


创建工程:

首先还是在HPM SDK里面创建工程选项如下图:


代码分析:

/*
 * Copyright (c) 2021 HPMicro
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *
 */

#include "board.h"
#include "hpm_gpio_drv.h"

#define GPIO_TOGGLE_COUNT 5

void isr_gpio(void)
{
    gpio_clear_pin_interrupt_flag(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,
                        BOARD_APP_GPIO_PIN);
#ifdef BOARD_LED_GPIO_CTRL
    gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX,
                          BOARD_LED_GPIO_PIN);
    printf("toggle led pin output\n");
#else
#if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)
    if (gpio_read_pin(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN) == false) {
        printf("user key pressed\n");
    } else {
        printf("user key released\n");
    }
#else
    printf("user key pressed\n");
#endif
#endif

}
SDK_DECLARE_EXT_ISR_M(BOARD_APP_GPIO_IRQ, isr_gpio)

void test_gpio_input_interrupt(void)
{
    gpio_interrupt_trigger_t trigger;

    printf("input interrupt\n");
#ifdef BOARD_LED_GPIO_CTRL
    printf("user led will be switched on off based on user switch\n");
    gpio_set_pin_output(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX,
                           BOARD_LED_GPIO_PIN);
#endif
    gpio_set_pin_input(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,
                           BOARD_APP_GPIO_PIN);
#if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)
    trigger = gpio_interrupt_trigger_edge_both;
#else
    trigger = gpio_interrupt_trigger_edge_falling;
#endif
    gpio_config_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,
                           BOARD_APP_GPIO_PIN, trigger);
    gpio_enable_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,
                           BOARD_APP_GPIO_PIN);
    intc_m_enable_irq_with_priority(BOARD_APP_GPIO_IRQ, 1);
    while (1) {
        __asm("wfi");
    }
}

#ifdef BOARD_LED_GPIO_CTRL
void test_gpio_toggle_output(void)
{
    printf("toggling led %u times in total\n", GPIO_TOGGLE_COUNT);
    gpio_set_pin_output(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX,
                           BOARD_LED_GPIO_PIN);
    gpio_write_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX,
                        BOARD_LED_GPIO_PIN, board_get_led_gpio_off_level());

    for (uint32_t i = 0; i < GPIO_TOGGLE_COUNT; i++) {
        gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX,
                            BOARD_LED_GPIO_PIN);
        board_delay_ms(500);
        gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX,
                            BOARD_LED_GPIO_PIN);
        board_delay_ms(500);
        printf("toggling led %u/%u times\n", i + 1, GPIO_TOGGLE_COUNT);
    }
}
#endif

int main(void)
{
    board_init();
    board_init_gpio_pins();
    printf("gpio \n");

#ifdef BOARD_LED_GPIO_CTRL
    test_gpio_toggle_output();
#endif
    test_gpio_input_interrupt();

    while (1);
    return 0;
}

1.头文件包含:
#include "board.h"
#include "hpm_gpio_drv.h"

这里包含了与嵌入式系统板级支持和GPIO驱动相关的头文件。


2.宏定义:
#define GPIO_TOGGLE_COUNT 5

这个宏定义表示在测试中要切换LED状态的次数。


3.中断服务程序(ISR):
void isr_gpio(void) {
    // 处理GPIO中断
}
SDK_DECLARE_EXT_ISR_M(BOARD_APP_GPIO_IRQ, isr_gpio)

这定义了一个GPIO中断服务程序(ISR),当GPIO中断发生时执行。在中断服务程序中,通过 gpio_clear_pin_interrupt_flag 函数清除中断标志,然后根据硬件配置,切换LED状态或输出用户按键的状态。

清除中断标志
gpio_clear_pin_interrupt_flag(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN);
处理 LED 状态切换:
#ifdef BOARD_LED_GPIO_CTRL
gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN);
printf("toggle led pin output\n");
处理用户按键状态:
#if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)
if (gpio_read_pin(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN) == false) {
    printf("user key pressed\n");
} else {
    printf("user key released\n");
}

如果硬件支持双边沿触发的中断(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT 宏被定义且等于 1),则通过 gpio_read_pin 函数检查用户按键的状态。如果按键被按下,则打印 "user key pressed";如果按键被释放,则打印 "user key released"。

处理其他情况:
#else
printf("user key pressed\n");
#endif

如果没有硬件支持双边沿触发的中断,直接打印 "user key pressed"。


4.void test_gpio_input_interrupt(void):
void test_gpio_input_interrupt(void) {
    // 测试GPIO输入中断
}
打印提示信息
printf("input interrupt\n");

打印一条提示消息,指示该函数用于测试 GPIO 的输入中断功能。

初始化 LED GPIO
#ifdef BOARD_LED_GPIO_CTRL
printf("user led will be switched on off based on user switch\n");
gpio_set_pin_output(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN);
#endif

定义了 BOARD_LED_GPIO_CTRL 宏,表示存在 LED 的 GPIO 控制器,那么打印一条消息提示 LED 的状态将会根据用户开关的状态进行切换,并通过 gpio_set_pin_output 函数将 LED 的 GPIO 引脚设置为输出模式。

配置 GPIO 引脚为输入模式
gpio_set_pin_input(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN);

通过调用 gpio_set_pin_input 函数将指定的 GPIO 引脚配置为输入模式。

配置中断触发类型
#if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)
trigger = gpio_interrupt_trigger_edge_both;
#else
trigger = gpio_interrupt_trigger_edge_falling;
#endif
gpio_config_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN, trigger);

根据硬件支持的中断触发类型,配置 GPIO 引脚的中断触发类型。如果支持双边沿触发中断,则设置 triggergpio_interrupt_trigger_edge_both,否则设置为 gpio_interrupt_trigger_edge_falling

启用 GPIO 中断
gpio_enable_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN);

通过调用 gpio_enable_pin_interrupt 函数启用 GPIO 引脚的中断。

设置中断优先级
intc_m_enable_irq_with_priority(BOARD_APP_GPIO_IRQ, 1);

通过调用 intc_m_enable_irq_with_priority 函数,设置与 GPIO 中断相关的中断优先级。

进入低功耗模式
while (1) {
    __asm("wfi");
}

进入一个无限循环,并在循环中调用 __asm("wfi"); 进入等待中断(WFI)指令,使处理器进入低功耗模式,等待 GPIO 中断的发生。

在这个测试函数中,主要目的是配置和启用 GPIO 的输入中断,并在进入低功耗模式后等待中断的发生。当 GPIO 中断触发时,与中断相关的处理函数 isr_gpio 将被调用。这个测试函数用于验证嵌入式系统中 GPIO 输入中断的正常工作。


5.void test_gpio_toggle_output(void):
打印提示信息
printf("toggling led %u times in total\n", GPIO_TOGGLE_COUNT);

打印一条消息,指示该函数将会切换 LED 总共 GPIO_TOGGLE_COUNT 次。

初始化 LED GPIO
gpio_set_pin_output(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN);
gpio_write_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN, board_get_led_gpio_off_level());

使用 gpio_set_pin_output 函数将 LED 的 GPIO 引脚设置为输出模式,并使用 gpio_write_pin 函数设置 LED 的初始状态,根据板级支持的函

printf("toggling led test completed\n");

board_get_led_gpio_off_level 来确定 LED 的初始状态。

循环切换 LED 状态
for (uint32_t i = 0; i < GPIO_TOGGLE_COUNT; i++) {
    gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN);
    board_delay_ms(500);
    gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN);
    board_delay_ms(500);
    printf("toggling led %u/%u times\n", i + 1, GPIO_TOGGLE_COUNT);
}

在一个循环中,使用 gpio_toggle_pin 函数切换 LED 的输出状态,然后通过 board_delay_ms 函数延迟 500 毫秒,再次切换状态,以模拟 LED 的开关操作。在每次切换之后,打印一条消息,显示切换的次数。

打印测试完成信息
printf("toggling led test completed\n");

总体而言,test_gpio_toggle_output 函数用于测试嵌入式系统中 GPIO 输出状态切换的功能。通过在循环中切换 LED 的状态,它模拟了 LED 的开关操作,并通过打印相关信息,显示切换的次数和测试完成的消息。


6.int main(void)

int main(void) 函数是嵌入式系统中的主函数,它是程序的入口点。以下是 main 函数的主要步骤的解释:

初始化板级硬件
board_init();
board_init_gpio_pins();

调用 board_init 函数和 board_init_gpio_pins 函数,用于初始化板级硬件,包括系统时钟、GPIO 等。

测试 GPIO 输出状态切换:
#ifdef BOARD_LED_GPIO_CTRL
test_gpio_toggle_output();
#endif

定义了 BOARD_LED_GPIO_CTRL 宏,表示存在 LED 的 GPIO 控制器,那么调用 test_gpio_toggle_output 函数,测试 GPIO 输出状态切换功能。

测试 GPIO 输入中断

调用 test_gpio_input_interrupt 函数,测试 GPIO 输入中断功能。

进入无限循环

main 函数的主要作用是初始化嵌入式系统的硬件环境,然后进行 GPIO 功能的测试。具体测试的内容包括 GPIO 输出状态切换和 GPIO 输入中断。在这个例子中,通过宏的定义来判断是否存在 LED 的 GPIO 控制器,以确定是否执行 GPIO 输出状态切换的测试。无论是否进行 GPIO 输出状态切换测试,都会执行 GPIO 输入中断的测试。程序最终进入一个无限循环,保持运行状态。


运行现象:

  • 支持双沿触发模式的芯片,工程配置的是双沿触发模式,每次按键按下和释放都会翻转一次LED状态,并打印两次LED切换输出。

  • 当工程正确运行后,可以观察到LED闪烁5次,之后按下GPIO按键(请确认具体开发板 按键 部分描述)可以翻转LED的状态,串口终端会输出如下信息:

toggling led 5 times in total
toggling led 1/5 times
toggling led 2/5 times
toggling led 3/5 times
toggling led 4/5 times
toggling led 5/5 times
input interrupt
user led will be switched on off based on user switch
toggle led pin output
toggle led pin output

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

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

相关文章

Tomcat服务为什么起不来?

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 服务跑在Tomcat下面&#xff0c;有时候会遇到Tomcat起不来的情况。目前为止常遇到的情况有如下几种&#xff1a; 1. Tomcat服务…

Python模拟技巧实现自动抽屉登录和自动点赞

目录 一、引言 二、准备工作 三、自动抽屉登录 四、自动点赞 五、注意事项 六、案例分析 七、总结 一、引言 随着互联网的普及&#xff0c;人们越来越依赖于各种在线平台进行社交互动和信息获取。在这些平台上&#xff0c;用户需要登录才能享受各种服务&#xff0c;同时…

李宏毅机器学习第二十三周周报 Flow-based model

文章目录 week 23 Flow-based model摘要Abstract一、李宏毅机器学习1.引言2.数学背景2.1Jacobian2.2Determinant2.3Change of Variable Theorem 3.Flow-based Model4.GLOW 二、文献阅读1. 题目2. abstract3. 网络架构3.1 change of variable formula3.2 Coupling layers3.3Prop…

java数据结构与算法刷题-----LeetCode509. 斐波那契数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

跨境电商独立站代采1688货源网站

什么是淘宝代购 淘宝代购是近年兴起的一种购物模式&#xff0c;是帮国外客户购买中国商品。主要是通过万邦 科技的外贸代购系统&#xff0c;把淘宝、天猫等电商平台的全站商品通过API 接入到你的网站 上&#xff0c;瞬间就可以架设一个有数亿产品的大型网上商城&#xff0c;而且…

外贸人应该顺应趋势做外贸

2024年&#xff0c;有人疑惑外贸将如何发展&#xff1f;我想紧跟趋势是不会出错的&#xff0c;多年前网络没有如今那么发达&#xff0c;客户到中国参展或者来访就能确认订单。如今到处都是各种推广平台&#xff0c;客户足不出户就能在线上订购产品&#xff0c;如果你还是想靠之…

出版实务 | 书刊整体设计

文章目录 书刊整体设计概念目的原则内容外部装帧设计内文版式设计 书刊的形态术语书刊外表的翻本形态书刊的开本书刊装订样式种类平装精装骑马订装散页装 书刊的结构部件图书封面勒口书名页目录页 期刊面封底封 书刊版式设计概述版心、周空、版口、翻口的概念版面类型——和合面…

STM32CubeMX教程11 RTC 实时时钟 - 入侵检测和时间戳

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验…

英伟达「摊牌」,朋友变对手

对于曾经拿着英伟达的GPU进行自动驾驶系统开发的初创公司来说&#xff0c;可能未必会想到&#xff1a;某一天&#xff0c;这家全球GPU巨头&#xff0c;曾经的合作伙伴会成为自己的直接竞争对手。 上周&#xff0c;英伟达官方公众号发布招聘消息&#xff0c;公司正在扩大其自动驾…

实验4.4 动态路由OSPF协议的配置

实验4.4 动态路由OSPF协议的配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.配置交换机和路由器的接口的IP地址等参数。2.配置动态路由OSPF协议&#xff0c;实现全网互通。 六、任务验收七、任务小结八、知识链接1&#xff0e;OSPF协议概念2&#xff0e;…

网络安全-真实ip获取伪造与隐藏挖掘

目录 真实ip获取应用层网络层网络连接TOAproxy protocol ip伪造应用层网络层TOA攻击proxy protocol 隐藏代理 挖掘代理多地ping历史DNS解析记录国外主机解析域名网站RSS订阅网络空间搜索引擎 总结参考 本篇文章学习一下如何服务如何获取真实ip&#xff0c;隐藏自己的ip&#xf…

Http状态:net::ERR_INCOMPLETE_CHUNKED_ENCODING

一、问题描述&#xff1a; 今天前端的小伙伴遇到一个js文件加载报错&#xff1a;net::ERR_INCOMPLETE_CHUNKED_ENCODING&#xff0c;不论如何刷新页面始终只有该文件加载失败&#xff0c;Chrome开发者工具中响应内容显示此请求没有可用的响应数据。 二、原因调查 排除非前端发…

RabbitMQ(七)ACK 消息确认机制

目录 一、简介1.1 背景1.2 定义1.3 如何查看确认/未确认的消息数&#xff1f; 二、消息确认机制的分类2.1 消息发送确认1&#xff09;ConfirmCallback方法2&#xff09;ReturnCallback方法3&#xff09;代码实现方式一&#xff1a;统一配置a.配置类a.生产者c.消费者d.测试结果 …

Linux------mv命令超详解(狠狠爱住)

mv 命令用于移动文件或目录&#xff0c;也可以用来重命名文件或目录。 基本语法&#xff1a; mv [选项] 源文件 目标文件 常用选项&#xff1a; -i 或 --interactive&#xff1a;交互式地移动文件&#xff0c;如果目标文件已经存在&#xff0c;则会询问是否覆盖。-u 或 --…

网络安全卷么?

官方一直宣传网络安全是朝阳行业&#xff0c;每年缺少大几百万人才&#xff0c;民间网络安全公司生存堪忧&#xff0c;只能靠各种低价冲标&#xff0c;安全技术也是各种卷。你身边的网络安全人过的怎么样呢&#xff1f; 官方宣传的是对的网络安全现在是朝阳行业&#xff0c;缺口…

Apache POI 操作Excel表格

1、Apache POI介绍 Apache POI 是一个处理Miscrosoft Office文件格式的开源项目&#xff0c;在Java中可以用来对Miscrosoft Office的各种文件进行读写操作&#xff0c;本文是介绍Apache POI操作Excel的基础案例。 2、Apache POI操作Excel 引入pom依赖 <!--excel POI依赖…

电源模块电阻测试:万用表如何测量电源的电阻?

电阻是电路中常用的电子元件&#xff0c;它可以调节电压、限制电流&#xff0c;从而保护电路。电阻测试是电源模块的常规测试项目之一&#xff0c;常见的电阻测试方法是通过万用表来测量电阻阻值&#xff0c;具体如下&#xff1a; 一、两线法 适用于测量较大的电阻值&#xff0…

如何快速搭建自己的外贸/跨境电商独立站?

外贸老鸟一定听过行业内某些大神通过运营外贸独立站获得成百上千封的询盘&#xff0c;看到别人每天询盘接到手软常常羡慕不已&#xff0c;再回头看看自己的网站&#xff0c;一年到头也收不到几个询盘。等到终于抽出时间下定决心要打造自己的外贸独立站接单平台&#xff0c;又常…

逻辑卷学习后续----------缩容

一、缩容&#xff1a;缩减大小 ext4可以 &#xff0c; xfs无法缩减&#xff0c;缩减会影响业务 1.解挂载 2.检查文件系统完整性 3.缩减文件系统 4.缩减逻辑卷上下一致 5.再挂载回去 添加磁盘 文件系统只能装ext4 缩减文件系统 resize2fs 挂载失败需要重新安装文件系统…

电商数据公司的卓越之路:优秀特质与优质服务的探索

在数字化浪潮中&#xff0c;电商数据公司作为行业变革的驱动者&#xff0c;正发挥着越来越重要的作用。这些公司通过收集、分析和利用海量数据&#xff0c;为电商企业提供决策支持、市场洞察和个性化服务。然而&#xff0c;要在竞争激烈的市场中脱颖而出&#xff0c;一家优秀的…