zoukankan      html  css  js  c++  java
  • 计数器中断关于systick的构件编写。

    发一下牢骚和主题无关:

        systick一共有4个寄存器

        CSR :控制和状态寄存器。

        

        COUNTFLAG :标记位,标记systick计数器否是经已倒数到0 。0 :还没有数到0 。1:经已数到0 了。

        CLKSOURCE:时钟源的选择。1:systick用使系统内核时钟。0:可选的外部时钟(根据不同备设有不同的时钟,可以通过查看芯片手册失掉,KL25里头是内核时钟的1/16)

        TICKINT:中断能使位。1:能使systick中断。0:计数器数到0不触发中断。

        ENABLE:计数器是能为。0:计数器禁用。1:计数器运行。

        RVR:载重计数器。当计数器倒数到0时,新重从该计数器加载tick值。

        

        CVR:计数器当期的值。放存计数器以后的计数值。

        

        CALIB:校准计数器。有些芯片厂家会将每一秒的频率值放存在该寄存器中。TENMS代表10ms对应的滴答值。通过查芯片手册,该区域在KL25里头该值为0

        

        NOREF:标记时钟源否是选择外部参考时钟。1:非参考时钟。0:参考时钟

        SKEW:标记该出厂值TENMS否是确精:0:确精。1:不确精,因为时钟频率的因原。

        TENMS:10ms的滴答值。

        通过这3个寄存器我们可以编写3个数函:

        systick_init:systick初始化

        systick_trim:systick校准

        systick_isr:systick中断例程。

        话不多说:上码。

    //数函称名:systick_init
    //数函返回:无
    //数参说明:clock_scr:内核时钟源的选择:0:内核时钟。1:内核时钟/16。
    //         systick_unit:systick的每次中断的时间间隔。位单ms 推荐选用10ms。最大为1000ms,即1s中断一次。
    //功能提要:初始化ARM Cortex-M处理器内核的SysTick模块作为系统滴答时钟。
    void systick_init(uint_8 clock_scr, uint_32 systick_unit)
    {
        //定义ticks代表时钟源的滴答数
        uint_32 ticks;
        // 初始化系统滴答计数值
        systicks = 0; 
        // 关闭SYSTICK
        SYST_CSR = 0;
        // 清除以后值计数器  
        SYST_CVR = 0;
        // 选择时钟源0:内核时钟/16 1:内核时钟
        if(0==clock_scr)
        {
        	ticks=core_clk_khz*1000/16;  
        }
        else
        {
        	clock_scr=1;
        	ticks=core_clk_khz*1000;
        }
        //置设计数器载重寄存器数值 
        SYST_RVR = ticks/ 1000*systick_unit;
        // 设定 SysTick优先级
        SCB_SHPR3 |= SCB_SHPR3_PRI_15(1<<6);
        //置设stick中断到1s的数次
        g_ticks=1000/systick_unit-1;
        // 用使内核时钟,倒计时到0时发生SYSTICK中断,能使SYSTICK
        SYST_CSR = (clock_scr<<SysTick_CSR_CLKSOURCE_SHIFT) | SysTick_CSR_ENABLE_MASK | SysTick_CSR_TICKINT_MASK; 
    }
        每日一道理
    心是一棵树,爱与希望的根须扎在土里,智慧与情感的枝叶招展在蓝天下。无论是岁月的风雨扑面而来,还是滚滚尘埃遮蔽了翠叶青枝,它总是静默地矗立在那里等待,并接受一切来临,既不倨傲,也不卑微。
      心是一棵树,一个个故事被年轮携载;一回回驿动与飞鸟相约;一次次碰撞使它绵密柔韧;一幕幕经历造就了它博广的胸怀。心是一棵树,独木不成林。因此,树与树既独立又相联,心与心既相异又相亲。

        //数函称名:systick_trim //数函返回:无 //数参说明:flag: 0示表慢,1示表快 //         trim_sec:每一分钟的秒数之差       //功能提要:校准systick,如果每分钟慢一秒,SYST_RVR就增长48M/6000=8000 //         如果每分钟快一秒,SYST_RVR就增长48M/6000=8000 void systick_trim(uint_32 flag, uint_32 trim_sec) {

        uint_32 current_RVR=0;

        uint_32 current_CSR=0;

     // 初始化系统滴答计数值     systicks = 0;      // 关闭SYSTICK     current_CSR=SYST_CSR;     SYST_CSR = 0;     // 清除以后值计数器       SYST_CVR = 0;     // 设定倒计时计数值     current_RVR=SYST_RVR;     if(0 == flag)     {    

        current_RVR = current_RVR - current_RVR*trim_sec/60;     }     else     {    

        current_RVR = current_RVR + current_RVR*trim_sec/60;

        }     SYST_RVR=current_RVR;     // 设定 SysTick优先级     SCB_SHPR3 |= SCB_SHPR3_PRI_15(1<<6);       // 用使内核时钟,倒计时到0时发生SYSTICK中断,能使SYSTICK     SYST_CSR = current_CSR;  }

    //数函称名:systick_isr
    //数函返回:无
    //数参说明:无
    //功能提要:SysTick定时器中断服务例程,新更系统滴答计数变量值。
    void systick_isr(void)
    {
       //systicks++;
       timecount++;
       if(timecount > g_ticks)   //1s到,递增时,分,秒缓冲区的值
       {
         timecount = 0;
         SecAdd1(g_time);        //加1s
       }
    }

        编写该构件还是有定一的难度的。要想别人看的懂,自己也看的懂,就得装封一些数函及数值。

        

        

        

        

        

        

        

    文章结束给大家分享下程序员的一些笑话语录: 3G普不普及现在已经不是看终端了,而是看应用,有好的,便宜实用的应用,花1000多买个能用的智能手机应该不是什么难事。反过来说,你200元拿一个智能手机,没有好的应用,看个电影要几十元,也是没人用3G。

  • 相关阅读:
    重载运算符 && 构造函数 的写法
    2019 ICPC Asia Xuzhou Regional
    中国剩余定理
    求逆元
    Exgcd
    Leading Robots
    大家好
    AtCoder Grand Contest 047 部分题解
    CodeForces 1389E Calendar Ambiguity 题解
    CodeForces 1380F Strange Addition 题解
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3047896.html
Copyright © 2011-2022 走看看