STM32L053C8 MCU上的低功耗模式详解

发布者:JoyfulSpirit5最新更新时间:2024-09-18 来源: elecfans关键字:MCU  低功耗模式 手机看文章 扫描二维码
随时随地手机看文章

意法半导体(STMicroelectronics)的超低功耗MCU系列采用低泄漏技术和优化设计,以实现出色的低电流消耗,使其非常适合电池供电和能量收集应用。为了充分利用这些器件的低功耗功能,有必要知道可用的低功耗模式,如何配置它们以及最适合哪些任务。本文概述了STM32L053C8 MCU上的低功耗模式。但是,由于该系列的低功耗模式相同,因此可以使用任何STM32L0器件。 STM32L1系列和STM32L4系列还包括在超低功耗系列中。这些器件是性能更高的产品,具有更高级的内核,更多的内存和更多的外围设备。它们具有与L0系列相同的低功耗模式(对于L4系列,还具有一些其他功能),因此,本文也是从了解L4系列的好入门。图1摘自ST的宣传册之一,简要总结了L0、L1和L4系列的功能和优点。


当使用ST的MCU进行任何工作时,应该有两个可用的文档。首先是参考手册,对于STM32L053C8,则是STM32L0x3参考手册。本文档包含有关STM32L0x3系列的详细信息,即如何使用存储器和外设集。有关产品线中特定设备的更多详细信息,例如引脚映射、电气特性和封装信息,应使用数据表作为参考。就低功耗模式而言,参考手册将明确详细说明如何进入和退出它们,而数据手册将专门定义外围设备的可用性、可能的唤醒源和电流消耗估算。


背景介绍

STM32L0基于Cortex-M0 +内核,这意味着其低功耗功能取决于该内核的电源管理功能。可以使用系统控制块中的系统控制寄存器(SCR)来配置这些功能。不幸的是,参考手册或数据表中都没有记录内核寄存器。 ST则为那些寻求有关Cortex-M0 +的简洁文档的人员提供了STM32L0系列Cortex-M0 +编程手册。有关Cortex-M0、M0 +和M1内核的完整文档,可以在《 ARMv6-M体系结构参考手册》中找到。这两个文档都有一个关于电源管理的部分,这是开始本主题的好地方。


如图2所示,SCR由三位组成:SEVONPEND、SLEEPONEXIT和SLEEPDEEP。 SEVONPEND(发送事件在待命状态)位允许中断进入待命状态以触发唤醒事件。请注意,如果未在NVIC中启用这些中断,则仍会产生唤醒事件,但不会输入ISR。有关未决中断,使能中断或一般而言NVIC的更多信息,请参见前述Cortex-M0 +手册中的“嵌套向量中断控制器”部分。 SLEEPONEXIT位提供了一个选项,可以在异常恢复后使处理器继续执行程序之前将处理器置于低功耗模式。对于仅需要唤醒服务中断的应用程序来说,这是理想的选择。最后,SLEEPDEEP位允许进入深度睡眠状态,而不是常规睡眠状态。利用Cortex-M0 +内核的芯片制造商可以确定这些状态下设备的确切性能。睡眠状态用作睡眠模式和低功耗睡眠模式的基础,而深度睡眠状态用作停止模式和待机模式的基础。

有三种方法可以在Cortex-M0 +上进入低功耗模式。第一种是使用WFI(等待中断)指令。顾名思义,如果设备由于该指令而进入低功耗模式,则中断(在NVIC中启用)能够唤醒设备。进入低功耗模式的第二种方法是执行WFE(等待事件)指令。这与WFI指令非常相似,但具有更大的灵活性。不仅可以通过扩展中断和事件控制器(EXTI)中配置的事件唤醒设备,还可以通过NVIC中禁用的中断(只要它们在相应的外设控制寄存器中启用)唤醒。已经提到了进入低功耗模式的第三种方法。通过将SCR中的SLEEPONEXIT位置1,异常返回将使设备进入低功耗模式,就像执行WFI指令一样。请注意,在所有这些情况下,仅当没有中断或事件挂起时才进入低功耗模式。由于不能保证WFI和WFE会中止程序执行,因此通常将它们称为“提示指令”。


