feat: 完成状态机,完成刷卡、数据上报、命令处理

This commit is contained in:
Timothy Yin 2025-05-09 01:07:02 +08:00
parent d96b2070f2
commit ba2ce4e0ce
15 changed files with 1346 additions and 745 deletions

716
.idea/workspace.xml generated
View File

@ -29,12 +29,21 @@
</configurations> </configurations>
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="56631632-52f0-4e39-b905-89e46eb6e768" name="Changes" comment="chore: update .gitignore"> <list default="true" id="56631632-52f0-4e39-b905-89e46eb6e768" name="Changes" comment="dev: 暂时禁用指令下发处理">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.mxproject" beforeDir="false" afterPath="$PROJECT_DIR$/.mxproject" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Inc/main.h" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Inc/main.h" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Core/Inc/main.h" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Inc/main.h" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Inc/oledfont.h" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Inc/oledfont.h" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Inc/rc522.h" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Inc/rc522.h" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Inc/stm32f1xx_hal_conf.h" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Inc/stm32f1xx_hal_conf.h" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Inc/stm32f1xx_it.h" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Inc/stm32f1xx_it.h" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Src/OneNet.c" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Src/OneNet.c" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Src/esp8266.c" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Src/esp8266.c" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Src/freertos.c" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Src/freertos.c" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Core/Src/freertos.c" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Src/freertos.c" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Src/main.c" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Src/main.c" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Core/Src/main.c" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Src/main.c" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Src/tim.c" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Src/tim.c" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Core/Src/rc522.c" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Src/rc522.c" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Src/spi.c" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Src/spi.c" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Core/Src/stm32f1xx_it.c" beforeDir="false" afterPath="$PROJECT_DIR$/Core/Src/stm32f1xx_it.c" afterDir="false" />
<change beforePath="$PROJECT_DIR$/IntelliChargingPile.ioc" beforeDir="false" afterPath="$PROJECT_DIR$/IntelliChargingPile.ioc" afterDir="false" /> <change beforePath="$PROJECT_DIR$/IntelliChargingPile.ioc" beforeDir="false" afterPath="$PROJECT_DIR$/IntelliChargingPile.ioc" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
@ -201,6 +210,669 @@
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" /> <setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" /> <setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" /> <setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
</component> </component>
<component name="ProjectApplicationVersion"> <component name="ProjectApplicationVersion">
<option name="ide" value="CLion" /> <option name="ide" value="CLion" />
@ -305,7 +977,7 @@
<workItem from="1743488783461" duration="3691000" /> <workItem from="1743488783461" duration="3691000" />
<workItem from="1743492489952" duration="8816000" /> <workItem from="1743492489952" duration="8816000" />
<workItem from="1743525779889" duration="15870000" /> <workItem from="1743525779889" duration="15870000" />
<workItem from="1746680992201" duration="23593000" /> <workItem from="1746680992201" duration="37397000" />
</task> </task>
<task id="LOCAL-00001" summary="initial commit: oled, rc522, exti"> <task id="LOCAL-00001" summary="initial commit: oled, rc522, exti">
<option name="closed" value="true" /> <option name="closed" value="true" />
@ -395,7 +1067,15 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1746705282234</updated> <updated>1746705282234</updated>
</task> </task>
<option name="localTasksCounter" value="12" /> <task id="LOCAL-00012" summary="dev: 暂时禁用指令下发处理">
<option name="closed" value="true" />
<created>1746710418606</created>
<option name="number" value="00012" />
<option name="presentableId" value="LOCAL-00012" />
<option name="project" value="LOCAL" />
<updated>1746710418606</updated>
</task>
<option name="localTasksCounter" value="13" />
<servers /> <servers />
</component> </component>
<component name="TypeScriptGeneratedFilesManager"> <component name="TypeScriptGeneratedFilesManager">
@ -417,35 +1097,29 @@
<MESSAGE value="break: before freertos" /> <MESSAGE value="break: before freertos" />
<MESSAGE value="feat: before tring to fix cmdHandler" /> <MESSAGE value="feat: before tring to fix cmdHandler" />
<MESSAGE value="chore: update .gitignore" /> <MESSAGE value="chore: update .gitignore" />
<option name="LAST_COMMIT_MESSAGE" value="chore: update .gitignore" /> <MESSAGE value="dev: 暂时禁用指令下发处理" />
<option name="LAST_COMMIT_MESSAGE" value="dev: 暂时禁用指令下发处理" />
</component> </component>
<component name="XDebuggerManager"> <component name="XDebuggerManager">
<breakpoint-manager> <breakpoint-manager>
<breakpoints> <breakpoints>
<line-breakpoint enabled="true" type="com.jetbrains.cidr.execution.debugger.OCBreakpointType"> <line-breakpoint enabled="true" type="com.jetbrains.cidr.execution.debugger.OCBreakpointType">
<url>file://$PROJECT_DIR$/Core/Src/OneNet.c</url> <url>file://$PROJECT_DIR$/Core/Src/OneNet.c</url>
<line>195</line> <line>66</line>
<option name="timeStamp" value="3" /> <option name="timeStamp" value="16" />
</line-breakpoint>
<line-breakpoint enabled="true" type="com.jetbrains.cidr.execution.debugger.OCBreakpointType">
<url>file://$PROJECT_DIR$/Core/Src/OneNet.c</url>
<line>163</line>
<option name="timeStamp" value="17" />
</line-breakpoint> </line-breakpoint>
</breakpoints> </breakpoints>
</breakpoint-manager> </breakpoint-manager>
<watches-manager> <watches-manager>
<configuration name="com.jetbrains.cidr.embedded.openocd.conf.type"> <configuration name="com.jetbrains.cidr.embedded.openocd.conf.type">
<watch expression="(float) uwTick/1000.0f" language="C++" /> <watch expression="rc522Handle.state" language="C++" />
<watch expression="new_crc.word16" language="C++" /> <watch expression="rc522Handle.status" language="C++" />
<watch expression="IM_RxBuf" language="C++" />
<watch expression="IM_TxBuf" language="C++" />
<watch expression="new_crc" />
</configuration> </configuration>
<inline-watch fileUrl="file://$PROJECT_DIR$/Core/Src/main.c" line="314">
<watch expression="@ ALREADY PREPROCESSED @UART2_RxData" />
</inline-watch>
<inline-watch fileUrl="file://$PROJECT_DIR$/Core/Src/IM1281B.c" line="87">
<watch expression="@ ALREADY PREPROCESSED @new_crc" />
</inline-watch>
<inline-watch fileUrl="file://$PROJECT_DIR$/Core/Src/IM1281B.c" line="88">
<watch expression="IM_RecvLen" />
</inline-watch>
</watches-manager> </watches-manager>
</component> </component>
<component name="XSLT-Support.FileAssociations.UIState"> <component name="XSLT-Support.FileAssociations.UIState">

File diff suppressed because one or more lines are too long

View File

