06_瑞萨GUI(LVGL)移植实战教程之驱动EC11旋转编码器(GPIO)

news2024/11/28 18:49:31

本系列教程配套出有视频教程,观看地址:https://www.bilibili.com/video/BV1gV4y1e7Sg

6. 驱动EC11旋转编码器(GPIO)

本次实验我们驱动EC11旋转编码器。

6.1 复制工程

上次实验得出的工程我们可以通过复制在原有的基础上得到一个新的工程。

如果你不清楚复制工程的步骤,请参考阅读第三章实验的步骤教程。

本次实验我们的项目命名为:04_dshanmcu_ra6m5_ec11_encoder

chapter-6_001

6.2 配置FSP

6.2.1 查看硬件资料

驱动EC11旋转编码器,驱动原理:

chapter-6_001-1

需要用到 3个GPIO,我们实验使用的引脚是:

  • S1 <-----> P202
  • S2 <-----> P203
  • KEY <-----> P205

这三个引脚对应开发板上的这三个引脚,引脚位置及接线,如下图所示:

chapter-6_002

打开位于 03硬件资料\\5_官方资料\RA6M5 Group User's Manual Hardware.pdf 的文档,跳转到下图所示的位置:

chapter-6_003

根据上图中列表的内容,可以得出以下对应关系:

  • KEY <-----> P205 (IRQ1)
  • S1 <-----> P202 (IRQ2)
  • S2 <-----> P203 (IRQ3)

接下来根据以上信息,在 e2stduio 中对 r_icu 进行配置。

6.2.2 添加 Stacks(r_icu)

  1. 打开 FSP Configuration 视图:双击项目文件夹中的 configuration.xml 文件。
  2. 按照下图所示,添加 3个 r_icu 模块:
chapter-6_004
  1. 点击刚刚添加的第一个 r_icu 在底部窗口的 Properties 选项卡中对其进行配置,将其配置为与下图一致:

    • Name: g_external_irq1_key
    • Channel: 1
    • Callback: external_irq1_key_callback
chapter-6_005
  1. 点击刚刚添加的第一个 r_icu 在底部窗口的 Properties 选项卡中对其进行配置,将其配置为与下图一致:

    • Name: g_external_irq2_s2
    • Channel: 2
    • Callback: external_irq2_s2_callback
chapter-6_006
  1. 点击刚刚添加的第一个 r_icu 在底部窗口的 Properties 选项卡中对其进行配置,将其配置为与下图一致:

    • Name: g_external_irq3_s1
    • Channel: 3
    • Callback: external_irq3_s1_callback
chapter-6_007

最后检查确认无误,点击右上角的 “Generate Project Content” e2studio就会根据我们对FSP的配置自动配置项目、生成相应的代码。

chapter-6_008

6.3 编写EC11驱动代码

在e2studio中进入 04_dshanmcu_ra6m5_ec11_encoder\dshanmcu_ra6m5\drivers 目录,新建如下两个文件 drv_gpio_ec11.cdrv_gpio_ec11.h

chapter-6_009

在e2studio中点击打开 04_dshanmcu_ra6m5_ec11_encoder\dshanmcu_ra6m5\drivers\drv_gpio_ec11.c 添加下面的代码:

/***********************************************************************************************************************
 * Includes
 **********************************************************************************************************************/
#include "drv_gpio_ec11.h"

/**********************************************************************************************************************
 * Macro definitions
 **********************************************************************************************************************/
#define DRV_GPIO_EC11_USE_LVGL  (1)

#if DRV_GPIO_EC11_USE_LVGL == 1
#include "lvgl.h"
#endif

/**********************************************************************************************************************
 * Typedef definitions
 **********************************************************************************************************************/

/***********************************************************************************************************************
 * Private function prototypes
 **********************************************************************************************************************/

/***********************************************************************************************************************
 * Private global variables
 **********************************************************************************************************************/
static uint32_t ec11_key_press_tick = 0;
static uint32_t ec11_s1_press_tick = 0;
static uint32_t ec11_s2_press_tick = 0;

static bool ec11_key_state = false;
static bool ec11_s1_state = false;
static bool ec11_s2_state = false;


/***********************************************************************************************************************
 * Functions
 **********************************************************************************************************************/

