历史上的今天
返回首页

历史上的今天

今天是:2024年09月20日(星期五)

正在发生

2019年09月20日 | 第42章 电源管理—实现低功耗—零死角玩转STM32-F429系列

2019-09-20 来源:eefocus

本章参考数据:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。


42.1 STM32的电源管理简介

电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。因此,STM32有专门的电源管理外设监控电源并管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。


42.1.1 电源监控器

STM32芯片主要通过引脚VDD从外部获取电源,在它的内部具有电源监控器用于检测VDD的电压,以实现复位功能及掉电紧急处理功能,保证系统可靠地运行。


1.    上电复位与掉电复位(POR与PDR)

当检测到VDD的电压低于阈值VPOR及VPDR时,无需外部电路辅助,STM32芯片会自动保持在复位状态,防止因电压不足强行工作而带来严重的后果。见图 421,在刚开始电压低于VPOR时(约1.72V),STM32保持在上电复位状态(POR,Power On Reset),当VDD电压持续上升至大于VPOR时,芯片开始正常运行,而在芯片正常运行的时候,当检测到VDD电压下降至低于VPDR阈值(约1.68V),会进入掉电复位状态(PDR,Power Down Reset)。


图 421 POR与PDR


2.    欠压复位(BOR)

POR与PDR的复位电压阈值是固定的,如果用户想要自行设定复位阈值,可以使用STM32的BOR功能(Brownout Reset)。它可以编程控制电压检测工作在表 421中的阈值级别,通过修改"选项字节"(某些特殊寄存器)中的BOR_LEV位即可控制阈值级别。其复位控制示意图见图 422。


表 421 BOR欠压阈值等级

image.png?imageView2/2/w/550

图 422 BOR复位控制


3.    可编程电压检测器PVD

上述POR、PDR以及BOR功能都是使用其电压阈值与外部供电电压VDD比较,当低于工作阈值时,会直接进入复位状态,这可防止电压不足导致的误操作。除此之外,STM32还提供了可编程电压检测器PVD,它也是实时检测VDD的电压,当检测到电压低于VPVD阈值时,会向内核产生一个PVD中断(EXTI16线中断)以使内核在复位前进行紧急处理。该电压阈值可通过电源控制寄存器PWR_CSR设置。


使用PVD可配置8个等级,见表 422。其中的上升沿和下降沿分别表示类似图 422中VDD电压上升过程及下降过程的阈值。


表 422 PVD的阈值等级

image.png?imageView2/2/w/550

42.1.2 STM32的电源系统

为了方便进行电源管理,STM32把它的外设、内核等模块跟据功能划分了供电区域,其内部电源区域划分见图 423。

图 423 STM32的电源系统


从框图了解到,STM32的电源系统主要分为备份域电路、内核电路以及ADC电路三部分,介绍如下:


备份域电路


STM32的LSE振荡器、RTC、备份寄存器及备份SRAM这些器件被包含进备份域电路中,这部分的电路可以通过STM32的VBAT引脚获取供电电源,在实际应用中一般会使用3V的钮扣电池对该引脚供电。


在图中备份域电路的左侧有一个电源开关结构,它的功能类似图 424中的双二极管,在它的上方连接了VBAT电源,下方连接了VDD主电源(一般为3.3V),右侧引出到备份域电路中。当VDD主电源存在时,由于VDD电压较高,备份域电路通过VDD供电,当VDD掉电时,备份域电路由钮扣电池通过VBAT供电,保证电路能持续运行,从而可利用它保留关键数据。


图 424 双二极管结构


调压器供电电路


在STM32的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电,其中包括内核、数字外设以及RAM,调压器的输出电压约为1.2V,因而使用调压器供电的这些电路区域被称为1.2V域。


调压器可以运行在"运行模式"、"停止模式"以及"待机模式"。在运行模式下,1.2V域全功率运行;在停止模式下1.2V域运行在低功耗状态,1.2V区域的所有时钟都被关闭,相应的外设都停止了工作,但它会保留内核寄存器以及SRAM的内容;在待机模式下,整个1.2V域都断电,该区域的内核寄存器及SRAM内容都会丢失(备份区域的寄存器及SRAM不受影响)。


ADC电源及参考电压