@ -40,6 +40,8 @@ extern char flag_1s;
extern char flag_2s; extern char flag_2s;
extern char flag_5s; extern char flag_5s;
extern char flag_10s; extern char flag_10s;
extern char IC_CARD_ID[16];
/* USER CODE END ET */ /* USER CODE END ET */
/* Exported constants --------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/

View File

@ -200,32 +200,75 @@ const unsigned char F8X16[] =
//部分汉字 //部分汉字
const unsigned char Hzk[][32] = const unsigned char Hzk[][32] =
{ {
// 你(0) 好(1) 世(2) 界(3) 按(4) 键(5) 次(6) 数(7) // 你(0) 好(1) 等(2) 待(3) 配(4) 网(5) 连(6) 接(7) 服(8) 务(9) 器(10) 设(11) 备(12) 在(13) 离(14) 上(15)
// 线(16) 卡(17) 号(18) 余(19) 额(20) 正(21) 在(22) 停(23) 止(24) 充(25) 电(26) 消(27) 费(28) 输(29) 出(30) 开(31)
// 关(32)
{0x00, 0x80, 0x60, 0xF8, 0x07, 0x40, 0x20, 0x18, 0x0F, 0x08, 0xC8, 0x08, 0x08, 0x28, 0x18, 0x00}, {0x00, 0x80, 0x60, 0xF8, 0x07, 0x40, 0x20, 0x18, 0x0F, 0x08, 0xC8, 0x08, 0x08, 0x28, 0x18, 0x00},
{0x01, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x0C, 0x03, 0x40, 0x80, 0x7F, 0x00, 0x01, 0x06, 0x18, 0x00}, /*"你",0*/ {0x01, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x0C, 0x03, 0x40, 0x80, 0x7F, 0x00, 0x01, 0x06, 0x18, 0x00}, /*"你",0*/
{0x10, 0x10, 0xF0, 0x1F, 0x10, 0xF0, 0x00, 0x80, 0x82, 0x82, 0xE2, 0x92, 0x8A, 0x86, 0x80, 0x00}, {0x10, 0x10, 0xF0, 0x1F, 0x10, 0xF0, 0x00, 0x80, 0x82, 0x82, 0xE2, 0x92, 0x8A, 0x86, 0x80, 0x00},
{0x40, 0x22, 0x15, 0x08, 0x16, 0x61, 0x00, 0x00, 0x40, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"好",1*/ {0x40, 0x22, 0x15, 0x08, 0x16, 0x61, 0x00, 0x00, 0x40, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"好",1*/
{0x08, 0x04, 0x23, 0x22, 0x26, 0x2A, 0x22, 0xFA, 0x24, 0x23, 0x22, 0x26, 0x2A, 0x02, 0x02, 0x00},
{0x20, 0x20, 0x20, 0xFE, 0x20, 0x20, 0xFF, 0x20, 0x20, 0x20, 0xFF, 0x20, 0x20, 0x20, 0x20, 0x00}, {0x01, 0x09, 0x09, 0x09, 0x19, 0x69, 0x09, 0x09, 0x49, 0x89, 0x7D, 0x09, 0x09, 0x09, 0x01, 0x00}, /*"等",2*/
{0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x47, 0x44, 0x44, 0x44, 0x47, 0x40, 0x40, 0x40, 0x00, 0x00}, /*"世",2*/ {0x00, 0x10, 0x88, 0xC4, 0x33, 0x40, 0x48, 0x48, 0x48, 0x7F, 0x48, 0xC8, 0x48, 0x48, 0x40, 0x00},
{0x02, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x0A, 0x32, 0x02, 0x42, 0x82, 0x7F, 0x02, 0x02, 0x02, 0x00}, /*"待",3*/
{0x00, 0x00, 0x00, 0xFE, 0x92, 0x92, 0x92, 0xFE, 0x92, 0x92, 0x92, 0xFE, 0x00, 0x00, 0x00, 0x00}, {0xF2, 0x12, 0xFE, 0x12, 0xFE, 0x12, 0xF2, 0x00, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x00, 0x00, 0x00},
{0x08, 0x08, 0x04, 0x84, 0x62, 0x1E, 0x01, 0x00, 0x01, 0xFE, 0x02, 0x04, 0x04, 0x08, 0x08, 0x00}, /*"界",3*/ {0xFF, 0x4A, 0x49, 0x48, 0x49, 0x49, 0xFF, 0x00, 0x3F, 0x40, 0x40, 0x40, 0x41, 0x40, 0x70, 0x00}, /*"配",4*/
{0x00, 0xFE, 0x02, 0x22, 0x42, 0x82, 0x72, 0x02, 0x22, 0x42, 0x82, 0x72, 0x02, 0xFE, 0x00, 0x00},
{0x10, 0x10, 0x10, 0xFF, 0x90, 0x20, 0x98, 0x88, 0x88, 0xE9, 0x8E, 0x88, 0x88, 0xA8, 0x98, 0x00}, {0x00, 0xFF, 0x10, 0x08, 0x06, 0x01, 0x0E, 0x10, 0x08, 0x06, 0x01, 0x4E, 0x80, 0x7F, 0x00, 0x00}, /*"网",5*/
{0x02, 0x42, 0x81, 0x7F, 0x00, 0x00, 0x80, 0x84, 0x4B, 0x28, 0x10, 0x28, 0x47, 0x80, 0x00, 0x00}, /*"按",4*/ {0x40, 0x40, 0x42, 0xCC, 0x00, 0x04, 0x44, 0x64, 0x5C, 0x47, 0xF4, 0x44, 0x44, 0x44, 0x04, 0x00},
{0x00, 0x40, 0x20, 0x1F, 0x20, 0x44, 0x44, 0x44, 0x44, 0x44, 0x7F, 0x44, 0x44, 0x44, 0x44, 0x00}, /*"连",6*/
{0x40, 0x30, 0xEF, 0x24, 0x24, 0x80, 0xE4, 0x9C, 0x10, 0x54, 0x54, 0xFF, 0x54, 0x7C, 0x10, 0x00}, {0x10, 0x10, 0x10, 0xFF, 0x10, 0x50, 0x44, 0x54, 0x65, 0xC6, 0x44, 0x64, 0x54, 0x44, 0x40, 0x00},
{0x01, 0x01, 0x7F, 0x21, 0x51, 0x26, 0x18, 0x27, 0x44, 0x45, 0x45, 0x5F, 0x45, 0x45, 0x44, 0x00}, /*"键",5*/ {0x04, 0x44, 0x82, 0x7F, 0x01, 0x82, 0x82, 0x4A, 0x56, 0x23, 0x22, 0x52, 0x4E, 0x82, 0x02, 0x00}, /*"接",7*/
{0x00, 0x00, 0xFE, 0x22, 0x22, 0x22, 0xFE, 0x00, 0xFE, 0x82, 0x82, 0x92, 0xA2, 0x9E, 0x00, 0x00},
{0x00, 0x02, 0x0C, 0x80, 0x60, 0x80, 0x40, 0x30, 0x0F, 0xC8, 0x08, 0x08, 0x28, 0x18, 0x00, 0x00}, {0x80, 0x60, 0x1F, 0x02, 0x42, 0x82, 0x7F, 0x00, 0xFF, 0x40, 0x2F, 0x10, 0x2C, 0x43, 0x80, 0x00}, /*"服",8*/
{0x02, 0x02, 0x7E, 0x01, 0x80, 0x40, 0x20, 0x18, 0x06, 0x01, 0x06, 0x18, 0x20, 0x40, 0x80, 0x00}, /*"次",6*/ {0x00, 0x00, 0x90, 0x88, 0x4C, 0x57, 0xA4, 0x24, 0x54, 0x54, 0x8C, 0x84, 0x00, 0x00, 0x00, 0x00},
{0x01, 0x01, 0x80, 0x42, 0x22, 0x1A, 0x07, 0x02, 0x42, 0x82, 0x42, 0x3E, 0x01, 0x01, 0x01, 0x00}, /*"务",9*/
{0x90, 0x52, 0x34, 0x10, 0xFF, 0x10, 0x34, 0x52, 0x80, 0x70, 0x8F, 0x08, 0x08, 0xF8, 0x08, 0x00}, {0x80, 0x80, 0x9E, 0x92, 0x92, 0x92, 0x9E, 0xE0, 0x80, 0x9E, 0xB2, 0xD2, 0x92, 0x9E, 0x80, 0x00},
{0x82, 0x9A, 0x56, 0x63, 0x22, 0x52, 0x8E, 0x00, 0x80, 0x40, 0x33, 0x0C, 0x33, 0x40, 0x80, 0x00}, /*"数",7*/ {0x08, 0x08, 0xF4, 0x94, 0x92, 0x92, 0xF1, 0x00, 0x01, 0xF2, 0x92, 0x94, 0x94, 0xF8, 0x08, 0x00}, /*"器",10*/
{0x40, 0x40, 0x42, 0xCC, 0x00, 0x40, 0xA0, 0x9E, 0x82, 0x82, 0x82, 0x9E, 0xA0, 0x20, 0x20, 0x00},
{0x00, 0x00, 0x00, 0x3F, 0x90, 0x88, 0x40, 0x43, 0x2C, 0x10, 0x28, 0x46, 0x41, 0x80, 0x80, 0x00}, /*"设",11*/
{0x80, 0x90, 0x90, 0x48, 0x4C, 0x57, 0x24, 0x24, 0x24, 0x54, 0x4C, 0x44, 0x80, 0x80, 0x80, 0x00},
{0x00, 0x00, 0x00, 0xFF, 0x49, 0x49, 0x49, 0x7F, 0x49, 0x49, 0x49, 0xFF, 0x00, 0x00, 0x00, 0x00}, /*"备",12*/
{0x08, 0x08, 0x88, 0xC8, 0x38, 0x0C, 0x0B, 0x08, 0x08, 0xE8, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00},
{0x02, 0x01, 0x00, 0xFF, 0x40, 0x41, 0x41, 0x41, 0x41, 0x7F, 0x41, 0x41, 0x41, 0x41, 0x40, 0x00}, /*"在",13*/
{0x04, 0x04, 0x04, 0xF4, 0x84, 0xD4, 0xA5, 0xA6, 0xA4, 0xD4, 0x84, 0xF4, 0x04, 0x04, 0x04, 0x00},
{0x00, 0xFE, 0x02, 0x02, 0x12, 0x3A, 0x16, 0x13, 0x12, 0x1A, 0x32, 0x42, 0x82, 0x7E, 0x00, 0x00}, /*"离",14*/
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00},
{0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00}, /*"上",15*/
{0x20, 0x30, 0xAC, 0x63, 0x20, 0x18, 0x80, 0x90, 0x90, 0xFF, 0x90, 0x49, 0x4A, 0x48, 0x40, 0x00},
{0x22, 0x67, 0x22, 0x12, 0x12, 0x12, 0x40, 0x40, 0x20, 0x13, 0x0C, 0x14, 0x22, 0x41, 0xF8, 0x00}, /*"线",16*/
{0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xFF, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x40, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x02, 0x04, 0x08, 0x10, 0x00, 0x00, 0x00}, /*"卡",17*/
{0x80, 0x80, 0x80, 0xBE, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xBE, 0x80, 0x80, 0x80, 0x00},
{0x00, 0x00, 0x00, 0x06, 0x05, 0x04, 0x04, 0x04, 0x44, 0x84, 0x44, 0x3C, 0x00, 0x00, 0x00, 0x00}, /*"号",18*/
{0x80, 0x80, 0x40, 0x20, 0x50, 0x48, 0x44, 0xC3, 0x44, 0x48, 0x50, 0x20, 0x40, 0x80, 0x80, 0x00},
{0x00, 0x40, 0x22, 0x1A, 0x02, 0x42, 0x82, 0x7F, 0x02, 0x02, 0x02, 0x0A, 0x12, 0x60, 0x00, 0x00}, /*"余",19*/
{0x00, 0x8C, 0x44, 0xB5, 0x26, 0xA4, 0x64, 0x0C, 0x02, 0xF2, 0x1A, 0xD6, 0x12, 0xF2, 0x02, 0x00},
{0x10, 0x08, 0xFC, 0x4A, 0x49, 0x4A, 0xFC, 0x08, 0x80, 0x4F, 0x30, 0x0F, 0x10, 0x2F, 0xC0, 0x00}, /*"额",20*/
{0x00, 0x02, 0x02, 0xC2, 0x02, 0x02, 0x02, 0xFE, 0x82, 0x82, 0x82, 0x82, 0x82, 0x02, 0x00, 0x00},
{0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00}, /*"正",21*/
{0x08, 0x08, 0x88, 0xC8, 0x38, 0x0C, 0x0B, 0x08, 0x08, 0xE8, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00},
{0x02, 0x01, 0x00, 0xFF, 0x40, 0x41, 0x41, 0x41, 0x41, 0x7F, 0x41, 0x41, 0x41, 0x41, 0x40, 0x00}, /*"在",22*/
{0x80, 0x60, 0xF8, 0x07, 0x00, 0x04, 0x74, 0x54, 0x55, 0x56, 0x54, 0x54, 0x74, 0x04, 0x00, 0x00},
{0x00, 0x00, 0xFF, 0x00, 0x03, 0x01, 0x05, 0x45, 0x85, 0x7D, 0x05, 0x05, 0x05, 0x01, 0x03, 0x00}, /*"停",23*/
{0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xFF, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00},
{0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00}, /*"止",24*/
{0x04, 0x04, 0x84, 0xC4, 0xA4, 0x9C, 0x85, 0x86, 0x84, 0x84, 0xA4, 0xC4, 0x84, 0x04, 0x04, 0x00},
{0x00, 0x80, 0x80, 0x40, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x80, 0x81, 0xF0, 0x00, 0x00}, /*"充",25*/
{0x00, 0x00, 0xF8, 0x88, 0x88, 0x88, 0x88, 0xFF, 0x88, 0x88, 0x88, 0x88, 0xF8, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x1F, 0x08, 0x08, 0x08, 0x08, 0x7F, 0x88, 0x88, 0x88, 0x88, 0x9F, 0x80, 0xF0, 0x00}, /*"电",26*/
{0x10, 0x60, 0x02, 0x0C, 0xC0, 0x00, 0xE2, 0x2C, 0x20, 0x3F, 0x20, 0x28, 0xE6, 0x00, 0x00, 0x00},
{0x04, 0x04, 0x7C, 0x03, 0x00, 0x00, 0xFF, 0x09, 0x09, 0x09, 0x49, 0x89, 0x7F, 0x00, 0x00, 0x00}, /*"消",27*/
{0x00, 0x02, 0x3A, 0xAA, 0x6A, 0x3F, 0x2A, 0x2A, 0x2A, 0xFF, 0x2A, 0xAA, 0x2E, 0xE0, 0x00, 0x00},
{0x00, 0x02, 0x81, 0x9E, 0x42, 0x42, 0x22, 0x1A, 0x22, 0x22, 0x42, 0x5E, 0x81, 0x00, 0x00, 0x00}, /*"费",28*/
{0x88, 0x68, 0x1F, 0xC8, 0x08, 0x10, 0xC8, 0x54, 0x52, 0xD1, 0x12, 0x94, 0x08, 0xD0, 0x10, 0x00},
{0x09, 0x19, 0x09, 0xFF, 0x05, 0x00, 0xFF, 0x12, 0x92, 0xFF, 0x00, 0x5F, 0x80, 0x7F, 0x00, 0x00}, /*"输",29*/
{0x00, 0x00, 0x7C, 0x40, 0x40, 0x40, 0x40, 0xFF, 0x40, 0x40, 0x40, 0x40, 0xFC, 0x00, 0x00, 0x00},
{0x00, 0x7C, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x40, 0xFC, 0x00, 0x00}, /*"出",30*/
{0x80, 0x82, 0x82, 0x82, 0xFE, 0x82, 0x82, 0x82, 0x82, 0x82, 0xFE, 0x82, 0x82, 0x82, 0x80, 0x00},
{0x00, 0x80, 0x40, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"开",31*/
{0x00, 0x00, 0x10, 0x11, 0x16, 0x10, 0x10, 0xF0, 0x10, 0x10, 0x14, 0x13, 0x10, 0x00, 0x00, 0x00},
{0x81, 0x81, 0x41, 0x41, 0x21, 0x11, 0x0D, 0x03, 0x0D, 0x11, 0x21, 0x41, 0x41, 0x81, 0x81, 0x00}, /*"关",32*/
}; };
#endif #endif

