打印
[牛人杂谈]

IP的初始化流程

[复制链接]
1400|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
下面介绍的每个IP的初始化流程,目的是要大家了解每个IP的工作原理。一步一步讲解代码是为了介绍宏和API的使用方法。如果大家要测试某个IP,我们的BSPSampleCode\StdDriver下针对每个IP都有几个demo,大家直接跑这些demo 更方便。
芯片一般包含5种时钟源:
²  内部高速振荡器 HIRC(一般是 22.1184M,也有的是 12M 或者 16M)
²  内部低速振荡器 LIRC(一般是 10K,有的是 32K)
²  外部高速晶振 HXT(范围一般是 4~24M)
²  外部低速晶振 LXT(32K)
²  PLL
注意:有的芯片外部晶振HXT和LXT是共用引脚的。
为了省电,上电之后,默认只有HIRC是起振的,其他的晶振都需要软件使能才会起振。起振之后也不是马上供给各个IP,也需要软件使能之后该IP才会有时钟,它的寄存器才能被访问和读/写。
每个IP的初始化包括2部分,系统初始化和IP本身功能的初始化,流程如下:
1)      系统初始化
n  选择 IP 时钟源,一般有上面 5 种可以选择。如果某个 IP的时钟源不能选择,则它的时钟源就是HCLK(就是 CPU 的时钟)。选择时钟源之前,IP 默认选择的时钟源和将选择的时钟源必须都要保持使能。不然 IP 将不工作。一般 IP 默认选择的时钟都是 HIRC,如果 IP 想选择 HXT 做时钟源,必须先使能 HXT(如果没有修改过 Config0,上电后 HIRC 默认是使能的),然后 IP 才能切换时钟源。千万不能先关闭 HIRC,再切 IP 的时钟源,这样 IP 会不工作的,或者工作不正常。虽然在切时钟源的时候 IP 也许并没有工作,但是也要保证 2 个时钟源(当前选择的和将要选择的)都是使能的才能切时钟源。
注:Config0 是用户配置区寄存器,用于配置上电默认使能的时钟、启动的Flash、加密、使能 DataFlash
n  使能 IP 时钟
n  配置 MFP 寄存器(多功能引脚寄存器)
2)      最后配置 IP 的功能
每个 IP 系统初始化步骤都是一样的:选择时钟源、使能时钟、配置多功能引脚。下面的代码基本上都使用的NANO112 BSP: NANO102_112_SeriesBSP_CMSIS_V3.01.000。如果

没有特别说明,都在这个 BSP下编译。其它系列的 BSP和 NANO112的 BSP函数基本上一样,但是宏定义有些不同。不过各个IP 的使用方法大同小异,学会了使用 NANO112,其它的用起来也不难。

沙发
gejigeji521|  楼主 | 2017-4-16 09:23 | 只看该作者
系统内存映射
整个系统ROM分为4块:APROM、LDROM、Dataflash和用于配置区(config Area)。有的芯片还有 SPROM,那就有5块ROM 上电执行APROM还是LDROM中的程序由config area寄存器决定
²  APROM:一般用来放用户的程序
²  LDROM:一般用来放 ISP,可以通过 UART 或者 USB 更新 APROM 中的程序
²  Dataflash:一般用来存放用户的数据。这部分 ROM有的芯片是独立的一块,有的芯片是从
APROM中分一块,由软件决定大小
²  Configarea:用于设定上电之后芯片的一些行为,某些寄存器的缺省值是从Config area 拿的。例如:从 APROM 还是 LDROM 开始执行代码,是否使能 BOD,是否使能 dataflash 等等。
Config 区域映射如下:
有的芯片只有 CONFIG0 和 CONFIG1,有的芯片有 CONFIG0、CONFIG1、CONFIG2、 CONFIG3。具体有多少个 CONFIG 寄存器,详细请参考 TRM。

注意:Config area修改之后需要复位才能起做用。如果不用ICPtool 修改Configarea,而用软件修改,修改之后需要软件发出CHIPreset才能起做用奥!

使用特权

评论回复
板凳
gejigeji521|  楼主 | 2017-4-16 09:24 | 只看该作者
IAP
大多芯片都支持IAP功能,这个功能的好处就是:
²  如果 LDROM 不用,而 APROM 不够了,可以将程序放一部分到 LDROM中
²  如果 ISP 代码太大,LDROM 中放不下,可以放一部分到 APROM中
²  甚至程序可以不用从地址 0x00000000开始执行,从 APROM/LDROM中任意地方开始都行
大家如果对IAP感兴趣,可以看一下《AN_xxx7_IAP Application Note_xx_xxx.pdf》

使用特权

