找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[M051] NuMicro M058S 库函数中CLK_SysTickDelay函数延时不准是什么情况..

[复制链接]
跳转到指定楼层
楼主
Seaber 发表于 2017-2-16 16:38:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式




小弟刚接触 NuMicro M058S, 对他库的 使用方法不很了解,遇到如下问题请教高手。


在官方的M058SSAN开发上写了一个LED 闪烁的程序,闪烁延时调用的是官方库中的CLK_SysTickDelay()函数。
但是实际的延时时长要比设置的延时时长短很多。是不是我的使用方法不对呢。请教高手。
代码如下:

#include <stdio.h>
#include "M058S.h"

#define PLL_CLOCK           50000000
void SYS_Init(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();
          /* Enable Internal RC 22.1184MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

    /* Waiting for Internal RC clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

    /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

    /* Enable external XTAL 12MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

    /* Waiting for external XTAL clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(PLL_CLOCK);
        
    SYS_LockReg();
}


int main()
{
    SYS_Init();
          CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLK_S_HXT_DIV2);
          GPIO_SetMode(P3, BIT6, GPIO_PMD_OUTPUT);
    while(1)
                {
                        P36 = 0 ;
                        CLK_SysTickDelay(5000000);//设置5秒的延时,实际大概有0.5秒
                        P36 = 1 ;
                        CLK_SysTickDelay(5000000);//设置5秒的延时,实际大概有0.5秒
                }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

沙发
 楼主| Seaber 发表于 2017-2-16 21:56:56 | 只看该作者
问题解决;原因如下:
回复 支持 反对

使用道具 举报

板凳
 楼主| Seaber 发表于 2017-2-16 21:57:25 | 只看该作者
/**
  * @brief  This function execute delay function.
  * @param[in]  us  Delay time. The Max value is 2^24 / CPU Clock(MHz). Ex:
  *                             50MHz => 335544us, 48MHz => 349525us, 28MHz => 699050us ...
  * @return None
  * @Details    Use the SysTick to generate the delay time and the UNIT is in us.
  *             The SysTick clock source is from HCLK, i.e the same as system core clock.
  */
void CLK_SysTickDelay(uint32_t us)
{
    SysTick->LOAD = us * CyclesPerUs;
    SysTick->VAL  =  (0x00);
    SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;

    /* Waiting for down-count to zero */
    while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);
    SysTick->CTRL = 0;
}
回复 支持 反对

使用道具 举报

地板
a_ziliu 发表于 2017-2-23 11:40:18 | 只看该作者
只能到2^24,程式有註解 ,最多3秒多。

* @brief      This function execute delay function.
  * @param[in]  us  Delay time. The Max value is 2^24 / CPU Clock(MHz). Ex:
  *                             50MHz => 335544us, 48MHz => 349525us, 28MHz => 699050us ...
  * @return     None
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU