文章目录
03.TMS570LC43入门指南——按键输入
一、简介
通过上节学习,我们使用 TMS570LC43
实现了 LED 闪烁。通过这篇文章,我们将学习按键的使用方法。
首先,我们需要了解的是,通过阅读这篇文章,我们将会学习到什么。以下是本文想阐述的主要内容:
-
学习 GIO 输入
-
学习相关寄存器操作
二、 项目实现
2.1 硬件部分
我们需要使用到按键,因此通过翻阅原理图,我们可以看到按键有以下定义:
通过对上图的理解,我们可以看到,该开发板具有两个按键,分别为 S3
和 S4
。本文将使用 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的电平状态。具体使用的寄存器解释我就不再赘述了,需要的朋友可以看我的上一篇文章,连接如下:
我在这一节里将着重按键检测部分的寄存器操作,对于 gioInit()
这样的函数,大家可以试着自己去实现。要对上述代码中进行修改的部分也只有:
// #define KEY1 gioGetBit(gioPORTB, 4) // Hal 库操作
#define KEY1 (gioPORTB->DIN >> 4) & 1U // 寄存器操作
四、写在最后
本文介绍了 TMS570LC43如何使用按键检测以及其实现代码。
在后续的文章中,将继续对 TMS570LC43x 进行详细的入门指导,欢迎读者关注!!!
目前暂时没有考虑整合的打算,所以各位读者如果需要看别的教程,可以点进 专栏 进行查找。在后续的更新中,将会逐步加入各个文章的链接,以便大家快速翻阅。
欢迎广大读者提出问题以及修改意见,本人看到后会给予回应,欢迎留言,后续会逐步进行开源!!!
另外,由于文章是作者手打的文字,有些地方可能文字会出错,望谅解,也可私信联系我,我对其进行更改。
-
个人CSDN账号:刘梓谦_-CSDN博客
-
GitHub:Jiahao-Liu29 (github.com)