系统初始化包含了时钟(clock)初始化和多功能引脚(Multi Function 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 做时钟源
/* Update System Core Clock */ /* 可以通过 SystemCoreClockUpdate() 来自动计算 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 */ 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(); }

新唐的M0/M4一般都有时钟输出功能,用于调试内部时钟频率,或者产生时钟给其它芯片使用。这个功能引脚一般叫CKO,设定寄存器是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; }

有的芯片输出的频率至少要/2,那么输出的频率就是HCLK/2了,这个要注意看CLK IP的FRQDIV寄存器的描述。

新唐有些芯片可以用外部32K trim内部HIRC。一般HIRC全温度范围误差2%左右,在有些场合这个精度不够,这时候就可以用外部32K来trim内部HIRC,trim之后HIRC精度可以达到0.25%左右。Trim功能一旦使能就一直在工作,不会停止。如果外部32K晶振出错,trim就会停止,并发生中断。所以需要在中断里面重新启动trim功能。

/*LXT 时钟出错或者尝试次数达到限制将发生中断*/
void HIRC_IRQHandler(void) {
uint32_t u32IRCStatus;
/*清除中断标志*/
u32IRCStatus = SYS->IRCTRIMINT;
SYS->IRCTRIMINT = u32IRCStatus;
/*重新启动trim功能*/
SYS->IRCTRIMCTL = SYS_IRCTRIMCTL_LOOP_32CLK| SYS_IRCTRIMCTL_TRIM_12M;
}
/*使能trim功能*/
void SYS_EnableAutoTrim() {
/*取32个32K时钟周期的平均值来trim HIRC*/
SYS->IRCTRIMCTL = SYS_IRCTRIMCTL_LOOP_32CLK| SYS_IRCTRIMCTL_TRIM_12M;
/*一旦出错将发生中断*/
SYS->IRCTRIMIEN = SYS_IRCTRIMIEN_32KERR_EN | SYS_IRCTRIMIEN_FAIL_EN; NVIC_EnableIRQ(HIRC_IRQn);
}

只要调用SYS_EnableAutoTrim就可以使能Auto trim功能来trim HIRC了。

新唐的芯片一般有3种复位方式:CPU reset、Chip reset和System reset
 CPU reset:就是将CPU执行指针PC直接指到0的地方重新执行程序
 Chip reset:就是整个芯片复位,类似于POR上电复位的方式,让程序重新执行
 System reset:类似于Chip reset,除了不复位晶振电路和Config Area的值不会重新加载,其它的电路都会被复位
我们常用System reset切到APROM运行,或者切到LDROM运行。系统上电从APROM运行还是从LDROM运行由Config area决定,但是有时侯软件希望切到某个区域运行,这时候用System reset比较好。其实用CPU reset也可以,但是System reset的好处是它会将所有的IP都复位,防止它们在新的程序里面乱动作。

