bootloader详解目录—废铁是怎么产生价值的

浅析嵌入式系统之uboot详解(1)—板子上电后uboot做了什么浅析嵌入式系统之uboot详解(2)—CPU工作模式浅析嵌入式系统之uboot详解(3)—看门狗浅析嵌入式系统之uboot详解(4.1)—内部中断浅析嵌入式系统之uboot详解(4.2)—外部中断(GPIO)浅析嵌入式系统之uboot详解(4.3)—异常和异常向量浅析嵌入式系统之uboot详解(5.1)—时钟分频浅析嵌入式系统之uboot详解(5.2)—省电模式(番外)浅析嵌入式系统之uboot详解(5.3)—PWM定时器(番外)浅析嵌入式系统之uboot详解(6)—关闭缓存和mmu浅析嵌入式系统之uboot详解(7)—初始化SDRAM



uboot详解—省电模式(番外)

  • 1. 前言
  • 2. 省电模式
  • 3. 总结


1. 前言

  可以看到标题出现了特殊的字眼—番外,原因是本篇文章的内容与uboot启动关系并不大,这篇文章将对uboot的省电模式进行分析,如果关心uboot的启动过程,可以跳过这节以及后面的小节,直接到第6章。

2. 省电模式

  省电模式和cpu的工作模式(异常)其实关系也不大,省电模式主要是依靠时钟来分类的,因为外设的工作必须要时钟,当停止给外设提供时钟的时候,相应的外设也会停止工作,所以省电管理就是根据控制是否给相应的设备提供时钟或电源来达到节电的目的。

  ARM有四中节电模式:

  • 普通模式: 这种模式下,会给所有的外设和cpu都提供时钟,当所有的外设都开启的时候,功率消耗将达到最大,我们也可以通过编程来控制给哪些外设提供时,比如一个计时器不需要使用了,用户可以通过设置CLKCON寄存器的相应位来停止对这个设备提供时钟,达到节能的目的。
  • 慢模式: 也就是关闭PLL模式,在这种模式下是不会进行倍频操作的,不像普通模式,慢模式是通过使用外部时钟(XTIPLL或EXTCLK)作为输入时钟,这个时钟是没有经过锁相环的,频率将小于(如果有设置CLKSOLW)或等于外部时钟的大小。
  • 空闲模式: 这种模式会给所有的外设提供时钟,但是不会给cpu核提供,这种模式能够减少cpu核的功率消耗,但是当有中断请求到来的时候,就会间cpu从空闲模式中唤醒。
  • 睡眠模式: 这种模式不仅会关闭cpu核的时钟,也会关闭和cpu核集成在cpu内部的其他逻辑单元,比如内部看门狗和片上内存等,但是会给片上唤醒单元提供时钟。唤醒睡眠模式需要满足两个条件,一个是给片上唤醒单元提供电流的电源,另一个是给片内的其他单元提供电流的电源,而且这个第二个电源可以控制片上其他单元的电源开闭。在睡眠模式下,可以通过EINT[15:0] 或者RTC alarm interrupt唤醒。

电源管理模块可以通过软件来控制,以达到减少系统功率消耗的目的。和电源管理相关的模块包括锁相环(PLL),时钟控制和唤醒单元。S3C2440A有4种省电模式,接下来对这4种模式进行描述。这4中模式是不能自由切换的,请看下图对4种模式的切换。

J1800 BIOS 设置省电 bios省电模式_嵌入式硬件


