【先楫HPM6750系列】GPIO点灯和按键控制

本文介绍如何点亮HPM6750EVKMINI开发板上的三色LED灯,以及如何使用HPM SDK实现——通过GPIO读取HPM6750EVKMINI开发板上的按键状态,并通过按键状态控制LED灯的颜色。

GPIO点灯

创建闪灯程序

在hpm_sdk/samples子目录下创建gpio_led目录,将hello_world目录内的src目录和CMakeLists.txt复制到gpio_led目录下,并将src/hello_world.c重命名为gpio_led.c,并将文件内容修改为:

#include <stdio.h>
#include "board.h"
#include "hpm_gpio_drv.h"#define LED_FLASH_PERIOD_IN_MS 500int main(void)
{int u;board_init();board_init_led_pins();//board_timer_create(LED_FLASH_PERIOD_IN_MS, board_led_toggle);gpio_write_pin(BOARD_R_GPIO_CTRL, BOARD_R_GPIO_INDEX, BOARD_R_GPIO_PIN, 0);gpio_write_pin(BOARD_G_GPIO_CTRL, BOARD_G_GPIO_INDEX, BOARD_G_GPIO_PIN, 0);gpio_write_pin(BOARD_B_GPIO_CTRL, BOARD_B_GPIO_INDEX, BOARD_B_GPIO_PIN, 0);printf("gpio_led start...\n");while(1){gpio_write_pin(BOARD_R_GPIO_CTRL, BOARD_R_GPIO_INDEX, BOARD_R_GPIO_PIN, 0);board_delay_ms(LED_FLASH_PERIOD_IN_MS);gpio_write_pin(BOARD_R_GPIO_CTRL, BOARD_R_GPIO_INDEX, BOARD_R_GPIO_PIN, 1);board_delay_ms(LED_FLASH_PERIOD_IN_MS);}return 0;
}

CMakeLists.txt文件内容修改为:

# Copyright 2021 hpmicro
# SPDX-License-Identifier: BSD-3-Clausecmake_minimum_required(VERSION 3.13)find_package(hpm-sdk REQUIRED HINTS $ENV{HPM_SDK_BASE})project(gpio_led)sdk_compile_definitions(-DBOARD_SHOW_CLOCK=0)
sdk_app_src(src/gpio_led.c)
generate_ses_project()

编译、运行闪灯程序

在hpm_sdk\samples\gpio_led目录运行:generate_project -b hpm6750evkmini -t flash_xip -f命令生产项目文件。

使用SEGGER Embedded Studio打开生产的项目文件、编译,编译完成后如下图所示:

编译、运行后,就可以看到红色LED闪烁了:

HPM6750点灯

三色LED原理图分析

查阅原理图,可以找到三色LED相关的原理图如下:

可以看到三种颜色的控制管脚信息如下:

  • 红色通过PWM1.P0控制,高电平点亮;
  • 绿色通过PWM1.P1控制,高电平点亮;
  • 蓝色通过PWM0.P7控制,高电平点亮;

继续在原理图中搜索PWM1.P0、PWM1.P1和PWM0.P7,可以找到:

这里标号U1的就是HPM6750芯片,PWM1.P0、PWM1.P1和PWM0.P7和引脚标号的对应关系如下:

  • PWM1.P0对应PB19,控制红色;
  • PWM1.P1对应PB18,控制绿色;
  • PWM9.P7对应PB20,控制蓝色;

上面的分析,这和board.h文件里面的代码一致:

#define BOARD_R_GPIO_CTRL HPM_GPIO0
#define BOARD_R_GPIO_INDEX GPIO_DI_GPIOB
#define BOARD_R_GPIO_PIN 19
#define BOARD_G_GPIO_CTRL HPM_GPIO0
#define BOARD_G_GPIO_INDEX GPIO_DI_GPIOB
#define BOARD_G_GPIO_PIN 18
#define BOARD_B_GPIO_CTRL HPM_GPIO0
#define BOARD_B_GPIO_INDEX GPIO_DI_GPIOB
#define BOARD_B_GPIO_PIN 20

让三种颜色依次闪烁

将gpio_led.c修改为:

#include <stdio.h>
#include "board.h"
#include "hpm_gpio_drv.h"#define LED_FLASH_PERIOD_IN_MS 500int main(void)
{int u;board_init();board_init_led_pins();//board_timer_create(LED_FLASH_PERIOD_IN_MS, board_led_toggle);gpio_write_pin(BOARD_R_GPIO_CTRL, BOARD_R_GPIO_INDEX, BOARD_R_GPIO_PIN, 0);gpio_write_pin(BOARD_G_GPIO_CTRL, BOARD_G_GPIO_INDEX, BOARD_G_GPIO_PIN, 0);gpio_write_pin(BOARD_B_GPIO_CTRL, BOARD_B_GPIO_INDEX, BOARD_B_GPIO_PIN, 0);printf("gpio_led start...\n");while(1){gpio_write_pin(BOARD_R_GPIO_CTRL, BOARD_R_GPIO_INDEX, BOARD_R_GPIO_PIN, 1);board_delay_ms(LED_FLASH_PERIOD_IN_MS);gpio_write_pin(BOARD_R_GPIO_CTRL, BOARD_R_GPIO_INDEX, BOARD_R_GPIO_PIN, 0);board_delay_ms(LED_FLASH_PERIOD_IN_MS);gpio_write_pin(BOARD_G_GPIO_CTRL, BOARD_G_GPIO_INDEX, BOARD_G_GPIO_PIN, 1);board_delay_ms(LED_FLASH_PERIOD_IN_MS);gpio_write_pin(BOARD_G_GPIO_CTRL, BOARD_G_GPIO_INDEX, BOARD_G_GPIO_PIN, 0);board_delay_ms(LED_FLASH_PERIOD_IN_MS);gpio_write_pin(BOARD_B_GPIO_CTRL, BOARD_B_GPIO_INDEX, BOARD_B_GPIO_PIN, 1);board_delay_ms(LED_FLASH_PERIOD_IN_MS);gpio_write_pin(BOARD_B_GPIO_CTRL, BOARD_B_GPIO_INDEX, BOARD_B_GPIO_PIN, 0);board_delay_ms(LED_FLASH_PERIOD_IN_MS);}return 0;
}

重新编译、运行,

就可以看到红绿蓝依次闪烁了:

HPM6750 红绿蓝闪灯

GPIO读取按键状态

接下来,我们尝试使用GPIO读取PBUTN和WBUTN两个按键的状态,并输出到串口中。

首先需要在原理图中找到,按键相关的原理图:



循环读取并打印PBUTN和WBUTN按键状态的代码段:

        uint32_t count = 0;while (1){count++;uint8_t pbutn_value = gpio_read_pin(HPM_BGPIO, GPIO_DI_GPIOZ, 2);uint8_t wbutn_value = gpio_read_pin(HPM_BGPIO, GPIO_DI_GPIOZ, 3);printf("[%d] pbutn_value=%d, wbutn_value=%d\n", count, pbutn_value, wbutn_value);board_delay_ms(500);}

设置PZ02/PZ03引脚功能

经测试发现,默认情况下,这两个按键分别是长按关机和长按休眠的功能。

可以使用如下代码段,将这两个引脚功能设置为普通GPIO,并设置为内部上拉状态:

static void init_butn_as_gpio()
{uint32_t pad_ctl = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);// 设置PZ02、PZ03为GPIO功能HPM_BIOC->PAD[IOC_PAD_PZ02].FUNC_CTL = IOC_PZ02_FUNC_CTL_BGPIO_Z_02;HPM_BIOC->PAD[IOC_PAD_PZ03].FUNC_CTL = IOC_PZ03_FUNC_CTL_BGPIO_Z_03;// 设置PZ02、PZ03为GPIO的模式为 内部上拉HPM_IOC->PAD[IOC_PAD_PZ02].PAD_CTL = pad_ctl;HPM_IOC->PAD[IOC_PAD_PZ03].PAD_CTL = pad_ctl;
}

使用PBUTN和WBUTN按键控制三色LED的颜色

本小节实现——通过PBUTN和WBUTN两个按键,切换三色LED等的颜色:

  • 按PBUTN按键,颜色切换顺序为——红、绿、蓝
  • 按WBUTN按键,颜色切换顺序为——蓝、绿、红
  • 长按,则颜色会一直轮流切换
  • 松开,切换停止

完整代码:

