打印
[技术问答]

请教M451示例程序开头的初始化问题

[复制链接]
2107|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
59387033|  楼主 | 2015-1-20 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ck, pd, rc, UART, se
基本所有的程序开头都包含了如下:
/* 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();
而其中的sys_init又包含如下
    /* Enable HIRC clock (Internal RC 22.1184MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

    /* Wait for HIRC clock ready */
    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

    /* Select HCLK clock source as HIRC and and HCLK clock divider as 1 */
    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

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

    /* Wait for HXT clock ready */
    CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

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

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

    /* Select UART module clock source as HXT and UART module clock divider as 1 */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));

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

    /* Set PD multi-function pins for UART0 RXD(PD.6) and TXD(PD.1) */
    SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD6MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk);
    SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD6MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD);
我想请教,这么繁琐的过程有无必要性?
初始化过程中的各个步骤有何实际意义?如果不这么做可能会导致什么问题?
特别是先打开寄存器,系统初始化后紧接着又锁定寄存器,为什么?
沙发
tcchiu1| | 2015-1-20 10:26 | 只看该作者
程序只有一点点,建议还是参考官方的流程。不然时钟源设定错误,debug又花更多时间。
锁定寄存器是怕系统跑飞,重要的寄存器被修改到,导致系统死机。不过我的程序都是打开寄存器,目前量产二年了,都没有什麽遇到问题。

使用特权

评论回复
板凳
gaoyang9992006| | 2015-1-20 13:32 | 只看该作者
那个不是繁琐,只是起名字起的长,因为内部寄存器太多了,如果你理解他们,建议使用库比较好,方便移植,你写的程序别人也能看懂。

使用特权

评论回复
地板
mintspring| | 2015-1-20 23:01 | 只看该作者
那个是库函数,你管他内部如何做的干啥,你就知道接口都让你干啥就行了。

使用特权

评论回复
5
zxf0168| | 2015-1-21 09:59 | 只看该作者
其实应该了解一点寄存器的知识,库函数不形象

使用特权

评论回复
6
gaoyang9992006| | 2015-1-21 13:01 | 只看该作者
楼主不要管库函数里面怎么做的,那个都是经过测试的,没问题,认真记得形参列表就行了。

使用特权

评论回复
7
59387033|  楼主 | 2015-1-21 13:15 | 只看该作者
谢谢大家的回答,但是我觉得有点跑题,函数的内部具体实现,我自己看下了解下就行了,
但是由于我对单片机不熟,我不知道程序开头的各项初始化工作的实际意义,我像我问的那样,假设不这么做,可能会出现什么情况,
这么做的目的在于什么?
还请各位前辈指教

使用特权

评论回复
8
598330983| | 2015-1-22 20:00 | 只看该作者
解锁寄存器,这样可以对寄存器初始化,然后修改寄存器配置,配置好了,防止错误的修改寄存器,就锁定寄存器,禁止修改。这样只关注你后面的应用代码,如果需要修改寄存器,重新解锁。

使用特权

评论回复
9
598330983| | 2015-1-22 20:00 | 只看该作者
这是库函数给出的一种安全措施。因为你不知道什么库函数会修改寄存器。

使用特权

评论回复
10
mintspring| | 2015-2-28 07:38 | 只看该作者
有必要啊,那串口的配置

使用特权

评论回复
11
lijiankun| | 2015-3-23 22:54 | 只看该作者
这是对系统时钟的配置,单片机要能正常工作,必须要配置好时钟,时钟是单片机能正常工作的源头。还有各个模块的时钟,像串口的时钟,USB的时钟,SPI的时钟,都是一样的,没有正确的时钟,系统就会瘫痪,不能正常工作的。还有时钟决定着单片机的运行速度,时钟频率越高,单片机运行速度越快,当然这个一般是有上线的

使用特权

评论回复
12
ccw1986| | 2015-3-24 20:47 | 只看该作者
那个是库函数,你管他内部如何做的干啥,你就知道接口都让你干啥就行了。

使用特权

评论回复
13
cowboy2014| | 2015-3-25 15:56 | 只看该作者
楼主学着给打个包吧

使用特权

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

本版积分规则

6

主题

26

帖子

0

粉丝