因项目需要, 寻觅了一段时间STM32L系列的低功耗方案, 并测试了 运行态最小功耗模式(ram上运行code),结果证明功耗的确比较理想, 只是实际使用的是睡眠模式,这种测试了一下就再没接触,有机会还是可是使用这种模式的。芯片是stm32l051c8t6, 下面贴下代码:
//注意, 这里只是main函数
typedef void (*fun)(void); //定义一个函数p 类型的参数.
u32 ramBuf[1024];
u32* pot;
void delay_ms(u32 tms) //
{
u32 i, j;
for(i = 0; i < tms; i++)
{
for(j = 0; j < diver; j++) //2.1MHz, 526->1ms
{ }
}
}
void Gpio_Config(void)
{
RCC->IOPENR |= (RCC_IOPENR_GPIOAEN | RCC_IOPENR_GPIOBEN | RCC_IOPENR_GPIOCEN);
GPIOA->MODER = 0x28000000;//0x28000000; //SWD 不能改0; //
GPIOA->PUPDR = 0x55555555; //设置为上拉输入
GPIOB->MODER = 0x55555555; //0x00010000; // b8 out 0
GPIOB->PUPDR = 0; //0x55545555; //设置为上拉输入
GPIOC->MODER = 0x55555555;//0xf7ffffff; //C13 01:OUT 0
GPIOC->PUPDR = 0; //
}
// 要复制到 ram中运行, 不可调用任何函数(flash 要关闭)
void lpRunRam(void)
{
u32 dly;
//initPPP;
FLASH->PDKEYR = 0x04152637;//写入解锁序列.
FLASH->PDKEYR = 0xFAFBFCFD;
FLASH->ACR |= FLASH_ACR_RUN_PD; //关闭FLASH
while(1)
{
LED_ON;
dly = 32768;
while(dly--);
LED_OFF;
dly = 32768;
while(dly--);
//所有的ram运行工作, 没有代码依赖, ram可访问
}
FLASH->ACR &= ~FLASH_ACR_RUN_PD;
}
// 准备工作, ram lowpwr运行
void readyRunRam(void)
{
u32 i;
fun pramfun;
pot = (u32*)((u8*)(&lpRunRam)-1);
for(i = 0; i < 256; i++) //代码复制
ramBuf[i] = pot[i];
pramfun = (fun)((u32)ramBuf+1); / 注意 要加1 ,末位区分ARM与Thumb状态
pramfun(); // 这里一旦执行, PC指针就跳到 RAM去了, 上面的数组(ramBuf),funny
}
void Init(void)
{
uint32_t delay;
Gpio_Config(); //输出初始化
RCC->APB1ENR |= (RCC_APB1ENR_PWREN); /* (1) */
PWR->CR = PWR_CR_ULP | PWR_CR_VOS_0 | PWR_CR_VOS_1; /* PWR->CR |(2) */// 1.2V
delay =2000000; while(--delay);
// 1: 1.2v 800
delay_ms(100);
// 65 536 Hz
RCC->ICSCR &= 0xffff1fff;
RCC->CFGR |= RCC_CFGR_HPRE_3;
delay_ms(100);
PWR->CR |= PWR_CR_LPSDSR; // LPSDSR bit, must set before lprun set
//reset after lprun reset;-> lprun = 0时 操作 lpsdsr
delay_ms(100);
PWR->CR |= PWR_CR_LPRUN;
delay_ms(100);
readyRunRam();
}
int main(void)
{
Init();
while(1)
{
user code...
}
}
上面我是想ram运行 没有使用正规的方法,正规方法应该是自己写 分散加载文件, xxx.sct 文件,这个我还不会,下面给个实现的连接,eepw网的,http://www.eepw.com.cn/article/201611/316126.htm, 如果没有账号或者不想登录,自己查看源代码(把源代码复制到自建的html文本中,找到 应用程序遮罩 类字样, 删除这一段就好了^_^)。 下面是 数据手册的功耗数据:
关于ram运行-复制大法,另一篇有个完整点的,只是用途有限些,我是用在IAP中的,效果很好,可以做到自更新(更新IAP代码)。