#include <stdio.h>
#include "board.h"
#include "hpm_gpio_drv.h"static void init_butn_as_gpio()
{uint32_t pad_ctl = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);// 设置PZ02、PZ03为GPIO功能HPM_BIOC->PAD[IOC_PAD_PZ02].FUNC_CTL = IOC_PZ02_FUNC_CTL_BGPIO_Z_02;HPM_BIOC->PAD[IOC_PAD_PZ03].FUNC_CTL = IOC_PZ03_FUNC_CTL_BGPIO_Z_03;// 设置PZ02、PZ03为GPIO的模式为 内部上拉HPM_IOC->PAD[IOC_PAD_PZ02].PAD_CTL = pad_ctl;HPM_IOC->PAD[IOC_PAD_PZ03].PAD_CTL = pad_ctl;
}void app_led_write(uint32_t index, uint8_t state)
{switch (index){case 0:gpio_write_pin(BOARD_R_GPIO_CTRL, BOARD_R_GPIO_INDEX, BOARD_R_GPIO_PIN, state);break;case 1:gpio_write_pin(BOARD_G_GPIO_CTRL, BOARD_G_GPIO_INDEX, BOARD_G_GPIO_PIN, state);break;case 2:gpio_write_pin(BOARD_B_GPIO_CTRL, BOARD_B_GPIO_INDEX, BOARD_B_GPIO_PIN, state);break;default:/* Suppress the toolchain warnings */break;}
}uint32_t app_led_next(uint32_t index)
{return (index + 1) % 3;
}uint32_t app_led_prev(uint32_t index)
{return (index + 3 - 1) % 3;
}int main(void)
{uint32_t current = 0, next = 0;board_init();board_init_led_pins();init_butn_as_gpio();while (1){// 读取按键状态uint8_t pbutn_value = gpio_read_pin(HPM_BGPIO, GPIO_DI_GPIOZ, 2);uint8_t wbutn_value = gpio_read_pin(HPM_BGPIO, GPIO_DI_GPIOZ, 3);// 按键状态处理if (pbutn_value == 0) {printf("pbutn_value=%d, wbutn_value=%d\n", pbutn_value, wbutn_value);next = app_led_next(current);app_led_write(current, 0);// app_led_write(next, 1);current = next;} else if (wbutn_value == 0) {printf("pbutn_value=%d, wbutn_value=%d\n", pbutn_value, wbutn_value);next = app_led_prev(current);app_led_write(current, 0);// app_led_write(next, 1);current = next;}app_led_write(current, 1); // 放这里,第一次能够点亮红色// 延时,控制扫描频率board_delay_ms(100);}return 0;
}

效果演示:

HPM6750 按键控制LED灯

补充说明

点灯的过程中发现,SDK 0.9.0(sdk 0.10.0也有这个问题)里面hpm5760evkmini的LED亮灭的高低电平搞反了。我已经向先楫反馈了这个问题,从他们那里了解到HPM6750EVKMINI板子改版过,旧版本是低电平点亮,新版本是高电平点亮,这块的代码没有更新。他们说会在下一个版本中修复这个问题,目前解决这个问题需要修改几处代码,改动都很简单,具体可以参考我的这条提交记录:https://gitee.com/hpm6750/hpm_sdk/commit/bbc896e4a571e756e4cbac38afcc042409a7957f

修改完这部分代码后,hello_world示例也就可以正确的依次闪烁红、绿、蓝了,效果和上面的视频差不多。

代码仓

上面那个提交链接的代码仓:https://gitee.com/hpm6750/hpm_sdk

是我个人建立的用于测试HPM6750 SDK开发的,欢迎Star支持~

另外,我在码云创建了名为HPM6750的组织,该组织下还有其他代码仓,后续会随着新帖子的发布设置为公开,敬请期待~

【先楫HPM6750系列】GPIO点灯和按键控制相关推荐

  1. 【先楫HPM6750系列】RT-Thread开发环境搭建和Hello World

    [先楫HPM6750系列]RT-Thread开发环境搭建和Hello World 本篇介绍HPM6750开发板的RT-Thread Studio开发环境搭建,以及在RT-Thread Studio环境 ...

  2. 【先楫HPM6750系列】CoreMark跑分测试

    [先楫HPM6750系列]CoreMark跑分测试 上篇帖子中,我们完成了Embedded Studio开发环境搭建,对Hello World示例进行了编译和调试. 本篇将会使用SEGGER Embe ...

  3. 【先楫HPM6750系列】移植轻量级AI推理框架——TinyMaix

    [先楫HPM6750系列]移植轻量级AI推理框架--TinyMaix 文章目录 [先楫HPM6750系列]移植轻量级AI推理框架--TinyMaix 一.TinyMaix是什么? 二.TinyMaix ...

  4. 【先楫HPM6750系列】PWM驱动蜂鸣器发声

    [先楫HPM6750系列]PWM驱动蜂鸣器发声 本篇将介绍如何使用HPM6750输出PWM信号,并使用PWM信号驱动蜂鸣器发声. PWM简介 PWM 的全称是 脉冲宽度调制 ( Pulse-width ...

  5. 奋斗的小孩系列 FPGA学习altera系列: 第十篇 按键控制LED

    奋斗的小孩系列 FPGA学习altera系列: 第十篇 按键控制LED 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江 ...

  6. 【先楫HPM6750系列】HPM6750EVKMINI开箱和资料下载

    去年年底,我就在网络上看到了关于HPM6750的相关新闻,当时记住了两条关键信息--RISC-V内核.主频高达800MHz. 因此,我在了解到eeworld上有HPM6750的试用活动后,立即报名了此 ...

  7. petalinux zynq spi_ZYNQ 系列 01 | PL 实现按键控制 LED(1)

    注:本篇文章由[开源骚客:OpenSoc]公众号首发,现转载至头条号. 新的开始,这一篇文章,就算是使用 Vitis 开发 ZYNQ 的第一篇文章吧. 计划把 ZYNQ 开发写成一个系列,所使用的的软 ...

  8. 【先楫HPM6750系列】HPM SDK开发环境搭建和Hello World

    上篇帖子中,我们介绍了如何下载HPM6750开发所需的资料,包括开发板资料和SEGGER Embedded Studio安装包,以及如何申请Embedded Studio激活码.本篇将会介绍如何安装S ...

  9. 【先楫HPM6750系列】RT-Thread SDIO驱动和文件系统

    本篇将介绍--如何在HPM6750EVKMINI开发板上使用RT-Thread的SDIO驱动和FATFS文件系统组件实现SD卡上的文件读写. 开始本篇实验前,需要搭建RT-Thread开发环境,可以参 ...

最新文章

  1. adviser vs mentor
  2. Sqlserver 2000 迷你、便携企业管理器(10M),支持Dts编辑
  3. java简单的死锁检测(转载线下代码)
  4. git 连接gitee时报错 Auth error: Access deined: authorize failure
  5. python数据分析与人工智能_Python数据分析:seaborn
  6. 最简单的基于FFmpeg的移动端例子:Android 视频解码器-单个库版
  7. 系统学习NLP(十二)--文本表示综述
  8. Android SQLite封装sql语句、查看数据库
  9. 2021届成都高考一诊成绩查询,2021届成都一诊来了!你想知道的,都在这儿!(附2020年985/211高校在川调档线及位次)...
  10. JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))
  11. C#使用Newtonsoft.Json读写json、读写Base64图像
  12. js密码强度正则表达式_相信我,这20个正则表达式,能让你少写1000多行代码,建议收藏...
  13. java实现账号登陆界面_java用户登录界面的代码
  14. 已知三点求圆心 c语言,转 已知两点坐标和半径求圆心坐标程序C++
  15. 计算机基础(2)——重装系统(2)——win10(1)——MediaCreationTool制作WIN10安装U盘,安装纯净版win10的通用教程
  16. Word 在试图打开文件时遇到错误 解决办法
  17. LINUX | 如何开放vultr的端口
  18. Linux服务详解(主要基于RedHat系的及Centos默认服务详解)(综合整理)
  19. V831——车牌识别
  20. 漫画:脑筋急转弯题目(尼姆问题求解)

热门文章

  1. python docx库_Python-docx库的使用
  2. 小程序 超长页面截图保存web-view+html2canvas
  3. python进度条简单实现过程
  4. [授权发表]动态符号链接的细节
  5. 当我们打开网页时,浏览器究竟做了什么
  6. springmvc框架后台Date类型字段接收数据
  7. 【网站架构】网站系统怎么才是安全的?安全验收?等保、网络安全、SQL盲注、https、鉴权
  8. H5电商营销系统+微信商城小程序、拼团、砍价、秒杀、优惠券、积分、分销等功能thinkphp二次开发
  9. 深度学习“三巨头”、图灵奖得主 Yann LeCun:我没有天赋,所以才追随聪明人
  10. CMD和ENTRYPOINT区别