View File

@ -174,4 +174,32 @@ char PCD_Halt(void);
void CardCompare(void); //自行定义函数 void CardCompare(void); //自行定义函数
// 添加状态机的状态定义和接口函数声明
typedef enum
{
RC522_STATE_IDLE,
RC522_STATE_REQUEST,
RC522_STATE_ANTICOLL,
RC522_STATE_SELECT,
RC522_STATE_AUTH,
RC522_STATE_READ,
RC522_STATE_WRITE,
RC522_STATE_HALT
} RC522_State;
typedef struct
{
RC522_State state;
uint8_t cardType[2];
uint8_t cardID[5];
uint8_t blockData[16];
uint8_t blockAddr;
uint8_t keyA[6];
uint8_t keyB[6];
char status;
} RC522_Handle;
void RC522_InitStateMachine(RC522_Handle *handle);
void RC522_ProcessStateMachine(RC522_Handle *handle);
#endif #endif

View File

@ -42,7 +42,7 @@
/*#define HAL_CORTEX_MODULE_ENABLED */ /*#define HAL_CORTEX_MODULE_ENABLED */
/*#define HAL_CRC_MODULE_ENABLED */ /*#define HAL_CRC_MODULE_ENABLED */
/*#define HAL_DAC_MODULE_ENABLED */ /*#define HAL_DAC_MODULE_ENABLED */
/*#define HAL_DMA_MODULE_ENABLED */ #define HAL_DMA_MODULE_ENABLED
/*#define HAL_ETH_MODULE_ENABLED */ /*#define HAL_ETH_MODULE_ENABLED */
/*#define HAL_FLASH_MODULE_ENABLED */ /*#define HAL_FLASH_MODULE_ENABLED */
#define HAL_GPIO_MODULE_ENABLED #define HAL_GPIO_MODULE_ENABLED

View File

@ -52,6 +52,8 @@ void MemManage_Handler(void);
void BusFault_Handler(void); void BusFault_Handler(void);
void UsageFault_Handler(void); void UsageFault_Handler(void);
void DebugMon_Handler(void); void DebugMon_Handler(void);
void DMA1_Channel2_IRQHandler(void);
void DMA1_Channel3_IRQHandler(void);
void TIM1_UP_IRQHandler(void); void TIM1_UP_IRQHandler(void);
void TIM3_IRQHandler(void); void TIM3_IRQHandler(void);
void TIM4_IRQHandler(void); void TIM4_IRQHandler(void);

View File

@ -15,33 +15,17 @@
extern unsigned char esp8266_buf[128]; extern unsigned char esp8266_buf[128];
//==========================================================
// 函数名称: OneNet_DevLink
//
// 函数功能: 与onenet创建连接
//
// 入口参数: 无
//
// 返回参数: 1-成功 0-失败
//
// 说明: 与onenet平台建立连接
//==========================================================
_Bool OneNet_DevLink(void) _Bool OneNet_DevLink(void)
{ {
MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包 MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};
unsigned char* dataPtr;
_Bool status = 1; _Bool status = 1;
// printf("OneNet_DevLink\r\nPROID: %s\tAUIF: %s\tDEVID:%s\r\n", PRODUCT_ID, SIGNATURE, DEVICE_ID);
if (MQTT_PacketConnect(PRODUCT_ID, SIGNATURE, DEVICE_ID, 256, 1, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0) if (MQTT_PacketConnect(PRODUCT_ID, SIGNATURE, DEVICE_ID, 256, 1, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0)
{ {
ESP8266_SendData(mqttPacket._data, mqttPacket._len); //上传平台 ESP8266_SendData(mqttPacket._data, mqttPacket._len);
dataPtr = ESP8266_GetIPD(250); //等待平台响应 unsigned char* dataPtr = ESP8266_GetIPD(250);
if (dataPtr != NULL) if (dataPtr != NULL)
{ {
if (MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK) if (MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK)
@ -52,26 +36,24 @@ _Bool OneNet_DevLink(void)
status = 0; status = 0;
break; break;
// case 1: printf("WARN: 连接失败:协议错误\r\n"); case 1:
// break; // Invalid protocol version
// case 2: printf("WARN: 连接失败非法的clientid\r\n"); case 2:
// break; // Invalid client-id
// case 3: printf("WARN: 连接失败:服务器失败\r\n"); case 3:
// break; // Failed to connect to broker
// case 4: printf("WARN: 连接失败:用户名或密码错误\r\n"); case 4:
// break; // Wrong username or password
// case 5: printf("WARN: 连接失败:非法链接(比如token非法)\r\n"); case 5:
// break; // Not authorized
default: default:
break; break;
} }
} }
} }
MQTT_DeleteBuffer(&mqttPacket); //删包 MQTT_DeleteBuffer(&mqttPacket);
} }
// else
// printf("WARN: MQTT_PacketConnect Failed\r\n");
return status; return status;
} }
@ -79,105 +61,91 @@ _Bool OneNet_DevLink(void)
unsigned char OneNet_FillBuf(char* buf) unsigned char OneNet_FillBuf(char* buf)
{ {
char text[48]; cJSON* packet = cJSON_CreateObject();
strcpy(buf, "{\"id\":\"1743082944\",\"params\":{"); char packet_id[16];
sprintf(packet_id, "%d", uwTick);
cJSON_AddItemToObject(packet, "id", cJSON_CreateString(packet_id));
memset(text, 0, sizeof(text)); cJSON* params = cJSON_CreateObject();
sprintf(text, "\"volt\":{\"value\":%.2f},", IM_Volt * 0.0001); cJSON* valueObj = cJSON_CreateObject();
strcat(buf, text);
memset(text, 0, sizeof(text)); cJSON_AddItemToObject(valueObj, "value", cJSON_CreateNumber(IM_Volt * 0.0001));
sprintf(text, "\"current\":{\"value\":%.2f},", IM_Curr * 0.0001); cJSON_AddItemToObject(params, "volt", valueObj);
strcat(buf, text);
memset(text, 0, sizeof(text)); valueObj = cJSON_CreateObject();
sprintf(text, "\"watt_P\":{\"value\":%.2f},", IM_Power * 0.0001); cJSON_AddItemToObject(valueObj, "value", cJSON_CreateNumber(IM_Curr * 0.0001));
strcat(buf, text); cJSON_AddItemToObject(params, "current", valueObj);
memset(text, 0, sizeof(text)); valueObj = cJSON_CreateObject();
sprintf(text, "\"energy\":{\"value\":%.3f},", IM_Energy * 0.0001); cJSON_AddItemToObject(valueObj, "value", cJSON_CreateNumber(IM_Power * 0.0001));
strcat(buf, text); cJSON_AddItemToObject(params, "watt_P", valueObj);
memset(text, 0, sizeof(text)); valueObj = cJSON_CreateObject();
sprintf(text, "\"output\":{\"value\":%s}", cJSON_AddItemToObject(valueObj, "value", cJSON_CreateNumber(IM_Energy * 0.0001));
HAL_GPIO_ReadPin(RELAY1_GPIO_Port, RELAY1_Pin) == GPIO_PIN_RESET ? "true" : "false"); cJSON_AddItemToObject(params, "energy", valueObj);
strcat(buf, text);
valueObj = cJSON_CreateObject();
cJSON_AddItemToObject(valueObj, "value", cJSON_CreateString(IC_CARD_ID));
cJSON_AddItemToObject(params, "ic_id", valueObj);
valueObj = cJSON_CreateObject();
cJSON_AddItemToObject(valueObj, "value", cJSON_CreateBool(HAL_GPIO_ReadPin(RELAY1_GPIO_Port, RELAY1_Pin) == GPIO_PIN_RESET));
cJSON_AddItemToObject(params, "output", valueObj);
cJSON_AddItemToObject(packet, "params", params);
const char* json_str = cJSON_Print(packet);
strcpy(buf, json_str);
cJSON_Delete(packet);
strcat(buf, "}}");
return strlen(buf); return strlen(buf);
} }
//==========================================================
// 函数名称: OneNet_SendData
//
// 函数功能: 上传数据到平台
//
// 入口参数: type发送数据的格式
//
// 返回参数: 无
//
// 说明:
//==========================================================
void OneNet_SendData(void) void OneNet_SendData(void)
{ {
MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包 MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};
char buf[256]; char buf[256];
short body_len = 0, i = 0; short body_len = 0, i = 0;
memset(buf, 0, sizeof(buf)); //清空数组内容 memset(buf, 0, sizeof(buf));
body_len = OneNet_FillBuf(buf); //获取当前需要发送的数据流的总长度 body_len = OneNet_FillBuf(buf);
if (body_len) if (body_len)
{ {
if (MQTT_PacketSaveData(DEVICE_ID, body_len, NULL, 5, &mqttPacket) == 0) //封包 if (MQTT_PacketSaveData(DEVICE_ID, body_len, NULL, 5, &mqttPacket) == 0)
{ {
for (; i < body_len; i++) for (; i < body_len; i++)
{ {
mqttPacket._data[mqttPacket._len++] = buf[i]; mqttPacket._data[mqttPacket._len++] = buf[i];
} }
ESP8266_SendData(mqttPacket._data, mqttPacket._len); //上传数据到平台 ESP8266_SendData(mqttPacket._data, mqttPacket._len);
MQTT_DeleteBuffer(&mqttPacket); //删包 MQTT_DeleteBuffer(&mqttPacket);
} }
else; else;
// printf( "WARN:EDP_NewBuffer Failed\r\n");
} }
} }
void OneNET_Subscribe(void) void OneNET_Subscribe(void)
{ {
MQTT_PACKET_STRUCTURE mqtt_packet = {NULL, 0, 0, 0}; //协议包 MQTT_PACKET_STRUCTURE mqtt_packet = {NULL, 0, 0, 0};
char topic_buf[56]; char topic_buf[56];
const char* topic = topic_buf; const char* topic = topic_buf;
snprintf(topic_buf, sizeof(topic_buf), "$sys/%s/%s/thing/property/set", PRODUCT_ID, DEVICE_ID); snprintf(topic_buf, sizeof(topic_buf), "$sys/%s/%s/thing/property/set", PRODUCT_ID, DEVICE_ID);
// printf("Subscribe Topic: %s\r\n", topic_buf);
if (MQTT_PacketSubscribe(MQTT_SUBSCRIBE_ID, MQTT_QOS_LEVEL0, &topic, 1, &mqtt_packet) == 0) if (MQTT_PacketSubscribe(MQTT_SUBSCRIBE_ID, MQTT_QOS_LEVEL0, &topic, 1, &mqtt_packet) == 0)
{ {
ESP8266_SendData(mqtt_packet._data, mqtt_packet._len); //向平台发送订阅请求 ESP8266_SendData(mqtt_packet._data, mqtt_packet._len);
MQTT_DeleteBuffer(&mqtt_packet); //删包 MQTT_DeleteBuffer(&mqtt_packet);
} }
} }
//==========================================================
// 函数名称: OneNet_RevPro
//
// 函数功能: 平台返回数据检测
//
// 入口参数: dataPtr平台返回的数据
//
// 返回参数: 无
//
// 说明:
//==========================================================
void OneNet_RevPro(unsigned char* cmd) void OneNet_RevPro(unsigned char* cmd)
{ {
char* req_payload = NULL; char* req_payload = NULL;
@ -251,22 +219,18 @@ void OneNet_RevPro(unsigned char* cmd)
} }
break; break;
case MQTT_PKT_PUBACK: //发送Publish消息平台回复的Ack case MQTT_PKT_PUBACK:
if (MQTT_UnPacketPublishAck(cmd) == 0) if (MQTT_UnPacketPublishAck(cmd) == 0)
break; break;
case MQTT_PKT_SUBACK:
case MQTT_PKT_SUBACK: //发送Subscribe消息的Ack
if (MQTT_UnPacketSubscribe(cmd) == 0) if (MQTT_UnPacketSubscribe(cmd) == 0)
break; break;
default: default:
result = -1; result = -1;
break; break;
} }
ESP8266_Clear(); //清空缓存 ESP8266_Clear();
if (result == -1) if (result == -1)
return; return;

