MSPM0学习,systick的配置以及中断
前言
如果您未看过笔者之前写的"第一步配置"和"MSPM0教程之调用SYSCONFIG以及配置GPIO输出和输入",强烈建议您将这两篇先看了,以免出现配置错误,如果您以及完成了SYSCONFIG的配置,请继续往下看
在SYSCONFIG中配置滴答定时器,以及中断配置
根据自己需要的技术频率来设置分频系数Period,1ms的频率是应用最多的,MSPM0L的主频为32M,故分频系数设置为32000,同时我们开启中断,并将滴答定时器的中断优先级设置为最低,这也是为了我们后续方便移植RTOS
MSPM0中断策略解读
在官方用户手册中,介绍了MSPM0的中断策略,可以看到TI给所有的中断和异常都分配到了事件组里
MSPM0把CPU中断,DMA触发,以及外设触发外设,都统称为事件(Event)触发源称为事件发布者(Event Publisher),相应中断的外设被称为事件订阅者(Event Subscriber)。
Event的传播路由分为三类,第一个是静态事件路由(Static Event Route),就是指的事件发布者(Event Publisher)到事件订阅者(Event Subscriber)是固定路径,不可配置,例如外设到CPU的中断,中断标志位需要手动清除。
以上文段来自创易栈MSPM0L1306开发板教程3 - GPIO的中断
第二种称为DMA事件路由(DMA Event Route),这个是外设与DMA的之间的点对点连接,路径不可配置,中断标志会自动清除
第三种称为通用事件路由(Generic Event Route),就是外设到外设,外设到DMA,CPU之间的可配置连接,例如定时器触发ADC,IO触发IO,这些都是通用事件路由,中断标志会自动清除。
特别说明的是,在通用事件路由中,Event Publisher是一个,Event Subscriber最多支持到两个,也就是说,一个事件可以触发最多两个动作,例如一个按键可以触发两个GPIO进行翻转。
以上文段来自创易栈MSPM0L1306开发板教程3 - GPIO的中断
systick中断的配置
在SYSCONFIG配置好后,我们进行编译,可以看到生成了systick的配置函数
接下来我们来到startup_mspm0l1306_uvision.s(即启动文件)中,可以看到对应的中断已经被映射到中断向量表里了,我们直接复制对应的函数名,然后编写中断函数即可
unsigned int utick = 0;//滴答定时器中断计数
void SysTick_Handler(void)
{
SysTick->CTRL &= ~(1 << 16); /*清除滴答定时器中断标志位*/
utick++;//滴答定时器中断计数
}
编写一个delay_ms函数
void delay_ms(unsigned int ms)
{
unsigned int tick = utick;
while(utick < (tick + ms));
}
在main中编写验证代码
extern unsigned int utick;
int main(void)
{
SYSCFG_DL_init();
while (1) {
delay_ms(1000);
DL_GPIO_togglePins(GPIO_GRP_0_PORT,GPIO_GRP_0_LED_PIN);
}
}
DL_GPIO_togglePins函数的定义如下图所示
在debug中,我们看到程序成功进入了中断函数内,说明配置成功
注意事项
当我们把keil的优化等级开到o1(魔术棒-C/C++-optimization)时,会发现mian里面的主循环代码都未链接(即不能打断点,,可以通过这个来简单判断程序是否被编译器链接),如图所示
将优化等级调成O0以后,main能被正常链接
遗憾的是,下调优化等级后,代码大小几乎翻了一倍,这对于flash大小仅有32K的MSPM0L1306来说,已经用了相当一部分了
转载请标明出处