fsp_err_t drv_gpio_ec11_init(void)
{
    fsp_err_t err;

    // external irq 1
    err = g_external_irq1_key.p_api->open(g_external_irq1_key.p_ctrl,
                                          g_external_irq1_key.p_cfg);
    if(FSP_SUCCESS != err)
    {
        return err;
    }
    err = g_external_irq1_key.p_api->enable(g_external_irq1_key.p_ctrl);
    if(FSP_SUCCESS != err)
    {
        return err;
    }

    // external irq 2
    err = g_external_irq2_s2.p_api->open(g_external_irq2_s2.p_ctrl,
                                         g_external_irq2_s2.p_cfg);
    if(FSP_SUCCESS != err)
    {
        return err;
    }
    err = g_external_irq2_s2.p_api->enable(g_external_irq2_s2.p_ctrl);
    if(FSP_SUCCESS != err)
    {
        return err;
    }

    // external irq 3
    err = g_external_irq3_s1.p_api->open(g_external_irq3_s1.p_ctrl,
                                         g_external_irq3_s1.p_cfg);
    if(FSP_SUCCESS != err)
    {
        return err;
    }
    err = g_external_irq3_s1.p_api->enable(g_external_irq3_s1.p_ctrl);
    if(FSP_SUCCESS != err)
    {
        return err;
    }

    return err;
}

uint32_t drv_gpio_ec11_get_pin_press_tick(bsp_io_port_pin_t pin)
{
    uint32_t pin_press_tick = 0;

    switch(pin){
        case EC11_PIN_KEY:
            pin_press_tick = ec11_key_press_tick;
            break;
        case EC11_PIN_S1:
            pin_press_tick = ec11_s1_press_tick;
            break;
        case EC11_PIN_S2:
            pin_press_tick = ec11_s2_press_tick;
            break;
        default:
            pin_press_tick = 0;
            break;
    }

    return pin_press_tick;
}

bool drv_gpio_ec11_get_pin_state(bsp_io_port_pin_t pin)
{
    bool pin_state = false;

    switch(pin){
        case EC11_PIN_KEY:
            pin_state = ec11_key_state;
            break;
        case EC11_PIN_S1:
            pin_state = ec11_s1_state;
            break;
        case EC11_PIN_S2:
            pin_state = ec11_s2_state;
            break;
        default:
            pin_state = false;
            break;
    }

    return pin_state;
}


void drv_gpio_ec11_set_pin_state(bsp_io_port_pin_t pin, bool state)
{
    switch(pin){
        case EC11_PIN_KEY:
            ec11_key_state = state;
            break;
        case EC11_PIN_S1:
             ec11_s1_state = state;
            break;
        case EC11_PIN_S2:
            ec11_s2_state = state;
            break;
        default:
            break;
    }
}


void external_irq1_key_callback(external_irq_callback_args_t * p_args)
{
    if(p_args->channel == 1)
    {
        ec11_key_state = true;
#if DRV_GPIO_EC11_USE_LVGL == 0
        ec11_key_press_tick = 20;
#else
        ec11_key_press_tick = lv_tick_get() + 20;;
#endif
    }
}

void external_irq2_s2_callback(external_irq_callback_args_t * p_args)
{
    if(p_args->channel == 2)
    {
        bsp_io_level_t level;
        g_ioport.p_api->pinRead(&g_ioport_ctrl, EC11_PIN_S1, &level);
        if(level)
        {
            ec11_s2_state = true;
#if DRV_GPIO_EC11_USE_LVGL == 0
        ec11_s2_press_tick = 20;
#else
        ec11_s2_press_tick = lv_tick_get() + 20;;
#endif
        }
    }
}

void external_irq3_s1_callback(external_irq_callback_args_t * p_args)
{
    if(p_args->channel == 3)
    {
        bsp_io_level_t level;
        g_ioport.p_api->pinRead(&g_ioport_ctrl, EC11_PIN_S2, &level);
        if(level)
        {
            ec11_s1_state = true;
#if DRV_GPIO_EC11_USE_LVGL == 0
            ec11_s1_press_tick = 20;
#else
        ec11_s1_press_tick = lv_tick_get() + 20;;
#endif
        }

    }
}

/***********************************************************************************************************************
 * Private Functions
 **********************************************************************************************************************/

