GD32开发实战指南(基础篇) 第15章 低功耗

发布者:SparklingDreams最新更新时间:2024-11-06 来源: elecfans关键字:GD32  开发实战  低功耗 手机看文章 扫描二维码
随时随地手机看文章

开发环境:

MDK:Keil 5.30

开发板:GD32F207I-EVAL

MCU:GD32F207IK

1 GD32电源管理

GD32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器提供所需的1.8V电源。当主电源VDD掉电后,通过VBAT脚为实时时钟(RTC)和备份寄存器提供电源。

1684245485489k9nyiyuks9

使用电池或其他电源连接到VBAT脚上,当VDD断电时,可以保存备份寄存器的内容和维持RTC的功能。

VBAT脚为RTC、 LSE振荡器和PC13至PC15端口供电,可以保证当主电源被切断时RTC能继续工作。切换到VBAT供电的开关,由复位模块中的掉电复位功能控制。

当备份域由VDD供电(VBAK连接至VDD)时,以下功能可用:

● PC13可以作为通用I/O口或RTC功能引脚;

● PC14和PC15可以作为通用I/O口或LXTAL晶振引脚。

● PI8可以作为通用I/O口或RTC功能引脚

当备份域由VBAT电源供电时(VBAK连接至VBAT),以下功能可用:

● PC13仅可以作为RTC功能引脚;

● PC14和PC15仅可作为LXTAL晶振引脚。

● PI8仅可以作为RTC功能引脚

注意:由于PC13至PC15引脚是通过电源切换器供电的,电源切换器仅可通过小电流,因此当PC13至PC15的GPIO口在输出模式时,其工作的速度不能超过2MHz(最大负载为30pF)。

2 GD32低功耗模式

在系统或电源复位以后,微控制器处于运行状态。当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。

GD32F207有三种低功耗模式:

  • 睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)

● 深度睡眠/停止模式(所有的时钟都已停止)

● 待机模式(1.8V电源关闭)

此外,在运行模式下,可以通过以下方式中的一种降低功耗:

● 降低系统时钟

● 关闭APB和AHB总线上未被使用的外设时钟。

1684245486046vja3pvlwnn

从表中可以看到,这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。

在睡眠模式中,仅关闭了 CPU 时钟, CPU 停止运行 ,但其片上外设,CM3 核心外设全都还照常运行。有两种方式进入睡眠模式,它的进入方式决定了从睡眠唤醒的方式,分别是 WFI(wait for interrupt)和 WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。

在深度睡眠模式中, 进一步关闭了其它所有的时钟 ,于是所有的外设都停止了工作,但由于其 1.8V 区域的电源没有关闭,还保留了 CPU 的寄存器、内存的信息,所以深度睡眠模式唤醒,并重新开启时钟后,还可以从上次深度睡眠处继续执行代码。深度睡眠模式可以由任意一个外部中断(EXTI)唤醒。在深度睡眠模式中可以选择电压调节器为开模式或低功耗模式,若选择低功耗模式,在唤醒时会加上电压调节器的唤醒延迟。

待机模式,这与我们平时印象中的手机关机模式相似,它除了关闭所有的时钟,还把1.8V 区域的电源也关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 boot 条件,从头开始执行程序。它有四种唤醒方式,分别是 WKUP(PA0)引脚的上升沿,RTC 闹钟事件,NRST 引脚的复位和FWDGT复位。

在运行模式下,任何时候都可以通过停止为外设和内存提供时钟来减少功耗。为了在睡眠模式下更多地减少功耗,可在执行WFI或WFE指令前关闭所有外设的时钟。

通过设置AHB外设时钟使能寄存器、APB2外设时钟使能寄存器和APB1外设时钟使能寄存器来开关各个外设模块的时钟。

2.1睡眠模式

  • 进入睡眠模式

通过执行WFI或WFE指令进入睡眠状态。根据Cortex™-M3中SCR(系统控制寄存器)的SLEEPONEXIT位,有两种睡眠进入机制选项:

● Sleep-now:如果SLEEPONEXIT位被清零,一旦执行WFI或WFE指令, MCU立即进入睡眠模式;

● Sleep-on-exit:如果SLEEPONEXIT位被置位,当系统从最低优先级的中断处理程序离开后, MCU立即进入睡眠模式。

在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。

  • 退出睡眠模式

如果执行WFI指令进入睡眠模式,任意一个被嵌套向量中断控制器响应的外设中断都能将系统从睡眠模式唤醒。

如果执行WFE指令进入睡眠模式,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。唤醒事件可以通过下述方式产生:

● 在外设控制寄存器中使能一个中断,而不是在NVIC(嵌套向量中断控制器)中使能,并且在Cortex-M3系统控制寄存器中使能SEVONPEND位。当MCU从WFE中唤醒后,外设的中断挂起位和外设的NVIC中断通道挂起位(在NVIC中断清除挂起寄存器中)必须被清除。

● 配置一个外部或内部的EXIT线为事件模式。当MCU从WFE中唤醒后,因为与事件线对应的挂起位未被设置,不必清除外设的中断挂起位或外设的NVIC中断通道挂起位。

该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。

SLEEP-NOW****模式说明
进入在以下条件下执行WFI(等待中断)或WFE(等待事件)指令: –SLEEPDEEP = 0和–SLEEPONEXIT = 0参考Cortex-M3系统控制寄存器。
退出如果执行WFI进入睡眠模式:中断。 如果执行WFE进入睡眠模式:唤醒事件。
唤醒延时
SLEEP-ON_EXIT****模式说明
进入在以下条件下执行WFI指令:–SLEEPDEEP = 0和–SLEEPONEXIT = 1参考Cortex™-M3系统控制寄存器
退出中断:参考中断向量表
唤醒延时

2.2 深度睡眠模式

深度睡眠模式是在Cortex™-M3的深睡眠模式基础上结合了外设的时钟控制机制,深度睡眠模式与 Cortex™-M3 的 SLEEPDEEP 模式相对应。在深度睡眠模式下,1.2V 域中的所有时钟全部关闭,IRC8M、HXTAL及PLLs 也全部被禁用。SRAM和寄存器中的内容被保留。

在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态。

  • 进入深度睡眠模式

在深度睡眠模式下,通过设置电源控制寄存器PMU_CTL的LDOLP位使内部调节器进入低功耗模式,能够降低更多的功耗。

如果正在进行闪存编程,直到对内存访问完成,系统才进入深度睡眠模式。

如果正在进行对APB的访问,直到对APB访问完成,系统才进入深度睡眠模式。可以通过对独立的控制位进行编程。

在深度睡眠模式下,如果在进入该模式前ADC和DAC没有被关闭,那么这些外设仍然消耗电流。

  • 退出深度睡眠模式

当一个中断或唤醒事件导致退出深度睡眠模式时,IRC8M、IRC40K振荡器被选为系统时钟。

当电压调节器处于低功耗模式下,当系统从深度睡眠模式退出时,将会有一段额外的启动延时。如果在深度睡眠模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会增加。

深度睡眠模式说明
进入在以下条件下执行WFI(等待中断)或WFE(等待事件)指令: –设置Cortex-M3系统控制寄存器中的SLEEPDEEP位 –清除电源控制寄存器(PMU_CTL)中的STBMOD位 –通过设置PMU_CTL中LDOLP位选择电压调节器的模式 注:为了进入停止模式,所有的外部中断的请求位(挂起寄存器)和RTC的闹钟标志都必须被清除,否则停止模式的进入流程将会被跳过,程序继续运行。
退出如果执行WFI进入停止模式: 设置任一外部中断线为中断模式(在NVIC中必须使能相应的外部中断向量)。参见中断向量。 如果执行WFE进入停止模式: 设置任一外部中断线为事件模式。参见唤醒事件管理。
唤醒延时IRC8M、IRC40K唤醒时间+电压调节器从低功耗唤醒的时间。

2.3待机模式

待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。IRC8M、HXTAL 和 PLL振荡器也被断电。SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。

  • 进入待机模式

进入待机模式前,先将Cortex™-M3 系统控制寄存器的 SLEEPDEEP 位置 1,再将 PMU_CTL 寄存器的 STBMOD 位置 1,再清除 PMU_CS 寄存器的 WUF 位,然后执行 WFI 或 WFE 指令,系统进入待机模式,PMU_CS 寄存器的 STBF 位状态表示 MCU 是否已进入待机模式。

  • 退出待机模式

当一个外部复位(NRST引脚)、 FWDGT复位、 WKUP引脚上的上升沿或RTC闹钟事件的上升沿发生时,微控制器从待机模式退出。从待机唤醒后,除了电源控制/状态寄存器(PWR_CS),所有寄存器被复位。

从待机模式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚、读取复位向量等)。 电源控制/状态寄存器(PWR_CS)将会指示内核由待机状态退出。

待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。IRC8M、HXTAL 和 PLL振荡器也被断电。SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。

待机模式说明
进入在以下条件下执行WFI(等待中断)或WFE(等待事件)指令: –设置Cortex™-M3系统控制寄存器中的SLEEPDEEP位 –设置电源控制寄存器(PWR_CTL)中的STBMOD位 –清除电源控制/状态寄存器(PWR_CS)中的WUF位
退出WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、FWDGT复位。
唤醒延时复位阶段时电压调节器的启动

3 低功耗的寄存器描述

电源控制寄存器(PWR_CTL),该寄存器的各位描述如下图所示:

1684245486565uey0p7r2pq

我们通过设置 PWR_CTL的 STBMOD位,使 CPU 进入深度睡眠时进入待机模式。

电源控制/状态寄存器( PWR_CS)的各位描述如图所示。

1684245486948ys3dsyd2c7

通过设置 PWR_CS的 WUPEN 位,来使能 WKUP 引脚用于待机模式唤醒。我们还可以从 WUF 来检查是否发生了唤醒事件。

4 低功耗具体代码实现

通过以上介绍,我们了解了进入低功耗模式的三种方法,在者三种模式中待机模式功耗最低。笔者这里使用的是按键唤醒,其电路如下:

1684245487308dwt16x8vn9

4.1睡眠模式

睡眠模式很简单,就是通过以下指令进入睡眠:


__WFI();

__WFE();

那么以上两条指令又是啥意思呢?WFI(Wait for interrupt)和WFE(Wait for event)是两个让ARM核进入low-power standby模式的指令,由ARM architecture定义,由ARM core实现。我们可以在core_cmx3.h(笔者使用的是GD32F207,对应的就是core_cmx3.h,其他内核类似),中找到以上指令的定义。


static __INLINE void __WFI()                      { __ASM volatile ('wfi'); }

static __INLINE void __WFE()                      { __ASM volatile ('wfe'); }

以上就是把汇编指令都封装成了诸如__Commnad()的函数形式,并且预编译为二进制包。那么以上指令都能让ARM进入睡眠模式,又有啥区别呢?


对WFI来说,执行WFI指令后,ARM core会立即进入low-power standby state,直到有WFI Wakeup events发生。


而WFE则稍微不同,执行WFE指令后,根据Event Register(一个单bit的寄存器,每个PE一个)的状态,有两种情况:如果Event Register为1,该指令会把它清零,然后执行完成(不会standby);如果Event Register为0,和WFI类似,进入low-power standby state,直到有WFE Wakeup events发生。


总结一下,这两条指令的作用都是令MCU进入休眠/待机状态以便降低功耗,但是略有区别:


WFI: wait for Interrupt 等待中断,即下一次中断发生前都在此hold住不干活


WFE: wait for Events 等待事件,即下一次事件发生前都在此hold住不干活


因此我们要项唤醒MCU,最简单的就是通过中断唤醒。


睡眠模式时通过按键中断唤醒,代码如下:


/*

    brief      main function

    param[in]  none

    param[out] none

    retval     none

*/

int main(void)

{

    //usart init 115200 8-N-1

    com_init(COM1, USART_MODE_GPIO, 115200, 0, 1);


    /* configure LED1 GPIO port */

    led_init(LED1);


    /* configure LED2 GPIO port */

    led_init(LED2);


    /* configure LED3 GPIO port */

    led_init(LED3);


    /* configure LED4 GPIO port */

    led_init(LED4);


    //key init

    key_init(KEY_WAKEUP, KEY_MODE_EXTI);


    printf('\r\n Sleep Test \r\n');


    while(1)

    {

        led_toggle(LED1);

        Delay(0xFFFFF);

        led_toggle(LED2);

        Delay(0xFFFFF);

        led_toggle(LED3);

        Delay(0xFFFFF);

        led_toggle(LED4);

        //__WFI(); //进入睡眠模式,等待中断唤醒  方式一

        __WFE(); //方式二

    }

}

进入睡眠模式也可调用库函数。


void pmu_to_sleepmode(uint8_t sleepmodecmd)

值得注意的是,这里不能用滴答定时器来延时,因为这里使用的是中断方式实现的。


WFI和WFE两条指令让MCU进入睡眠模式,均可通过按键中断唤醒,但是他们的唤醒本质是有区别的。


如上图所示,图中的蓝色虚线箭头标出了中断信号的传输路径,而红色箭头标出了事件的传输路径。虽然中断和事件的产生源都是一样的,都是通过按键产生,但是路径却有不同,中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等。


4.2 深度睡眠模式

进入深度睡眠模式之后,任何外部中断都可以唤醒低功耗,但是需要重新配置时钟,不然系统将以默认时钟(没有经过倍频)运行。笔者这里还是使用外部中断唤醒。我们先看看主函数。


/*

    brief      main function

    param[in]  none

    param[out] none

    retval     none

*/

int main(void)

{

    //usart init 115200 8-N-1

com_init(COM1, USART_MODE_GPIO, 115200, 0, 1);


    /* configure LED1 GPIO port */

    led_init(LED1);


    /* configure LED2 GPIO port */

    led_init(LED2);


    /* configure LED3 GPIO port */

    led_init(LED3);


    /* configure LED4 GPIO port */

    led_init(LED4);


    //key init

    key_init(KEY_WAKEUP, KEY_MODE_EXTI);


    /* 使能电源管理单元的时钟 */

rcu_periph_clock_enable(RCU_PMU);


    printf('\r\n Enter stop mode \r\n');


    /* 进入深度睡眠模式,设置电压调节器为低功耗模式,等待中断唤醒*/

    pmu_to_deepsleepmode(PMU_LDO_LOWPOWER,WFI_CMD);


    while(1)

    {

        led_toggle(LED1);

        Delay(0xFFFFF);

        led_toggle(LED2);

        Delay(0xFFFFF);

        led_toggle(LED3);

        Delay(0xFFFFF);

        led_toggle(LED4);

    }

}

以上最重要的就一句:


pmu_to_deepsleepmode(PMU_LDO_LOWPOWER,WFI_CMD);

这是MCU进入低功耗模式的库函数,在gd32f20x_pmu.c中实现,原型如下:


/*!

    \brief      PMU work in deepsleep mode

    \param[in]  ldo:

                only one parameter can be selected which is shown as below:

      \arg        PMU_LDO_NORMAL: LDO work at normal power mode when pmu enter deepsleep mode

      \arg        PMU_LDO_LOWPOWER: LDO work at low power mode when pmu enter deepsleep mode

    \param[in]  deepsleepmodecmd:

                only one parameter can be selected which is shown as below:

      \arg        WFI_CMD: use WFI command

      \arg        WFE_CMD: use WFE command

    \param[out] none

    \retval     none

*/

void pmu_to_deepsleepmode(uint32_t ldo, uint8_t deepsleepmodecmd)

{

    static uint32_t reg_snap[4];

    /* clear stbmod and ldolp bits */

    PMU_CTL &= ~((uint32_t)(PMU_CTL_STBMOD | PMU_CTL_LDOLP));


    /* set ldolp bit according to pmu_ldo */

    PMU_CTL |= ldo;


    /* set sleepdeep bit of Cortex-M3 system control register */

    SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;


    reg_snap[0] = REG32(0xE000E010U);

    reg_snap[1] = REG32(0xE000E100U);

    reg_snap[2] = REG32(0xE000E104U);

    reg_snap[3] = REG32(0xE000E108U);


    REG32(0xE000E010U) &= 0x00010004U;

    REG32(0xE000E180U)  = 0XFF7FF83DU;

    REG32(0xE000E184U)  = 0XBFFFF8FFU;

    REG32(0xE000E188U)  = 0xFFFFFFFFU;


    /* select WFI or WFE command to enter deepsleep mode */

    if(WFI_CMD == deepsleepmodecmd) {

[1] [2]
关键字:GD32  开发实战  低功耗 引用地址:GD32开发实战指南(基础篇) 第15章 低功耗

上一篇:GD32 MCU内部温度传感器如何使用,以及适合哪种应用场景?
下一篇:GD32 MCU进入低功耗模式导致无法再进行程序下载怎么办?

推荐阅读最新更新时间:2026-03-25 11:38

GD32开发实战指南(基础篇) 第2章 初始GPIO流水灯
开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 1 GPIO工作原理 熟悉单片机的朋友都知道,学习的第一个例程就是流水灯,要想实现流水灯,首先必须了解GPIO的工作原理。GPIO的基本结构如下图所示。 GD32 的 IO 口可以由软件配置成如下 8 种模式: 输入模式 浮空输入:浮空(floating)就是逻辑器件的输入引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。通俗讲就是让管脚什么都不接,浮空着。信号进入芯片内部后,既没有接上拉电阻也没有接下拉电阻,经由触发器输
[单片机]
GD32开发实战指南(基础篇) 第18章 CRC校验
开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 1 CRC的校验原理 __循环冗余校验(CRC)计算单元是根据固定的生成多项式得到任一32位全字的CRC计算结果。__在其他的应用中, CRC技术主要应用于核实数据传输或者数据存储的正确性和完整性。标准EN/IEC 60335-1即提供了一种核实闪存存储器完整性的方法。 CRC计算单元可以在程序运行时计算出软件的标识,之后与在连接时生成的参考标识比较,然后存放在指定的存储器空间。那么首先来看看CRC校验原理。 1.1基本原理 CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构
[单片机]
GD32开发实战指南(基础篇) 第16章 RTC
开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 1 RTC工作原理 1.1 RTC简介 GD32 的 RTC 外设,实质是一个掉电后还继续运行的定时器。从定时器的角度来说,相对于通用定时器 TIMER 外设,它十分简单,只有很纯粹的计时功能(当然,可以触发中断);但从掉电还继续运行的角度来说,它却是 GD32中唯一一个具有如此强大功能的外设。所以 RTC 外设的复杂之处并不在于它的定时功能,而在于它掉电还继续运行的特性。 以上所说的掉电, 是指主电源 VDD断开的情况,为了 RTC 外设掉电继续运行,必须给GD32芯片通过 VBAT引脚接上锂电池 。当主电源 VD
[单片机]
NTN 技术如何落地物联网?Nordic 联合生态伙伴共话开发实战
挪威奥斯陆 – 2026年3月17日 – 全球领先的低功耗无线通信解决方案提供商 Nordic 今日正式宣布, 将于2026 年 3 月 23 日 13:00在深圳南山深铁皇冠假日酒店 5 楼会议室 4举办 “Nordic 长距离 NTN 线下研讨会” 。本次研讨会聚焦非地面网络(NTN)技术落地,深度解析 Nordic NTN 完整解决方案,联动卫星通信生态伙伴,分享实战开发经验与全球场测成果,为物联网行业探索长距离、广覆盖的通信新路径搭建交流与合作的核心平台。 作为物联网通信技术的核心推动者,Nordic 始终致力于突破连接边界。随着物联网应用从地面场景向全球广域覆盖延伸,NTN(非地面网络)技术凭借卫星通信等接入方式,成
[物联网]
NTN 技术如何落地物联网?Nordic 联合生态伙伴共话<font color='red'>开发</font>与<font color='red'>实战</font>
赋能欧标充电桩市场:OCPP协议实战开发指南
随着全球电动汽车产业的迅猛发展,充电基础设施的智能化与标准化已成为行业迫切需求。OCPP(Open Charge Point Protocol即开放充电点协议)作为连接充电桩与中央管理系统的 通用语言 ,正成为解决设备互联互通难题的关键技术。 一、OCPP:为何是出海欧标的必选项? OCPP是一个开放、标准的通信协议,它确保了不同制造商生产的充电桩能够与任何兼容的后台管理系统进行无缝通信。集成OCPP协议意味着为产品赋予“标准通信接口”,其核心价值在于: 打破互联壁垒:使充电桩能接入任何符合OCPP标准的第三方运营平台,提升产品适配性; 满足法规要求:满足欧盟对充电设施互操作性的强制法规,是市场准入的前提; 解
[嵌入式]
赋能欧标充电桩市场:OCPP协议<font color='red'>实战</font><font color='red'>开发</font>指南
低成本STM32实战开发T-BOX技术:高效可靠的车联网解决方案
引言:为什么需要T-BOX? 在“十四五”交通安全规划背景下,“两客一危”车辆(旅游包车、长途客车、危险品运输车)的智能化管控成为行业刚需。远程信息处理器(T-BOX) 作为车联网的核心节点,承担着车辆状态感知、远程控制、数据加密传输等关键任务。本文基于 STM32F105 主控芯片,设计了一款低成本、高可靠的T-BOX系统,助力新能源汽车行业实现车路云协同的智能化管理。 系统总体设计:T-BOX的架构与核心功能 T-BOX系统由四大核心模块构成(如图1所示): STM32主控单元:负责数据处理与调度; GNSS定位模块:支持多卫星系统联合定位; 4G通信模块:实现车云双向数据传输; 双CAN总线接口:解析车辆ECU的J
[单片机]
低成本STM32<font color='red'>实战</font><font color='red'>开发</font>T-BOX技术:高效可靠的车联网解决方案
迅为-i.MX6ULL开发板-QT实战项目DHT11&网络编程实战练习(一)
1 项目前准备 工具及环境: 1.开发环境: Ubuntu 16.04 2.工具:Qt creator 3.迅为 电子 i.MX6ULL终结者开发板 MX6ULL终结者开发板已板载了DHT11 传感器 ,且提供的Linux镜像和设备树已配置好了dht11接口,dht11驱动程序使用高版本Linux内核自带的稳定驱动程序,根文件系统使用网盘资料里的Yocto镜像,使用手册有详细的系统移植和 Qt5移植步骤。开发板要保证iio接口正常,如图 1.1: cd /sys/bus/iio/devices/iio:device1 多cat几次, cat in_temp_input ,出现00为结尾的数字为正常 2 软件流程图 本实验目的是
[单片机]
迅为-i.MX6ULL<font color='red'>开发</font>板-QT<font color='red'>实战</font>项目DHT11&网络编程<font color='red'>实战</font>练习(一)
《STM32库开发实战指南 》USART
补充几个当时还不会的知识点。 发送寄存器 寄存器 功能 TE 发送使能 TXE 发送单个字节的时候使用,检查发送寄存器为空? TC 发送字符串的时候使用,实质上时多次调用发送单字符的函数,但是最后一次退出前要检查TC,发送完成寄存器 TXIE 发送完成中断使能 printf的多态 我们可以在Keil5中的工程选项中,勾选Use MicroLIB,这样我们就可以在工程中使用stdio.h头文件了。 当然了,单片机又没有屏幕和键盘,所以原来printf、scanf的实现方法当然不能用了,不过我们可以通过串口的方式来实现其。按照串口的方法,将要显示的内容输出到串口,将要获得的字符从串口中读取,那么无论是printf
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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