为了提高转换精度,STM32的ADC配有独立的电源接口,方便进行单独的滤波。ADC的工作电源使用VDDA引脚输入,使用VSSA作为独立的地连接,VREF引脚则为ADC提供测量使用的参考电压。


42.1.3 STM32的功耗模式

按功耗由高到低排列,STM32具有运行、睡眠、停止和待机四种工作模式。上电复位后STM32处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中,电源消耗不同、唤醒时间不同、唤醒源不同,用户需要根据应用需求,选择最佳的低功耗模式。三种低功耗的模式说明见表 423。    


表 423STM32的低功耗模式说明

image.png?imageView2/2/w/550

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


1.    睡眠模式

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


表 424 睡眠模式的各种特性

image.png?imageView2/2/w/550

2.    停止模式

在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其1.2V区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒。在停止模式中可以选择电压调节器为开模式或低功耗模式,可选择内部FLASH工作在正常模式或掉电模式。停止模式的各种特性见表 425。


表 425 停止模式的各种特性

image.png?imageView2/2/w/550

3.    待机模式

待机模式,它除了关闭所有的时钟,还把1.2V区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测boot条件,从头开始执行程序。它有四种唤醒方式,分别是WKUP(PA0)引脚的上升沿,RTC闹钟事件,NRST引脚的复位和IWDG(独立看门狗)复位。


表 426 待机模式的各种特性

image.png?imageView2/2/w/550

在以上讲解的睡眠模式、停止模式及待机模式中,若备份域电源正常供电,备份域内的RTC都可以正常运行、备份域内的寄存器及备份域内的SRAM数据会被保存,不受功耗模式影响。


42.2 电源管理相关的库函数及命令

STM32标准库对电源管理提供了完善的函数及命令,使用它们可以方便地进行控制,本小节对这些内容进行讲解。


42.2.1 配置PVD监控功能

PVD可监控VDD的电压,当它低于阈值时可产生PVD中断以让系统进行紧急处理,这个阈值可以直接使用库函数PWR_PVDLevelConfig配置成前面表 422中说明的阈值等级。


42.2.2 WFI与WFE命令

我们了解到进入各种低功耗模式时都需要调用WFI或WFE命令,它们实质上都是内核指令,在库文件core_cmInstr.h中把这些指令封装成了函数,见代码清单 241。


代码清单 421 WFI与WFE的指令定义(core_cmInstr.h文件)


1


2 /** brief Wait For Interrupt


3


4 Wait For Interrupt is a hint instruction that suspends execution


5 until one of a number of events occurs.


6 */


7 #define __WFI __wfi


8


9


10 /** brief Wait For Event


11


12 Wait For Event is a hint instruction that permits the processor to enter


13 a low-power state until one of a number of events occurs.


14 */


15 #define __WFE __wfe


对于这两个指令,我们应用时一般只需要知道,调用它们都能进入低功耗模式,需要使用函数的格式"__WFI();"和"__WFE();"来调用(因为__wfi及__wfe是编译器内置的函数,函数内部使用调用了相应的汇编指令)。其中WFI指令决定了它需要用中断唤醒,而WFE则决定了它可用事件来唤醒,关于它们更详细的区别可查阅《cortex-CM3/CM4权威指南》了解。


42.2.3 进入停止模式

直接调用WFI和WFE指令可以进入睡眠模式,而进入停止模式则还需要在调用指令前设置一些寄存器位,STM32标准库把这部分的操作封装到PWR_EnterSTOPMode函数中了,它的定义见代码清单 402。


代码清单 422 进入停止模式


1 /**


2 * @brief 进入停止模式


3 *


4 * @note 在停止模式下所有I/O的会保持在停止前的状态


5 * @note 从停止模式唤醒后,会使用HSI作为时钟源


6 * @note 调压器若工作在低功耗模式,可减少功耗,但唤醒时会增加延迟


7 * @param PWR_Regulator: 设置停止模式时调压器的工作模式


8 * @arg PWR_MainRegulator_ON: 调压器正常运行


9 * @arg PWR_LowPowerRegulator_ON: 调压器低功耗运行


10 * @param PWR_STOPEntry: 设置使用WFI还是WFE进入停止模式


11 * @arg PWR_STOPEntry_WFI: WFI进入停止模式


12 * @arg PWR_STOPEntry_WFE: WFE进入停止模式


13 * @retval None


14 */