在e2studio中点击打开 04_dshanmcu_ra6m5_ec11_encoder\dshanmcu_ra6m5\drivers\drv_gpio_ec11.h 添加下面的代码:

#ifndef DRV_GPIO_EC11_H
#define DRV_GPIO_EC11_H

/***********************************************************************************************************************
 * Includes
 **********************************************************************************************************************/
#include "hal_data.h"

/**********************************************************************************************************************
 * Macro definitions
 **********************************************************************************************************************/
#define EC11_PIN_KEY    BSP_IO_PORT_02_PIN_05
#define EC11_PIN_S1     BSP_IO_PORT_02_PIN_02
#define EC11_PIN_S2     BSP_IO_PORT_02_PIN_03

/**********************************************************************************************************************
 * Typedef definitions
 **********************************************************************************************************************/

/***********************************************************************************************************************
 * Exported global variables
 **********************************************************************************************************************/

/***********************************************************************************************************************
 * Exported global functions (to be accessed by other files)
 **********************************************************************************************************************/
fsp_err_t drv_gpio_ec11_init(void);

uint32_t drv_gpio_ec11_get_pin_press_tick(bsp_io_port_pin_t pin);

void drv_gpio_ec11_set_pin_state(bsp_io_port_pin_t pin, bool state);

bool drv_gpio_ec11_get_pin_state(bsp_io_port_pin_t pin);

#endif /*DRV_GPIO_EC11_H*/


6.4 编写app

04_dshanmcu_ra6m5_ec11_encoder\dshanmcu_ra6m5\applications 目录下新建 app_ec11_test.c 文件,如下图所示:

chapter-6_010

打开 app_ec11_test.c 添加如下代码:

/***********************************************************************************************************************
 * Includes
 **********************************************************************************************************************/
#include "app.h"
#include "drv_uart.h"
#include "drv_gpio_ec11.h"
#include <stdio.h>

/**********************************************************************************************************************
 * Macro definitions
 **********************************************************************************************************************/


/**********************************************************************************************************************
 * Typedef definitions
 **********************************************************************************************************************/


/***********************************************************************************************************************
 * Private function prototypes
 **********************************************************************************************************************/

/***********************************************************************************************************************
 * Private global variables
 **********************************************************************************************************************/

/***********************************************************************************************************************
 * Functions
 **********************************************************************************************************************/
void app_ec11_test(void)
{
    fsp_err_t err;

    err = drv_uart_init();
    if(FSP_SUCCESS != err) __BKPT();

    err = drv_gpio_ec11_init();
    if(FSP_SUCCESS != err)
    {
        printf ("%s %d\r\n", __FUNCTION__, __LINE__);
        __BKPT();
    }

    while (1)
    {
        if(drv_gpio_ec11_get_pin_state(EC11_PIN_KEY))
        {
            R_BSP_SoftwareDelay(drv_gpio_ec11_get_pin_press_tick(EC11_PIN_KEY), BSP_DELAY_UNITS_MILLISECONDS);
            drv_gpio_ec11_set_pin_state(EC11_PIN_KEY, 0);
            printf("EC11 pressed (KEY)!\r\n");
        }
        else if(drv_gpio_ec11_get_pin_state(EC11_PIN_S1))
        {
            R_BSP_SoftwareDelay(drv_gpio_ec11_get_pin_press_tick(EC11_PIN_S1), BSP_DELAY_UNITS_MILLISECONDS);
            drv_gpio_ec11_set_pin_state(EC11_PIN_S1, 0);
            printf("EC11 turn right(S1)!\r\n");
        }
        else if(drv_gpio_ec11_get_pin_state(EC11_PIN_S2))
        {
            R_BSP_SoftwareDelay(drv_gpio_ec11_get_pin_press_tick(EC11_PIN_S2), BSP_DELAY_UNITS_MILLISECONDS);
            drv_gpio_ec11_set_pin_state(EC11_PIN_S2, 0);
            printf("EC11 turn left(S2)!\r\n");
        }

    }
}


/***********************************************************************************************************************
 * Private Functions
 **********************************************************************************************************************/

app.h 改为如下代码:

#ifndef APP_TEST_H
#define APP_TEST_H

/***********************************************************************************************************************
 * Includes
 **********************************************************************************************************************/
