打印
[STM8]

STM8L有关低功耗唤醒

[复制链接]
4430|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
int main(void)
{
  system_init();
  shut_boot();
  while(1)
  {
          if(start_flag)
          {                if(power_flag) boot();        //开启相关外部中断 RTC唤醒
                          if(Idel_Flag){Idel_Flag=FALSE;Menu_Show();}// 无发送命令时周期4ms 占空50%波形刷显示
                          if(work_flag)        {}                                                                   //发送相关spi指令
          }
          else shut_boot(); //关闭除开机键外的所有中断
    halt();
  }
}关机的时候电流40uA 开机待机状态下驱动一个数码管显示8 耗电流大约10个毫安 改成方波刷显示之后电流大约在4ma 由于硬件上的限流暂时不考虑, 现在只考虑软件方面减少功耗。以前的主程序里只有一个halt()所有中断都可以响应,但现在换了好多中断都出现错误。有时候中断乱跳有时候中断完成之后不安主程序里规定的执行 。中断唤醒之后 主程序是怎么运行的?
沙发
b626393883|  楼主 | 2014-11-5 18:45 | 只看该作者
这是中断配置
void EXTI_config()
{
  GPIO_Init(GPIOB, GPIO_Pin_0, GPIO_Mode_In_FL_IT);                             //KEY3
  GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_In_FL_IT);                             //KEY1
  GPIO_Init(GPIOD, GPIO_Pin_3, GPIO_Mode_In_FL_IT);                             //KEY5
  GPIO_Init(GPIOD, GPIO_Pin_4, GPIO_Mode_In_FL_IT);                             //KEY7
  GPIO_Init(GPIOD, GPIO_Pin_5, GPIO_Mode_In_FL_IT);                             //KEY2
  GPIO_Init(GPIOD, GPIO_Pin_6, GPIO_Mode_In_FL_IT);                             //KEY4
  GPIO_Init(GPIOD, GPIO_Pin_7, GPIO_Mode_In_FL_IT);                             //KEY6
  GPIO_Init(GPIOF, GPIO_Pin_0, GPIO_Mode_In_FL_IT);                             //SCRAM
  
  EXTI_SetPinSensitivity(EXTI_Pin_0, EXTI_Trigger_Falling_Low);
  EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling_Low);
  EXTI_SetPinSensitivity(EXTI_Pin_3, EXTI_Trigger_Falling_Low);
  EXTI_SetPinSensitivity(EXTI_Pin_4, EXTI_Trigger_Falling_Low);
  EXTI_SetPinSensitivity(EXTI_Pin_5, EXTI_Trigger_Falling_Low);
  EXTI_SetPinSensitivity(EXTI_Pin_6, EXTI_Trigger_Falling_Low);
  EXTI_SetPinSensitivity(EXTI_Pin_7, EXTI_Trigger_Falling_Low);

  ITC_SetSoftwarePriority(EXTI4_IRQn, ITC_PriorityLevel_1);                     //关机键的优先级  
  ITC_SetSoftwarePriority(EXTI0_IRQn, ITC_PriorityLevel_2);                     //功能键和急停的优先级
  ITC_SetSoftwarePriority(EXTI6_IRQn, ITC_PriorityLevel_2);
  ITC_SetSoftwarePriority(EXTI3_IRQn, ITC_PriorityLevel_2);
  ITC_SetSoftwarePriority(EXTI7_IRQn, ITC_PriorityLevel_2);
  ITC_SetSoftwarePriority(EXTI1_IRQn, ITC_PriorityLevel_3);                     //加键的优先级
  ITC_SetSoftwarePriority(EXTI5_IRQn, ITC_PriorityLevel_3);                     //减键的优先级
  
  enableInterrupts();
}

使用特权

评论回复
板凳
b626393883|  楼主 | 2014-11-5 18:56 | 只看该作者

以前已经好用的程序主要是考虑功耗降低想做到驱动一个数码管在不发送SPI指令下电流在4MA以下但是改了主程序之后都不好用了 中断连减就卡主了
但是用while检测按键松开就可以 但是实现不了连减。

使用特权

评论回复
地板
b626393883|  楼主 | 2014-11-5 18:57 | 只看该作者
期待大神指教

使用特权

评论回复
5
mmuuss586| | 2014-11-5 19:31 | 只看该作者
中断唤醒之后,先进入中断服务程序;
再返回到,睡眠指令后面的地方继续执行;

使用特权

评论回复
6
b626393883|  楼主 | 2014-11-5 20:20 | 只看该作者
mmuuss586 发表于 2014-11-5 19:31
中断唤醒之后,先进入中断服务程序;
再返回到,睡眠指令后面的地方继续执行; ...

也就是说中断服务程序结束之后执行halt()后面的程序是这样吗?

使用特权

评论回复
7
mmuuss586| | 2014-11-6 08:15 | 只看该作者
b626393883 发表于 2014-11-5 20:20
也就是说中断服务程序结束之后执行halt()后面的程序是这样吗?

是的;

使用特权

评论回复
8
b626393883|  楼主 | 2014-11-6 09:33 | 只看该作者
mmuuss586 发表于 2014-11-6 08:15
是的;

谢谢 我做了测试了现在两个驱动数码管显示20电流大约6.5ma 再换下限流电阻估计能达到3ma 现在发现中断有误动作的情况 我一直按键对应的外部中断3 但是有可能跳到外部中断1或者4上 但是他们对应的按键并未按下 这个是要软件做误动作处理?感觉没道理跳错中断呢 中断向量对应的也检查过了

使用特权

评论回复
9
mmuuss586| | 2014-11-6 12:10 | 只看该作者
b626393883 发表于 2014-11-6 09:33
谢谢 我做了测试了现在两个驱动数码管显示20电流大约6.5ma 再换下限流电阻估计能达到3ma 现在发现中断有 ...


如果这样的话,软件做小防错处理;
有条件的按键加些滤波;

使用特权

评论回复
10
b626393883|  楼主 | 2014-11-6 15:19 | 只看该作者
mmuuss586 发表于 2014-11-6 12:10
如果这样的话,软件做小防错处理;
有条件的按键加些滤波;

防错处理已经做了现在可以了,因为数码管高度不够所以垫了两排排针,现在全部关闭外部模块进入halt模式 大约70UA,但是我的手在靠近数码管时电流变成了14ua,用手或者其余东西压住数码管整机电流变成了2ua而且比较稳定。数码管是共阳的,按理说都关闭了不应该有影响的,难道数码管与排针接触不良发生了什么影响?

使用特权

评论回复
11
b626393883|  楼主 | 2014-11-6 16:00 | 只看该作者
加入 PWR_UltraLowPowerCmd(ENABLE);电流降低了约0.4ma 占空比改成了67% 现在数码管亮度已经很低了,就算加限流电阻也做不到2ma 还要怎么降低功耗呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

28

帖子

2

粉丝