View File

@ -58,7 +58,7 @@ void ESP8266_Clear(void)
// //
// 说明: 循环调用检测是否接收完成 // 说明: 循环调用检测是否接收完成
//========================================================== //==========================================================
_Bool ESP8266_WaitRecive(void) _Bool ESP8266_WaitReceive(void)
{ {
if (esp8266_cnt == 0) //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数 if (esp8266_cnt == 0) //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
return REV_WAIT; return REV_WAIT;
@ -95,7 +95,7 @@ _Bool ESP8266_SendCmd(char* cmd, char* res)
while (timeOut--) while (timeOut--)
{ {
if (ESP8266_WaitRecive() == REV_OK) //如果收到数据 if (ESP8266_WaitReceive() == REV_OK) //如果收到数据
{ {
if (strstr((const char*)esp8266_buf, res) != NULL) //如果检索到关键词 if (strstr((const char*)esp8266_buf, res) != NULL) //如果检索到关键词
{ {
@ -153,7 +153,7 @@ unsigned char* ESP8266_GetIPD(unsigned short timeOut)
do do
{ {
if (ESP8266_WaitRecive() == REV_OK) //如果接收完成 if (ESP8266_WaitReceive() == REV_OK) //如果接收完成
{ {
ptrIPD = strstr((char*)esp8266_buf, "IPD,"); //搜索“IPD”头 ptrIPD = strstr((char*)esp8266_buf, "IPD,"); //搜索“IPD”头
if (ptrIPD == NULL) //如果没找到可能是IPD头的延迟还是需要等待一会但不会超过设定的时间 if (ptrIPD == NULL) //如果没找到可能是IPD头的延迟还是需要等待一会但不会超过设定的时间
@ -186,7 +186,7 @@ unsigned char* ESP8266_GetIPD_soft(unsigned short timeOut)
do do
{ {
if (ESP8266_WaitRecive() == REV_OK) //如果接收完成 if (ESP8266_WaitReceive() == REV_OK) //如果接收完成
{ {
ptrIPD = strstr((char*)esp8266_buf, "IPD,"); //搜索“IPD”头 ptrIPD = strstr((char*)esp8266_buf, "IPD,"); //搜索“IPD”头
if (ptrIPD == NULL) //如果没找到可能是IPD头的延迟还是需要等待一会但不会超过设定的时间 if (ptrIPD == NULL) //如果没找到可能是IPD头的延迟还是需要等待一会但不会超过设定的时间
@ -250,24 +250,3 @@ void ESP8266_SmartConfig(void)
// stop smart config // stop smart config
while (ESP8266_SendCmd("AT+CWSTOPSMART\r\n", "OK")) HAL_Delay(500); while (ESP8266_SendCmd("AT+CWSTOPSMART\r\n", "OK")) HAL_Delay(500);
} }
//==========================================================
// 函数名称: ESP8266_IRQHandler
//
// 函数功能: 串口2收发中断
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
//==========================================================
//void ESP8266_IRQHandler(void)
//{
// if(esp8266_cnt >= sizeof(esp8266_buf))
// {
// esp8266_cnt = 0; //防止串口被刷爆
// }
// esp8266_buf[esp8266_cnt++] = USART1->DR;
//}

View File

@ -34,6 +34,7 @@
#include <string.h> #include <string.h>
#include "retarget.h" #include "retarget.h"
#include "tim.h" #include "tim.h"
#include "rc522.h"
#include "timers.h" #include "timers.h"
/* USER CODE END Includes */ /* USER CODE END Includes */
@ -57,16 +58,18 @@
/* Private variables ---------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */ /* USER CODE BEGIN Variables */
char ONENET_CONNECTED = 0;
// Flags // Flags
char KEY_PRESSED[4] = {0, 0, 0, 0}; char KEY_PRESSED[4] = {0, 0, 0, 0};
RC522_Handle rc522Handle;
char ONENET_CONNECTED = 0;
/* USER CODE END Variables */ /* USER CODE END Variables */
/* Definitions for defaultTask */ /* Definitions for defaultTask */
osThreadId_t defaultTaskHandle; osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = { const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask", .name = "defaultTask",
.stack_size = 256 * 4, .stack_size = 1024 * 4,
.priority = (osPriority_t) osPriorityNormal, .priority = (osPriority_t) osPriorityNormal,
}; };
/* Definitions for keyScanTask */ /* Definitions for keyScanTask */
@ -76,13 +79,6 @@ const osThreadAttr_t keyScanTask_attributes = {
.stack_size = 128 * 4, .stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal, .priority = (osPriority_t) osPriorityNormal,
}; };
/* Definitions for cmdTask */
osThreadId_t cmdTaskHandle;
const osThreadAttr_t cmdTask_attributes = {
.name = "cmdTask",
.stack_size = 256 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Private function prototypes -----------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */ /* USER CODE BEGIN FunctionPrototypes */
@ -92,7 +88,6 @@ void Display_IM1281B(void);
void StartDefaultTask(void *argument); void StartDefaultTask(void *argument);
void startKeyScanTask(void *argument); void startKeyScanTask(void *argument);
void startCmdTask(void *argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
@ -103,20 +98,47 @@ void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
*/ */
void MX_FREERTOS_Init(void) { void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */ /* USER CODE BEGIN Init */
// Peripheral initialization
MFRC_Init();
PCD_Init();
RC522_InitStateMachine(&rc522Handle);
OLED_ShowString(0,0,"initializing...",12); OLED_ShowString(0,0,"initializing...",12);
int const isSmartConfigMode = !HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin); int const isSmartConfigMode = !HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);
if (isSmartConfigMode) OLED_ShowString(0,0,"smartConfigMode",12); if (isSmartConfigMode)
{
// 等待配网
OLED_ShowChinese(0, 0, 2);
OLED_ShowChinese(16, 0, 3);
OLED_ShowChinese(32, 0, 4);
OLED_ShowChinese(48, 0, 5);
OLED_ShowString(48 + 16, 0, " ", 12);
OLED_ShowString(48 + 16, 1, "... ", 12);
}
ESP8266_Init(isSmartConfigMode); ESP8266_Init(isSmartConfigMode);
OLED_ShowString(0, 0, "connectOneNet", 12); // 连接服务器
OLED_ShowChinese(0, 0, 6);
OLED_ShowChinese(16, 0, 7);
OLED_ShowChinese(32, 0, 8);
OLED_ShowChinese(48, 0, 9);
OLED_ShowChinese(64, 0, 10);
OLED_ShowString(64 + 16, 1, "... ", 12);
while (OneNet_DevLink()) {} while (OneNet_DevLink()) {}
OneNET_Subscribe(); OneNET_Subscribe();
ONENET_CONNECTED = 1; ONENET_CONNECTED = 1;
OLED_ShowString(0,0,"OneNet online ",12); // 设备上线
OLED_ShowChinese(0, 0, 11);
OLED_ShowChinese(16, 0, 12);
OLED_ShowChinese(32, 0, 15);
OLED_ShowChinese(48, 0, 16);
OLED_ShowString(48 + 16, 0, " ", 16);
OLED_ShowString(48 + 16, 1, " ", 16);
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
HAL_TIM_Base_Start_IT(&htim1); HAL_TIM_Base_Start_IT(&htim1);
@ -145,9 +167,6 @@ void MX_FREERTOS_Init(void) {
/* creation of keyScanTask */ /* creation of keyScanTask */
keyScanTaskHandle = osThreadNew(startKeyScanTask, NULL, &keyScanTask_attributes); keyScanTaskHandle = osThreadNew(startKeyScanTask, NULL, &keyScanTask_attributes);
/* creation of cmdTask */
cmdTaskHandle = osThreadNew(startCmdTask, NULL, &cmdTask_attributes);
/* USER CODE BEGIN RTOS_THREADS */ /* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */ /* add threads, ... */
/* USER CODE END RTOS_THREADS */ /* USER CODE END RTOS_THREADS */
@ -168,24 +187,30 @@ void MX_FREERTOS_Init(void) {
void StartDefaultTask(void *argument) void StartDefaultTask(void *argument)
{ {
/* USER CODE BEGIN StartDefaultTask */ /* USER CODE BEGIN StartDefaultTask */
OLED_Clear();
// 在线
OLED_ShowChinese(96, 0, 13);
OLED_ShowChinese(112, 0, 16);
// 输出
OLED_ShowChinese(0, 0, 29);
OLED_ShowChinese(16, 0, 30);
/* Infinite loop */ /* Infinite loop */
for(;;) for(;;)
{ {
/* Keys handler */
// osDelay(500); if (KEY_PRESSED[0])
//
// OneNet_SendData();
// osDelay(500);
// ESP8266_Clear();
if (KEY_PRESSED[0] || KEY_PRESSED[1])
{ {
KEY_PRESSED[0] = 0; KEY_PRESSED[0] = 0;
KEY_PRESSED[1] = 0;
HAL_GPIO_TogglePin(RELAY1_GPIO_Port, RELAY1_Pin); HAL_GPIO_TogglePin(RELAY1_GPIO_Port, RELAY1_Pin);
} }
// Output state
if (HAL_GPIO_ReadPin(RELAY1_GPIO_Port, RELAY1_Pin) == GPIO_PIN_RESET)
OLED_ShowString(16 + 16, 0, ":ON ", 16);
else
OLED_ShowString(16 + 16, 0, ":OFF", 16);
/* Flags handler */
if (flag_1s) if (flag_1s)
{ {
flag_1s = 0; flag_1s = 0;
@ -211,7 +236,22 @@ void StartDefaultTask(void *argument)
Display_IM1281B(); Display_IM1281B();
} }
/* State machines */
if (rc522Handle.state == RC522_STATE_IDLE)
{
rc522Handle.state = RC522_STATE_REQUEST;
snprintf(IC_CARD_ID, sizeof(IC_CARD_ID), "%02X-%02X-%02X-%02X", rc522Handle.cardID[0], rc522Handle.cardID[1], rc522Handle.cardID[2], rc522Handle.cardID[3]);
}
IM_Read(); IM_Read();
RC522_ProcessStateMachine(&rc522Handle);
/* Remote command handler */
uint8_t* dataPtr = ESP8266_GetIPD_soft(0);
if (dataPtr != NULL)
{
OneNet_RevPro(dataPtr);
}
} }
/* USER CODE END StartDefaultTask */ /* USER CODE END StartDefaultTask */
} }
@ -234,31 +274,6 @@ void startKeyScanTask(void *argument)
/* USER CODE END startKeyScanTask */ /* USER CODE END startKeyScanTask */
} }
/* USER CODE BEGIN Header_startCmdTask */
/**
* @brief Function implementing the cmdTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_startCmdTask */
void startCmdTask(void *argument)
{
/* USER CODE BEGIN startCmdTask */
/* Infinite loop */
for(;;)
{
// if (ONENET_CONNECTED)
// {
// uint8_t* dataPtr = ESP8266_GetIPD_soft(0);
// if (dataPtr != NULL)
// {
// OneNet_RevPro(dataPtr);
// }
// }
}
/* USER CODE END startCmdTask */
}
/* Private application code --------------------------------------------------*/ /* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */ /* USER CODE BEGIN Application */
void KeyScan(void) void KeyScan(void)
@ -303,24 +318,23 @@ void KeyScan(void)
void Display_IM1281B(void) void Display_IM1281B(void)
{ {
OLED_ShowString(0, 0, "Volt:", 12); OLED_ShowString(0, 5, "V:", 12);
OLED_ShowString(0, 2, "Curr:", 12); OLED_ShowString(64, 5, "A:", 12);
OLED_ShowString(0, 4, "Pwr: ", 12); OLED_ShowString(0, 7, "P:", 12);
OLED_ShowString(0, 6, "Eng: ", 12);
char buffer[16]; char buffer[16];
snprintf(buffer, sizeof(buffer), "%.2fV", IM_Volt * 0.0001); snprintf(buffer, sizeof(buffer), "%.2fV ", IM_Volt * 0.0001);
OLED_ShowString(40, 0, buffer, 12); OLED_ShowString(16, 5, buffer, 12);
snprintf(buffer, sizeof(buffer), "%.2fA", IM_Curr * 0.0001); snprintf(buffer, sizeof(buffer), "%.2fA ", IM_Curr * 0.0001);
OLED_ShowString(40, 2, buffer, 12); OLED_ShowString(80, 5, buffer, 12);
snprintf(buffer, sizeof(buffer), "%.2fW", IM_Power * 0.0001); snprintf(buffer, sizeof(buffer), "%.2fW ", IM_Power * 0.0001);
OLED_ShowString(40, 4, buffer, 12); OLED_ShowString(16, 7, buffer, 12);
snprintf(buffer, sizeof(buffer), "%.3fKWh", IM_Energy * 0.0001); snprintf(buffer, sizeof(buffer), "%.3fkWh", IM_Energy * 0.0001);
OLED_ShowString(40, 6, buffer, 12); OLED_ShowString(64, 7, buffer, 12);
} }
/* USER CODE END Application */ /* USER CODE END Application */

View File

@ -19,6 +19,7 @@
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "main.h" #include "main.h"
#include "cmsis_os.h" #include "cmsis_os.h"
#include "dma.h"
#include "i2c.h" #include "i2c.h"
#include "spi.h" #include "spi.h"
#include "tim.h" #include "tim.h"
@ -32,7 +33,6 @@
#include "retarget.h" #include "retarget.h"
#include "oled.h" #include "oled.h"
#include "rc522.h"
#include "esp8266.h" #include "esp8266.h"
#include "OneNet.h" #include "OneNet.h"
/* USER CODE END Includes */ /* USER CODE END Includes */
@ -72,6 +72,8 @@ uint8_t rf_card_type[3];
uint8_t rf_card_id[5]; uint8_t rf_card_id[5];
uint8_t rf_data[16]; uint8_t rf_data[16];
char IC_CARD_ID[16];
uint8_t ADDR = 0x01 * 4 + 0x03; uint8_t ADDR = 0x01 * 4 + 0x03;
uint8_t KEY_A[6]= {0xff,0xff,0xff,0xff,0xff,0xff}; uint8_t KEY_A[6]= {0xff,0xff,0xff,0xff,0xff,0xff};
uint8_t KEY_B[6]= {0xff,0xff,0xff,0xff,0xff,0xff}; uint8_t KEY_B[6]= {0xff,0xff,0xff,0xff,0xff,0xff};
@ -120,6 +122,7 @@ int main(void)
/* Initialize all configured peripherals */ /* Initialize all configured peripherals */
MX_GPIO_Init(); MX_GPIO_Init();
MX_DMA_Init();
MX_I2C1_Init(); MX_I2C1_Init();
MX_SPI1_Init(); MX_SPI1_Init();
MX_USART1_UART_Init(); MX_USART1_UART_Init();
@ -139,8 +142,8 @@ int main(void)
// HAL_TIM_Base_Start_IT(&htim3); // HAL_TIM_Base_Start_IT(&htim3);
// Init RC522 // Init RC522
MFRC_Init(); // MFRC_Init();
PCD_Reset(); // PCD_Reset();
HAL_UARTEx_ReceiveToIdle_IT(&huart1, (uint8_t*)UART1_RxData, 40); HAL_UARTEx_ReceiveToIdle_IT(&huart1, (uint8_t*)UART1_RxData, 40);
HAL_UART_Receive_IT(&huart2, &UART2_RxData, 1); HAL_UART_Receive_IT(&huart2, &UART2_RxData, 1);
@ -162,6 +165,17 @@ int main(void)
/* USER CODE BEGIN WHILE */ /* USER CODE BEGIN WHILE */
while (1) while (1)
{ {
// RC522_ProcessStateMachine(&rc522Handle);
//
// if (rc522Handle.state == RC522_STATE_IDLE && rc522Handle.status == PCD_OK)
// {
// // Example: Display card information when idle and successful
// OLED_ShowString(0, 0, "Card ID:", 12);
// char buffer[16];
// snprintf(buffer, sizeof(buffer), "%02X-%02X-%02X-%02X", rc522Handle.cardID[0], rc522Handle.cardID[1], rc522Handle.cardID[2], rc522Handle.cardID[3]);
// OLED_ShowString(36, 0, buffer, 12);
// }
// if (onenet_state()) // if (onenet_state())
// { // {
// OLED_ShowString(0,0,"OneNet online ",12); // OLED_ShowString(0,0,"OneNet online ",12);

View File

@ -6,120 +6,53 @@
extern SPI_HandleTypeDef hspi1; extern SPI_HandleTypeDef hspi1;
/**************************************************************************************
* MFRC_Init
* MFRC初始化
*
*
*
* MFRC的SPI接口速率为0~10Mbps
***************************************************************************************/
void MFRC_Init(void) void MFRC_Init(void)
{ {
RS522_NSS(1); RS522_NSS(1);
RS522_RST(1); RS522_RST(1);
} }
static uint8_t ret;
/**************************************************************************************
* : SPI_RW_Byte
* : SPI读写一个字节
* : -byte:
* : -byte:
***************************************************************************************/
static uint8_t ret; //这些函数是HAL与标准库不同的地方【读写函数】
uint8_t SPI1_RW_Byte(uint8_t byte) uint8_t SPI1_RW_Byte(uint8_t byte)
{ {
HAL_SPI_TransmitReceive(&hspi1, &byte, &ret, 1, 10);//把byte 写入并读出一个值把它存入ret HAL_SPI_TransmitReceive(&hspi1, &byte, &ret, 1, 10);
return ret;//入口是byte 的地址读取时用的也是ret地址一次只写入一个值10 return ret;
} }
/**************************************************************************************
* MFRC_WriteReg
*
* -addr:
* -data:
*
*
*
***************************************************************************************/
void MFRC_WriteReg(uint8_t addr, uint8_t data) void MFRC_WriteReg(uint8_t addr, uint8_t data)
{ {
uint8_t AddrByte; const uint8_t AddrByte = (addr << 1) & 0x7E;
AddrByte = (addr << 1 ) & 0x7E; //求出地址字节 RS522_NSS(0);
RS522_NSS(0); //NSS拉低 SPI1_RW_Byte(AddrByte);
SPI1_RW_Byte(AddrByte); //写地址字节 SPI1_RW_Byte(data);
SPI1_RW_Byte(data); //写数据 RS522_NSS(1);
RS522_NSS(1); //NSS拉高
} }
/**************************************************************************************
* MFRC_ReadReg
*
* -addr:
*
* -data:
*
***************************************************************************************/
uint8_t MFRC_ReadReg(uint8_t addr) uint8_t MFRC_ReadReg(uint8_t addr)
{ {
uint8_t AddrByte, data; const uint8_t AddrByte = ((addr << 1) & 0x7E) | 0x80;
AddrByte = ((addr << 1 ) & 0x7E ) | 0x80; //求出地址字节 RS522_NSS(0);
RS522_NSS(0); //NSS拉低 SPI1_RW_Byte(AddrByte);
SPI1_RW_Byte(AddrByte); //写地址字节 const uint8_t data = SPI1_RW_Byte(0x00);
data = SPI1_RW_Byte(0x00); //读数据
RS522_NSS(1); //NSS拉高 RS522_NSS(1); //NSS拉高
return data; return data;
} }
/**************************************************************************************
* MFRC_SetBitMask
*
* -addr:
* -mask:(bit)
*
*
*
***************************************************************************************/
void MFRC_SetBitMask(uint8_t addr, uint8_t mask) void MFRC_SetBitMask(uint8_t addr, uint8_t mask)
{ {
uint8_t temp; uint8_t temp;
temp = MFRC_ReadReg(addr); //先读回寄存器的值 temp = MFRC_ReadReg(addr);
MFRC_WriteReg(addr, temp | mask); //处理过的数据再写入寄存器 MFRC_WriteReg(addr, temp | mask);
} }
/**************************************************************************************
* MFRC_ClrBitMask
*
* -addr:
* -mask:(bit)
*
*
*
***************************************************************************************/
void MFRC_ClrBitMask(uint8_t addr, uint8_t mask) void MFRC_ClrBitMask(uint8_t addr, uint8_t mask)
{ {
uint8_t temp; uint8_t temp;
temp = MFRC_ReadReg(addr); //先读回寄存器的值 temp = MFRC_ReadReg(addr);
MFRC_WriteReg(addr, temp & ~mask); //处理过的数据再写入寄存器 MFRC_WriteReg(addr, temp & ~mask);
} }
void MFRC_CalulateCRC(uint8_t* pInData, uint8_t len, uint8_t* pOutData)
/**************************************************************************************
* MFRC_CalulateCRC
* MFRC计算CRC结果
* -pInDataCRC计算的数据
* -lenCRC计算的数据长度
* -pOutDataCRC计算结果
* -pOutDataCRC计算结果
*
*
***************************************************************************************/
void MFRC_CalulateCRC(uint8_t *pInData, uint8_t len, uint8_t *pOutData)
{ {
//0xc1 1 2 pInData[2] //0xc1 1 2 pInData[2]
uint8_t temp; uint8_t temp;
@ -127,7 +60,7 @@ void MFRC_CalulateCRC(uint8_t *pInData, uint8_t len, uint8_t *pOutData)
MFRC_ClrBitMask(MFRC_DivIrqReg, 0x04); //使能CRC中断 MFRC_ClrBitMask(MFRC_DivIrqReg, 0x04); //使能CRC中断
MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE); //取消当前命令的执行 MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE); //取消当前命令的执行
MFRC_SetBitMask(MFRC_FIFOLevelReg, 0x80); //清除FIFO及其标志位 MFRC_SetBitMask(MFRC_FIFOLevelReg, 0x80); //清除FIFO及其标志位
for(i = 0; i < len; i++) //将待CRC计算的数据写入FIFO for (i = 0; i < len; i++) //将待CRC计算的数据写入FIFO
{ {
MFRC_WriteReg(MFRC_FIFODataReg, *(pInData + i)); MFRC_WriteReg(MFRC_FIFODataReg, *(pInData + i));
} }
@ -138,26 +71,12 @@ void MFRC_CalulateCRC(uint8_t *pInData, uint8_t len, uint8_t *pOutData)
temp = MFRC_ReadReg(MFRC_DivIrqReg); //读取DivIrqReg寄存器的值 temp = MFRC_ReadReg(MFRC_DivIrqReg); //读取DivIrqReg寄存器的值
i--; i--;
} }
while((i != 0) && !(temp & 0x04)); //等待CRC计算完成 while ((i != 0) && !(temp & 0x04)); //等待CRC计算完成
pOutData[0] = MFRC_ReadReg(MFRC_CRCResultRegL); //读取CRC计算结果 pOutData[0] = MFRC_ReadReg(MFRC_CRCResultRegL); //读取CRC计算结果
pOutData[1] = MFRC_ReadReg(MFRC_CRCResultRegM); pOutData[1] = MFRC_ReadReg(MFRC_CRCResultRegM);
} }
char MFRC_CmdFrame(uint8_t cmd, uint8_t* pInData, uint8_t InLenByte, uint8_t* pOutData, uint16_t* pOutLenBit)
/**************************************************************************************
* MFRC_CmdFrame
* MFRC522和ISO14443A卡通讯的命令帧函数
* -cmdMFRC522命令字
* -pIndataMFRC522发送给MF1卡的数据的缓冲区首地址
* -InLenByte
* -pOutdataMF1卡片返回数据的缓冲区首地址
* -pOutLenBitMF1卡返回数据的位长度
* -pOutdataMF1卡片返回数据的缓冲区首地址
* -pOutLenBitMF1卡返回数据位长度的首地址
* -status(MFRC_OKMFRC_NOTAGERRMFRC_ERR)
*
***************************************************************************************/
char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pOutData, uint16_t *pOutLenBit)
{ {
uint8_t lastBits; uint8_t lastBits;
uint8_t n; uint8_t n;
@ -167,7 +86,7 @@ char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pO
uint8_t waitFor = 0x00; uint8_t waitFor = 0x00;
/*根据命令设置标志位*/ /*根据命令设置标志位*/
switch(cmd) switch (cmd)
{ {
case MFRC_AUTHENT: //Mifare认证 case MFRC_AUTHENT: //Mifare认证
irqEn = 0x12; irqEn = 0x12;
@ -186,12 +105,12 @@ char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pO
MFRC_SetBitMask(MFRC_FIFOLevelReg, 0x80); //清除FIFO缓冲区及其标志位 MFRC_SetBitMask(MFRC_FIFOLevelReg, 0x80); //清除FIFO缓冲区及其标志位
/*发送命令帧*/ /*发送命令帧*/
for(i = 0; i < InLenByte; i++) //写入命令参数 for (i = 0; i < InLenByte; i++) //写入命令参数
{ {
MFRC_WriteReg(MFRC_FIFODataReg, pInData[i]); MFRC_WriteReg(MFRC_FIFODataReg, pInData[i]);
} }
MFRC_WriteReg(MFRC_CommandReg, cmd); //执行命令 MFRC_WriteReg(MFRC_CommandReg, cmd); //执行命令
if(cmd == MFRC_TRANSCEIVE) if (cmd == MFRC_TRANSCEIVE)
{ {
MFRC_SetBitMask(MFRC_BitFramingReg, 0x80); //启动发送 MFRC_SetBitMask(MFRC_BitFramingReg, 0x80); //启动发送
} }
@ -201,20 +120,20 @@ char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pO
n = MFRC_ReadReg(MFRC_ComIrqReg); n = MFRC_ReadReg(MFRC_ComIrqReg);
i--; i--;
} }
while((i != 0) && !(n & 0x01) && !(n & waitFor)); //等待命令完成 while ((i != 0) && !(n & 0x01) && !(n & waitFor)); //等待命令完成
MFRC_ClrBitMask(MFRC_BitFramingReg, 0x80); //停止发送 MFRC_ClrBitMask(MFRC_BitFramingReg, 0x80); //停止发送
/*处理接收的数据*/ /*处理接收的数据*/
if(i != 0) if (i != 0)
{ {
if(!(MFRC_ReadReg(MFRC_ErrorReg) & 0x1B)) if (!(MFRC_ReadReg(MFRC_ErrorReg) & 0x1B))
{ {
status = MFRC_OK; status = MFRC_OK;
if(n & irqEn & 0x01) if (n & irqEn & 0x01)
{ {
status = MFRC_NOTAGERR; status = MFRC_NOTAGERR;
} }
if(cmd == MFRC_TRANSCEIVE) if (cmd == MFRC_TRANSCEIVE)
{ {
n = MFRC_ReadReg(MFRC_FIFOLevelReg); n = MFRC_ReadReg(MFRC_FIFOLevelReg);
lastBits = MFRC_ReadReg(MFRC_ControlReg) & 0x07; lastBits = MFRC_ReadReg(MFRC_ControlReg) & 0x07;
@ -226,15 +145,15 @@ char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pO
{ {
*pOutLenBit = n * 8; *pOutLenBit = n * 8;
} }
if(n == 0) if (n == 0)
{ {
n = 1; n = 1;
} }
if(n > MFRC_MAXRLEN) if (n > MFRC_MAXRLEN)
{ {
n = MFRC_MAXRLEN; n = MFRC_MAXRLEN;
} }
for(i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
pOutData[i] = MFRC_ReadReg(MFRC_FIFODataReg); pOutData[i] = MFRC_ReadReg(MFRC_FIFODataReg);
} }
@ -246,57 +165,39 @@ char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pO
} }
} }
MFRC_SetBitMask(MFRC_ControlReg, 0x80); //停止定时器运行 MFRC_SetBitMask(MFRC_ControlReg, 0x80); // 停止定时器运行
MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE); //取消当前命令的执行 MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE); // 取消当前命令的执行
return status; return status;
} }
/**************************************************************************************
* PCD_Reset
* PCD复位
*
*
*
*
***************************************************************************************/
void PCD_Reset(void) void PCD_Reset(void)
{ {
/*硬复位*/ /* Hard reset */
RS522_RST(1);//用到复位引脚 RS522_RST(1); //用到复位引脚
osDelay(2); osDelay(2);
RS522_RST(0); RS522_RST(0);
osDelay(2); osDelay(2);
RS522_RST(1); RS522_RST(1);
osDelay(2); osDelay(2);
/*软复位*/ /* Soft reset */
MFRC_WriteReg(MFRC_CommandReg, MFRC_RESETPHASE); MFRC_WriteReg(MFRC_CommandReg, MFRC_RESETPHASE);
osDelay(2); osDelay(2);
/*复位后的初始化配置*/ /* Init after reset */
MFRC_WriteReg(MFRC_ModeReg, 0x3D); //CRC初始值0x6363 MFRC_WriteReg(MFRC_ModeReg, 0x3D); // CRC初始值0x6363
MFRC_WriteReg(MFRC_TReloadRegL, 30); //定时器重装值 MFRC_WriteReg(MFRC_TReloadRegL, 30); // 定时器重装值
MFRC_WriteReg(MFRC_TReloadRegH, 0); MFRC_WriteReg(MFRC_TReloadRegH, 0);
MFRC_WriteReg(MFRC_TModeReg, 0x8D); //定时器设置 MFRC_WriteReg(MFRC_TModeReg, 0x8D); // 定时器设置
MFRC_WriteReg(MFRC_TPrescalerReg, 0x3E); //定时器预分频值 MFRC_WriteReg(MFRC_TPrescalerReg, 0x3E); // 定时器预分频值
MFRC_WriteReg(MFRC_TxAutoReg, 0x40); //100%ASK MFRC_WriteReg(MFRC_TxAutoReg, 0x40); // 100%ASK
PCD_AntennaOff(); //关天线 PCD_AntennaOff(); // 关天线
osDelay(2); osDelay(2);
PCD_AntennaOn(); //开天线 PCD_AntennaOn(); // 开天线
} }
/**************************************************************************************
* PCD_AntennaOn
* 线,使PCD发送能量载波信号
*
*
*
* 线1ms的间隔
***************************************************************************************/
void PCD_AntennaOn(void) void PCD_AntennaOn(void)
{ {
uint8_t temp; uint8_t temp;
@ -307,29 +208,11 @@ void PCD_AntennaOn(void)
} }
} }
/**************************************************************************************
* PCD_AntennaOff
* 线,PCD发送能量载波信号
*
*
*
* 线1ms的间隔
***************************************************************************************/
void PCD_AntennaOff(void) void PCD_AntennaOff(void)
{ {
MFRC_ClrBitMask(MFRC_TxControlReg, 0x03); MFRC_ClrBitMask(MFRC_TxControlReg, 0x03);
} }
/***************************************************************************************
* PCD_Init
*
*
*
*
*
***************************************************************************************/
void PCD_Init(void) void PCD_Init(void)
{ {
MFRC_Init(); //MFRC管脚配置 MFRC_Init(); //MFRC管脚配置
@ -338,38 +221,21 @@ void PCD_Init(void)
PCD_AntennaOn(); //开启天线 PCD_AntennaOn(); //开启天线
} }
char PCD_Request(uint8_t RequestMode, uint8_t* pCardType)
/***************************************************************************************
* PCD_Request
*
* -RequestMode
* PICC_REQIDL线
* PICC_REQALL线
* -pCardType
* -pCardType
* 0x4400Mifare_UltraLight
* 0x0400Mifare_One(S50)
* 0x0200Mifare_One(S70)
* 0x0800Mifare_Pro(X)
* 0x4403Mifare_DESFire
* -status(PCD_OKPCD_NOTAGERRPCD_ERR)
*
***************************************************************************************/
char PCD_Request(uint8_t RequestMode, uint8_t *pCardType)
{ {
int status; int status;
uint16_t unLen; uint16_t unLen;
uint8_t CmdFrameBuf[MFRC_MAXRLEN]; uint8_t CmdFrameBuf[MFRC_MAXRLEN];
MFRC_ClrBitMask(MFRC_Status2Reg, 0x08);//关内部温度传感器 MFRC_ClrBitMask(MFRC_Status2Reg, 0x08); //关内部温度传感器
MFRC_WriteReg(MFRC_BitFramingReg, 0x07); //存储模式,发送模式,是否启动发送等 MFRC_WriteReg(MFRC_BitFramingReg, 0x07); //存储模式,发送模式,是否启动发送等
MFRC_SetBitMask(MFRC_TxControlReg, 0x03);//配置调制信号13.56MHZ MFRC_SetBitMask(MFRC_TxControlReg, 0x03); //配置调制信号13.56MHZ
CmdFrameBuf[0] = RequestMode; CmdFrameBuf[0] = RequestMode;
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 1, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 1, CmdFrameBuf, &unLen);
if((status == PCD_OK) && (unLen == 0x10)) if ((status == PCD_OK) && (unLen == 0x10))
{ {
*pCardType = CmdFrameBuf[0]; *pCardType = CmdFrameBuf[0];
*(pCardType + 1) = CmdFrameBuf[1]; *(pCardType + 1) = CmdFrameBuf[1];
@ -378,16 +244,7 @@ char PCD_Request(uint8_t RequestMode, uint8_t *pCardType)
return status; return status;
} }
char PCD_AntiColl(uint8_t* pSnr)
/***************************************************************************************
* PCD_Anticoll
* ,
* -pSnr,4
* -pSnr,4
* -status(PCD_OKPCD_NOTAGERRPCD_ERR)
*
***************************************************************************************/
char PCD_AntiColl(uint8_t *pSnr)
{ {
char status; char status;
uint8_t i, snr_check = 0; uint8_t i, snr_check = 0;
@ -403,14 +260,14 @@ char PCD_AntiColl(uint8_t *pSnr)
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 2, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 2, CmdFrameBuf, &unLen);
if(status == PCD_OK) if (status == PCD_OK)
{ {
for(i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
*(pSnr + i) = CmdFrameBuf[i]; *(pSnr + i) = CmdFrameBuf[i];
snr_check ^= CmdFrameBuf[i]; snr_check ^= CmdFrameBuf[i];
} }
if(snr_check != CmdFrameBuf[i]) if (snr_check != CmdFrameBuf[i])
{ {
status = PCD_ERR; status = PCD_ERR;
} }
@ -420,16 +277,7 @@ char PCD_AntiColl(uint8_t *pSnr)
return status; return status;
} }
char PCD_Select(uint8_t* pSnr)
/***************************************************************************************
* PCD_Select
*
* -pSnr,4
*
* -status(PCD_OKPCD_NOTAGERRPCD_ERR)
*
***************************************************************************************/
char PCD_Select(uint8_t *pSnr)
{ {
char status; char status;
uint8_t i; uint8_t i;
@ -439,7 +287,7 @@ char PCD_Select(uint8_t *pSnr)
CmdFrameBuf[0] = PICC_ANTICOLL1; CmdFrameBuf[0] = PICC_ANTICOLL1;
CmdFrameBuf[1] = 0x70; CmdFrameBuf[1] = 0x70;
CmdFrameBuf[6] = 0; CmdFrameBuf[6] = 0;
for(i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
CmdFrameBuf[i + 2] = *(pSnr + i); CmdFrameBuf[i + 2] = *(pSnr + i);
CmdFrameBuf[6] ^= *(pSnr + i); CmdFrameBuf[6] ^= *(pSnr + i);
@ -450,7 +298,7 @@ char PCD_Select(uint8_t *pSnr)
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 9, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 9, CmdFrameBuf, &unLen);
if((status == PCD_OK) && (unLen == 0x18)) if ((status == PCD_OK) && (unLen == 0x18))
{ {
status = PCD_OK; status = PCD_OK;
} }
@ -461,38 +309,24 @@ char PCD_Select(uint8_t *pSnr)
return status; return status;
} }
char PCD_AuthState(uint8_t AuthMode, uint8_t BlockAddr, uint8_t* pKey, uint8_t* pSnr)
/***************************************************************************************
* PCD_AuthState
*
* -AuthMode
* PICC_AUTHENT1AA密码
* PICC_AUTHENT1BB密码
* -BlockAddr(0~63)
* -pKey
* -pSnr,4
*
* -status(PCD_OKPCD_NOTAGERRPCD_ERR)
* ,,BlockAddr参数可以是同一个扇区的任意块
***************************************************************************************/
char PCD_AuthState(uint8_t AuthMode, uint8_t BlockAddr, uint8_t *pKey, uint8_t *pSnr)
{ {
char status; char status;
uint16_t unLen; uint16_t unLen;
uint8_t i, CmdFrameBuf[MFRC_MAXRLEN]; uint8_t i, CmdFrameBuf[MFRC_MAXRLEN];
CmdFrameBuf[0] = AuthMode; CmdFrameBuf[0] = AuthMode;
CmdFrameBuf[1] = BlockAddr; CmdFrameBuf[1] = BlockAddr;
for(i = 0; i < 6; i++) for (i = 0; i < 6; i++)
{ {
CmdFrameBuf[i + 2] = *(pKey + i); CmdFrameBuf[i + 2] = *(pKey + i);
} }
for(i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
CmdFrameBuf[i + 8] = *(pSnr + i); CmdFrameBuf[i + 8] = *(pSnr + i);
} }
status = MFRC_CmdFrame(MFRC_AUTHENT, CmdFrameBuf, 12, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_AUTHENT, CmdFrameBuf, 12, CmdFrameBuf, &unLen);
if((status != PCD_OK) || (!(MFRC_ReadReg(MFRC_Status2Reg) & 0x08))) if ((status != PCD_OK) || (!(MFRC_ReadReg(MFRC_Status2Reg) & 0x08)))
{ {
status = PCD_ERR; status = PCD_ERR;
} }
@ -500,17 +334,7 @@ char PCD_AuthState(uint8_t AuthMode, uint8_t BlockAddr, uint8_t *pKey, uint8_t *
return status; return status;
} }
char PCD_WriteBlock(uint8_t BlockAddr, uint8_t* pData)
/***************************************************************************************
* PCD_WriteBlock
* MF1卡数据块
* -BlockAddr
* -pData: ,16
*
* -status(PCD_OKPCD_NOTAGERRPCD_ERR)
*
***************************************************************************************/
char PCD_WriteBlock(uint8_t BlockAddr, uint8_t *pData)
{ {
char status; char status;
uint16_t unLen; uint16_t unLen;
@ -522,14 +346,14 @@ char PCD_WriteBlock(uint8_t BlockAddr, uint8_t *pData)
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);
if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)) if ((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A))
{ {
status = PCD_ERR; status = PCD_ERR;
} }
if(status == PCD_OK) if (status == PCD_OK)
{ {
for(i = 0; i < 16; i++) for (i = 0; i < 16; i++)
{ {
CmdFrameBuf[i] = *(pData + i); CmdFrameBuf[i] = *(pData + i);
} }
@ -537,7 +361,7 @@ char PCD_WriteBlock(uint8_t BlockAddr, uint8_t *pData)
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 18, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 18, CmdFrameBuf, &unLen);
if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)) if ((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A))
{ {
status = PCD_ERR; status = PCD_ERR;
} }
@ -546,17 +370,7 @@ char PCD_WriteBlock(uint8_t BlockAddr, uint8_t *pData)
return status; return status;
} }
char PCD_ReadBlock(uint8_t BlockAddr, uint8_t* pData)
/***************************************************************************************
* PCD_ReadBlock
* MF1卡数据块
* -BlockAddr
* -pData: ,16
* -pData: ,16
* -status(PCD_OKPCD_NOTAGERRPCD_ERR)
*
***************************************************************************************/
char PCD_ReadBlock(uint8_t BlockAddr, uint8_t *pData)
{ {
char status; char status;
uint16_t unLen; uint16_t unLen;
@ -567,9 +381,9 @@ char PCD_ReadBlock(uint8_t BlockAddr, uint8_t *pData)
MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]); MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);
if((status == PCD_OK) && (unLen == 0x90)) if ((status == PCD_OK) && (unLen == 0x90))
{ {
for(i = 0; i < 16; i++) for (i = 0; i < 16; i++)
{ {
*(pData + i) = CmdFrameBuf[i]; *(pData + i) = CmdFrameBuf[i];
} }
@ -582,21 +396,7 @@ char PCD_ReadBlock(uint8_t BlockAddr, uint8_t *pData)
return status; return status;
} }
char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t* pValue)
/***************************************************************************************
* PCD_Value
* MF1卡数据块增减值操作
*
* -BlockAddr
* -pValue,
* -mode
* PICC_INCREMENT
* PICC_DECREMENT
*
* -status(PCD_OKPCD_NOTAGERRPCD_ERR)
*
***************************************************************************************/
char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t *pValue)
{ {
//0XC1 1 Increment[4]={0x03, 0x01, 0x01, 0x01}; //0XC1 1 Increment[4]={0x03, 0x01, 0x01, 0x01};
char status; char status;
@ -609,27 +409,27 @@ char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t *pValue)
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);
if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)) if ((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A))
{ {
status = PCD_ERR; status = PCD_ERR;
} }
if(status == PCD_OK) if (status == PCD_OK)
{ {
for(i = 0; i < 16; i++) for (i = 0; i < 16; i++)
{ {
CmdFrameBuf[i] = *(pValue + i); CmdFrameBuf[i] = *(pValue + i);
} }
MFRC_CalulateCRC(CmdFrameBuf, 4, &CmdFrameBuf[4]); MFRC_CalulateCRC(CmdFrameBuf, 4, &CmdFrameBuf[4]);
unLen = 0; unLen = 0;
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 6, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 6, CmdFrameBuf, &unLen);
if(status != PCD_ERR) if (status != PCD_ERR)
{ {
status = PCD_OK; status = PCD_OK;
} }
} }
if(status == PCD_OK) if (status == PCD_OK)
{ {
CmdFrameBuf[0] = PICC_TRANSFER; CmdFrameBuf[0] = PICC_TRANSFER;
CmdFrameBuf[1] = BlockAddr; CmdFrameBuf[1] = BlockAddr;
@ -637,7 +437,7 @@ char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t *pValue)
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);
if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)) if ((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A))
{ {
status = PCD_ERR; status = PCD_ERR;
} }
@ -645,16 +445,6 @@ char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t *pValue)
return status; return status;
} }
/***************************************************************************************
* PCD_BakValue
* ()
* -sourceBlockAddr
* -goalBlockAddr
*
* -status(PCD_OKPCD_NOTAGERRPCD_ERR)
*
***************************************************************************************/
char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr) char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr)
{ {
char status; char status;
@ -665,12 +455,12 @@ char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr)
CmdFrameBuf[1] = sourceBlockAddr; CmdFrameBuf[1] = sourceBlockAddr;
MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]); MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);
if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)) if ((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A))
{ {
status = PCD_ERR; status = PCD_ERR;
} }
if(status == PCD_OK) if (status == PCD_OK)
{ {
CmdFrameBuf[0] = 0; CmdFrameBuf[0] = 0;
CmdFrameBuf[1] = 0; CmdFrameBuf[1] = 0;
@ -678,13 +468,13 @@ char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr)
CmdFrameBuf[3] = 0; CmdFrameBuf[3] = 0;
MFRC_CalulateCRC(CmdFrameBuf, 4, &CmdFrameBuf[4]); MFRC_CalulateCRC(CmdFrameBuf, 4, &CmdFrameBuf[4]);
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 6, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 6, CmdFrameBuf, &unLen);
if(status != PCD_ERR) if (status != PCD_ERR)
{ {
status = PCD_OK; status = PCD_OK;
} }
} }
if(status != PCD_OK) if (status != PCD_OK)
{ {
return PCD_ERR; return PCD_ERR;
} }
@ -693,7 +483,7 @@ char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr)
CmdFrameBuf[1] = goalBlockAddr; CmdFrameBuf[1] = goalBlockAddr;
MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]); MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen); status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);
if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)) if ((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A))
{ {
status = PCD_ERR; status = PCD_ERR;
} }
@ -701,15 +491,6 @@ char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr)
return status; return status;
} }
/***************************************************************************************
* PCD_Halt
*
*
*
* -status(PCD_OKPCD_NOTAGERRPCD_ERR)
*
***************************************************************************************/
char PCD_Halt(void) char PCD_Halt(void)
{ {
char status; char status;
@ -725,87 +506,93 @@ char PCD_Halt(void)
return status; return status;
} }
// uint8_t readUid[5]; //卡号 void RC522_InitStateMachine(RC522_Handle* handle)
// uint8_t CT[3]; //卡类型 {
// uint8_t DATA[16]; //存放数据 handle->state = RC522_STATE_IDLE;
// memset(handle->cardType, 0, sizeof(handle->cardType));
// uint8_t KEY_A[6]= {0xff,0xff,0xff,0xff,0xff,0xff}; memset(handle->cardID, 0, sizeof(handle->cardID));
// uint8_t KEY_B[6]= {0xff,0xff,0xff,0xff,0xff,0xff}; memset(handle->blockData, 0, sizeof(handle->blockData));
// unsigned char buf[16]={0x01,0x02,0x03,0x04,0x05,0x06,0xff handle->blockAddr = 0x01 * 4 + 0x03;
// ,0x07,0x80,0x69,0x18,0x17,0x16,0x15,0x14,0x13}; memset(handle->keyA, 0xFF, sizeof(handle->keyA));
// memset(handle->keyB, 0xFF, sizeof(handle->keyB));
// uint8_t status; handle->status = PCD_OK;
// uint8_t addr = 0x01*4 + 0x03; // 总共16个扇区。一个扇区4个块从0开始算表示第一扇区第三块 }
// void CardCompare(void) void RC522_ProcessStateMachine(RC522_Handle* handle)
// { {
// uint8_t i; switch (handle->state)
// //status = PCD_WriteBlock(addr, buf); {
// status = PCD_Request(0x52, CT); //找到卡返回0 case RC522_STATE_IDLE:
// if(!status) //寻卡成功 // 等待触发
// { break;
// status = PCD_ERR;
// status = PCD_AntiColl(readUid); //防冲撞 case RC522_STATE_REQUEST:
// } handle->status = PCD_Request(PICC_REQALL, handle->cardType);
// if (handle->status == PCD_OK)
// if(!status) //防冲撞成功 {
// { handle->state = RC522_STATE_ANTICOLL;
// status = PCD_ERR; }
// printf("卡的类型为:%x%x%x\r\n",CT[0],CT[1],CT[2]); /* 读取卡的类型 */ else
// printf("卡号:%x-%x-%x-%x\r\n",readUid[0],readUid[1],readUid[2],readUid[3]); {
// HAL_Delay(1000); handle->state = RC522_STATE_IDLE;
// status=PCD_Select(readUid); /* 选卡 */ }
// } break;
//
// if(!status) //选卡成功 case RC522_STATE_ANTICOLL:
// { handle->status = PCD_AntiColl(handle->cardID);
// status = PCD_ERR; if (handle->status == PCD_OK)
// // 验证A密钥 块地址 密码 SN {
// status = PCD_AuthState(PICC_AUTHENT1A, addr, KEY_A, readUid); handle->state = RC522_STATE_SELECT;
// if(status == PCD_OK)//验证A成功 }
// { else
// printf("A密钥验证成功\r\n"); {
// HAL_Delay(1000); handle->state = RC522_STATE_IDLE;
// } }
// else break;
// {
// printf("A密钥验证失败\r\n"); case RC522_STATE_SELECT:
// HAL_Delay(1000); handle->status = PCD_Select(handle->cardID);
// } if (handle->status == PCD_OK)
// {
// // 验证B密钥 块地址 密码 SN handle->state = RC522_STATE_AUTH;
// status = PCD_AuthState(PICC_AUTHENT1B, addr, KEY_B, readUid); }
// if(status == PCD_OK)//验证B成功 else
// { {
// printf("B密钥验证成功\r\n"); handle->state = RC522_STATE_IDLE;
// } }
// else break;
// {
// printf("B密钥验证失败\r\n"); case RC522_STATE_AUTH:
// } handle->status = PCD_AuthState(PICC_AUTHENT1A, handle->blockAddr, handle->keyA, handle->cardID);
// HAL_Delay(1000); if (handle->status == PCD_OK)
// } {
// handle->state = RC522_STATE_READ;
// if(status == PCD_OK)//验证密码成功接着读取3块 }
// { else
// status = PCD_ERR; {
// status = PCD_ReadBlock(addr, DATA); handle->state = RC522_STATE_IDLE;
// }
// if(status == PCD_OK)//读卡成功 break;
// {
// printf("1扇区3块DATA:"); case RC522_STATE_READ:
// for(i = 0; i < 16; i++) handle->status = PCD_ReadBlock(handle->blockAddr, handle->blockData);
// { if (handle->status == PCD_OK)
// printf("%02x", DATA[i]); {
// } handle->state = RC522_STATE_HALT;
// printf("\r\n"); }
// else
// } {
// else handle->state = RC522_STATE_IDLE;
// { }
// printf("读卡失败\r\n"); break;
// }
// HAL_Delay(1000); case RC522_STATE_HALT:
// } PCD_Halt();
// handle->state = RC522_STATE_IDLE;
// } break;
default:
handle->state = RC522_STATE_IDLE;
break;
}
}