#include "hal_data.h"

/**********************************************************************************************************************
 * Macro definitions
 **********************************************************************************************************************/

/**********************************************************************************************************************
 * Typedef definitions
 **********************************************************************************************************************/

/***********************************************************************************************************************
 * Exported global variables
 **********************************************************************************************************************/

/***********************************************************************************************************************
 * Exported global functions (to be accessed by other files)
 **********************************************************************************************************************/

void app_uart_test(void);

void app_i2c_touchpad_test(void);

void app_spi_display_test(void);

void app_lvgl_test(void);

void app_ec11_test(void);

#endif /*APP_TEST_H*/

6.5 调用app

打开 04_dshanmcu_ra6m5_ec11_encoder\src\hal_entry.c ,将 hal_entry 函数修改为如下所示的代码:

void hal_entry(void)
{
    /* TODO: add your own code here */
    //app_uart_test();
    //app_i2c_touchpad_test();
    //app_spi_display_test();
    //app_lvgl_test();
    app_ec11_test();

#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

6.6 验证效果

点击编译按钮,再点击 debug 按钮,将程序烧写到开发板中。打开串口工具,操作EC11编码器(左转、右转、按下)同时会看到串口中断打印出相应的提示信息,如下所示:

EC11 pressed (KEY)!
EC11 pressed (KEY)!
EC11 turn right(S1)!
EC11 turn right(S1)!
EC11 turn left(S2)!
EC11 turn left(S2)!
本节完

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

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

相关文章

XCE18T4K1P40-FJJP40、F4Z1P40规格书(泰兴创航)

关于XCE18T4K1P40-FJJP40、F4Z1P40电连接器规格书 主要性能指标 工作温度&#xff1a;-55℃~200℃相对湿度&#xff1a;温度40℃2℃时达98%振动&#xff1a;频率10-2000Hz&#xff0c;加速度196m/s2冲击&#xff1a;加速度980m/s2机械寿命&#xff1a;5000次壳体材料&#xff1…

05_瑞萨GUI(LVGL)移植实战教程之添加LVGL库,对接显示和触摸驱动

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg 5. 添加LVGL库&#xff0c;对接显示和触摸驱动 本次实验我们会融合前面实验的成果&#xff0c;添加LVGL库&#xff0c;对接显示和触摸驱动&#xff0c;让屏幕能显示…

金蝶云星空与泛微OA集成的方案落地与实践

打破信息孤岛&#xff0c;泛微OA集成的方案落地与实践 在现代企业内部&#xff0c;不同类型的业务系统和泛微OA平台层出不穷。企业需要找到一种高效的方法来整合和协同这些多样化的系统&#xff0c;同时将它们与泛微OA平台融合&#xff0c;以实现资源整合和高度协同的办公环境…

Win10下python的命令行启动和调用问题

Win10下python的命令行启动和调用问题 Win10下Python的启动问题解决办法 Win10下Python的启动问题 Win10下安装了python&#xff0c;但是命令行启动仍然显示Windows商店界面 同时在C:\Users\用户名\AppData\Local\Microsoft\WindowsApps目录下发现空的python3.exe文件 即便在…

【Java】基于SSM的单位人事管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

向量数据库,能让AI再次起飞吗?

9月7-8日&#xff0c;深圳国际会展中心18号馆 来了&#xff0c;来了&#xff0c;腾讯面向产业互联网领域规格最高、规模最大、覆盖最广的年度科技盛会 -——- 腾讯全球数字生态大会。 9 月 7 日&#xff0c;我们将聚焦产业未来发展新趋势&#xff0c;针对云计算、大数据、人工…

Kafka3.0.0版本——消费者(分区的分配以及再平衡)

目录 一、分区的分配以及再平衡1.1、消费者分区及消费者组的概述1.2、如何确定哪个consumer来消费哪个partition的数据1.3、消费者分区分配策略 一、分区的分配以及再平衡 1.1、消费者分区及消费者组的概述 一个consumer group中有多个consumer组成&#xff0c;一个 topic有多…

单片机代码不变,hex却变了?

关注星标公众号&#xff0c;不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 今天在技术交流群看到这么一个问题&#xff0c;大概意思就是&#xff1a;同一个代码工程&#xff08;源码不变&#xff09;&#xff0c;因Keil版本不同&#xff0c;程序&#xff08…

更快更强更稳定:腾讯向量数据库测评

向量数据库&#xff1a;AI时代的新基座 人工智能在无处不在影响着我们的生活&#xff0c;而人工智能飞速发展的背后是需要对越来越多的海量数据处理&#xff0c;传统数据库已经难以支撑大规模的复杂数据处理。特别是大模型的出现&#xff0c;向量数据库横空出世。NVIDIA CEO黄…

sqlserver2012 bat脚本实现最大使用内存设置

前言 安装完成sqlserver之后&#xff0c;在运行过程中会无限制的占用电脑的内存&#xff0c;会影响到其他软甲的使用。 bat脚本 准备好bat脚本和sql文件之后&#xff0c;配置好数据库信息 直接双击即可 ECHO OFF REM 自动判断权限问题&#xff0c;主动获取管理员权限>…

中国有多少个省?【最新】

2023.09.09 中华人民共和国省级行政区是指中国现行的34个一级行政区&#xff0c; 包括23个省&#xff08;河北、山西、黑龙江、吉林、辽宁、江苏、浙江、安徽、福建、江西、山东、河南、湖北、湖南、广东、海南、四川、贵州、云南、陕西、甘肃、青海、台湾&#xff09;、 5个…

国际版腾讯云阿里云免费开户:全站加快 DCDN 重磅发布!打造新一代加快引擎

腾讯云全站加快 DCDN 重磅发布&#xff01;打造新一代加快引擎 在数字化转型革新逐渐深化的当下&#xff0c;安全高效成为企业上云、全球化布置的要害需求。 跟着运用场景复杂度不断提高、事务需求差异化开展&#xff0c;为了给企业供给更完善的安全加快服务&#xff0c;阿里云…

基于Java+SpringBoot+Vue前后端分离小型诊疗预约平台设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

黑马JVM总结(一)

&#xff08;1&#xff09;什么是JVM JVM是java的运行环境&#xff0c;我们写了一个HelloWorld.java源代码&#xff0c;经过javac编译成了class字节码&#xff0c;这个class字节码使用一个java程序加载到虚拟机里就可以运行了 Java语言是跨平台的&#xff0c;它是在那个层面上…

08_瑞萨GUI(LVGL)移植实战教程之LVGL对接串口打印

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg 8. LVGL对接串口打印 本次实验我们为LVGL库对接串口的打印功能。 8.1 复制工程 上次实验得出的工程我们可以通过复制在原有的基础上得到一个新的工程。 如果你不清…

09_瑞萨GUI(LVGL)移植实战教程之拓展练习

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg 9. 拓展练习 本节安排三个实验检验学习成果&#xff0c;实验示例源码在资料包的这个位置&#xff1a; DShanMCU-RA6M5配套学习资料\2_配套源码\02_瑞萨电子MCU GUI(…

分享一个基于Python和Django的产品销售收入数据分析系统源码

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

数据通信网络之IPv6静态路由

文章及资源归档至公众号【AIShareLab】&#xff0c;回复 通信系统与网络 可获取。 文章目录 一、目的二、拓扑三、需求四、步骤 一、目的 掌握路由器的 IPv6 基础配置。掌握静态 IPv6 路由的基础配置。理解 IPv6 数据报文的路由过程。 二、拓扑 如图 1 所示&#xff0c;三台…

XL-LightHouse 与 Flink 和 ClickHouse 流式大数据统计系统

一个Flink任务只能并行处理一个或少数几个数据流&#xff0c;而XL-LightHouse一个任务可以并行处理数万个、几十万个数据流&#xff1b; 一个Flink任务只能实现一个或少数几个数据指标&#xff0c;而XL-LightHouse单个任务就能支撑大批量、数以万计的数据指标。 1、XL-LightHo…

005微信小程序云开发API数据库-查询记录-聚合-统计记录数量

文章目录 1.微信小程序云开发API数据库-查询记录案例代码 2.微信小程序云开发API数据库-聚合案例代码 3.微信小程序云开发API数据库-统计记录数量案例代码 1.微信小程序云开发API数据库-查询记录 微信小程序云开发API数据库是一个方便快捷的数据库解决方案&#xff0c;可以让开…