15 void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)


16 {


17 uint32_t tmpreg = 0;


18


19 /* 设置调压器的模式 ------------*/


20 tmpreg = PWR->CR;


21 /* 清除 PDDS 及 LPDS 位 */


22 tmpreg &= CR_DS_MASK;


23


24 /* 根据PWR_Regulator 的值(调压器工作模式)配置LPDS,MRLVDS及LPLVDS位 */


25 tmpreg |= PWR_Regulator;


26


27 /* 写入参数值到寄存器 */


28 PWR->CR = tmpreg;


29


30 /* 设置内核寄存器的SLEEPDEEP位 */


31 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;


32


33 /* 设置进入停止模式的方式-----------------*/


34 if (PWR_STOPEntry == PWR_STOPEntry_WFI) {


35 /* 需要中断唤醒*/


36 __WFI();


37 } else {


38 /* 需要事件唤醒 */


39 __WFE();


40 }


41 /* 以下的程序是当重新唤醒时才执行的,清除SLEEPDEEP位的状态*/


42 SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);


43 }


这个函数有两个输入参数,分别用于控制调压器的模式及选择使用WFI或WFE停止,代码中先是根据调压器的模式配置PWR_CR寄存器,再把内核寄存器的SLEEPDEEP位置1,这样再调用WFI或WFE命令时,STM32就不是睡眠,而是进入停止模式了。函数结尾处的语句用于复位SLEEPDEEP位的状态,由于它是在WFI及WFE指令之后的,所以这部分代码是在STM32被唤醒的时候才会执行。


要注意的是进入停止模式后,STM32的所有I/O都保持在停止前的状态,而当它被唤醒时,STM32使用HSI作为系统时钟(16MHz)运行,由于系统时钟会影响很多外设的工作状态,所以一般我们在唤醒后会重新开启HSE,把系统时钟设置会原来的状态。


前面提到在停止模式中还可以控制内部FLASH的供电,控制FLASH是进入掉电状态还是正常供电状态,这可以使用库函数PWR_FlashPowerDownCmd配置,它其实只是封装了一个对FPDS寄存器位操作的语句,见代码清单 423。这个函数需要在进入停止模式前被调用,即应用时需要把它放在上面的PWR_EnterSTOPMode之前。


代码清单 423 控制FLASH的供电状态


1 /**


2 * @brief 设置内部FLASH在停止模式时是否工作在掉电状态


3 * 掉电状态可使功耗更低,但唤醒时会增加延迟


4 * @param NewState:


5 ENABLE:FLASH掉电


6 DISABLE:FLASH正常运行


7 * @retval None


8 */


9 void PWR_FlashPowerDownCmd(FunctionalState NewState)


10 {


11 /*配置FPDS寄存器位*/


12 *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)NewState;


13 }


42.2.4 进入待机模式

类似地,STM32标准库也提供了控制进入待机模式的函数,其定义见代码清单 403。


代码清单 424 进入待机模式


1 /**


2 * @brief 进入待机模式


3 * @note 待机模式时,除以下引脚,其余引脚都在高阻态:


4 * -复位引脚


5 * - RTC_AF1 引脚 (PC13) (需要使能侵入检测、时间戳事件或RTC闹钟事件)


6 * - RTC_AF2 引脚 (PI8) (需要使能侵入检测或时间戳事件)


7 * - WKUP 引脚 (PA0) (需要使能WKUP唤醒功能)


8 * @note 在调用本函数前还需要清除WUF寄存器位


9 * @param None


10 * @retval None


11 */


12 void PWR_EnterSTANDBYMode(void)


13 {


14 /* 选择待机模式 */


15 PWR->CR |= PWR_CR_PDDS;


16


17 /* 设置内核寄存器的SLEEPDEEP位 */


18 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;


19


20 /* 存储操作完毕时才能进入待机模式,使用以下语句确保存储操作执行完毕 */


21


22 __force_stores();


23


24 /* 等待中断唤醒 */


25 __WFI();


26 }


