*更新记录*
2024-6-28:更正按键电平的读取方式,对DL_GPIO_readPins()进行了测试验证。
1、前言
通过前面LED的学习,大家需要重点关注DL_GPIO_readPins()这个函数以及Sysconfig的上下拉电阻配置。
2、相关配置
主控:MSPM0G3507SPTR(48角)
编译器:Keil,版本:5.33
3、Sysconfig配置
在Sysconfig配置中需要注意的是,GPIO的上下拉电阻需要根据外部硬件电路设计,如我的按键按下为低电平,那么我的GPIO就需要进行上拉。如果我选择下拉,那么无论我按下按键还是不按下按键,GPIO口都会是低电平,无法对外部按键进行判断。
4、GPIO函数设计
DL_GPIO_readPins(PORTA_PORT,PORTA_KEY1_PIN);
判断IO口的输入电平,我们认识这一个函数就行了,“readPins”就是读取引脚的值。
这里需要特别注意DL_GPIO_readPins()这个函数的返回值并非0或1,而是u32的数据类型。例如,我们要读取B18和B19的电平,当外部输入为高电平时(或者内部上拉,外部悬空),DL_GPIO_readPins()的返回值为0x0008 0000和0x0004 0000,并非为1;当外部输入为低电平时,DL_GPIO_readPins()的返回值为0x0000 0000和0x0000 0000;
因此我们在设计代码时, 以下代码的写法是错误的(笔者的个人看法,有误还请指正),高电平的返回值并不一定为1。
错误示范:
if (DL_GPIO_readPins(KEY2_PORT, KEY2_PIN2_PIN) == 1) // 若引脚为高电平 LED_RED_ON; // 红灯亮
正确的写法是:
/*----------------------------读取方式1------------------------------*/ /* 高电平的判断方式 */ if (DL_GPIO_readPins(KEY2_PORT, KEY2_PIN2_PIN) > 0) // 若引脚为高电平 { /* 用户代码 */ } /*----------------------------读取方式2------------------------------*/ /* 低电平的判断方式 */ if (DL_GPIO_readPins(KEY2_PORT, KEY2_PIN2_PIN) == 0) // 若引脚为低电平 { /* 用户代码 */ } /*----------------------------读取方式3------------------------------*/ /* 高、低电平的判断方式 */ if (DL_GPIO_readPins(KEY2_PORT, KEY2_PIN2_PIN)) // 若引脚为高电平 { /* 用户代码 */ } else // 不是高电平,那就是低电平 { /* 用户代码 */ } /*-------------------------------------------------------------------*/
对相关函数进行封装,方便调用。
/**
* @函数介绍: 读取按键值
* @输入参数: 无
* @输出参数: 无
* @说明: 按键值变化,LED灯发生相应变化
* 按键默认配置为PA10,输入模式为上拉输入
*/
void Read_Key_Value(void)
{
if (DL_GPIO_readPins(PORTA_PORT,PORTA_KEY1_PIN) > 0) // 若引脚为高电平
LED_RED_ON; // 红灯亮
else
LED_RED_OFF; // 红灯灭
}
主函数直接调用就行了,也可以直接放主函数里进行测试。
/**
* @函数介绍: main函数
* @说明: 无
*/
int main(void)
{
SYSCFG_DL_init(); // 芯片资源初始化,由SysConfig配置软件自动生成
while(1)
{
Read_Key_Value(); // 读取按键值
}
}
5、实验效果
实验所用的按键为自锁按键,会固定状态。
通过实验我们可以发现,按键每做一次切换,LED就能做出对应的显示(这里可能不太清楚,但实际效果是OK的,能够正确读取高低电平)。
6、总结
按键配置是比较基础的,主要注意:
1、按键的上下拉配置
2、DL_GPIO_readPins()函数的使用,高电平返回值不一定是1!!!
2024-6-28-17:12,雨还在下(。-ω-)zzz