LPC824有颗M0的芯
虽然有些许瑕疵
低功耗做的不错
Power-down模式下很轻松做到几个uA
麻烦地方在于需要仔细调整每个IO管脚的设置
附件给出了所有可配置管脚的列表
通过对pinEnergySavingTable中每个管脚的设置
来调试最终功耗
需从NXP官网下载LPC824库文件chip_8xx及chip_common来支持
单片机源程序如下:
- #include "includes.h"
- #include "energy.h"
- enum {
- INPUT = 0,
- OUTPUT = 1,
- };
- enum {
- LOW = 0,
- HIGH = 1,
- };
- const struct struPinEnergySavingTable pinEnergySavingTable[] = {
- {
- .pin = 0,
- .iocon = IOCON_PIO0,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 1,
- .iocon = IOCON_PIO1,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 2,
- .iocon = IOCON_PIO2,
- .dir = 0,
- }, // SWM_FIXED_SWDIO
- {
- .pin = 3,
- .iocon = IOCON_PIO3,
- .dir = 0,
- }, // SWM_FIXED_SWCLK
- {
- .pin = 4,
- .iocon = IOCON_PIO4,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 5,
- .iocon = IOCON_PIO5,
- .dir = 0,
- }, // RESET
- {
- .pin = 6,
- .iocon = IOCON_PIO6,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 7,
- .iocon = IOCON_PIO7,
- .dir = 0,
- }, // SWM_FIXED_ADC0
- {
- .pin = 8,
- .iocon = IOCON_PIO8,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 9,
- .iocon = IOCON_PIO9,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 10,
- .iocon = IOCON_PIO10,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 11,
- .iocon = IOCON_PIO11,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 12,
- .iocon = IOCON_PIO12,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 13,
- .iocon = IOCON_PIO13,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 14,
- .iocon = IOCON_PIO14,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 15,
- .iocon = IOCON_PIO15,
- .dir = 0,
- },
- {
- .pin = 16,
- .iocon = IOCON_PIO16,
- .dir = 1,
- .level = 1,
- },
- {
- .pin = 17,
- .iocon = IOCON_PIO17,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 18,
- .iocon = IOCON_PIO18,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 19,
- .iocon = IOCON_PIO19,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 20,
- .iocon = IOCON_PIO20,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 21,
- .iocon = IOCON_PIO21,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 22,
- .iocon = IOCON_PIO22,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 23,
- .iocon = IOCON_PIO23,
- .dir = 0,
- },
- {
- .pin = 24,
- .iocon = IOCON_PIO24,
- .dir = 0,
- },
- {
- .pin = 25,
- .iocon = IOCON_PIO25,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 26,
- .iocon = IOCON_PIO26,
- .dir = 1,
- .level = 0,
- },
- {
- .pin = 27,
- .iocon = IOCON_PIO27,
- .dir = 1,
- .level = 1,
- },
- {
- .pin = 28,
- .iocon = IOCON_PIO28,
- .dir = 1,
- .level = 0,
- },
- };
- #define PIN_ENERGY_SAVING_NUM (sizeof(pinEnergySavingTable) / sizeof(struct struPinEnergySavingTable))
- static inline void PinEnergySaving(const struct struPinEnergySavingTable *saving)
- {
- Chip_IOCON_PinSetMode(LPC_IOCON, saving->iocon, PIN_MODE_INACTIVE);
- if (saving->dir) {
- Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 0, saving->pin);
- if (saving->level) {
- Chip_GPIO_SetPinOutHigh(LPC_GPIO_PORT, 0, saving->pin);
- } else {
- Chip_GPIO_SetPinOutLow(LPC_GPIO_PORT, 0, saving->pin);
- }
- } else {
- Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT, 0, saving->pin);
- }
- }
- void EnergyPeripheral(void)
- {
- int i;
-
- for (i = 0; i < 9; i++) {
- LPC_SWM->PINASSIGN[i] = 0xFFFFFFFF;
- }
- LPC_SWM->PINENABLE0 |= (1 << (SWM_FIXED_ADC11 + 1)) - 1;
-
- for (i = 0; i < PIN_ENERGY_SAVING_NUM; i++) {
- PinEnergySaving(&pinEnergySavingTable[i]);
- }
- }
- void PowerDownMode(void)
- {
- // 6.7.6.2 Programming Power-down mode
-
- // Select the power configuration in Power-down mode in the PDSLEEPCFG
- Chip_SYSCTL_SetDeepSleepPD(SYSCTL_DEEPSLP_BOD_PD | SYSCTL_DEEPSLP_WDTOSC_PD);
- // Select the power configuration after wake-up in the PDAWAKECFG
- Chip_SYSCTL_SetWakeup(
- SYSCTL_SLPWAKE_BOD_PD |
- SYSCTL_SLPWAKE_ADC_PD |
- SYSCTL_SLPWAKE_SYSOSC_PD |
- SYSCTL_SLPWAKE_SYSPLL_PD |
- SYSCTL_SLPWAKE_ACMP_PD);
- LPC_SYSCTL->PDRUNCFG = LPC_SYSCTL->PDAWAKECFG;
- // If any of the available wake-up interrupts are used for wake-up, enable the interrupts in the interrupt wake-up registers
- Chip_SYSCTL_EnablePINTWakeup(0);
- Chip_SYSCTL_EnablePINTWakeup(1);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
energy.rar
(1.52 KB, 下载次数: 8)
|