该函数中先配置了PDDS寄存器位及SLEEPDEEP寄存器位,接着调用__force_stores函数确保存储操作完毕后再调用WFI指令,从而进入待机模式。这里值得注意的是,待机模式也可以使用WFE指令进入的,如果您有需要可以自行修改;另外,由于这个函数没有操作WUF寄存器位,所以在实际应用中,调用本函数前,还需要清空WUF寄存器位才能进入待机模式。


在进入待机模式后,除了被使能了的用于唤醒的I/O,其余I/O都进入高阻态,而从待机模式唤醒后,相当于复位STM32芯片,程序重新从头开始执行。


42.3 PWR—睡眠模式实验

在本小节中,我们以实验的形式讲解如何控制STM32进入低功耗睡眠模式。


42.3.1 硬件设计

实验中的硬件主要使用到了按键、LED彩灯以及使用串口输出调试信息,这些硬件都与前面相应实验中的一致,涉及到硬件设计的可参考原理图或前面章节中的内容。


42.3.2 软件设计

本小节讲解的是"PWR—睡眠模式"实验,请打开配套的代码工程阅读理解。


1.    程序设计要点

(1)    初始化用于唤醒的中断按键;


(2)    进入睡眠状态;


(3)    使用按键中断唤醒芯片;


2.    代码分析

main函数

睡眠模式的程序比较简单,我们直接阅读它的main函数了解执行流程,见代码清单 242。


代码清单 425 睡眠模式的main函数(main.c文件)


1


2 /**


3 * @brief 主函数


4 * @param 无


5 * @retval 无


6 */


7 int main(void)


8 {


9


10 LED_GPIO_Config();


11


12 /*初始化USART1*/


13 Debug_USART_Config();


14


15 /* 初始化按键为中断模式,按下中断后会进入中断服务函数 */


16 EXTI_Key_Config();


17


18 printf("rn欢迎使用秉火 STM32 F429 开发板。rn");


19 printf("rn秉火F429 睡眠模式例程rn");


20


21 printf("rn实验说明:rn");


22


23 printf("rn 1.本程序中,绿灯表示STM32正常运行,红灯表示睡眠状态,蓝灯表示刚从睡眠状态被唤醒rn");


24 printf("rn 2.程序运行一段时间后自动进入睡眠状态,在睡眠状态下,可使用KEY1或KEY2唤醒rn");


25 printf("rn 3.本实验执行这样一个循环:rn");


26printf("rn --》亮绿灯(正常运行)->亮红灯(睡眠模式)->按KEY1或KEY2唤醒->亮蓝灯(刚被唤醒)--》rn");


27 printf("rn 4.在睡眠状态下,DAP下载器无法给STM32下载程序,rn");


28 printf("rn可按KEY1、KEY2唤醒后下载,rn");


29 printf("rn或按复位键使芯片处于复位状态,然后在电脑上点击下载按钮,再释放复位按键,即可下载rn");


30


31 while (1) {


32 /*********执行任务***************************/


33 printf("rn STM32正常运行,亮绿灯rn");


34


35 LED_GREEN;


36 Delay(0x3FFFFFF);


37


38 /*****任务执行完毕,进入睡眠降低功耗***********/


39


40


41 printf("rn进入睡眠模式,按KEY1或KEY2按键可唤醒rn");


42


43 //使用红灯指示,进入睡眠状态


44 LED_RED;


45 //进入睡眠模式


46 __WFI(); //WFI指令进入睡眠


47


48 //等待中断唤醒 K1或K2按键中断


49


50 /***被唤醒,亮蓝灯指示***/


51 LED_BLUE;


52 Delay(0x1FFFFFF);


53


54 printf("rn已退出睡眠模式rn");


55 //继续执行while循环


56 }


57 }


这个main函数的执行流程见图 425。    


图 425 睡眠模式实验流程图


(1)    程序中首先初始化了LED灯及串口以便用于指示芯片的运行状态,并且把实验板上的两个按键都初始化成了中断模式,以便当系统进入睡眠模式的时候可以通过按键来唤醒。这些硬件的初始化过程都跟前面章节中的一模一样。


(2)    初始化完成后使用LED及串口表示运行状态,在本实验中,LED彩灯为绿色时表示正常运行,红灯时表示睡眠状态,蓝灯时表示刚从睡眠状态中被唤醒。


(3)    程序执行一段时间后,直接使用WFI指令进入睡眠模式,由于WFI睡眠模式可以使用任意中断唤醒,所以我们可以使用按键中断唤醒。