评论回复
地板
gejigeji521|  楼主 | 2017-4-16 09:25 | 只看该作者
系统初始化
系统初始化包含了时钟(clock)初始化和多功能引脚(MultiFunction Pin 简称MFP寄存器)配置。
void SYS_Init(void) 
{
    /* 解锁保护寄存器 */
    SYS_UnlockReg();/*芯片中很多寄存器是写保护的,例如PWRCTL寄存器,要写这些寄存器需要先解锁*/

    /* 使能外部高速晶振,一般范围是 (4~24 MHz) */
    CLK->PWRCTL |= (0x1 << CLK_PWRCTL_HXT_EN_Pos); // HXT Enabled  
    /* 等待外部时钟稳定,一般是12M */
    CLK_WaitClockReady( CLK_CLKSTATUS_HXT_STB_Msk);

    /* HCLK就是CPU 的时钟,切为外部晶振HXT */
    CLK->CLKSEL0 = (CLK->CLKSEL0 &~CLK_CLKSEL0_HCLK_S_Msk) | CLK_CLKSEL0_HCLK_S_HXT;  
    /* 使能UART0和UART1两个IP的时钟 */
    CLK->APBCLK |= CLK_APBCLK_UART0_EN; // UART0 Clock Enable     CLK->APBCLK |= CLK_APBCLK_UART1_EN; // UART1 Clock Enable  
    /* 选择UART时钟源 */
    CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk)  | CLK_CLKSEL1_UART_S_HXT;// 选择外部 12 MHz or 32 KHz 做时钟源

    /* 更新系统用到的变量 */
    /* PllClock, SystemCoreClock 和 CycylesPerUs   */
    SystemCoreClockUpdate();

    /* 初始化 I/O 多功能引脚 */
    /* PB13用作UART0 接收,PB14用作UART0发送 */
    SYS->PB_H_MFP &= ~(SYS_PB_H_MFP_PB13_MFP_Msk | SYS_PB_H_MFP_PB14_MFP_Msk);
    SYS->PB_H_MFP |= (SYS_PB_H_MFP_PB13_MFP_UART0_RX | SYS_PB_H_MFP_PB14_MFP_UART0_TX);  
    /* PB4用作UART1 RTS,PB5用作UART1接收,PB6用作UART1 发送,PB7用作UART1 CTS */


使用特权

评论回复
5
gejigeji521|  楼主 | 2017-4-16 09:26 | 只看该作者
默认 CPU 和内部总线以及各个 IP 大都选择内部高速晶振作为时钟源。除了极少数 IP:WDT 选择内部 10K,LCD 和 RTC 选择外部 32K.

上面的代码,使能了外部高速晶振 HXT 并将 CPU 的时钟切为外部高速晶振。同时 UART0 和 UART1 也切到 HXT 作为时钟源,并使能 UART0 和 UART1 的时钟。配置了 UART0 和 UART1 的引脚,PB13 和 PB14 分别当作 UART0 的 RX 和 TX,PB4、PB5、PB6 和 PB7 分别作为 UART1 的 RTS、RX、TX 和 CTS。

UART 如果只使用 RX 和 TX 两根脚,RTS 和 CTS 可以用作普通的 GPIO 脚。

使用特权

评论回复
6
gejigeji521|  楼主 | 2017-4-16 09:27 | 只看该作者
时钟输出功能
新唐的M0/M4一般都有时钟输出功能,用于调试内部时钟频率,或者产生时钟给其它芯片使用。
这个功能引脚一般叫CLKO/FCLK,设定寄存器是FRQDIV
Void CKO_Init() { 
/*使能FRQDIV 时钟*/
CLK->APBCLK |= CLK_APBCLK_FDIV_EN_Msk;
/*选择FRQDIV 时钟源为HCLK,从CKO输出的时钟频率将与HCLK有关*/
CLK->CLKSEL2 = (CLK-
>CLKSEL2&~(CLK_CLKSEL2_FRQDIV_S_Msk))|(CLK_CLKSEL2_FRQDIV_S_HCLK);//CKO using HCLK
/*将P3.6配置为CKO功能*/
SYS->P3_MFP &= ~( SYS_MFP_P36_Msk);
SYS->P3_MFP |= (SYS_MFP_P36_CKO);//HCLK 从P3.6输出
/*  CKO 输出的频率为 HCLK/1 */
CLK->FRQDIV = CLK_FRQDIV_DIVIDER1_Msk | CLK_FRQDIV_DIVIDER_EN_Msk; }


使用特权

评论回复
7
gejigeji521|  楼主 | 2017-4-16 09:29 | 只看该作者
上面的代码使能FRQDIV IP的时钟并选择HCLK(CPU的时钟)为时钟源,配置P3.6为CKO功能,最后配置FRQDIV寄存器将HCLK从P3.6输出。该代码可以在M051_Series_BSP_CMSIS_Rev3.00.002下编译,只要调用CKO_Init就可以从P3.6量到HCLK的时钟了。
有的芯片输出的频率至少要/2,那么输出的频率就是HCLK/2了,这个要注意看CLK IP的FRQDIV 寄存器的描述。

使用特权

评论回复
8
捉虫天师| | 2017-4-16 09:36 | 只看该作者
选择时钟源、使能时钟、配置多功能引脚,这个才是正确的流程啊,难怪有时候弄的部队。

使用特权

评论回复
9
yiy| | 2017-4-16 11:42 | 只看该作者
为了省电,上电之后,默认只有HIRC是起振的,其他的晶振都需要软件使能才会起振。
原来如此,如果不配置那就是这默认的。

使用特权

评论回复
10
稳稳の幸福| | 2017-4-16 21:42 | 只看该作者
流程很重要,学会了,每个模块的都可以配置了。

使用特权

评论回复
11
zhuomuniao110| | 2017-4-18 21:39 | 只看该作者
刚开始以为是IP地址的呢,原来是指的外设模块。

使用特权

评论回复
12
玛尼玛尼哄| | 2017-4-19 11:09 | 只看该作者
有的芯片外部晶振HXT和LXT是共用引脚的。

使用特权

评论回复
13
mintspring| | 2017-4-20 08:55 | 只看该作者
内部高速振荡器 HIRC(一般是 22.1184M,也有的是 12M 或者 16M)

使用特权

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

本版积分规则

163

主题

2132

帖子

8

粉丝