系统初始化包含了时钟(clock)初始化和多功能引脚(Multi Function Pin 简称MFP寄存器)配置。void SYS_Init(void) {

  1.  
  1. /* 解锁保护寄存器 */
  2. SYS_UnlockReg();
  3.  
  4. /*芯片中很多寄存器是写保护的,例如PWRCTL寄存器,要写这些寄存器需要先解锁*/
  5.  
  6. /* 使能外部高速晶振,一般范围是 (4~24 MHz) */
  7. CLK->PWRCTL |= (0x1 << CLK_PWRCTL_HXT_EN_Pos); // HXT Enabled
  8.  
  9. /* 等待外部时钟稳定,一般是12M */
  10.  
  11. CLK_WaitClockReady( CLK_CLKSTATUS_HXT_STB_Msk);
  12.  
  13. /* HCLK就是CPU 的时钟,切为外部晶振HXT */
  14. CLK->CLKSEL0 = (CLK->CLKSEL0 &~CLK_CLKSEL0_HCLK_S_Msk) | CLK_CLKSEL0_HCLK_S_HXT;
  15.  
  16. /* 使能UART0和UART1两个IP的时钟 */
  17. CLK->APBCLK |= CLK_APBCLK_UART0_EN;
  18.  
  19. // UART0 Clock Enable
  20. CLK->APBCLK |= CLK_APBCLK_UART1_EN;
  21.  
  22. // UART1 Clock Enable
  23. /* 选择UART时钟源 */
  24. CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk) | CLK_CLKSEL1_UART_S_HXT;// 选择外部 12 MHz or 32 KHz 做时钟源
  25. /* Update System Core Clock */
  26.  
  27. /* 可以通过 SystemCoreClockUpdate() 来自动计算 PllClock, SystemCoreClock 和 CycylesPerUs */
  28.  
  29. SystemCoreClockUpdate();
  30. /* 初始化 I/O 多功能引脚 */
  31. /* PB13用作UART0 接收,PB14用作UART0发送 */
  32. SYS->PB_H_MFP &= ~(SYS_PB_H_MFP_PB13_MFP_Msk | SYS_PB_H_MFP_PB14_MFP_Msk);
  33.  
  34. SYS->PB_H_MFP |= (SYS_PB_H_MFP_PB13_MFP_UART0_RX | SYS_PB_H_MFP_PB14_MFP_UART0_TX);
  35.  
  36. /* PB4用作UART1 RTS,PB5用作UART1接收,PB6用作UART1 发送,PB7用作UART1 CTS */
  37.  
  38. 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);
  39.  
  40. 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);
  41.  
  42. /* 重新加锁 */
  43. SYS_LockReg();
  44.  
  45. }

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

  1. Void CKO_Init() {
  2. /*使能FRQDIV 时钟*/
  3. CLK->APBCLK |= CLK_APBCLK_FDIV_EN_Msk;
  4. /*选择FRQDIV 时钟源为HCLK,从CKO输出的时钟频率将与HCLK有关*/
    CLK->CLKSEL2 = (CLK->CLKSEL2&~(CLK_CLKSEL2_FRQDIV_S_Msk))|(CLK_CLKSEL2_FRQDIV_S_HCLK);//CKO using HCLK
  5.  
  6. /*将P3.6配置为CKO功能*/
  7. SYS->P3_MFP &= ~( SYS_MFP_P36_Msk); SYS->P3_MFP |= (SYS_MFP_P36_CKO);
  8. //HCLK 从P3.6输出 /* CKO 输出的频率为 HCLK/1 */
  9. CLK->FRQDIV = CLK_FRQDIV_DIVIDER1_Msk |
  10.  
  11. 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功能。

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

只要调用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. [转]好用工具:Oracle SQL Developer

    我們一直以來就很少使用 Oracle 資料庫,一年下來也頂多 1 ~ 2 個案子採用 Oracle 的資料庫,所以一直都對 Oracle 資料庫的操作不太熟悉,尤其是用 Oracle 內建的那些超難用 ...

  2. PHP MysqlI操作数据库

    1连接数据库. //procedural style $mysqli = mysqli_connect('host','username','password','database_name'); / ...

  3. 【Unity笔记】UGUI中Canvas屏幕适配

    1.通过RectTransform中的Anchors和Pivot来进行控件和窗体的布局适配. Anchors控制当前Panel相对于父窗体的布局位置,可以设置为居中或者左上角,当父窗体拉伸的时候当前P ...

  4. SpringMVC 利用AbstractRoutingDataSource实现动态数据源切换

    SpringMVC 利用AbstractRoutingDataSource实现动态数据源切换 本文转载至:http://exceptioneye.iteye.com/blog/1698064 Spri ...

  5. Android——RadioGroup和CheckBox

    xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  6. 【高可用HA】Nginx (1) —— Mac下配置Nginx Http负载均衡(Load Balancer)之101实例

    [高可用HA]Nginx (1) -- Mac下配置Nginx Http负载均衡(Load Balancer)之101实例 nginx版本: nginx-1.9.8 参考来源: nginx.org [ ...

  7. /usr/include/glib-2.0/glib/gtypes.h:34:24: fatal error: glibconfig.h: No such file or directory

    cc -DDEBUG -mtune=core2 -O2 \ -onvideo nvideo.c \ -I/usr/include/atk-1.0 \ -I/usr/include/cairo \ -I ...

  8. jquery轮播控件

    网上找了一个轮播控件,效果不错,而且很容易改,需要的同学去下载咯 地址是:http://download.csdn.net/detail/jine515073/7704143

  9. Integer与int有什么区别?

      Integer与int有什么区别?       由于面试的时候问到这个问题,所以就网上百度一下,发现一个大神说得非常好,非常清楚,所有就博文复制过来供“自己学习”.(这不是原文,原文底下有链接) ...

  10. 释放Ubuntu/Linux系统cache,增加可用内存空间

    某台式机Ubuntu内存共3G,但free的内存只有200M,无法满足scala的jvm需求. 注意用top命令查看才能看到真正的free内存.下面是查看真正内存使用量的另一种命令. watch -n ...