View File

@ -25,6 +25,8 @@
/* USER CODE END 0 */ /* USER CODE END 0 */
SPI_HandleTypeDef hspi1; SPI_HandleTypeDef hspi1;
DMA_HandleTypeDef hdma_spi1_rx;
DMA_HandleTypeDef hdma_spi1_tx;
/* SPI1 init function */ /* SPI1 init function */
void MX_SPI1_Init(void) void MX_SPI1_Init(void)
@ -87,6 +89,39 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(RC522_MISO_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(RC522_MISO_GPIO_Port, &GPIO_InitStruct);
/* SPI1 DMA Init */
/* SPI1_RX Init */
hdma_spi1_rx.Instance = DMA1_Channel2;
hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_spi1_rx.Init.Mode = DMA_NORMAL;
hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(spiHandle,hdmarx,hdma_spi1_rx);
/* SPI1_TX Init */
hdma_spi1_tx.Instance = DMA1_Channel3;
hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_spi1_tx.Init.Mode = DMA_NORMAL;
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx);
/* USER CODE BEGIN SPI1_MspInit 1 */ /* USER CODE BEGIN SPI1_MspInit 1 */
/* USER CODE END SPI1_MspInit 1 */ /* USER CODE END SPI1_MspInit 1 */
@ -111,6 +146,9 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
*/ */
HAL_GPIO_DeInit(GPIOA, RC522_SCK_Pin|RC522_MISO_Pin|RC522_MOSI_Pin); HAL_GPIO_DeInit(GPIOA, RC522_SCK_Pin|RC522_MISO_Pin|RC522_MOSI_Pin);
/* SPI1 DMA DeInit */
HAL_DMA_DeInit(spiHandle->hdmarx);
HAL_DMA_DeInit(spiHandle->hdmatx);
/* USER CODE BEGIN SPI1_MspDeInit 1 */ /* USER CODE BEGIN SPI1_MspDeInit 1 */
/* USER CODE END SPI1_MspDeInit 1 */ /* USER CODE END SPI1_MspDeInit 1 */

