• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

滴答定时器初始化函数为啥正点原子的不需要实参呢

huihui163 2018-10-07 浏览量:1575
在正点原子中delay_init();滴答定时器就可以,但是在其他程序中括号里必须有个72才能编译通过
1 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 其它程序的参数72表示MCU的工作主频是72MHz

    原子的例程如下:

    void delay_init()
    {
    #if SYSTEM_SUPPORT_OS         //如果需要支持OS.
     u32 reload;
    #endif
     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟  HCLK/8
     fac_us=SystemCoreClock/8000000;    //为系统时钟的1/8 
    #if SYSTEM_SUPPORT_OS         //如果需要支持OS.
     reload=SystemCoreClock/8000000;    //每秒钟的计数次数 单位为K   
     reload*=1000000/delay_ostickspersec;  //根据delay_ostickspersec设定溢出时间
                //reload为24位寄存器最大值:16777216在72M下约合1.86s左右 
     fac_ms=1000/delay_ostickspersec;   //代表OS可以延时的最少单位   

     SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;    //开启SYSTICK中断
     SysTick->LOAD=reload;       //每1/delay_ostickspersec秒中断一次 
     SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;    //开启SYSTICK   

    #else
     fac_ms=(u16)fac_us*1000;     //非OS下代表每个ms需要的systick时钟数  
    #endif
    }



    注意,SystemCoreClock这个变量,它在头文件 system_stm32f10x.h 中有定义并赋初值

    /*******************************************************************************
    *  Clock Definitions
    *******************************************************************************/
    #ifdef SYSCLK_FREQ_HSE
      uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;        /*!< System Clock Frequency (Core Clock) */
    #elif defined SYSCLK_FREQ_24MHz
      uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;        /*!< System Clock Frequency (Core Clock) */
    #elif defined SYSCLK_FREQ_36MHz
      uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;        /*!< System Clock Frequency (Core Clock) */
    #elif defined SYSCLK_FREQ_48MHz
      uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;        /*!< System Clock Frequency (Core Clock) */
    #elif defined SYSCLK_FREQ_56MHz
      uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;        /*!< System Clock Frequency (Core Clock) */
    #elif defined SYSCLK_FREQ_72MHz
      uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        /*!< System Clock Frequency (Core Clock) */
    #else /*!< HSI Selected as System Clock source */
      uint32_t SystemCoreClock         = HSI_VALUE;        /*!< System Clock Frequency (Core Clock) */
    #endif


    在我的例程中,SystemCoreClock等于72M。

    -----------------------------

    总结:一定意义上,原子的这种写法更为合适。不仅仅是SYSTICK的初始化要依赖主频,串口、SPI、I2C等对时序有要求的,初始化都要依赖主频的值。

    如果这些接口的初始化都要求以参数的方式传递,可能会因为程序员的笔误增加出错的可能。

    • 发布于 2018-10-07
    • 举报
    • 评论 0
    • 4
    • 0

其他答案 数量:14
  • 都goto看看怎么定义的就明白了
    • 发布于2018-10-07
    • 举报
    • 评论 0
    • 1
    • 0

  • 传进去的参数72叫实参,在定义函数的地方你可以去看看,它用到了一个对应的形参。这是c需要定义函数的一个概念问题,可以找相关资料看看函数的定义和形参列表的作用。
    • 发布于2018-10-07
    • 举报
    • 评论 0
    • 1
    • 0

  • 不都是根据系统时钟来配置的吗?SystemCoreClock/8000000
    • 发布于2018-10-07
    • 举报
    • 评论 0
    • 1
    • 0

  • 72是时钟输入参数,你可以修改函数直接把72写进去
    • 发布于2018-10-07
    • 举报
    • 评论 0
    • 1
    • 0

  • 本质都是一样的,比如


    int clk1=0;

    int clk2=0;


    int set1(void){

        clk1=72;

    }


    int set2(int value){

        clk2=value;

    }


    int main(void){

        set1();

        set2(72);

    }

    这两个子函数分别设置两个全局变量,结果是把 clk1 和 clk2 都设置为 72,你能理解么?不要在乎实现,不放心就追踪源码。本质一样样

    • 发布于2018-10-08
    • 举报
    • 评论 0
    • 1
    • 0

  • 本质是一样的,只不过原子写得比较特殊,每个人都有自己的写法吧。72是代表看系统的主时钟。
    • 发布于2018-10-08
    • 举报
    • 评论 0
    • 1
    • 0

  • 这种东西要结合实际的代码来分析的,要72那个,应该是它的频率可以调整
    • 发布于2018-10-13
    • 举报
    • 评论 0
    • 1
    • 0

  • 原子并没有使用传参的方式去调整频率,其实在原子的早期代码上,也是用传参72来控制的
    • 发布于2018-10-21
    • 举报
    • 评论 0
    • 1
    • 0

  • 要根据你的时钟树来看,根据时钟树回推到时钟的源头
    • 发布于2018-10-27
    • 举报
    • 评论 0
    • 1
    • 0

  • 这个是原子的特殊写法,其实本质是一样的对时钟的操作,没有什么不同的地方
    • 发布于2018-10-30
    • 举报
    • 评论 0
    • 1
    • 0

  • 这个跟你函数编写的内容有关系,不需要72参数的那是因为在函数里面默认设置为72了。
    • 发布于2018-10-31
    • 举报
    • 评论 0
    • 1
    • 0

  • 这个只需要仔细看看代码就可以发现其中的奥妙了,一步一步跟踪过去就可以发现其时钟源的定义了
    • 发布于2018-10-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个和你的设置有关系,不一定都是72M
    • 发布于2018-11-14
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

滴答定时器初始化函数为啥正点原子的不需要实参呢