中级会员
 
- 积分
- 320
- 金钱
- 320
- 注册时间
- 2017-10-14
- 在线时间
- 80 小时
|
10金钱
最近在做一款低功耗 IOT Sensor,静态功耗18ua,使用的MCU是SM32L031,使用lora芯片SX1278上报数据给基站,即lora发送一包数据约需要250ms,多个Sensor在同一时间上报数据时,会发生数据冲撞,没有收到基站回复的sensor会补发数据,但如果很多一起重发,依旧会发生大量冲撞,为了避免这种现象,使用了随机延时重发的方法,以单片机RTC的实时时钟子秒SubSeconds为随机数种子,使用srand()种随机数,用rand()取随机数,并将取出的随机数对17取余,得出0-16范围内的随机数,再以300ms为步进值做随机延时,这样可以做到发生数据冲撞时各个Sensor可以随机分时补报(0ms-4800ms之间以300ms步进),最高补报15次,但若使用HAL_Delay()函数,延时期间MCU为全速运行状态,功耗达到7ma以上,会对使用寿命造成很大影响。故采用低功耗定时器hlptim1做定时唤醒,代码如下: Get_Now_Time();//获取RTC时间
srand((255-stimestructure.SubSeconds)*1000/256);//种随机数种子
DelayRand=((rand()%17))*300;//取随机数,并在0-4800ms之间按300ms的步进值切分
// if(LOG)
{
printf("DelayRand = %d\r\n",DelayRand);
}
DelayRand=(DelayRand*32)/125;//把毫秒转化为定时器的SubS
HAL_NVIC_DisableIRQ(EXTI4_15_IRQn);//进入低功耗模式前关闭外部中断
HAL_LPTIM_TimeOut_Start_IT(&hlptim1,DelayRand,DelayRand); //使用低功耗定时器重发随机延时,延时期间进入低功耗模式 2019-07-30-1
EnterStopMode();//进入STOP模式
产品发布后,出现偶尔有死机现象,但并没有进入硬件错误,判断在某个死循环里,后来仿真发现,一直进入HAL_LPTIM_IRQHandler(),无法退出中断,而死机情况出现时前一次随机数为0,即定时0S后唤醒单片机,随后进入STOP模式,每次死机前一次随机数必然是0,但又不是每次随机延时0S都会导致死机。
当我把DelayRand=((rand()%17))*300;改为DelayRand=((rand()%17)+1)*300;,
再无死机现象出现,希望得到大家的意见,谢谢!
|
|