//==================================================================普通轮询检测
一,图像化配置界面
命名为 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;
}
}