查看: 1029|回复: 0

【SAMV71精讲精练系列】3、System Tick详解

[复制链接]

该用户从未签到

发表于 2015-11-24 10:20:17 | 显示全部楼层 |阅读模式
分享到:
科学家研究发现,一个人对事物认知的最高程度,是能用语言或者文字,
把它的逻辑详尽透彻、有条理地表述出来。
别说这个真有道理,很多东西,你感觉自己明白了,但是说出来可能完全
是两回事,甚至听者也觉得不知所谓,那说明你对这个东西的认知还没有
达到透彻的程度。

所以本次学习贴,尽量详尽一点,很显然我也有这个需求来把SAMV71这个
东西了解得更透彻。这有别于之前连载的XMEGA学习教程,XMEGA是我拿来
做过几个项目的芯片,讲太细于己来说绝对是浪费时间。而SAMV71是一款
全新的芯片,所以权当为以后的项目未雨绸缪,储备点知识,与各位共同进步。

稍微谈谈前几贴的学习体会,很大的感触是,太熟悉了!有些貌似新鲜的
术语,仿佛以前便使用过一般,并且,因为这款IC的性能太强劲了,外设之
丰富让人叹为观止,所以应用于实际项目上,会有更大的灵活度和操作
空间。小资源的片子在时间和空间两个维度之间精雕细琢是太常见的事情,
而这个如果不上系统,简直就可以让你随便嗨……呵呵

但是,提醒一点,作为码农,切忌因为硬件强悍而随意写出超烂的乐色!
否则以后绝对可是要吃暗亏的。

扯远了,正式步入正题。

单片机新手,特别喜欢使用指令延时,实际上很多时候这是拖慢MCU效率
的一个很大的元凶。稍有经验的,很容易想到,用定时器来做一个标记,
显然这要高明得多,避免了MCU的“死等”。

SAMV71更是把这样一个算作是技巧性的处理,提升到了另外一个高度,
把它做成了一个单独的中断源,只要你愿意,这个Tick将会一直存活在
你程序的生命周期里!

解析一下如下库函数 - 配置系统TICK
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1);     /* Reload value impossible */

  SysTick->LOAD = ticks - 1;                        /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0;                             /* Load the SysTick Counter Value */
  SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
               SysTick_CTRL_TICKINT_Msk   |
               SysTick_CTRL_ENABLE_Msk;             /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                 /* Function successful */
}
调用这个函数便完成了系统TICK配置,
如果我们想要配置系统TICK每毫秒中断一次,只需要像如下这样调用即可;SysTick_Config(sysclk_get_cpu_hz() / 1000);
然后,我们自然需要在中断函数里作一个毫秒计数,如下
volatile uint32_t systemTickCounter;
void SysTick_Handler(void)
{
      systemTickCounter++;
}

顺便提醒一下volatile这个关键字,我建议你加上,否则……你懂得!
只有严密的程序才能达到理想的效果,任何寄希望于编译器或者IDE优化的想法都是在给自己“埋地雷”!

程序烧录进去之后的效果如下



main.c全部测试代码:
--------------------------------------------------------------------------------main.c
int main(void)
{     
        sysclk_init();
        board_init();

      SysTick_Config(sysclk_get_cpu_hz() / 1000);
        while (1) {
              if(!(systemTickCounter % 100)) {
                    ioport_toggle_pin_level(EXAMPLE_LED_GPIO);
            }

        }
}










(END)
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

手机版|小黑屋|与非网

GMT+8, 2024-11-19 00:46 , Processed in 0.125030 second(s), 17 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.