03.TMS570LC43入门指南——按键输入

03.TMS570LC43入门指南——按键输入

一、简介

通过上节学习,我们使用 TMS570LC43 实现了 LED 闪烁。通过这篇文章,我们将学习按键的使用方法。

首先,我们需要了解的是,通过阅读这篇文章,我们将会学习到什么。以下是本文想阐述的主要内容:

  • 学习 GIO 输入

  • 学习相关寄存器操作


二、 项目实现

2.1 硬件部分

我们需要使用到按键,因此通过翻阅原理图,我们可以看到按键有以下定义:

在这里插入图片描述

通过对上图的理解,我们可以看到,该开发板具有两个按键,分别为 S3S4。本文将使用 S3 完成此次项目的实现。

对电路的分析:

  • 首先输入 3.3V 经过一个 2.2K 的电阻进行分压后接到 MCU 引脚和按键上。这个电阻是尤为重要的,单片机IO承受不了那么大的电压,如果不对 3.3V 进行分压,有可能会烧坏芯片或者IO口。

通过原理图,我们明白了,需要对 GIOB_4 进行操作。而按键对应的位置在开发板上的示意图如下所示:

在这里插入图片描述

2.2 软件部分

在进行软件书写部分,需要建立工程文件,我这里不再进行赘述,需要学习的可以参照我前一篇文章。链接如下:

02.TMS570LC43入门指南——点亮LED-CSDN博客

如若点击无法进行跳转,可以自行复制:

  • https://blog.csdn.net/liujiahao_/article/details/134709088
2.2.1 HALCoGen 配置

通过上述内容,我们分析了,需要使用 GIOB_4 进行配置操作,因此我们建立完 HALCoGen 工程以及 CCS 工程后。同样的,需要 Enable GIO driver,然后在 GIO -> Port B 中如下图所示进行配置:

在这里插入图片描述

在这里插入图片描述

同时,我们使用要使得按键结果有所反馈,所以,这里使用之前讲的,LED翻转来表现按键的结果。故这里对 GIOB_6 进行以下操作:

在这里插入图片描述

与上一节所讲的不同在于,我们这里没有将 DOUT 置为 1,具体原理图可以参考 02.TMS570LC43入门指南——点亮LED-CSDN博客 中内容。这样做,默认LED不被点亮。

配置完成后,生成HAL文件。使用快捷键 F5 或依次点击 File -> Generate Code

2.2.2 CCS代码编写

生成文件后,依旧在 CCS 中进行编写逻辑代码操作。还是先找到我们的 HL_sys_main.c 文件。这里我给出我写的示例代码:

/* USER CODE BEGIN (0) */
/* USER CODE END */

/* Include Files */

#include "HL_sys_common.h"

/* USER CODE BEGIN (1) */
#include "HL_gio.h"
/* USER CODE END */

/** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*/

/* USER CODE BEGIN (2) */
#define CNT     500000

typedef enum keyFlag{
    NONE_PRESS = 0U,
    KEY1_PRESS
}keyFlag_t;

#define KEY1    gioGetBit(gioPORTB, 4)

keyFlag_t keyScan(uint8_t mode);
/* USER CODE END */

int main(void)
{
/* USER CODE BEGIN (3) */
    gioInit();

    while (1)
    {
        keyFlag_t keyStatus = keyScan(0);
        if (keyStatus == KEY1_PRESS) {
            gioToggleBit(gioPORTB, 6);
        }
    }
/* USER CODE END */

    return 0;
}


/* USER CODE BEGIN (4) */
static uint8_t key_up = 1;
/*
 * @brief       : 按键扫描函数
 * @param       : 当 mode 为 1 时,支持连按操作
 *                当 mode 为 0 时,不支持连按操作
 * @return      : keyFlag_t 中的参数
 * @author      : Liu Jiahao
 * @date        : 2024-03-07
 * @version     : v1.1
 * @copyright   : Copyright By Liu Jiahao, All Rights Reserved
 */
keyFlag_t keyScan(uint8_t mode)
{
    int i;
    if (mode == 1) key_up = 1;  // 连按支持
    if (key_up && (KEY1 == 0)) {
        for (i = 0; i < CNT; i++);	// 延时操作
        key_up = 0;
        if (KEY1 == 0)  return KEY1_PRESS;
    }
    else if (KEY1 == 1) key_up = 1;
    return NONE_PRESS;
}
/* USER CODE END */

如上所示,在主函数中先进行 gioInit() 的操作,然后调用自己写的 keyScan() 函数,获取其返回值后,对LED进行操作。实现逻辑较为简单。

对于 keyScan() 函数,源于 正点原子|广州星翼电子 (alientek.com) 中STM32按键检测教学。实际上这里由于没有现成的延时库函数,所以我对消抖的操作只是粗略采用 for循环 的方式进行。在实际项目开发过程中,一般不会采用这样的方式去处理消抖,这里只是用于示例教学

2.2.3 运行结果

编译运行后,下载到开发板。可以看到,我们每按下 S3 按键,LED2 就会翻转。值得注意的是,由于我在使用 keyScan() 函数的时候,传参为 0,即不支持连按操作。我们可以试试,按着按键不松手,LED仍然不会翻转。大家也可以试试把这个参数设置为 1 看看效果。


三、寄存器实现

有了前面一章寄存器操作LED的经验,对于按键操作,应该是得心应手了。按键操作无非就是读GPIO的电平状态。具体使用的寄存器解释我就不再赘述了,需要的朋友可以看我的上一篇文章,连接如下:

02.TMS570LC43入门指南——点亮LED-CSDN博客

我在这一节里将着重按键检测部分的寄存器操作,对于 gioInit() 这样的函数,大家可以试着自己去实现。要对上述代码中进行修改的部分也只有:

// #define KEY1    gioGetBit(gioPORTB, 4)	// Hal 库操作
#define KEY1	(gioPORTB->DIN >> 4) & 1U	// 寄存器操作

四、写在最后

本文介绍了 TMS570LC43如何使用按键检测以及其实现代码

在后续的文章中,将继续对 TMS570LC43x 进行详细的入门指导,欢迎读者关注!!!

目前暂时没有考虑整合的打算,所以各位读者如果需要看别的教程,可以点进 专栏 进行查找。在后续的更新中,将会逐步加入各个文章的链接,以便大家快速翻阅。

欢迎广大读者提出问题以及修改意见,本人看到后会给予回应,欢迎留言,后续会逐步进行开源!!!
另外,由于文章是作者手打的文字,有些地方可能文字会出错,望谅解,也可私信联系我,我对其进行更改。

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值