[技术问答] NUC029 BSP库函数设置PLL时钟代码 巨难理解

[复制链接]
889|23
 楼主 | 2019-12-4 08:43 | 显示全部楼层 |阅读模式
本帖最后由 followme001 于 2019-12-4 08:45 编辑

大家好,我的硬件是用的是NUC029LAN,外接12M晶振,用的是官网"NUC029xANBSP_CMSIS_v3.00.004",现在是套用里面文件夹SampleCode->StdDriver->GPIO_OutputInput工程里的代码,以下是它main.c里面的初始化代码,被卡在红色字体那一行,

void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/
    /* 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);   //-----------------------------------------------------------#define PLL_CLOCK           50000000最上面有宏定义为50M

    /* Enable UART module clock */
    CLK_EnableModuleClock(UART0_MODULE);

    /* Select UART module clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));

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

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


跳转到帮助文档有函数的定义:
uint32_t CLK_SetCoreClock (uint32_t u32Hclk)

Set HCLK frequency.
Parameters
[in]u32Hclkis HCLK frequency
ReturnsHCLK frequency
然后又跳到CLK_EnablePLLu32Hclk = CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HXT, u32Hclk);
uint32_t CLK_EnablePLL (uint32_t u32PllClkSrc,
uint32_t u32PllFreq
)

Set PLL frequency.
Parameters
[in]u32PllClkSrcis PLL clock source. Including :
[in]u32PllFreqis PLL frequency
ReturnsPLL frequency
然后这是用户手册里关于PLL时钟设置的计算公式:
Nuvoton.png
最后以下代码是计算什么NR  NF  NO的,以便代入
Nuvoton2.png




几个For循环看晕了,不知道最后算出来u32MinNR  u32MinNF是多少?有高手懂吗?
}

使用特权

评论回复
| 2019-12-4 13:57 | 显示全部楼层
你不要管那一堆for,那个是搜索最优配置的,当设置的最小误差为0的时候就退出了。

使用特权

评论回复
| 2019-12-4 13:58 | 显示全部楼层
那一堆是在那几个参数的范围内遍历所有的组合,看哪个组合先满足需求,就使用哪个,这个还真没法知道最后是什么,除非你打印出来,哈哈,写代码的那老哥也没法知道具体是什么。

使用特权

评论回复
| 2019-12-4 13:59 | 显示全部楼层
这就是妙处啊,所以配置时候耗费一点时间,是因为所有的参数设置不确定,只是让程序遍历所有组合。当然了,楼主如果觉得有更好的方法可以自己实现不用调用这个库函数。

使用特权

评论回复
 楼主 | 2019-12-4 14:03 | 显示全部楼层
小灵通2018 发表于 2019-12-4 13:59
这就是妙处啊,所以配置时候耗费一点时间,是因为所有的参数设置不确定,只是让程序遍历所有组合。当然了, ...

那我还是放弃用库函数来配时钟了,有用寄存器配的例子吗?

使用特权

评论回复
| 2019-12-4 14:13 | 显示全部楼层
followme001 发表于 2019-12-4 14:03
那我还是放弃用库函数来配时钟了,有用寄存器配的例子吗?

用这个就不需要你纠结内部怎么实现了啊。其实很好用,你设置多少就是多少,然后刚才那个函数帮你查找到最佳的参数配置。

使用特权

评论回复
| 2019-12-4 14:14 | 显示全部楼层
SampleCode\RegBased
目录下的这个文件夹是寄存器配置的。

使用特权

评论回复
| 2019-12-4 14:14 | 显示全部楼层
反正各有利弊,自己选。。。

使用特权

评论回复
| 2019-12-4 14:17 | 显示全部楼层
楼主没必要用这个库. nuc029lan 相当于M0516LDN. 直接用M051系列最新的bsp库. 引脚的操作也是P0-P4的

使用特权

评论回复
 楼主 | 2019-12-4 15:04 | 显示全部楼层
小灵通2018 发表于 2019-12-4 14:13
用这个就不需要你纠结内部怎么实现了啊。其实很好用,你设置多少就是多少,然后刚才那个函数帮你查找到最 ...

是么,哪个库函数配PLL输出时钟频率的?

使用特权

评论回复
 楼主 | 2019-12-4 15:05 | 显示全部楼层
Harvard 发表于 2019-12-4 14:17
楼主没必要用这个库. nuc029lan 相当于M0516LDN. 直接用M051系列最新的bsp库. 引脚的操作也是P0-P4的 ...

库基本都一样的吧,用哪款MCU就对应哪款的库。

使用特权

评论回复
 楼主 | 2019-12-4 15:17 | 显示全部楼层
小灵通2018 发表于 2019-12-4 14:13
用这个就不需要你纠结内部怎么实现了啊。其实很好用,你设置多少就是多少,然后刚才那个函数帮你查找到最 ...

你意思是,CLK_SetCoreClock(PLL_CLOCK);这个函数里,形参PLL_CLOCK是多少M,PLL频率就是多少M?

使用特权

评论回复
| 2019-12-4 15:29 | 显示全部楼层
followme001 发表于 2019-12-4 15:17
你意思是,CLK_SetCoreClock(PLL_CLOCK);这个函数里,形参PLL_CLOCK是多少M,PLL频率就是多少M? ...

是这样的 nuc029lan这款,与其他029不一样. 他就是M051的马甲.所有,  大可以用m051系列的库来开发. 用的人多. 有问题也好解决一些.而且完全是兼容51单片机的引脚模式.


另外,用新唐单片机 ,请把 <<
玩转新唐M0_M4_V1.06.pdf>> 看看 ,都有.

新唐现在的3.x库,通吃M0 M4 ,一致性还是比较好的 .

玩转新唐M0_M4_V1.06.pdf 下载地址:

http://bbs.21ic.com/forum.php?mo ... xNzA4fDEwMzY4MDI%3D

使用特权

评论回复
 楼主 | 2019-12-4 15:31 | 显示全部楼层
Harvard 发表于 2019-12-4 15:29
是这样的 nuc029lan这款,与其他029不一样. 他就是M051的马甲.所有,  大可以用m051系列的库来开发. 用的人 ...

原来这样,谢了。

使用特权

评论回复
| 2019-12-4 16:50 | 显示全部楼层
followme001 发表于 2019-12-4 15:31
原来这样,谢了。

嗯嗯 多交流  029lan用来 一箩筐了  从4.x的价格用到现在的2.x的价格.

使用特权

评论回复
| 2019-12-4 18:28 | 显示全部楼层
366675de78a2ea7a48.png
M051上是这个函数。

使用特权

评论回复
| 2019-12-4 18:29 | 显示全部楼层
344835de78a8dc7b75.png
然后根据你参数的设定范围设置对应的参数。

使用特权

评论回复
| 2019-12-4 18:45 | 显示全部楼层
675505de78e55910f0.png
查找最优参数。

使用特权

评论回复
| 2019-12-4 18:46 | 显示全部楼层
最优参数刚好的配置刚好可以满足指定的这个频率

使用特权

评论回复
 楼主 | 2019-12-5 14:50 | 显示全部楼层
dongnanxibei 发表于 2019-12-4 18:46
最优参数刚好的配置刚好可以满足指定的这个频率

嗯,NUC029跟M051函数都是一样的,很详细的图文讲解,理解了。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表