值得一提的最后一个内核寄存器是PRIMASK寄存器。它仅包含一个可配置位PM(可优先中断屏蔽),如果将其设置为1,它将禁用所有具有可配置优先级的中断。如果首先需要将系统恢复到工作状态,这不仅可以用于执行原子操作,而且可以延迟执行ISR。在详细说明停止模式的部分中将提供一个示例。


为了使程序员在开发C应用程序时轻松访问WFI和WFE指令,CMSIS-CORE标准提供了__WFI()和__WFE()函数。以下各节中的所有示例函数都使用__WFI()执行WFI指令并进入低功耗模式。另外,CMSIS不会直接提供对PRIMASK寄存器的访问,而是实现__disable_irq()和__enable_irq()函数,以便分别设置和清除PM位。为了检查PM位的状态,__ get_PRIMASK()函数将返回其当前状态。大多数IDE使将CMSIS驱动程序添加到项目变得非常简单。例如,在Keil中,请确保在包安装程序中安装了ARM :: CMSIS,并在创建新项目时在运行时环境管理器中仅检查“ CORE”包(在CMSIS组件)。


低功耗模式(Low-Power)

STM32L0器件实现了五种低功耗模式:低功耗运行模式、睡眠模式、低功耗睡眠模式、停止模式和待机模式。这些模式之间的差异可以用功耗,性能、唤醒时间和唤醒源来描述。如果对于这些参数中的每一个,将模式按从最佳(1)到最差(5)的顺序进行排序,则可以清楚地了解哪些取舍。一般而言,随着功耗的下降;性能下降,唤醒时间增加,唤醒源数量减少。表1总结了低功耗模式的排名。作为、示例,请考虑低功耗运行模式。它具有最佳的性能、最多的唤醒源,第二快的唤醒时间和第四低的电流消耗。

表1:基于各种工作参数的STM32L0低功耗模式的排列

在本节中,将很清楚如何得出这些排名。但是,重要的是要及早意识到它们仅在一般意义上是正确的。例如,停止模式完全有可能比低功耗睡眠模式消耗更多电流,这取决于它们的配置以及启用/禁用的外设。但是通常情况并非如此,因为停止模式对设备功能的限制远比低功耗睡眠模式所限制,以节省更多功率。


低功耗运行模式(Low-Power Run)

将其作为低功耗模式推销是相当诱人的,因为它节省能耗的主要方法是要求较低的系统时钟频率。将任何微控制器的时钟速度降低到千赫兹范围将极大地降低电流消耗,使其与普通睡眠模式相比更具竞争力。但是,通常不这样做的原因是,从长远来看,性能的降低以及静态电流消耗(不取决于时钟频率)会消耗更多的能量。取决于应用,即正在使用哪种睡眠模式或设备唤醒的频率,在较短的时间段内消耗更多的电流而不是在较长的时间段内消耗较少的电流可能更有效。 ST之所以可以将其分类为低功耗模式,是因为它们提供了将内部稳压器置于低功耗状态的能力。这将减少设备消耗的静态电流,从而将其对性能与总电流消耗之间的折衷影响降至最低。


为了将调节器切换到低功耗模式,必须满足两个条件。首先,调节器电压(VCORE)必须在2范围内。幸运的是,根据PWR_CR寄存器文档,这是调节器的默认配置。因此,除非利用器件的动态电压缩放功能,否则无需担心此先决条件。第二个条件是系统频率不超过fMSI范围1。根据MSIRANGE位的描述(在RCC_ICSCR寄存器中),它对应于大约131.072 kHz的频率。在这种速度和功率水平下,USB,ADC和TSC(触摸感应控制器)外围设备不可用。更改系统频率后,必须重新初始化之前在运行模式下初始化的所有与频率相关的外围设备(USART、计时器等),以便继续正常运行。