View File

@ -55,6 +55,8 @@
/* USER CODE END 0 */ /* USER CODE END 0 */
/* External variables --------------------------------------------------------*/ /* External variables --------------------------------------------------------*/
extern DMA_HandleTypeDef hdma_spi1_rx;
extern DMA_HandleTypeDef hdma_spi1_tx;
extern TIM_HandleTypeDef htim1; extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim3; extern TIM_HandleTypeDef htim3;
extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart1;
@ -163,6 +165,34 @@ void DebugMon_Handler(void)
/* please refer to the startup file (startup_stm32f1xx.s). */ /* please refer to the startup file (startup_stm32f1xx.s). */
/******************************************************************************/ /******************************************************************************/
/**
* @brief This function handles DMA1 channel2 global interrupt.
*/
void DMA1_Channel2_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
/* USER CODE END DMA1_Channel2_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_spi1_rx);
/* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
/* USER CODE END DMA1_Channel2_IRQn 1 */
}
/**
* @brief This function handles DMA1 channel3 global interrupt.
*/
void DMA1_Channel3_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel3_IRQn 0 */
/* USER CODE END DMA1_Channel3_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_spi1_tx);
/* USER CODE BEGIN DMA1_Channel3_IRQn 1 */
/* USER CODE END DMA1_Channel3_IRQn 1 */
}
/** /**
* @brief This function handles TIM1 update interrupt. * @brief This function handles TIM1 update interrupt.
*/ */

