第六章 时钟和低功耗模式
- 格式:ppt
- 大小:801.00 KB
- 文档页数:13


AXI4整理
AMBAA某IProtocolVerion:2.0
序言
面向的读者:
这是AMBA(高速微控制器总线结构)A某I(高速可扩展接口)协议的说明书。主要面向想熟悉AMBA、或是想去设计与AMBAA某I协议相兼容的系统和模块的读者。
说明书的内容安排:
第一章绪论
阅读本章,你会了解到A某I协议的结构、该协议中定义的基本的交易过程。第二章信号描述
本章主要介绍A某I一些信号的定义,如:写地址通道、读数据通道、写反应通道、读地址通道、读数据通道、以及低功耗接口等所用到信号。第三章通道握手
介绍通道握手的整个过程第四章地址选择
主要讲A某I猝发类型、如何去计算地址、在一次猝发中使用字节通道传输的过程。
第五章附加的控制信息
本章主要讲怎样让A某I协议支持系统级缓存和保护单元。第六章自动访问 本章主要讲互斥访问和锁定访问第七章反应信号
主要讲A某I从模块的四种交易反应。第八章模式调整
主要讲在A某I读和写数据线上,如何处理交易大小可变的数据,以及如何用字节固定端的方式去处理混合端类型数据。第十章非对齐传输
主要讲如何使用A某I协议处理非对齐传输。第十一章时钟和复字节
主要讲述A某I时钟和复字节信号的时序。第十二章低功耗接口
主要讲如何使用A某I时钟控制接口,进入或者跳出一种低功耗的模式。第十三章A某I4
主要描述A某I协议中A某I3版本和A某I4版本技术上的不同。第十四章A某I4-Lite
主要讲述A某I4-Lite接口,它是一种简单控制寄存器类型的接口,在不需要A某I4全部功能的时候使用。
说明书中的约定如下:
●印刷字体的类型
●第四页的时序图●第四页中的信号印刷字体的类型:
斜体此类型的字体用于突出显示重要的注释,介绍专用术语,指出文中所用到的参照和引用。
加粗字体此类型的字体用于突出显示接口包含的成分,如:菜单名。指示出信号的名字。在描述列表的适当之处,也可用来表示术语。
等宽字体此类型字体指出通过键盘输入的文本,如:命令,文件,程序名,源代码。 等宽的带下滑线字体此类型的字体指出一个命令或选项可以使用它的缩写。不需要输入命令或选项的全称,输入相应下划线的部分即可。等宽斜体此类型的字体指出等宽字体文本中的参数,文本中那些地方可以用一种特殊值替换参数。
32k晶振在芯片的作用
1.引言
1.1 概述
随着电子设备的快速发展,人们对于芯片性能的要求也越来越高。而32k晶振作为一种重要的元器件,广泛应用于各种芯片中,发挥着重要的作用。
概括而言,32k晶振是一种具有稳定频率的振荡器,它能够提供可靠的时钟信号,为芯片的运行提供精确的时间基准。它的频率一般为32,768Hz,这个数值之所以选择这样的值,是因为它是一个非常重要的时间单位——1秒的2的15次方分之一。
在芯片的设计中,时间非常重要,特别是对于一些需要精确计时和时间标准的应用,如实时时钟(RTC)、定时器、计时器等。而32k晶振能够提供稳定的时钟信号,可以精确地控制芯片的工作,使得芯片在各种场合下都能够准确地完成预定的工作。
此外,32k晶振还具有低功耗的特点,这使得它在电池供电的设备中得到广泛应用。它可以有效地减少芯片能耗,延长电池的使用寿命,对于那些需要长时间运行的设备,如手表、计步器、智能穿戴设备等,32k晶振更是不可或缺的元器件之一。
总之,32k晶振在芯片中起到了至关重要的作用。它不仅提供了稳定的时钟信号,为芯片的运行提供了准确的时间基准,同时还具有低功耗的特点,能够延长设备的电池寿命。随着科技的不断发展,对于32k晶振的需求也会越来越大,未来它将在更多的领域得到广泛应用。
文章结构部分的内容如下:
1.2 文章结构
本文主要分为三个部分进行论述,并通过概述引入话题,详细介绍32k晶振在芯片中的作用。具体结构如下:
引言部分:
在引言部分,首先会对32k晶振进行概述,介绍其基本原理和在芯片中的应用。接着会明确文章的目的,即探讨32k晶振在芯片中的重要性和未来的发展趋势。
正文部分:
正文部分将分为两个小节,分别是“32k晶振的基本原理”和“32k晶振在芯片中的应用”。
2.1 32k晶振的基本原理:
在这一小节中,将详细介绍32k晶振的基本原理,包括其工作原理、结构特点等。通过对32k晶振的原理解析,读者可以对其内部构造和工作原理有一个清晰的认识。
【CPU】C-State,C-模式是什么?为了在 CPU 空闲时节约能源,可以使⽤命令让 CPU 进⼊低功耗模式。每个 CPU 都有⼏种功耗模式,它们统称为“C-State”或“C-模式”。在本⽂中,我们将介绍这些模式的内容、具体操作⽅式及其对应的⽀持处理器。低功耗模式是在486DX4处理器中⾸次引⼊的,所以这个概念远远谈不上创新。通过新模式的不断增强,CPU 的功耗也在进⼀步降低。这些模式的⼯作原理是降低 CPU 内空闲单元的时钟信号和功率。通过降低时钟信号和电压停⽌(甚⾄完全关闭)的 CPU 单元越多,功耗就越低。但是,要从休眠模式中完全“唤醒”CPU,需要花费更长时间。这些模式或“C-State”从 C0 开始,CO 表⽰“正常”的 CPU 运⾏模式(CPU 已 100% 激活)。C 后的数字越⼤,表⽰ CPU 进⼊休眠模式的程度越深。换⾔之,关闭的电路和时钟信号越多,完全唤醒 CPU 进⼊ C0 模式需要的时间越长。每个 C-State 模式均有对应名称,其中⼀些模式根据节能级别和唤醒时间不同,还具有相应⼦模式。下表汇总了当前可⽤的所有 C-State 模式。C1 到 C3 模式可通过降低 CPU 时钟信号来实现,⽽ C4 到 C6 模式则通过降低 CPU 电压来实现。⽽“增强”模式可以结合上述两种模式。Mode(模式)姓名作⽤CPUC0操作状态CPU完全打开所有CPUC1停⽌通过软件停⽌ CPU 内部主时钟;总线接⼝单元和 APIC 仍然保持全速运⾏486DX4及以上C1E增强型停⽌通过软件停⽌ CPU 内部主时钟并降低 CPU 电压;总线接⼝单元和 APIC 仍然保持全速运⾏所有socket 775 CPUC1E—停⽌所有CPU内部时钟Turion 64、65-nm Athlon X2和Phenom CPUC2停⽌授予通过硬件停⽌ CPU 内部主时钟;总线接⼝单元和 APIC 仍然保持全速运⾏486DX4及以上C2停⽌时钟通过硬件停⽌CPU内部和外部时钟仅限486DX4、Pentium、Pentium MMX、K5、K6、K6-2、K6-IIIC2E扩展的停⽌授予通过硬件停⽌ CPU 内部主时钟并降低 CPU 电压;总线接⼝单元和 APIC 仍然保持全速运⾏ Core 2Duo和更⾼版本(仅限Intel)C3睡眠停⽌所有CPU内部时钟Pentium II、Athlon以上⽀持,但Core 2 DuoE4000和E6000上不⽀持C3深度睡眠停⽌所有CPU内部和外部时钟Pentium II以上⽀持,但Core 2 Duo E4000、E6000和Turion 64上不⽀持C3AltVID停⽌所有CPU内部时钟和降低CPU电压AMD Turion 64C4更深⼊的睡眠降低CPU电压Pentium M以上⽀持,但Core 2 Duo E4000、E6000和Turion 64上不⽀持C4E/C5增强的更深⼊的睡眠⼤幅降低CPU电压并关闭内存⾼速缓存Core Solo、Core Duo和45-nm移动版Core 2 Duo⽀持C6深度电源关闭将 CPU 内部电压降低⾄任何值,包括 0 V仅45-nm移动版Core 2 Duo⽀持
首先,STM8有三种低功耗模式,即等待、活跃停机和停机。具体它们三者有什么区别自己看官方手册去吧,这里只讲停机模式的应用,其他的一笔带过! 一、进入的方式: 等待模式进入用的指令是WFI,而活跃停机和停机用的都是halt(),所不同的是,在执行halt指令之前,如果开启了AWU,则是活跃停机,反之则是停机。还有一点要说明的是,在停机模式下独立看门狗是不能养的,而只能养窗口看门狗。 二、具体进入的步骤: 1、首先,你声明一个标志位,名字自己取。这个标志位是用来判断系统是该处于运行模式还是处于停机模式的。我这里用fPowerOn_flag,如下: bool fPowerOn_flag = FALSE; 有了这个标志位以后就写下面的部分了: int main(void) { //设置内部16M晶振为系统时钟 Clk_Init(); //系统时钟初始化函数 MWWDG_Init();//窗口看门狗初始化函数 while (1) { Free_WWDG();//喂狗函数 if(fPowerOn_flag == FALSE){ Halt_OffDevice();//停机前关闭不需要的外设 halt();//进入停机模式 System_Init();//系统初始化函数 } if(fPowerOn_flag){ //运行代码在这里添加 } } } 以上就是一个停机模式的模板了,大家参照着用就可以了。系统上电默认是进入停机模式,然后通过按键唤醒进入运行模式。下面为大家讲一下主函数中每个函数的写法和功能吧! 2、各函数说明: a、时钟初始化函数: void Clk_Init(void) { CLK_DeInit();//复位时钟寄存器 CLK_HSICmd(ENABLE);//使能内部高速时钟 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);//配置内部高速时钟(时钟分频器:4分频),系统时钟4MHz CLK_ClockSecuritySystemEnable();//开启时钟安全系统 } 这个函数我想不用多讲了,大家都懂的。 b、窗口看门狗函数: void MWWDG_Init(void) { WWDG_Init(COUNTERINIT, WINDOW);//COUNTERINIT = 0x7f,WINDOW = 0x77 } 这个是窗口看门狗初始化函数。 void Free_WWDG(void) { INT8U CounterValue; CounterValue = (INT8U)(WWDG_GetCounter() & 0x7F); /* * 判断是否小于所设置的窗口上限值 * 只有小于窗口上限值才能清零 */ if(CounterValue < WINDOW){ WWDG_SetCounter(COUNTERINIT); } } 这个是窗口看门狗喂狗函数,防止看门狗复位。 c、停机前外设设置函数: void Halt_OffDevice(void) { //关闭设备前,设置系统主时钟,和中断 Clk_Init(); //CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4); ADC1_DeInit(); TIM1_DeInit(); //停机前关闭不需要的功能模块的时钟 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER3,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART2,DISABLE); GPIO_Init(GPIOA,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_SLOW); GPIO_Init(GPIOB,GPIO_PIN_HNIB,GPIO_MODE_OUT_PP_LOW_SLOW); GPIO_Init(GPIOB,GPIO_PIN_2|GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_SLOW); GPIO_Init(GPIOC,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_SLOW); GPIO_Init(GPIOC,GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,GPIO_MODE_OUT_PP_LOW_SLOW); GPIO_Init(GPIOD,GPIO_PIN_LNIB,GPIO_MODE_OUT_PP_LOW_SLOW); GPIO_Init(GPIOD,GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,GPIO_MODE_OUT_PP_LOW_SLOW); GPIO_Init(GPIOE,GPIO_PIN_LNIB,GPIO_MODE_OUT_PP_LOW_SLOW); GPIO_Init(GPIOE,GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,GPIO_MODE_OUT_PP_LOW_SLOW); GPIO_Init(GPIOG,GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_SLOW); GPIO_Init(GPIOG,GPIO_PIN_1,GPIO_MODE_OUT_PP_HIGH_SLOW); InPut_Init(); enableInterrupts(); } 这个函数主要就是在停机前设置好系统的时钟,并且关闭一切不必要的外设的时钟,如AD,定时器等等的时钟。并且最重要的是要设置好系统唤醒的条件和使能中断。对于IO口的设置,对于外设是高电平工作的,那么设置成推挽输出低,对于是低电平工作的那么设置成推挽输出高。这里说明一下,浮空输入我不知道可不可以,大家可以试试。 d、唤醒口初始化设置函数: void InPut_Init(void) { //与按键相连的引脚设置为输入模式 GPIO_Init(P_PortD,Power,GPIO_MODE_IN_PU_IT); //将PD7引脚的TLI中断设置为下降沿中断,TLI是最高优先级中断 EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_FALL_ONLY); GPIO_Init(P_PortA,CHARGE_IN,GPIO_MODE_IN_PU_IT); //将GPIOD端口设置为上升沿触发中断--因为充电器插入时产生一个高电平,拔出时产生一个下降沿 EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA,EXTI_SENSITIVITY_RISE_FALL); } 系统可以通过两个IO口里唤醒CPU,一个是按键,设置成最高优先级中断TLI,并且是下降沿中断。还有一个就是充电器插入唤醒中断,这里我的移动电源是要充电的,所以要做充电器的插入拔除检测,因此要设置成上升沿下降沿中断方式。 讲完以上的函数,大部分的功能都讲完了,剩下的就是在stm8s_it.c里面处理中断了。 按键唤醒中断处理: INTERRUPT_HANDLER(TLI_IRQHandler, 0) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ delay_ms(20);//延时消抖 if(!GPIO_ReadInputPin(P_PortD,Power)){ delay_ms(20); time_count = 0; if(fPowerOn_flag == FALSE){ fPowerOn_flag = TRUE; } else{ if(fExitDCPower_flag == FALSE) fPowerOn_flag = FALSE; } } } 首先是20ms的延时,然后再次检测IO口的电平,如果为低,那么说明按键按下了,再延时20ms。然后处理系统工作的标志位。如果系统在停机模式,那么按下按键以后,系统进入工作模式;反之,系统进入停机模式。这里说明一下,那个else里面的处理要加入一个限制条件,就是在运行模式下再次按下唤醒按键时,要先判断充电器有没有插入,如果没有插入,则系统进入停机模式,如果插入了,系统则不处理,继续保持运行模式对电池充电。 充电器插入唤醒中断处理: INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler,3) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ delay_ms(20); if(GPIO_ReadInputPin(P_PortA,CHARGE_IN)){ delay_ms(20); if(fPowerOn_flag == FALSE) fPowerOn_flag = TRUE; if(fExitDCPower_flag == FALSE) fExitDCPower_flag = TRUE; } else{ delay_ms(20); if(fExitDCPower_flag == TRUE) fExitDCPower_flag = FALSE; } } 这里的话我相信大家也应该看得懂的,就不多言了! 好了,今天就讲到这里了。我想已经讲得够详细了吧,还有什么问题的话可以发邮件给我。我的邮箱是****************!拜拜,新的一年祝大家身体健康、工作顺利! 以下是附加文档,不需要