[牛人杂谈]

IAP与系统初始化

[复制链接]
2925|6
手机看帖
扫描二维码
随时随地手机跟帖
zhuomuniao110|  楼主 | 2016-5-15 11:44 | 显示全部楼层 |阅读模式
IAP
大多芯片都支持IAP功能,这个功能的好处就是:
        如果 LDROM 不用,而 APROM 不够了,可以将程序放一部分到 LDROM 中
        如果 ISP 代码太大,LDROM 中放不下,可以放一部分到 APROM 中
        甚至程序可以不用从地址 0x00000000 开始执行,从 APROM/LDROM 中任意地方开始都行
大家如果对IAP感兴趣,可以看一下《AN_xxx7_IAP Application Note_xx_xxx.pdf》


弱弱的问一下,谁有这个PDF,发来看看。

zhuomuniao110|  楼主 | 2016-5-15 11:45 | 显示全部楼层
系统初始化包含了时钟(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 */


使用特权

评论回复
zhuomuniao110|  楼主 | 2016-5-15 11:45 | 显示全部楼层
SYS->PB_L_MFP &= ~(SYS_PB_L_MFP_PB4_MFP_Msk | SYS_PB_L_MFP_PB5_MFP_Msk | 
                       SYS_PB_L_MFP_PB6_MFP_Msk | SYS_PB_L_MFP_PB7_MFP_Msk);
    SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB4_MFP_UART1_RTS | SYS_PB_L_MFP_PB5_MFP_UART1_RX |
                      SYS_PB_L_MFP_PB6_MFP_UART1_TX  | SYS_PB_L_MFP_PB7_MFP_UART1_CTS);  
    /* 重新加锁 */
    SYS_LockReg();

}
默认 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脚。

使用特权

评论回复
zhuomuniao110|  楼主 | 2016-5-15 11:46 | 显示全部楼层
时钟输出功能
新唐的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; }

上面的代码使能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 寄存器的描述。


使用特权

评论回复
zhuomuniao110|  楼主 | 2016-5-15 11:49 | 显示全部楼层
复位
新唐的芯片一般有3种软件复位方式:CPU reset、Chip reset和System reset
²  CPUreset:就是将 CPU执行指针 PC直接指到 0的地方重新执行程序,其它外设都不复位
²  Chipreset:就是整个芯片复位,类似于 POR(poweron reset)上电复位的方式,让程序重新执行
²  Systemreset:类似于 Chipreset,除了不复位晶振电路和 ConfigArea 的值不会重新加载,其它的电路都会被复位
我们常用System reset切到APROM运行,或者切到LDROM运行。系统上电从APROM运行还是从 LDROM运行由Config area决定,但是有时侯软件希望切到某个区域运行,这时候用System reset比较好。其实用CPU reset也可以,但是System reset的好处是它会将所有的IP都复位,防止它们在新的程序里面乱动作。

使用特权

评论回复
zhuomuniao110|  楼主 | 2016-5-15 11:49 | 显示全部楼层
低压检测和复位
低压复位一般有3个东西:BOD、LVR、POR
所谓BOD就是低电压检测,类似于家里电压不稳时,灯闪烁。LVR也是低电压检测。BOD的好处是它有多个电压可以选择,LVR一般是固定的电压。
POR就是上电复位,需要很低的电压才会触发它,一般是0.2V。就是电压掉到0.2V以下,才会触发POR复位;或者系统刚上电时也是POR负责复位所有的逻辑。
有的MCU BOD和LVR都有,有的只有BOD。一般LVR和BOD总要使能一个,在掉电的时候做复位。否则,例如电压掉到1.2V又升到3.3V,MCU可能会工作不正常,这时候就要靠BOD或者LVR 起作用了。
NANOBN 只有BOD,如果软件关闭了BOD,那要掉到约0.2V(LDO)才会触发POR复位。
NUC100 BOD和LVR都有。
其它系列大家可以细看TRM中的描述。

使用特权

评论回复
wanduzi| | 2018-9-26 22:36 | 显示全部楼层

使用特权

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

本版积分规则

188

主题

3237

帖子

10

粉丝