与其他低功耗模式不同,CPU不会在低功耗运行模式下停止。这意味着它不是通过前面讨论的WFI / WFE指令输入的,而是通过设置PWR_CR寄存器中的LPSDSR(低功耗睡眠-深度/睡眠/低功耗运行)和LPRUN(低功耗运行)位来输入的。 。请注意,必须在设置LPRUN之前设置LPSDSR,在清除LPSDSR之前必须清除LPRUN,并且在进入任何其他低功耗模式之前应清除LPRUN。由于程序在低功耗运行模式下继续执行,因此该设备被软件“唤醒”,而不是局限于有限的一组中断或事件。只需清除LPRUN位并使系统频率恢复到全速,即可使系统返回运行模式。清单1显示了使用参考手册中概述的步骤进入低功耗运行模式的整个过程。清单2演示了当设备不再需要处于低功耗运行模式时如何重新进入运行模式。


清单1:进入低功耗运行模式的示例

void enter_LPRun( void )

{

/* 1. Each digital IP clock must be enabled or disabled by using the

RCC_APBxENR and RCC_AHBENR registers */

RCC->APB1ENR |= RCC_APB1ENR_PWREN;

/* 2. The frequency of the system clock must be decreased to not exceed the

frequency of f_MSI range1. */

Config_SysClk_MSI_131();

// Reinitialize peripherals dependent on clock speed

USART1_Init();

SysTick_Init( 0.001 );

I2C1_Init();

/* 3. The regulator is forced in low-power mode by software

(LPRUN and LPSDSR bits set ) */

PWR->CR &= ~PWR_CR_LPRUN; // Be sure LPRUN is cleared!

PWR->CR |= PWR_CR_LPSDSR; // must be set before LPRUN

PWR->CR |= PWR_CR_LPRUN; // enter low power run mode

}

清单2:进入运行模式的示例

void enter_Run( void )

{

/* Enable Clocks */

RCC->APB1ENR |= RCC_APB1ENR_PWREN;

/* Force the regulator into main mode */

// Reset LPRUN bit

PWR->CR &= ~( PWR_CR_LPRUN );

// LPSDSR can be reset only when LPRUN bit = 0;

PWR->CR &= ~( PWR_CR_LPSDSR );

/* Set HSI16 oscillator as system clock */

Config_SysClk_HSI16();

// Reinitialize peripherals dependent on clock speed

USART1_Init();

SysTick_Init( 0.001 );

I2C1_Init();

}

睡眠模式(Sleep Mode)

睡眠模式是低功耗模式中最简单的一种,它以最省电的方式提供最短的唤醒时间。数据手册指出,在禁用所有外设且系统频率为16 MHz的情况下,将消耗约1 mA的电流。这远高于其他低功耗模式,后者可以实现微安或什至纳安的数量级。但是,唤醒时间几乎是最具竞争力的低功耗模式的十倍。表2显示了设备从每种低功耗模式唤醒并进入运行模式所花费的时间。唤醒时间的值取自数据表的表4。

表2:每种低功耗模式的唤醒到运行模式时间

在休眠模式下,所有外设继续运行时,仅内核停止运行。由于不必降低系统频率并且所有设备的外围设备都可以使用,因此这使进入睡眠模式几乎毫不费力。同样,退出休眠模式非常容易,因为在运行模式下可用的任何中断或事件都可以唤醒设备并以极低的延迟进行服务。因此,几乎在CPU处于自旋锁等待事件发生的任何情况下都可以使用睡眠模式。用户无需进入繁忙等待循环,只需执行WFI或WFE(取决于唤醒方法)即可暂停执行并节省功耗,直到再次需要内核为止。这是因为SCR默认情况下配置为睡眠模式,即SLEEPDEEP位被清除。对于只需要CPU处理中断的应用,将SLEEPONEXIT位置1并在处理完中断后始终进入睡眠模式更为有意义,这与恢复程序执行相反。

清单3是可用于进入睡眠模式的函数示例。因为此函数取自使用多个低功耗模式的程序,所以第一条语句可确保清除SLEEPDEEP位,以避免意外行为。同样,为了避免唤醒延迟,闪存访问控制寄存器配置为在设备处于休眠模式时使非易失性存储器保持空闲状态。在低功耗睡眠模式部分中将进一步讨论如何停止闪存接口时钟。

清单3:进入睡眠模式的示例

void enter_Sleep( void )