新唐M0 M4系统初始化的更多相关文章

  1. 基于MDK的ARM-GCC开发环境建立及新唐M0的HID类设备的C++开发

    一,下载安装测试arm-none-eabi-gcc编译工具链 1,查看arm-none-eabi-gcc编译工具版本        打开网页:https://sourcery.mentor.com/G ...

  2. 新唐M0 ISP下载要点

    http://blog.csdn.net/rejoice818/article/details/7736029 一.注意:官方光盘内“Software Utilities”目录下,可找到ICP或ISP ...

  3. 新唐M0特点分析

    1,价格低,05x系列0.6-1.5美金,1xx系列1.5-3.5美金:2,性能好,最新32位CORTEX-M0的ARM核,唯一可工作到+5.5V的CORTEX-M0:3,速度快,CPU核能跑到50M ...

  4. 基于新唐M0的XXTEA加密解密算法源码

    /*-------------------------------------------------------------------------------------------------- ...

  5. M0 M4之GPIO初始化

    新唐所有的M0/M4芯片基本上所有的IO都可以发生中断,为了符合大家的习惯还是有所谓的外部中断EINT0和EINT1.有2跟GPIO脚可以配置为EINT0功能和EINT1功能,分别将发生EINT0中断 ...

  6. M0 M4之UART初始化

    新唐的M0/M4 UART都有16级或者64级FIFO,用来缓存UART数据的收/发.例如:如果RX FIFO中断触发级别设为14,UART接收14个字节才会发生RDA(接收数据可得)中断.这样可以降 ...

  7. M0 M4之Timer初始化

    新唐的定时器一般有很多功能:普通的定时功能,事件计数功能,捕获功能,超时触发ADC等等.大家如果感兴趣可以读一下<NANOB Timer功能介绍以及在弱灌注中的应用.pdf>,虽然各个系列 ...

  8. 新唐ARM9之NUC972学习历程之系统的搭建和BSP包的使用

    说到嵌入式,我们首先想到的,就是它的复杂程度,LINUX,BSP,UBOOT,交叉编译,寄存器配置,等等一系列的问题,甚至有的时候我们对此一头雾水,很是头疼,不过我们今天要说的就是关于NUC972的一 ...

  9. 新唐的开发环境的搭建,驱动以及BSP

    https://www.keil.com/demo/eval/arm.htm#DOWNLOAD1,MDK-ARM的IDE集成开发环境:mdk512.exehttp://www.keil.com/fid ...

随机推荐

  1. 通过Windows PowerShell远程管理计算机(精简版)

    现在你手中有一台server(主控端),你打算通过主控端远程管理多台server(被控端).这个过程可以通过Windows PowerShell来完成. 首先在被控端上以管理员权限打开PowerShe ...

  2. Android——电脑蓝屏重启后,studio无法认出Android环境 setup JDK(缓存!缓存!缓存)

    电脑蓝屏重启后,studio无法认出Android环境 setup JDK 问题重现:因为工作问题,需要用到模拟器,然后创建了模拟器后开启了漫长的等待之旅,两三分钟之后win8蓝屏,重启,再次打开,依 ...

  3. [Django学习]Ajax访问静态页面

    Web开发中常用的一种开发方式是:通过Ajax进行系统的交互,采用Ajax进行交互的时候,更多的时候传输的是JSON格式的数据. 所以开发中我们需要将数据格式转化成JSON,请参见:https://w ...

  4. hibernate不调用save也保存上了

    List<Instrument> insts = instService.search(search); if (insts.size() == 1) { Instrument inst ...

  5. 百万级PHP网站架构工具箱

    在了解过世界最大的PHP站点,Facebook的后台技术后,今天我们来了解一个百万级PHP站点的网站架构:Poppen.de.Poppen.de是德国的一个社交网站,相对Facebook.Flickr ...

  6. jquery easyui datagrid 动态 加载列

    实现方式: 首先根据输入的sql语句获得相关的列名称返回给前台,然后在datagrid中动态加载列,接着根据查询条件(包括sql语句)获取相关的记录返回给前台用于填充datagrid.从而实现类似or ...

  7. 统一建模语言 UML (2)

    UML的图 1.用例图(use case diagram) 用例图(Use Case Diagram)是被称为参与者(Actor)的外部用户所能观察到的系统功能的模型图 列出系统中的用例和参与者 显示 ...

  8. openfire安装配置完全教程

    Java领域的IM解决方案 Java领域的即时通信的解决方案可以考虑openfire+spark+smack. Openfire是基于Jabber协议(XMPP)实现的即时通信服务器端,最新版本是3. ...

  9. Can't connect to MySQL server on '192.168.7.175' (10060)

    原因: 1.你的ip没有被授权,无法访问. 2.端口没有打开(如:3306端口没有打开). 解决方法: 授权(http://www.cnblogs.com/SZxiaochun/p/6401424.h ...

  10. C#代理多样性

    一.代理 首先我们要弄清代理是个什么东西.别让一串翻译过来的概念把大家搞晕了头.有的文章把代理称委托.代表等,其实它们是一个东西,英文表述都是“Delegate”.由于没有一本权威的书来规范这个概念, ...