J1800 BIOS 设置省电 bios省电模式_寄存器_02


  在一般模式下,所有的基本外设都有可能全功的运行,包括电源管理模块,cpu核,总线控制器,内存管理器,中断控制器,DMA和外部控制器等等,但是给每一个外设的时钟,处理基本外设都能够通过软件来控制,停止时钟的提供。

  在空闲模式下,输送给cpu核的时钟是停止的,除了总线控制器,内存控制器,中断控制器和电源管理模块,如果要退出这个空闲模式,可以通过设置EINT[23:0],RTC时钟中断或者其他中断(注意,如果GPIO模块没有开启,EINT是不会生效的)

  在慢模式下,是通过使用更低的时钟和去除锁相环模块的消耗来达到节能的目的。这时锁相环是不工作的,而如果需要设置FCLK的大小,就需要通过设置CLKSLOW寄存器,但是HCLK和PCLK仍然使用过CLKDIVN寄存器来设置分频的。

  当从慢模式切换到一般模式的时候,PLL就会开启,这时外部提供的时钟仍然会经过一段锁定时间以便让输出稳定,所以当PLL启动以后,需要经过至少300us的时间才能输出稳定的时钟,而在这300us里面,FCLK时钟的大小仍然是慢时钟的大小,注意它并不一定是等于外部时钟的大小,因为有可能在慢模式下,对CLKSLOW寄存器进行了设置。
  我们可以用通过设置CLKSLOW寄存器的enable SLOW mode位来开启或关闭慢模式。

  在睡眠模式下,cpu和所有内部逻辑单元(处理唤醒单元)都将不消耗功率,唤醒睡眠模式需要两个独立的电源,一个为唤醒单元提供电流的电源,一个是给所有内部逻辑单元(不包括唤醒单元)和cpu提供电流的电源。在睡眠模式下,第二个电源将被切断。如果要从睡眠模式中醒来,可以通过触发EINT[15:0]或者RTC时钟中断。下面是进入睡眠模式需要做的操作:

  1. 设置适合睡眠模式的GPIO
  2. 设置INTMSK寄存器,屏蔽所有的中断
  3. 设置合适的唤醒源,包括RTC时钟。(设置INTMSK不屏蔽唤醒源)
  4. 将USB pads设置为挂起模式(MISCCR[13:12]=11b)
  5. 将一些重要的值保存在GSTATUS[4:3]寄存器中,这些寄存器中的值将在睡眠模式下一直保存。
  6. 在数据总线上给pull-up总线设置MISCCR[1:0]
  7. 通过清除LCDCON1的ENVID位来停止LCD
  8. 读取rREFRESH和rCLKCON寄存器来填充TLB
  9. 通过设置REFRESH[22]=1b让SDRAM进入self-refresh模式
  10. 一直等到SDRAM的self-refresh起作用
  11. 设置MISCCR[19:17]=111b,是SDRAM信号(SCLK0,SCLK1 and SCKE)在睡眠模式下受到保护
  12. 将CLKCON的SLEEP mode位置1

提示:如果系统是从NAND启动模式,硬件引脚(EINT[23:21])必须设置成input,以便从睡眠模式醒来的时候,可以启动系统。

  上面介绍了怎么进入睡眠模式,下面将介绍怎么从睡眠模式醒来。

  1. 如果有任何一个唤醒源被触发,内部reset信号将会被宣告,这个和外部nRESET引脚的信号类似,这个reset间隔由内部的16位计数逻辑单元决定,reset宣告时间的计算方法是:tRST = (65535 / XTAL_frequency)。
  2. 检查GSTATUS2[2]来判断由唤醒源导致的功率提高是否在睡眠模式下发生的
  3. 通过设置MISCCR[19:17]=000b来释放对SDRAM的信号保护
  4. 配置SDRAM的内存管理器
  5. 等待SDRAM self-refresh被释放
  6. 保存在GSTATUS[3:4]的内容可以被使用
  7. 检查SRCPND寄存器和EINTPEND寄存器

J1800 BIOS 设置省电 bios省电模式_嵌入式硬件_03


  上面这张图是睡眠模式下的电源管理图,在睡眠模式的时候,只有外设和内部电源控制单元是工作的,而cpu和其他内部逻辑单元是没有电源的,而给内部电源控制单元提供电源的是VDDalive.从图中可以看出,有两种方法可以个内部电源管理单元发送信号,一个是RTC alarm,一个是EINT,当接受到信号以后,内部电源控制单元就会发送信号给PWREN校准器,然后决定给内部单元提供怎么样的电源。

J1800 BIOS 设置省电 bios省电模式_单片机_04


上图是CLKCON寄存器的datasheet,它可以指定节电模式和设置触发中断

J1800 BIOS 设置省电 bios省电模式_stm32_05


上图是CLKSLOW寄存器的datasheet,它可以根据下图设置FCLK,HCLK和PCLK的时钟

J1800 BIOS 设置省电 bios省电模式_J1800 BIOS 设置省电_06


关于CLKDIVN寄存器前面讲过,这里就不列不来了

3. 总结

这里简单的分析了一下省电模式的一些内容,后面将继续写一个番外,了解一下RTC和PWM的东西