{

/* Configure low-power mode */

SCB->SCR &= ~( SCB_SCR_SLEEPDEEP_Msk );// low-power mode = sleep mode

SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; // reenter low-power mode after ISR

/* Ensure Flash memory stays on */

FLASH->ACR &= ~FLASH_ACR_SLEEP_PD;

__WFI();// enter low-power mode

}

低功耗睡眠模式(Low-Power Sleep Mode)

低功耗睡眠模式本质上是低功耗运行模式和睡眠模式的组合。不仅Cortex-M0 +内核停止了,而且调节器进入了低功耗模式,这意味着必须满足与低功耗运行模式相同的条件。回想一下,VCORE必须在范围2(默认配置)中,并且系统时钟频率必须降低到不超过fMSI范围1(131.072 kHz)。因此,在此模式下,USB,ADC和TSC外设不可用。此外,任何继续在低功耗睡眠模式下运行的频率相关外围设备都必须重新初始化,以便它们继续正常运行。


与低功耗运行模式不同,LPRUN位不用于使稳压器进入低功耗模式。一旦系统频率降低,就应将LPSDSR位置1,并遵循进入睡眠模式的相同步骤。即,确保清除SLEEPDEEP位并执行WFI指令,WFE指令,或者将SLEEPONEXIT位置1,然后等待异常返回。当器件进入低功耗模式时,LPSDSR位将自动将调节器置于低功耗状态。当器件在唤醒事件后退出低功耗模式时,将进入稳压器全功率运行的运行模式。


参考手册在“低功耗睡眠模式”部分中提到了关闭闪存的选项。当器件进入睡眠模式或低功耗睡眠模式时,将FLASH_ACR寄存器中的SLEEP_PD(SLEEP掉电)位置1将使非易失性存储器进入掉电模式。虽然这确实增加了唤醒等待时间,但功耗却降低了约12 µA(数据表中的表34),这可能因应用而异。唤醒时间的增加大概是因为在参考手册的“睡眠模式”部分中没有提及此选项的原因(即使它确实在睡眠模式下也起作用)。如果使用睡眠模式的应用程序不需要它提供的惊人的快速唤醒时间,则应该改为使用低功耗睡眠模式。清单4显示了一个示例功能,该功能用于按照参考手册中列出的步骤进入低功耗睡眠模式。


清单4:进入低功耗睡眠模式的示例

void enter_LPSleep( void )

{

/* 1. The Flash memory can be switched off by using the control bits

(SLEEP_PD in the FLASH_ACR register). This reduces power consumption

but increases the wake-up time. */

FLASH->ACR |= FLASH_ACR_SLEEP_PD;

/* 2. Each digital IP clock must be enabled or disabled by using the

RCC_APBxENR and RCC_AHBENR registers */

RCC->APB1ENR |= RCC_APB1ENR_PWREN;

/* 3. The frequency of the system clock must be decreased to not exceed the

frequency of f_MSI range1. */

// Set MSI 131.072 kHz as system clock

Config_SysClk_MSI_131();

// Reinitialize peripherals dependent on clock speed

USART1_Init();

SysTick_Init( 0.001 );

I2C1_Init();

/* 4. The regulator is forced in low-power mode by software

(LPSDSR bits set ) */

PWR->CR |= PWR_CR_LPSDSR; // voltage regulator in low-power mode during sleep

/* 5. Follow the steps described in Section 6.3.5: Entering low-power mode */

SCB->SCR &= ~( SCB_SCR_SLEEPDEEP_Msk ); // low-power mode = sleep mode

SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; // reenter low-power mode after ISR

__WFI(); // enter low-power mode

}

停止模式(Stop Mode)

停止模式可以说是STM32L0系列中最复杂的低功耗模式,它有可能在保持SRAM和寄存器内容的同时实现纳安量级的电流消耗。但是,如果唤醒时间更重要,则可以忽略许多节能选项,以实现与低功耗运行模式相同的延迟。更为复杂的问题是可用的唤醒源数量有限,勘误表中多次提及“停止”模式以及增加的调试复杂性。但是,对于那些希望使用最少电量而又不必在唤醒时重新初始化系统的用户来说,停止模式可能是最佳选择。

