打印
[技术问答]

NuMicro M058S 库函数中CLK_SysTickDelay函数延时不准是什么情况?小弟新手请教前辈

[复制链接]
3322|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Seaber36|  楼主 | 2017-2-16 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟刚接触 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秒
                }
}

沙发
天灵灵地灵灵| | 2017-2-16 17:20 | 只看该作者
官方的例程?还是你自己写的?

使用特权

评论回复
板凳
天灵灵地灵灵| | 2017-2-16 17:26 | 只看该作者
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
* $Revision: 2 $
* $Date: 15/02/13 3:18p $
* @brief
*           A sample code for LED blanking.
*
* @note
* Copyright (C) 2015 Nuvoton Technology Corp. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include "M058S.h"

#define PLLCON_SETTING  CLK_PLLCON_50MHz_HXT
#define PLL_CLOCK       50000000

void SYS_Init(void)
{

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable Internal RC 22.1184MHz clock */
    CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk;

    /* Waiting for Internal RC clock ready */
    while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk));

    /* Switch HCLK clock source to Internal RC and and HCLK source divide 1 */
    CLK->CLKSEL0 &= ~CLK_CLKSEL0_HCLK_S_Msk;
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_HIRC;
    CLK->CLKDIV &= ~CLK_CLKDIV_HCLK_N_Msk;
    CLK->CLKDIV |= CLK_CLKDIV_HCLK(1);

    /* Enable external XTAL 12MHz clock */
    CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk;

    /* Waiting for external XTAL clock ready */
    while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_XTL12M_STB_Msk));

    /* Set core clock as PLL_CLOCK from PLL */
    CLK->PLLCON = PLLCON_SETTING;
    while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_PLL_STB_Msk));
    CLK->CLKSEL0 &= (~CLK_CLKSEL0_HCLK_S_Msk);
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_PLL;

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    //SystemCoreClockUpdate();
    PllClock        = PLL_CLOCK;            // PLL
    SystemCoreClock = PLL_CLOCK / 1;        // HCLK
    CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

    /* Enable UART module clock */
    CLK->APBCLK |= CLK_APBCLK_UART0_EN_Msk;

    /* Select UART module clock source */
    CLK->CLKSEL1 &= ~CLK_CLKSEL1_UART_S_Msk;
    CLK->CLKSEL1 |= CLK_CLKSEL1_UART_S_HXT;

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Set P3 multi-function pins for UART0 RXD , TXD and CKO */
    SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
    SYS->P3_MFP |= (SYS_MFP_P30_RXD | SYS_MFP_P31_TXD);

}

void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART0 */
    SYS->IPRSTC2 |=  SYS_IPRSTC2_UART0_RST_Msk;
    SYS->IPRSTC2 &= ~SYS_IPRSTC2_UART0_RST_Msk;

    /* Configure UART0 and set UART0 Baudrate */
    UART0->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HXT, 115200);
    UART0->LCR = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
}

/*---------------------------------------------------------------------------------------------------------*/
/*  Main Function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int32_t main(void)
{
    int32_t i;
   
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, peripheral clock and multi-function I/O */
    SYS_Init();

    /* Lock protected registers */
    SYS_LockReg();

    /* Init UART0 for printf */
    UART0_Init();

    printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

    /*
        This sample code will blinking LED on NuTiny EVB board of M058SSAN.
        The I/O for LED is P2.3 or P3.6
    */

    printf("+---------------------------------------+\n");
    printf("|    NuTiny EVB LED Sample Code         |\n");
    printf("+---------------------------------------+\n");
   
    /* Init P2.3 and P3.6 to be output mode */
    P2->PMD = (P2->PMD & ~(0x3 << 2*3)) | (1 << 2*3);
    P3->PMD = (P3->PMD & ~(0x3 << 2*6)) | (1 << 2*6);
   
    while(1)
    {
        /* Toggle P2.3 */
        P23 ^= 1;
        
        /* Toggle P3.6 */
        P36 ^= 1;
        
        /* Delay 200ms */
        for(i=0;i<2;i++)
            CLK_SysTickDelay(100000);
    }
   
   
}


使用特权

评论回复
地板
天灵灵地灵灵| | 2017-2-16 17:26 | 只看该作者
上面是官方的例程序,楼主看完应该明白了吧

使用特权

评论回复
5
Seaber36|  楼主 | 2017-2-16 17:28 | 只看该作者
天灵灵地灵灵 发表于 2017-2-16 17:20
官方的例程?还是你自己写的?

参照历程,自己改的 ,就是看不出是哪里 出了问题

使用特权

评论回复
6
Seaber36|  楼主 | 2017-2-16 17:33 | 只看该作者
天灵灵地灵灵 发表于 2017-2-16 17:26
上面是官方的例程序,楼主看完应该明白了吧

时钟的初始化有没直接用库的方式来做的?

使用特权

评论回复
7
天灵灵地灵灵| | 2017-2-16 17:34 | 只看该作者
你运行下我发的这个试试看,我看我们的配置貌似不同。

使用特权

评论回复
8
天灵灵地灵灵| | 2017-2-16 19:02 | 只看该作者
Seaber36 发表于 2017-2-16 17:33
时钟的初始化有没直接用库的方式来做的?

我发的那个就是官方原版的,一个字都没改。

使用特权

评论回复
9
天灵灵地灵灵| | 2017-2-16 19:03 | 只看该作者
Seaber36 发表于 2017-2-16 17:33
时钟的初始化有没直接用库的方式来做的?

官方的程序啊,肯定是库来的。

使用特权

评论回复
10
momososo| | 2017-2-16 20:03 | 只看该作者
看看这段
/**
  * @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;
}

延时5秒要用其他方法

使用特权

评论回复
11
Seaber36|  楼主 | 2017-2-16 21:39 | 只看该作者
momososo 发表于 2017-2-16 20:03
看看这段
/**
  * @brief  This function execute delay function.

嗯嗯  , 谢谢啦。我也发现这个问题啦。哎,还是对库的了解不够。看来得好好研究下库了。  太感谢啦 。

使用特权

评论回复
12
捉虫天师| | 2017-2-16 22:35 | 只看该作者
库函数都有明确的函数说明。

使用特权

评论回复
13
643757107| | 2017-2-20 19:19 | 只看该作者
用定时器做延时的话会准吗,应该有哪儿的时钟需要配置吧。

使用特权

评论回复
14
yyglucky| | 2017-7-9 16:49 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