(4)    当系统进入停止状态后,我们按下实验板上的KEY1或KEY2按键,即可使系统回到正常运行的状态,当执行完中断服务函数后,会继续执行WFI指令后的代码。


中断服务函数

系统刚被唤醒时会进入中断服务函数,见代码清单 243。


代码清单 426 按键中断的服务函数(stm32f4xx_it.c文件)


1


2 void KEY1_IRQHandler(void)


3 {


4 //确保是否产生了EXTI Line中断


5 if (EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) {


6 LED_BLUE;


7 printf("rn KEY1 按键中断唤醒 rn");


8 EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);


9 }


10 }


11


12 void KEY2_IRQHandler(void)


13 {


14 //确保是否产生了EXTI Line中断


15 if (EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET) {


16 LED_BLUE;


17 printf("rn KEY2 按键中断唤醒 rn");


18 //清除中断标志位


19 EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);


20 }


21 }


用于唤醒睡眠模式的中断,其中断服务函数也没有特殊要求,跟普通的应用一样。


42.3.3 下载验证

下载这个实验测试时,可连接上串口,在电脑端的串口调试助手获知调试信息。当系统进入睡眠状态的时候,可以按KEY1或KEY2按键唤醒系统。


注意:


当系统处于睡眠模式低功耗状态时(包括后面讲解的停止模式及待机模式),使用DAP下载器是无法给芯片下载程序的,所以下载程序时要先把系统唤醒。或者使用如下方法:按着板子的复位按键,使系统处于复位状态,然后点击电脑端的下载按钮下载程序,这时再释放复位按键,就能正常给板子下载程序了。


42.4 PWR—停止模式实验

在睡眠模式实验的基础上,我们进一步讲解如何进入停止模式及唤醒后的状态恢复。


42.4.1 硬件设计

本实验中的硬件与睡眠模式中的一致,主要使用到了按键、LED彩灯以及使用串口输出调试信息。


42.4.2 软件设计

本小节讲解的是"PWR—停止模式"实验,请打开配套的代码工程阅读理解。


1.    程序设计要点

(1)    初始化用于唤醒的中断按键;


(2)    设置停止状态时的FLASH供电或掉电;


(3)    选择电压调节器的工作模式并进入停止状态;


(4)    使用按键中断唤醒芯片;


(5)    重启HSE时钟,使系统完全恢复停止前的状态。


2.    代码分析

重启HSE时钟

与睡眠模式不一样,系统从停止模式被唤醒时,是使用HSI作为系统时钟的,在STM32F429中,HSI时钟一般为16MHz,与我们常用的180MHz相关太远,它会影响各种外设的工作频率。所以在系统从停止模式唤醒后,若希望各种外设恢复正常的工作状态,就要恢复停止模式前使用的系统时钟,本实验中定义了一个SYSCLKConfig_STOP函数,用于恢复系统时钟,它的定义见代码清单 243。

推荐阅读

史海拾趣

Fagor Electrónica公司的发展小趣事

如今,Fagor Electrónica已经成为电子和数字领域的领军企业之一。展望未来,公司将继续秉承创新驱动的发展理念,加大在人工智能、物联网等新兴领域的投入。同时,Fagor Electrónica还将积极参与全球市场竞争,拓展更广阔的市场空间。相信在不久的将来,Fagor Electrónica将会创造更加辉煌的业绩。

聚辰(Giantec)公司的发展小趣事

面对电子行业的快速变革和市场需求的不断变化,港源公司始终保持敏锐的市场洞察力和持续的创新精神。公司不断加大研发投入,推动产业升级和产品结构优化。通过技术创新和高效智造系统构建,港源公司实现了产品自动化制造的高覆盖率,并在精密小型化的塑胶五金零部件领域取得了突破性技术优势。这些努力不仅使港源公司在市场竞争中保持领先地位,还为公司未来的发展奠定了坚实的基础。

得倍(DBIC)公司的发展小趣事

倍(DBIC)公司自创立之初,就致力于在电子行业中进行技术创新。公司投入大量资源进行研发,成功推出了一系列具有革命性的产品,如高效能芯片和智能传感器。这些产品不仅提高了生产效率,还满足了市场对智能化、高效能电子产品的需求。随着技术的不断进步,倍(DBIC)公司逐渐在行业中树立了技术领先的形象,吸引了众多合作伙伴和客户。

EUCHNER公司的发展小趣事

EUCHNER公司一直将质量和服务视为其生命线。公司严格控制产品质量,所有核心部件均自行生产,以确保产品的可靠性和稳定性。同时,公司还注重客户服务体验,为客户提供具有竞争力的价格及优质服务。无论是为大型汽车制造企业还是小型研究机构提供解决方案,公司都坚持与客户紧密合作并倾听他们的需求。通过持续提升质量和服务水平,EUCHNER公司逐渐赢得了客户的信任和忠诚。

Deutron Electronics Corp公司的发展小趣事

在技术优势的基础上,Deutron Electronics Corp开始了积极的市场拓展和品牌建设工作。公司参加了多个国际电子展会,展示了其创新产品和技术实力,成功吸引了众多潜在客户的关注。同时,公司还加大了对品牌宣传的投入,通过广告、公关等手段提升了品牌知名度和美誉度。这些努力使得Deutron Electronics Corp的产品逐渐在市场上占据了一席之地。

Advanced Monolythic Ceramics公司的发展小趣事

为了进一步提升竞争力,Deutron Electronics Corp积极寻求国际合作与并购机会。公司与多家国际知名电子企业建立了战略合作关系,共同研发新产品和技术。同时,公司还成功收购了几家具有核心技术的电子企业,增强了自身的研发和生产能力。这些合作与并购为Deutron Electronics Corp带来了更多的发展机遇和市场空间。

问答坊 | AI 解惑

为什么禁止上拉

用ARM9 S3C2440做跑马灯的实验时,要禁止上拉电阻,请问这是为什么啊?…

查看全部问答>

VC++2005 如何使用sqlce数据库?[急]100分

小弟最近在做嵌入式使用到sqlce,可以不知道如何全用VC++访问Sqlce,从网上看到有人说:         SqlCeConnection conn=new SqlCeConnection(); 没想到就这么着一句也会出错,居然是SqlCeConnection未声明; Error  &n ...…

查看全部问答>

烧写时候启动找不到FLASH ID?

    现象:我们的硬件平台配置是:PXA270+两片Norflsh(intel strata flash 28F256P30B),通过Jflashmm.exe进行烧写,有两块主板烧写出错:一片能读出ID(0x8919),另一片读不对(FFFF)或者(0x0000),都是low part块,是Flash坏了吗 ...…

查看全部问答>

陕西杨工c8051f单片机博客

手机 13002928013 http://c8051fmcu.blog.sohu.com…

查看全部问答>

请教2个函数

1、我定义char a[10];          int i =0; 可以用        _snprintf(a, 10, \"%d\", i); 但使用RtlStringCchPrintfW(a, 10, \"%d\", i)时出错 2、我定义BK_CMD_T tAtCmd;     &n ...…

查看全部问答>

编译wince5.0时怎么把touchpanel关掉啊?

因为我板子上没有接touchpanel,wince启动会等待触摸屏校准,如何关掉这个驱动,跳过校准这一步?…

查看全部问答>

STM32如何实现精确延时

                                 STM32如何实现精确延时到us…

查看全部问答>

关于局部,全局变量(DS18b02温度传感仿真遇到 的问题)

uchar  dsreadebyte() {         uchar dat; uchar i,j;         for (i=0;i>=1;                    _nop_();    ...…

查看全部问答>

求MSP-EXP430F5529的三轴加速度传感器使用方法

想用MSP-EXP430F5529的三轴加速度传感器检测一个人是否跌倒,但没用过三轴加速度传感器,不知有没有大神能够指导一下这个的用法。…

查看全部问答>

用msp430g2553写了一个捕获程序,但怎么进不了中断呢?请各位指点一下,谢谢!

P1DIR |= BIT1;   P1SEL |= BIT1; //捕获端口使能 TACCTL1 |= CM_1 + CAP + SCS + CCIE; //配置控制寄存器   TACTL |= TASSEL_2 + MC_2 + TACLR; TACTL &= ~CCIFG; _EINT(); //中断使能 while (1) { …… } ...…

查看全部问答>