在停止模式下,内核被停止,并且只有有限容量的LSE,LSI和HSI能够运行的振荡器。低速时钟允许RTC和IWDG继续运行并唤醒设备。 HSI可以为能够在停止模式下运行的外围设备提供有限的功能。例如,通过在需要时唤醒HSI,USART和I2C仍能够在停止模式下接收数据。 HSI将仅提供请求它的外围设备,并且在不再需要它时将自动被禁用。有关在停止模式下可用的所有外设的完整列表以及可用的唤醒源,请参见数据表中的表4。请注意,由于核心时钟已停止,因此一旦进入停止模式,调试连接将无法维持。但是,根据参考手册,将DBGMCU_CR寄存器中的DBG_STOP位置1将允许在停止模式下进行调试。


为了进入停止模式,必须将SLEEPDEEP位置1,因为停止模式和待机模式都是由Cortex-M0 +内核提供的深度睡眠状态的实现。清除PWR_CR寄存器中的PDDS(掉电DeepSleep)位是在待机模式下选择停止模式的方式。另外,有必要确保清除PWR_CSR寄存器中的WUF(唤醒标志)位。不幸的是,该位不能由软件修改,必须通过向PWR_CR寄存器的CWUF(清除唤醒标志)位写入1来清除。这将在2个系统时钟周期后清除WUF。一旦满足这些条件,用户只需执行WFI指令,WFE指令或将SLEEPONEXIT位置1,然后等待异常返回。请注意,默认情况下,从停止模式唤醒时,设备会选择MSI振荡器作为系统时钟。通过在进入停止模式之前将RCC_CFGR寄存器中的STOPWUCK(停止唤醒时钟)位设置为1,将选择HSI16振荡器作为系统时钟。清单5显示了一个示例函数,它将使用此最低限度的配置进入Stop模式。它还显示了如何启用能够唤醒设备的外部中断。

清单5:进入停止模式的简单示例

void enter_Stop( void )

{

/* Enable Clocks */

RCC->APB1ENR |= RCC_APB1ENR_PWREN;

RCC->IOPENR |= RCC_IOPENR_GPIOAEN;

/* Configure PA0 as External Interrupt */

GPIOA->MODER &= ~( GPIO_MODER_MODE0 ); // PA0 is in Input mode

EXTI->IMR |= EXTI_IMR_IM0; // interrupt request from line 0 not masked

EXTI->RTSR |= EXTI_RTSR_TR0; // rising trigger enabled for input line 0

// Enable interrupt in the NVIC

NVIC_EnableIRQ( EXTI0_1_IRQn );

NVIC_SetPriority( EXTI0_1_IRQn, BTN_INT_PRIO );

/* Prepare to enter stop mode */

PWR->CR |= PWR_CR_CWUF; // clear the WUF flag after 2 clock cycles

PWR->CR &= ~( PWR_CR_PDDS ); // Enter stop mode when the CPU enters deepsleep

RCC->CFGR |= RCC_CFGR_STOPWUCK; // HSI16 oscillator is wake-up from stop clock

SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; // low-power mode = stop mode

__WFI(); // enter low-power mode

}

如果希望节省更多的电量,而唤醒时间就不再那么重要了,则可以在进入停止模式之前进行其他配置。最简单的方法是通过将PWR_CR寄存器中的LPSDSR位置1使稳压器进入低功耗模式。在同一寄存器中,如果任何模拟外设都没有使用VREFINT(内部参考电压),也可以将ULP(超低功耗模式)位置1以将其禁用。此外,如果唤醒后不需要立即使用VREFINT,将FWU(快速唤醒)位置1不会增加设置ULP可能引起的额外唤醒延迟。

前述更改将显着降低电流消耗,但该设备可能仍在以微安为单位订购。为了进入纳安范围,必须将所有GPIO引脚置于模拟模式。根据参考手册第9.3.12节,当I / O引脚配置为模拟引脚时,施密特触发器输入被禁用,每个引脚的功耗为零。但是,这样做意味着必须将每个端口的GPIOx_MODER寄存器保存,然后再将每个引脚切换到模拟模式。这样,设备唤醒后,每个引脚都可以恢复到其先前的模式。另外,为了避免意外错误,在保存和恢复过程中都应禁用中断。

