6707|1

653

帖子

1

TA的资源

纯净的硅(中级)

楼主
 

【Nucleo心得】+(八)HRM_LowPowerRTC 的例程运行 [复制链接]

本帖最后由 mars4zhu 于 2014-11-27 11:32 编辑


HRM_LowPowerRTC 是低功耗RTC,平时进入低功耗模式,RTC唤醒后,通过notify来通知手机更新心率数据(心率数据是模拟产生随机心率,即hr = (rand()&0x1F)+60;)。


  1. hr = (rand()&0x1F)+60;

  2.           __disable_irq();                        /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
  3.           send_hr_measurement = 0;
  4.           __set_PRIMASK(uwPRIMASK_Bit);        /**< Restore PRIMASK bit*/
  5.           deviceState = APPL_WAIT;

  6.           //HRProfile_Set_Sensor_Contact_Support_Bit(); //for test case TC_CN_BV_05
  7.                   Osal_MemSet((void*)&heartRateMeasurmentValue, 0, sizeof(heartRateMeasurmentValue));
  8.           heartRateMeasurmentValue.valueformat = HRM_VALUE_FORMAT_UINT8;//HRM_VALUE_FORMAT_UINT16;
  9.           heartRateMeasurmentValue.sensorContact = HRM_SENSOR_CONTACT_PRESENT;
  10.           heartRateMeasurmentValue.energyExpendedStatus = HRM_ENERGY_EXPENDED_PRESENT;
  11.           heartRateMeasurmentValue.rrIntervalStatus = HRM_RR_INTERVAL_PRESENT;
  12.           heartRateMeasurmentValue.heartRateValue = hr;//(uint8)0xE4;
  13.           heartRateMeasurmentValue.enrgyExpended = 0x00;
  14.           heartRateMeasurmentValue.numOfRRIntervalvalues = 0x05;

  15.           for (indx=0; indx<9; indx++)
  16.           {
  17.             heartRateMeasurmentValue.rrIntervalValues[indx] = (uint16)(indx + 0);
  18.           }
  19.           HRProfile_Send_HRM_Value (heartRateMeasurmentValue);
复制代码



通过进入睡眠模式,使用RTC的唤醒功能,每1s唤醒。
  1. /**
  2. * @brief  Disable wakeup counter and set the wakeup time
  3. * @param  None
  4. * @retval None
  5. */
  6. void LPM_EnterStopMode(void)
  7. {
  8.     /* Disable Wakeup Counter */
  9.     HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);

  10.     /*## Setting the Wake up time ############################################*/
  11.     /*  RTC Wakeup Interrupt Generation:
  12.         Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI))
  13.         Wakeup Time = Wakeup Time Base * WakeUpCounter
  14.                     = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI)) * WakeUpCounter
  15.         ==> WakeUpCounter = Wakeup Time / Wakeup Time Base

  16.         To configure the wake up timer to 4s the WakeUpCounter is set to 0x1FFF:
  17.           RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16
  18.           Wakeup Time Base = 16 /(~39.000KHz) = ~0,410 ms
  19.           Wakeup Time = ~4s = 0,410ms  * WakeUpCounter
  20.           ==> WakeUpCounter = ~4s/0,410ms = 9750 = 0x2616 */
  21.     //HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0x2616, RTC_WAKEUPCLOCK_RTCCLK_DIV16); /* Setting the Wake up time to 4s*/
  22.     HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0x987, RTC_WAKEUPCLOCK_RTCCLK_DIV16); /* Setting the Wake up time to 1s*/
  23.     //HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0x262, RTC_WAKEUPCLOCK_RTCCLK_DIV16); /* Setting the Wake up time to 0.25s*/   
  24. }
复制代码


该例程必须使用X-CUBE-IDB04\Utilities\Android_Software\HRM_CentralBLE\STM32_BLE_Toolbox.apk进行测试。

效果如下:(必须在Option里面设置成BLE Service Display, 不然不停的连接、断开。。。。不知道这么做是为什么)


进入下列界面后, 必须点击notfi/indic按钮, 设置BlueNRG的心率notification功能, 这样基本上每隔一秒钟, 心率数据就会变化(随机数模仿的心率)


下载了程序后,再去调试, 发现无法连接, 经过N多次摸索后,终于发现原因为:
程序中复用了JTAG或SW复用引脚导致程序执行后出现启动配置错误或者调试引脚被占用而引起的芯片锁死

X-CUBE-IDB04\Projects\STM32L053R8-Nucleo\Applications\Bluetooth_LE\HRM_LowPowerRTC
这个程序为了实现低功耗, 把SWD引脚功能给设置成了Analog-In模式,也就是下载了第一次之后,SWD就不能正常用了。 必须是“under-reset”才能发现芯片, 但是这样的话就无法实现正常调试i运行了。


我把它的代码改了一下,就可以正常用SWD了。
把low_power_conf.c 第138行那一段,把PA所有IO口都设置为这种模式了:

  1.   /* Configure all GPIO port pins in Analog Input mode (floating input trigger OFF) */
  2.   GPIO_InitStructure.Pin = GPIO_PIN_All;
  3.   GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
  4.   GPIO_InitStructure.Pull = GPIO_NOPULL;
  5. HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
  6.   HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
  7.   HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
  8.   HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
  9.   HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);
复制代码

我改成以下, 不改变PA13和PA14(也就是维持SWD的SWCLK和SWDIO两个引脚的调试功能),就可以正常运行调试了。

  1.   /* Configure all GPIO port pins in Analog Input mode (floating input trigger OFF) */
  2.   GPIO_InitStructure.Pin = GPIO_PIN_All;
  3.   GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
  4.   GPIO_InitStructure.Pull = GPIO_NOPULL;
  5. //  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
  6.   HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
  7.   HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
  8.   HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
  9.   HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);
复制代码








HRM的Profile标准提供了传感器位置的数据,原例程设置为BODY_SENSOR_LOCATION_HAND,我把它改为BODY_SENSOR_LOCATION_EAR_LOBE

修改hrm_profile_application.c中断额Init_Profile()函数,
  1. void Init_Profile()
  2. {
  3. #if (BLE_CURRENT_PROFILE_ROLES & HEART_RATE_SENSOR)
  4. PRINTF ("Test Application: Initializing Heart Rate Profile \n" );
  5. PRINTF ("Initializing Heart Rate Profile \n" );

  6. if (HRProfile_Init((uint8)0xFF,
  7. BLE_Profiles_Evt_Notify_Cb,
  8. BODY_SENSOR_LOCATION_EAR_LOBE) == BLE_STATUS_SUCCESS)
  9. {
  10. APPL_MESG_DBG(profiledbgfile,"Initialized Heart Rate Profile \n" );
  11. }
  12. else
  13. {
  14. APPL_MESG_DBG(profiledbgfile,"Failed Heart Rate Profile \n" );
  15. }
  16. #endif
  17. }/* end Init_Profile() */
复制代码





此帖出自stm32/stm8论坛

最新回复

不错,感谢恭喜。。。。。。。。。  详情 回复 发表于 2014-11-27 12:12

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报

4997

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
不错,感谢恭喜。。。。。。。。。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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