View File

@ -2,9 +2,30 @@
CAD.formats=[] CAD.formats=[]
CAD.pinconfig=Dual CAD.pinconfig=Dual
CAD.provider= CAD.provider=
Dma.Request0=SPI1_RX
Dma.Request1=SPI1_TX
Dma.RequestsNb=2
Dma.SPI1_RX.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.SPI1_RX.0.Instance=DMA1_Channel2
Dma.SPI1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.SPI1_RX.0.MemInc=DMA_MINC_ENABLE
Dma.SPI1_RX.0.Mode=DMA_NORMAL
Dma.SPI1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.SPI1_RX.0.PeriphInc=DMA_PINC_DISABLE
Dma.SPI1_RX.0.Priority=DMA_PRIORITY_LOW
Dma.SPI1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.SPI1_TX.1.Direction=DMA_MEMORY_TO_PERIPH
Dma.SPI1_TX.1.Instance=DMA1_Channel3
Dma.SPI1_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.SPI1_TX.1.MemInc=DMA_MINC_ENABLE
Dma.SPI1_TX.1.Mode=DMA_NORMAL
Dma.SPI1_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.SPI1_TX.1.PeriphInc=DMA_PINC_DISABLE
Dma.SPI1_TX.1.Priority=DMA_PRIORITY_LOW
Dma.SPI1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
FREERTOS.FootprintOK=true FREERTOS.FootprintOK=true
FREERTOS.IPParameters=Tasks01,configUSE_NEWLIB_REENTRANT,FootprintOK,configTOTAL_HEAP_SIZE FREERTOS.IPParameters=Tasks01,configUSE_NEWLIB_REENTRANT,FootprintOK,configTOTAL_HEAP_SIZE
FREERTOS.Tasks01=defaultTask,24,256,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;keyScanTask,24,128,startKeyScanTask,Default,NULL,Dynamic,NULL,NULL;cmdTask,24,256,startCmdTask,Default,NULL,Dynamic,NULL,NULL FREERTOS.Tasks01=defaultTask,24,1024,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;keyScanTask,24,128,startKeyScanTask,Default,NULL,Dynamic,NULL,NULL
FREERTOS.configTOTAL_HEAP_SIZE=8192 FREERTOS.configTOTAL_HEAP_SIZE=8192
FREERTOS.configUSE_NEWLIB_REENTRANT=1 FREERTOS.configUSE_NEWLIB_REENTRANT=1
File.Version=6 File.Version=6
@ -12,17 +33,18 @@ GPIO.groupedBy=Group By Peripherals
KeepUserPlacement=false KeepUserPlacement=false
Mcu.CPN=STM32F103C8T6 Mcu.CPN=STM32F103C8T6
Mcu.Family=STM32F1 Mcu.Family=STM32F1
Mcu.IP0=FREERTOS Mcu.IP0=DMA
Mcu.IP1=I2C1 Mcu.IP1=FREERTOS
Mcu.IP2=NVIC Mcu.IP10=USART2
Mcu.IP3=RCC Mcu.IP2=I2C1
Mcu.IP4=SPI1 Mcu.IP3=NVIC
Mcu.IP5=SYS Mcu.IP4=RCC
Mcu.IP6=TIM1 Mcu.IP5=SPI1
Mcu.IP7=TIM3 Mcu.IP6=SYS
Mcu.IP8=USART1 Mcu.IP7=TIM1
Mcu.IP9=USART2 Mcu.IP8=TIM3
Mcu.IPNb=10 Mcu.IP9=USART1
Mcu.IPNb=11
Mcu.Name=STM32F103C(8-B)Tx Mcu.Name=STM32F103C(8-B)Tx
Mcu.Package=LQFP48 Mcu.Package=LQFP48
Mcu.Pin0=PC13-TAMPER-RTC Mcu.Pin0=PC13-TAMPER-RTC
@ -57,6 +79,8 @@ Mcu.UserName=STM32F103C8Tx
MxCube.Version=6.14.0 MxCube.Version=6.14.0
MxDb.Version=DB.6.0.140 MxDb.Version=DB.6.0.140
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.DMA1_Channel2_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DMA1_Channel3_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.ForceEnableDMAVector=true NVIC.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
@ -186,7 +210,7 @@ ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath= ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=true ProjectManager.UnderRoot=true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_I2C1_Init-I2C1-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true,5-MX_USART1_UART_Init-USART1-false-HAL-true,6-MX_USART2_UART_Init-USART2-false-HAL-true,7-MX_TIM1_Init-TIM1-false-HAL-true,8-MX_TIM3_Init-TIM3-false-HAL-true ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true,6-MX_USART1_UART_Init-USART1-false-HAL-true,7-MX_USART2_UART_Init-USART2-false-HAL-true,8-MX_TIM1_Init-TIM1-false-HAL-true,9-MX_TIM3_Init-TIM3-false-HAL-true
RCC.ADCFreqValue=36000000 RCC.ADCFreqValue=36000000
RCC.AHBFreq_Value=72000000 RCC.AHBFreq_Value=72000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2 RCC.APB1CLKDivider=RCC_HCLK_DIV2