wenbo2005.online

学习记录 / 基础 TxT 篇

GPIO&KEY

基础 TxT 篇2025-04-30
//==================================================================普通轮询检测

一,图像化配置界面

命名为 KEY ,PORTB ,21 ,设置为上拉

二,按键代码编写:

uint8_t key_value,key_down,key_up,key_old;

void KEY_Read()
{
    if(DL_GPIO_readPins(KEY_PORT,KEY_PIN_21_PIN)==0)
        key_value=1;
    else
        key_value=0;

    key_down=key_value&(key_value^key_old);
    key_up=~key_value&(key_value^key_old);
    key_old=key_value;
}

uint32_t key_read=0;
void KEY_Display()
{
    if(uwTick - key_read<50) return;
    key_read=uwTick;

    KEY_Read();

    if(key_down==1)
    {
        DL_GPIO_togglePins(LED_PORT, LED_PIN_22_PIN);
    }
}

注意,PB21在没有按下时为高电平,返回 0x40000 (0100 0000 0000 0000 0000);

例如(高电平下): PB0 返回 0x0001

                PB1 返回 0x0010
                PB2 返回 0x0100
                PB3 返回 0x1000

//==================================================================外部中断

一,图像化配置界面(记得上拉)

interrupts/Events

1,勾选使能 Enable Interrupts

2,设置中断优先级 Interrupt Priority         默认

3,设置中断触发方式 Trigger Polarity        下降沿触发

4,设置时间发布通道 EPC 不设置(开启之后将会把外部中断事件发布到设置的通道上,其他外设就可以通过通道直接订阅事件)

二,GPIO中断代码编写:

根据MSPM0G系列的用户手册,可以知道GPIO的中断触发后,都是通过GRP1线将中断发布到总线,总线识别到之后就进入中断服务函数中执行内容

GROUP1_IRQHandler(void)    Group1的中断服务函数

初始化:NVIC_EnableIRQ(KEY_INT_IRQN);

void GROUP1_IRQHandler(void)//Group1的中断服务函数
{
    //读取Group1的中断寄存器并清除中断标志位
    switch( DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1) )
    {
        //检查是否是KEY的GPIOB端口中断,注意是INT_IIDX,不是PIN_22_IIDX
        case KEY_INT_IIDX:
            //如果按键按下变为高电平
            if( DL_GPIO_readPins(KEY_PORT, KEY_PIN_21_PIN)==0 )
            {
                //设置LED引脚状态翻转
                DL_GPIO_togglePins(LED_PORT, LED_PIN_22_PIN);
            }
        break;
    }
}