关于中断概念不多赘述,主要是了解M0系列的几种中断方式。(此文参考嘉立创提供的资料中文章总结)
首先引入一个概念:嵌套矢量中断控制器----NVIC,也在32中也非常重要,相信大家都了解过,主要用来管理外设中断。
查阅数据手册的时候,发现3507中只有两个外设中断组:INT_GROUP0、INT_GROUP1.本实验要用到的只有按键和LED,所以只有GPIO这一部分的中断,根据数据手册,可以知道GPIO的中断触发后,都是通过GRP1线将中断发布到总线,总线识别到之后就进入中断服务函数中执行内容。
本次实验的目标是通过五向按键来作为中断判断条件,当拨动 按键时,LED点亮,再次拨动熄灭。代码如下(期间延时是通过滴答定时器控制,也属于中断):
#include "ti_msp_dl_config.h"
volatile unsigned int delay_times = 0;
void delay_ms(unsigned int ms)
{
delay_times = ms;
while( delay_times != 0 );
}
int main(void)
{
SYSCFG_DL_init();
NVIC_EnableIRQ(PORTB_INT_IRQN);//开启按键引脚的GPIOB端口中断
while (1)
{
}
}
void SysTick_Handler(void)//滴答定时器的中断服务函数
{
if( delay_times != 0 )
{
delay_times--;
}
}
void GROUP1_IRQHandler(void)//Group1的中断服务函数
{
//读取Group1的中断寄存器并清除中断标志位
switch( DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1) )
{
//检查是否是KEY的GPIOA端口中断,注意是PORTB_INT_IIDX,不是PORTB_S1_IIDX
case PORTB_INT_IIDX:
//如果按键按下变为高电平
if( DL_GPIO_readPins(PORTB_PORT, PORTB_S1_PIN) > 0 )
{
//设置LED引脚状态翻转
DL_GPIO_togglePins(PORTA_PORT, PORTA_LED_PIN);
}
break;
}
}