# 1. 打猎相机外置MCU软件设计   为满足打猎相机的低功耗需求,使用外置MCU的硬件设计框架,在非工作状态下保持外置MCU供电,CPU断电,满足低功耗的产品需求。 | 修改 | 说明 | | ---- | ---- | | 2024-5-14 | 首次评审。 | ## 1.1. 基本概念 * **工作状态:** | 工作状态 | 说明 | | ---- | ---- | | OFF状态 | 整机处于断电状态,包括外置MCU和主控。 | | TEST状态 | 非正常工作状态,此时主控常通电,除非无操作时自动切换到ON状态。 | | ON状态 | 设备正常工作状态,必须保证低功耗性能,PIR触发抓拍后必须快速关机(主控断电)。 | **评审补充:** 1. 首次整机上电,必须CPU物理上电,完成SD卡产测文件检测,实现产测功能; 2. 动态切换到TEST/ON状态,需要CPU物理上电; * **启动模式:决定CPU单次启动的任务内容;**   每次启动的时间都是有限的,由CPU完成单次启动完成任务后发送断电关机指令给MCU,MCU给CPU断开物理电源;启动模式可以由CPU主动询问,也可以由MCU主动发送。 | 启动模式 | 说明 | | ---- | ---- | | PIR启动 | PIR触发启动。 | | TEST启动 | 三档拨键拨到“TEST”,常通电的工作模式。 | | ON启动 | 三档拨键拨到“ON”,正常工作模式。 | | 连拍启动 | PIR触发场景下,用户可以设置连拍的张数和连拍的间隔,CPU通过协议告诉MCU在多少时间之后进行连拍启动。 | | PIR延时启动 | 同PIR启动,只是PIR触发后,需要延时一段时间再给CPU上电。 | | 定时启动 | 间隔固定时间启动一次,例如:60min/次 **待定** | | 关机启动 | 某种场景下需要关机,给CPU上电一次,由CPU正式下发“关机”指令。 | | 低电关机 | 电池低电需要关机,给CPU上电一次,由CPU正式下发“关机”指令。 | | 异常启动 | CPU不正常时断电重启,例如:喂狗异常,超时启动异常。 |   工作模式对应板子上的三档拨键,有三个工作模式:关机/TEST/ON。 **评审补充:** * 一个PIR连拍周期内忽略PIR触发; ## 1.2. MCU基本功能 * 外围连接RTC,PIR传感器,电量计; * 保存数据包括:CPU的启动模式,CPU定时启动时间,工作时间周期,PIR灵敏度; * 使用串口协议与CPU进行数据/功能协议交互; | 需要保存的数据 | 说明 | | ---- | ---- | | 启动模式 | ---- | | 定时启动时间 | 例如:60min/次 | | 工作时间 | 打猎机正常PIR触发的时间周期,例如:2:00 ~ 20:00 | | PIR灵敏度 | PIR灵敏度设置 | **存疑:** 硬件光敏接在主控上,先由主控内置MCU控制,正常启动后Linux是否可以复用此GPIO口。 ## 1.3. 功能UML时序图 ### 1.3.1. 整机物理上电启动   整机物理上电时,根据实际情况刷新设备的工作状态。 补充: 如果掉电无法保存数据,首次物理上电向主控获取; 默认开启喂狗; ```mermaid sequenceDiagram participant CPU participant MCU MCU ->> MCU:物理上电 MCU ->> MCU:串口初始化 opt 检测到TEST拨档挡位 MCU ->> CPU:物理上电 MCU ->> +CPU:发送启动模式:TEST启动 CPU ->> CPU:TEST启动 CPU -->> -MCU:回复OK loop 无操作 CPU ->> +MCU:发送关机指令 MCU -->> -CPU:回复OK MCU ->> CPU:物理断电 end end opt 检测到ON拨档挡位 note over MCU:正常工作模式,PIR触发后可给主控上电 end opt PIR触发中断 MCU ->> CPU:物理上电 MCU ->> +CPU:发送PIR触发启动 CPU ->> CPU:PIR启动 CPU -->> -MCU:回复OK CPU ->> +MCU:发送关机指令 MCU -->> -CPU:回复OK MCU ->> CPU:物理断电 end MCU ->> MCU:休眠 note over MCU:休眠后进入正常工作模式:当发生PIR触发时,
给CPU物理上电并发送PIR启动命令 ``` ### 1.3.2. MCU休眠逻辑   合理的休眠设计,最大降低产品功耗,延长单次换电的使用周期。 定时中断待确认; ```mermaid sequenceDiagram participant CPU participant MCU loop 常通电待机 opt CPU关机 CPU ->> MCU:发送关机指令 MCU ->> CPU:物理断电 MCU ->> MCU:休眠 end opt PIR触发中断 MCU ->> MCU:休眠唤醒 MCU ->> CPU:物理上电 MCU ->> +CPU:发送PIR触发启动 CPU -->> -MCU:回复OK end opt TEST按键中断 MCU ->> MCU:休眠唤醒 MCU ->> CPU:物理上电 MCU ->> +CPU:发送TEST启动 CPU -->> -MCU:回复OK end opt 设置定时唤醒 CPU ->> MCU:发送设置定时唤醒协议 opt 定时唤醒中断 MCU ->> MCU:休眠唤醒 MCU ->> CPU:物理上电 MCU ->> +CPU:发送定时唤醒启动 CPU -->> -MCU:回复OK end end end ``` ### 1.3.3. 常通电待机   描述上电后的各种场景。 #### 1.3.3.1. 定时唤醒刷新环境数据(**待定,忽略**)   MCU定时唤醒更新环境参数,保证工作触发时的环境参数正确性。 ```mermaid sequenceDiagram participant CPU participant MCU loop 常通电待机 loop 大循环定时中断(20min/次) note over MCU:大循环定时中断负责定时触发小循环定时中断 opt 定时唤醒中断 loop 小循环采集数据(1s/次,共30次) note over MCU:小循环定时器,短时间间隔唤醒,多次采集环境数据,
计算出合理稳定的环境参数并保存,在工作时可快速响应。 MCU ->> MCU:采集环境数据 note right of MCU:采集光敏数据 opt 采集30次完成 note over MCU:计算平均值作为单次采集的真实数据 MCU ->> MCU:计算30次平均值 opt 对比上次发生翻转 MCU ->> MCU:保存最新数据(白天/黑夜) MCU ->> +CPU:发送数据同步任务 CPU -->> -MCU:回复OK MCU ->> CPU:物理上电 CPU ->> +MCU:读取白天黑夜数据 MCU -->> -CPU:回复白天黑夜数据 CPU ->> MCU:断电关机 MCU ->> CPU:物理断电 end end end end end end ``` #### 1.3.3.2. 喂狗   外置MCU充当硬件狗,在系统异常时断电重启系统。喂狗逻辑和启动模式无关。 默认开启喂狗; ```mermaid sequenceDiagram participant CPU participant MCU MCU ->> MCU:物理上电 MCU ->> CPU:某种启动模式触发物理上电 opt 主控开启喂狗 CPU ->> +MCU:开启狗/设置喂狗周期 MCU -->> -CPU:回复OK loop 主控喂狗 note over MCU:喂狗不需要回复 CPU ->> MCU:喂狗 end loop MCU定时查狗 alt 主控喂狗异常 MCU ->> CPU:断电重启 MCU ->> +CPU:发送启动模式:喂狗异常启动 CPU ->> CPU:喂狗异常启动 CPU -->> -MCU:回复OK CPU ->> MCU:断电关机 end end end CPU ->> MCU:断电关机 MCU ->> CPU:物理断电 MCU ->> MCU:休眠 note over MCU:休眠后进入正常工作模式:当发生PIR触发时,
给CPU物理上电并发送PIR启动命令 ``` #### 1.3.3.3. 心跳   CPU单次上电时间都是有限的,在主控未主动开启喂狗时,30s主动查询一次心跳,未回复则断电重启。此设计保证程序异常时电量不会一直消耗完。 **注意:** 整机上电之后如果从来未开启过喂狗功能,此功能不生效。避免调试版本不停重启。 取消心跳,默认开启喂狗。喂狗线程模拟主线程心跳; 单次上电时间异常重启,总时间3min; ```mermaid sequenceDiagram participant CPU participant MCU MCU ->> MCU:物理上电 MCU ->> CPU:某种启动模式触发物理上电 opt 主控开启喂狗 CPU ->> +MCU:开启狗/设置喂狗周期 MCU -->> -CPU:回复OK MCU ->> MCU:激活心跳功能 end CPU ->> MCU:断电关机 MCU ->> CPU:物理断电 MCU ->> MCU:休眠 note over MCU:只要CPU某次启动开启喂狗功能,下次启动心跳功能就会生效。 MCU ->> CPU:某种启动模式触发物理上电 opt 心跳功能已经激活 note over MCU:心跳功能在主控未开启喂狗时(异常)发挥作用。 opt 主控未开启喂狗 loop 30s主动查询一次心跳 MCU ->> +CPU:发送心跳包 alt 心跳回复 CPU -->> -MCU:回复OK else 5s超时, 心跳未回复 MCU ->> CPU:断电重启 MCU ->> +CPU:发送启动模式:心跳异常启动 CPU ->> CPU:心跳异常启动 CPU -->> -MCU:回复OK CPU ->> MCU:断电关机 end end end CPU ->> MCU:断电关机 MCU ->> CPU:物理断电 MCU ->> MCU:休眠 end ``` #### 1.3.3.4. PIR触发任务   PIR触发是相机的正常工作模式,相机会快速启动抓拍,并快速关机。 ```mermaid sequenceDiagram participant CPU participant MCU loop 常通电待机 opt PIR触发中断 MCU ->> MCU:休眠唤醒 MCU ->> CPU:物理上电 MCU ->> +CPU:发送PIR触发启动模式 CPU ->> CPU:PIR启动 CPU -->> -MCU:回复OK CPU ->> MCU:断电关机 MCU ->> CPU:物理断电 MCU ->> MCU:休眠 end end ``` #### 1.3.3.5. TEST拨键启动   TEST模式,相机处于一个长通电状态,功耗较高,长时间无操作会进入正常工作状态。 **存疑:** 实际使用时,当有人把按键从ON拨到TEST时,大概率会先触发PIR启动,再触发TEST启动。 ```mermaid sequenceDiagram participant CPU participant MCU MCU ->> MCU:常电待机 opt 拨键从ON拨到TEST note over MCU:TEST模式启动,只会发生在从ON切换到TEST的瞬间,
如果PIR触发时,已经处于TEST挡位,此时不影响PIR模式启动 MCU ->> CPU:物理上电 MCU ->> +CPU:发送启动模式:TEST启动 CPU ->> CPU:TEST启动 CPU -->> -MCU:回复OK opt 拨键从TEST拨到ON note over MCU:进入ON模式,设备处于正常工作状态 CPU ->> MCU:发送断电关机 MCU ->> CPU:物理断电 end opt CPU关机 note over MCU:超时关机时,
此时拨键还是处于“TEST”挡位的 CPU ->> MCU:发送断电关机 MCU ->> CPU:物理断电 end end MCU ->> MCU:休眠 ``` #### 1.3.3.6. 数据同步   主控和外置MCU之间数据同步,包括主控发给外置MCU的,也包括外置MCU发给主控的。数据同步流程可以在任意的工作状态下进行。 ```mermaid sequenceDiagram participant CPU participant MCU MCU ->> MCU:物理上电 MCU ->> CPU:某种启动模式触发物理上电 opt 数据同步 note over MCU:此处根据协议只做一个数据示例,其它协议雷同。 CPU ->> +MCU:设置灵敏度 MCU -->> -CPU:回复OK end CPU ->> MCU:断电关机 MCU ->> CPU:物理断电 MCU ->> MCU:休眠 note over MCU:休眠后进入正常工作模式:当发生PIR触发时,
给CPU物理上电并发送PIR启动命令 ``` ## 1.4. MCU协议   负责对MCU协议进行封包/解包,协议封包/解包功能独立封装成库,详见[协议文档](../../utils/McuProtocol/README.md)。