清单6中的功能建立在清单5中的基本功能的基础上。不仅将调节器置于低功耗模式并且VREFINT已关闭,而且在进入停止模式之前还保存了I / O上下文。由于在执行WFI时即禁用了中断,即PM位置1,因此外部中断将唤醒设备,但不会输入其ISR。程序从WFI指令继续执行,从而允许立即恢复上下文。重新启用中断后,由于中断仍处于挂起状态,因此将输入外部中断的ISR。

清单6:进入停止模式的高级示例

void enter_Stop( void )

{

/* Enable Clocks */

RCC->APB1ENR |= RCC_APB1ENR_PWREN;

RCC->IOPENR |= RCC_IOPENR_GPIOAEN;

/* Configure PA0 as External Interrupt */

GPIOA->MODER &= ~( GPIO_MODER_MODE0 ); // PA0 is in Input mode

EXTI->IMR |= EXTI_IMR_IM0; // interrupt request from line 0 not masked

EXTI->RTSR |= EXTI_RTSR_TR0; // rising trigger enabled for input line 0

[1] [2]
关键字:MCU  低功耗模式 引用地址:STM32L053C8 MCU上的低功耗模式详解

上一篇:应用笔记 | 关于STM32WL LSE 添加反馈电阻后无法起振问题
下一篇:STM32用串口下载后,不小心写保护和读保护了,如何解锁?

推荐阅读最新更新时间:2024-11-12 10:23

HOLTEK新推出紧急照明灯Flash MCU HT45FH4J
Holtek针对紧急照明灯(Emergency Light)领域,推出Flash MCU HT45FH4J,与传统MCU资源相比,HT45FH4J除了俱备更多资源及脚位外,同时内建5V LDO、LED以及Buzzer驱动等功能,除了省去外接零件,同时能降底生产BOM Cost以及PCB Size。 HT45FH4J具备2Kx16 Flash Program ROM、128 Byte Data RAM、64 Byte Data EEPROM、内建LDO输入电压最高为12V,输出5V/50mA,足已提供给内部MCU及外部电路所需的电流、内建3组精准RC Oscillator (HIRC 12/16/20MHz),6通道12-bit
[单片机]
51单片机I2C详解与程序源码
I2C是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL)和SerialData(简称SDA)。I2C是总线结构,1个Master,1个或多个Slave,各Slave设备以7位地址区分,地址后面再跟1位读写位,表示读(=1)或者写(=0),所以我们有时也可看到8位形式的设备地址,此时每个设备有读、写两个地址,高7位地址其实是相同的。 I2C数据格式如下: 无数据:SCL=1,SDA=1; 开始位(Start):当SCL=1时,SDA由1向0跳变; 停止位(Stop):当SCL=1时,SDA由0向1跳变; 数据位:当SCL由0向1跳变时,由发送方控制SDA,此时SDA为有效数据
[单片机]
PIC单片机的红外遥控与解码
今天玩红外遥控的解码! 先了解红外接收的原理: 遥控器使用方便,功能多.目前已广泛应用在电视机、VCD、DVD、空调等各种家用电器中,且价格便宜,市场上非常容易买到。如果能将遥控器上许多的按键解码出来.用作单片机系统的输入.则解决了常规矩阵键盘线路板过大、布线复杂、占用I/O口过多的弊病。而且通过使用遥控器,操作时可实现人与设备的分离,从而更加方便使用。 一、编码格式 1、0和1的编码 遥控器发射的信号由一串O和1的二进制代码组成.不同的芯片对0和1的编码有所不同。通常有曼彻斯特编码和脉冲宽度编码。TC9012的O和1采用PWM方法编码,即脉冲宽度调制,其O码和1码如图1所示(以遥控接收输出的波形为例)。O码由O.56
[单片机]
PIC单片机基础知识之一
PIC16中档单片机的基本架构 PIC16中档系列单片机是精简指令集的单片机,它具有以下特性: 内部为哈佛结构 指令流水线操作 文档寄存器的概念 单指令周期 所有指令为单字指令 长字指令 指令数很少 指令实现的功能基本不重复 接下来分别介绍上面各个特性。 1)哈佛结构-介绍哈佛结构通常要和冯.纽曼结构对比来介绍。我们熟悉的8086就是一种典型的冯.纽曼结构,它的程序和数据是共用同一个存储空间,CPU也是使用同一个总线来访问它们。那么,取指令和取数据势必分时来进行,这就限制了数据的流量。和它相对应的哈佛结构,则是不同。哈佛结构的典型特点就是程序和数据是分立的空间,CPU对程序和数据的访问也是使用完全独立的两套总线。所
[单片机]
AVR 单片机精确延时函数
1.毫秒级的延时 延时1ms; void delay_1ms(void) { unsigned int i; for(i=1;i (unsigned int)(xtal*143-2_;i++) ; } 在上式中,xtal为晶振频率,单位为MHz. 当晶振频率为8M时,延时函数软件仿真的结果为1000.25μs.当晶振频率为4M时,延时函数软件仿真结果为999.5μs. 如果需要准确的1ms延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值,并且循环中还必须关闭全局中断,防止中断影响延时函数的延时时间。 下面的函数可以获得1ms的整数倍的延时时间: void delay(unsigned int n) {
[单片机]
51单片机的定时器初始化设置的流程
51单片机的定时/计数器是一种可编程部件。它的工作方式、计数初值以及启停操作均应在定时/计数器工作前进行初始化,即向相应的寄存器写入相应的控制字。 标准的51单片机内部有T0和T1两个定时器,与这两个定时器有关的特殊功能寄存器主要由定时值存储寄存器、定时器控制寄存器和定时器模式寄存器。 在使用定时器的时候,需要完成对定时器配置,配置步骤如下: 第一:设置特殊功能寄存器TMOD,配置好工作模式。 第二:设置计数寄存器TH0和TL0的初值。 第三:设置TCON,通过TRX置1来让定时器开始计数。 第四:判断TCON寄存器的TFX位,监测定时器溢出情况 这里TRX和TFX中的X指的是0或者1。 下面程序使用定时器0,工作模式1,
[单片机]
51<font color='red'>单片机</font>的定时器初始化设置的流程
51单片机汇编语言实验(六)-----8255键盘与显示设计
一、实验目的:    掌握8255外接键盘与数码管显示的设计 二、实验设备:    PC计算机一台,Dais-52PRO+实验系统一套。 三、实验内容:    8255键盘与显示设计 四、 8255键盘与显示设计    1、实验原理:    本实验使用8255的PA7到PA0控制数码管字形口、PB5到PB0控制数码管字位口,同时PB4到PB0作为键盘扫描口、PC3~PC0作为键盘读入口。利用CPU控制8255,对4×5键盘进行扫描和键值读取,将键值显示到6位数码管上。本文介绍的是简化版的实验,不控制最后一列键盘,数码管位选端不接线,直接点亮。    2、实验步骤:   ① 按下图拆除14芯扁平电缆;   ②将8
[单片机]
51<font color='red'>单片机</font>汇编语言实验(六)-----8255键盘与显示设计
GD32 MCU进入低功耗模式导致无法再进行程序下载怎么办?
很多朋友在调试GD32 MCU的低功耗模式时会遇到一个问题:程序中让MCU进入了Sleep、Deepsleep或者Standby模式,之后MCU就无法再下载程序了。这是因为在低功耗模式下,MCU的SW口和JTAG口是无法访问的。比如下面的程序就会导致该问题发生: 该main函数中第一步是打开PMU时钟,然后马上让MCU进入Deepsleep模式,当你想要再次下载程序时,IDE会有如下错误提示(不同IDE报错不同): 遇到这种情况怎么办呢?难道只能重新换一颗芯片了?不不不,其实有方法解决这个问题的。 方法一: GD32 MCU的启动模式根据芯片上的BOOT0和BOOT1脚是可以选择三种模式: 一般情况下,BOOT0需
[单片机]
GD32 <font color='red'>MCU</font>进入<font color='red'>低功耗</font><font color='red'>模式</font>导致无法再进行程序下载怎么办?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved