2973|6

2144

帖子

3

TA的资源

五彩晶圆(中级)

楼主
 

【TI首届低功耗设计大赛】整机低功耗设计思想 [复制链接]

一、指导思想——又想马儿跑,又想马儿少吃草 低功耗设计的指导思想我认为这句话最贴切了。针对LPM系统无非是在不影响系统功能/性能(折中处理)的前提下更少的消耗整机能量。 如何消耗更少的整机能量呢,主要有两种途径: 1、器件/芯片本身功耗较低 相同执行时间周期基准下比较,比如MSP430FRxx和传统MSP430相同代码执行时的功耗消耗比较,这要归功于FRAM的低功耗特性。 这种方式有两种主要应对的策略:
  1. 1)相同功能器件/芯片选择功耗更低的,比如选择FR替代传统的MSP430/选择功耗更低的MEMS传感器件等
复制代码
2、只浪费必须的能量,空闲时让他睡觉 一般这需要针对整机的整体功能和性能来确认,拿我的设计来说,传感器数据采集可以周期性的进行,当然控制的实时性则关系到控制的性能。 这种方式需要对整机系统有很好的把握,建议在开发低功耗系统设计的时候,先把整机的功能做好,再去做功耗控制,当然在设计的时候外设驱动的设计/模块的设计等需要提前考虑低功耗的因素:
  1. 1)在整机功能完善的情况下,考虑低功耗设计思路会更加清晰
  2. 2)了解主控芯片的LPMx模式对应的外设特性/唤醒方式等,在对这些很熟悉的情况下才能更好的来考虑低功耗
复制代码
二、空气质量检测微信平台——实战低功耗设计 先分析一下整机的功能,这样便于后面来设计整机功耗。 1、支持按键P1.1切换工作模式
  1. 1)使用中断方式,减少系统功耗消耗
复制代码
看一下软件复位函数
  1. <blockquote>#if SOFTWARE_RESET == BOR_RESET
复制代码
2、支持带时间戳的FRAM日志模式
  1. 1)时间戳需要RTC的支持,对于RTC可直接采用MSP430FR5xx自带的低功耗RTC实时时钟
复制代码
FRAM-LOG代码片段
  1. /*
  2. * 存储PM25数据到FRAM-LOG区域
  3. * 注意超过FRAM-LOG规定地址区域的处理
  4. */
  5. FRAM_PM25_log_ptr = (unsigned int*)(FRAM_PM25_LOG_START + *FRAM_index_ptr);
  6. *FRAM_PM25_log_ptr = (unsigned int)DSM501A_PM2P5_SENS;
  7. #if ENABLE_LOG_TIME_STAMP
  8. uint16_t ym,dh,ms;
  9. Calendar calendar;
  10. calendar = RTC_B_getCalendarTime(RTC_B_BASE);
  11. ym = ((uint16_t)((calendar.Year%100)&0x00FF)<<8) | calendar.Month;
  12. dh = ((uint16_t)(calendar.DayOfMonth&0x00FF)<<8) | calendar.Hours;
  13. ms = ((uint16_t)(calendar.Minutes&0x00FF)<<8) | calendar.Seconds;
  14. FRAM_PM25_stamp_ptr = (unsigned int*)(FRAM_PM25_STAMP_START + (*FRAM_index_ptr)*6 + 0);
  15. *FRAM_PM25_stamp_ptr = (unsigned int)ym;
  16. FRAM_PM25_stamp_ptr = (unsigned int*)(FRAM_PM25_STAMP_START + (*FRAM_index_ptr)*6 + 2);
  17. *FRAM_PM25_stamp_ptr = (unsigned int)dh;
  18. FRAM_PM25_stamp_ptr = (unsigned int*)(FRAM_PM25_STAMP_START + (*FRAM_index_ptr)*6 + 4);
  19. *FRAM_PM25_stamp_ptr = (unsigned int)ms;
  20. #endif
  21. *FRAM_index_ptr += 2;
  22. if ( (*FRAM_index_ptr)/2 > FRAM_PM25_LOG_TOTAL/2 ) {
  23. *FRAM_index_ptr = 0;
  24. *FRAM_fulld_ptr = 0xF11F;
  25. }
复制代码
3、支持温湿度传感器数据采集
  1. 1)温湿度传感器每隔60秒采集一次数据,平时处于LPMx模式
复制代码
4、支持PM2.5传感器数据采集
  1. 1)PM2.5传感器每隔60秒采集一次数据,平时处于LPMx模式
复制代码
捕获定时器中断代码
  1. #pragma vector = TIMER1_A1_VECTOR
  2. __interrupt void Timer1_A1_ISR(void)
  3. {
  4. switch ( __even_in_range(TA1IV, TA0IV_TAIFG) )
  5. {
  6. case TA1IV_TA1CCR1:
  7. break;
  8. case TA1IV_TA1CCR2:
  9. {
  10. /* 判断是否为下降沿捕获中断,切换到上升沿捕获中断,并清除CCR2 */
  11. if ( (TA1CCTL2&0xC000) == CM_2 ) {
  12. TA1CCTL2 = CM_1 | CCIS_0 | SCS | CAP | CCIE;
  13. TA1CCR2 = 0;
  14. TA1CTL |= TACLR;
  15. } else if ( (TA1CCTL2&0xC000) == CM_1 ) {
  16. TA1CCTL2 = CM_2 | CCIS_0 | SCS | CAP | CCIE;
  17. DSM501A_LOW_PULSE_TIME += (TA1CCR2/32);
  18. }
  19. } break;
  20. case TA1IV_TA1IFG:
  21. break;
  22. default:
  23. break;
  24. }
  25. }
复制代码
5、支持微信数据交互
  1. 1)微信数据交互支持设备---->微信 和 微信---->设备两种方式
复制代码
  1. /**
  2. * brief sendSAE_GET_Head
  3. * note 发送GET头
  4. * param None
  5. * retval None
  6. */
  7. void sendSAE_GET_Head(uint8_t temp, uint8_t humi, uint8_t mode, uint16_t pm25)
  8. {
  9. char tempStr[10];
  10. char humiStr[10];
  11. char modeStr[10];
  12. char pm25Str[10];
  13. _DINT();
  14. memset(tempStr, 0x00, 10);
  15. memset(humiStr, 0x00, 10);
  16. memset(modeStr, 0x00, 10);
  17. memset(pm25Str, 0x00, 10);
  18. _itoa(temp, tempStr, 10);
  19. _itoa(humi, humiStr, 10);
  20. _itoa(mode, modeStr, 10);
  21. _itoa(pm25, pm25Str, 10);
  22. USCA1_strPrint((char*)GETHEAD[0]);
  23. USCA1_strPrint(tempStr);
  24. USCA1_strPrint((char*)GETHEAD[1]);
  25. USCA1_strPrint(humiStr);
  26. USCA1_strPrint((char*)GETHEAD[3]);
  27. USCA1_strPrint(pm25Str);
  28. USCA1_strPrint((char*)GETHEAD[4]);
  29. USCA1_strPrint((char*)GETHEAD[5]);
  30. USCA1_strPrint((char*)GETHEAD[6]);
  31. USCA1_strPrint((char*)GETHEAD[7]);
  32. _EINT();
  33. }
复制代码
6、支持FRAM-log日志打印
  1. 1)支持自定义的AT+扩展指令查询设备相关操作
复制代码
关于UART接收低功耗设计的思路可参考之前的帖子: 【TI首届低功耗设计大赛】为msp430fr5969移植命令行nanouif
  1. https://bbs.eeworld.com.cn/thread-447473-1-1.html
复制代码
仅仅举例FRAM时间戳日志代码
  1. /**
  2. * brief transmitFRAMData
  3. * note 传输FRAMlog数据
  4. * param None
  5. * retval None
  6. */
  7. void transmitFRAMData(void)
  8. {
  9. uint16_t i;
  10. uint8_t year,mon,day,hour,min,sec;
  11. char years[5],mons[5],days[5],hours[5],mins[5],secs[5];
  12. char PM25_Index[10];
  13. char PM25_Value[10];
  14. FRAM_index_ptr = (unsigned int*)FRAM_PM25_INDEX;
  15. if ((unsigned int)(*FRAM_fulld_ptr) == 0x0000) {
  16. _itoa( ((unsigned int)(*FRAM_index_ptr))/2, PM25_Index, 10);
  17. printf("FRAM log data index %s\r\n", PM25_Index);
  18. for (i=0; i<*FRAM_index_ptr; i+=2) {
  19. year = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+1)>>0)&0xFF;
  20. mon = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+0)>>0)&0xFF;
  21. day = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+3)>>0)&0xFF;
  22. hour = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+2)>>0)&0xFF;
  23. min = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+5)>>0)&0xFF;
  24. sec = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+4)>>0)&0xFF;
  25. _itoa( year, years, 10);
  26. _itoa( mon, mons, 10);
  27. _itoa( day, days, 10);
  28. _itoa( hour, hours, 10);
  29. _itoa( min, mins, 10);
  30. _itoa( sec, secs, 10);
  31. printf("Time stamp 20%02s-%02s-%02s %02s:%02s:%02s ", years, mons, days, hours, mins, secs);
  32. _itoa( *(unsigned int*)(FRAM_PM25_LOG_START+i), PM25_Value, 10 );
  33. printf("FRAM log data value %s\r\n", PM25_Value);
  34. __delay_cycles(100);
  35. }
  36. } else if ((unsigned int)(*FRAM_fulld_ptr) == 0xF11F) {
  37. _itoa( ((unsigned int)(*FRAM_index_ptr))/2, PM25_Index, 10);
  38. printf("FRAM log data index %s\r\n", PM25_Index);
  39. for (i=*FRAM_index_ptr; i<FRAM_PM25_LOG_TOTAL; i+=2) {
  40. year = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+1)>>0)&0xFF;
  41. mon = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+0)>>0)&0xFF;
  42. day = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+3)>>0)&0xFF;
  43. hour = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+2)>>0)&0xFF;
  44. min = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+5)>>0)&0xFF;
  45. sec = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+4)>>0)&0xFF;
  46. _itoa( year, years, 10);
  47. _itoa( mon, mons, 10);
  48. _itoa( day, days, 10);
  49. _itoa( hour, hours, 10);
  50. _itoa( min, mins, 10);
  51. _itoa( sec, secs, 10);
  52. printf("Time stamp 20%02s-%02s-%02s %02s:%02s:%02s ", years, mons, days, hours, mins, secs);
  53. _itoa( *(unsigned int*)(FRAM_PM25_LOG_START+i), PM25_Value, 10 );
  54. printf("FRAM log data value %s\r\n", PM25_Value);
  55. __delay_cycles(100);
  56. }
  57. for (i=0; i<*FRAM_index_ptr; i+=2) {
  58. year = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+1)>>0)&0xFF;
  59. mon = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+0)>>0)&0xFF;
  60. day = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+3)>>0)&0xFF;
  61. hour = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+2)>>0)&0xFF;
  62. min = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+5)>>0)&0xFF;
  63. sec = (*(uint8_t*)(FRAM_PM25_STAMP_START+6*i+4)>>0)&0xFF;
  64. _itoa( year, years, 10);
  65. _itoa( mon, mons, 10);
  66. _itoa( day, days, 10);
  67. _itoa( hour, hours, 10);
  68. _itoa( min, mins, 10);
  69. _itoa( sec, secs, 10);
  70. printf("Time stamp 20%02s-%02s-%02s %02s:%02s:%02s ", years, mons, days, hours, mins, secs);
  71. _itoa( *(unsigned int*)(FRAM_PM25_LOG_START+i), PM25_Value, 10 );
  72. printf("FRAM log data value %s\r\n", PM25_Value);
  73. __delay_cycles(100);
  74. }
  75. }
  76. }
复制代码
注册的AT指令,关于AT指令实现可参考之前的帖子
  1. /**
  2. * @brief uif_cmd_fram
  3. * @note FRAM命令
  4. * @param none
  5. * @retval none
  6. */
  7. void
  8. uif_cmd_fram (int argc, char **argv)
  9. {
  10. if (argc != 2) {
  11. printf("Error: Invalid argument list\r\n");
  12. printf("\r\n");
  13. return;
  14. }
  15. if ( ((argc-1) >= UIF_CMDTAB[1].min_args) && ((argc-1) <= UIF_CMDTAB[1].max_args) ) {
  16. if (argv[1] != NULL) {
  17. if (strcasecmp("pm2.5", argv[1]) == 0){
  18. transmitFRAMData();
  19. }else if (strcasecmp("cls", argv[1]) == 0){
  20. clearFRAMData();
  21. } else {
  22. printf(INVOPT, argv[1]);
  23. printf("\r\n");
  24. return;
  25. }
  26. }
  27. printf("+ok\r\n\r\n");
  28. return;
  29. } else {
  30. printf(INVARG, argv[0]);
  31. printf("\r\n");
  32. return;
  33. }
  34. }
复制代码
三、主要流程图——文字说不太清楚的逻辑 1、主流程 2、PORT1_ISR 3、TIMER0_A1_ISR 4、TIEMR1_A1_ISR 5、TIMER1_A2_ISR 6、USCI_A1_ISR 7、配置模式细节流程图全部忽略,画个图有点辛苦。。。 四、一些参考链接 【TI首届低功耗设计大赛】msp430fr5969_硬件准备好了 【TI首届低功耗设计大赛】msp430fr5969_漫谈铁电FRAM 【TI首届低功耗设计大赛】为msp430fr5969移植命令行nanouif 【TI首届低功耗设计大赛】为LaunchPad添加AT指令解析 【TI首届低功耗设计大赛】wifi通信测试 【TI首届低功耗设计大赛】PM2.5传感器驱动+测试 【TI首届低功耗设计大赛】空气质量检测_初步完成视频 【TI首届低功耗设计大赛】微信与FR5969交互 【TI首届低功耗设计大赛】小结一下,今天比较闲

最新回复

好  我们让技术看看   详情 回复 发表于 2014-12-29 09:32
 
点赞 关注
个人签名电工

回复
举报

2144

帖子

3

TA的资源

五彩晶圆(中级)

沙发
 
哎,真是个悲剧。。
丢了好多文字啊,所有的代码插入的那种里面全部丢了,基本上都有5条以上的分析,全丢了

算着,大家看流程图吧。

点评

丢失的原因是?  详情 回复 发表于 2014-12-29 09:02
 
个人签名电工
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
真详细,谢谢楼主了

点评

丢了很多东西,有点乱。。。  详情 回复 发表于 2014-12-29 08:37
 
个人签名

So TM what......?

 

 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

4
 
ljj3166 发表于 2014-12-28 21:50
真详细,谢谢楼主了
丢了很多东西,有点乱。。。
 
个人签名电工
 
 

回复

2万

帖子

71

TA的资源

管理员

5
 
lyzhangxiang 发表于 2014-12-28 16:00
哎,真是个悲剧。。
丢了好多文字啊,所有的代码插入的那种里面全部丢了,基本上都有5条以上的分析,全丢了

算着,大家看流程图吧。
丢失的原因是?
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

6
 
写的时间有点长,直接在网上写的,没在word中先写好。。下次注意了
我写的过程中用了下面红色的那个保存数据丢失的数据都是<>这个代码引用工具中的文字(全部)或代码(部分),比如那个复位函数


点评

好 我们让技术看看  详情 回复 发表于 2014-12-29 09:32
 
个人签名电工
 
 

回复

2万

帖子

71

TA的资源

管理员

7
 
lyzhangxiang 发表于 2014-12-29 09:14
写的时间有点长,直接在网上写的,没在word中先写好。。下次注意了
我写的过程中用了下面红色的那个保存数据丢失的数据都是这个代码引用工具中的文字(全部)或代码(部分),比如那个复位函数
好  我们让技术看看
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表