diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 553e6b8..42d385c 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -29,12 +29,21 @@
-
+
+
+
+
+
+
+
+
-
+
+
+
@@ -201,6 +210,669 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -305,7 +977,7 @@
-
+
@@ -395,7 +1067,15 @@
1746705282234
-
+
+
+ 1746710418606
+
+
+
+ 1746710418606
+
+
@@ -417,35 +1097,29 @@
-
+
+
file://$PROJECT_DIR$/Core/Src/OneNet.c
- 195
-
+ 66
+
+
+
+ file://$PROJECT_DIR$/Core/Src/OneNet.c
+ 163
+
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
diff --git a/.mxproject b/.mxproject
index a255f4a..e1ac20f 100644
--- a/.mxproject
+++ b/.mxproject
@@ -2,36 +2,38 @@
LibFiles=Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_bus.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_system.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_utils.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_exti.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_i2c.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_i2c.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_usart.h;Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h;Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h;Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h;Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h;Middlewares/Third_Party/FreeRTOS/Source/include/list.h;Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h;Middlewares/Third_Party/FreeRTOS/Source/include/portable.h;Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h;Middlewares/Third_Party/FreeRTOS/Source/include/queue.h;Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h;Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h;Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h;Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/task.h;Middlewares/Third_Party/FreeRTOS/Source/include/timers.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_mpool.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_os2.h;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/portmacro.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c;Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_bus.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_system.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_utils.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_exti.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_i2c.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_i2c.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_usart.h;Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h;Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h;Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h;Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h;Middlewares/Third_Party/FreeRTOS/Source/include/list.h;Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h;Middlewares/Third_Party/FreeRTOS/Source/include/portable.h;Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h;Middlewares/Third_Party/FreeRTOS/Source/include/queue.h;Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h;Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h;Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h;Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/task.h;Middlewares/Third_Party/FreeRTOS/Source/include/timers.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_mpool.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_os2.h;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/portmacro.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/tz_context.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_armv8mbl.h;
[PreviousUsedCubeIDEFiles]
-SourceFiles=Core/Src/main.c;Core/Src/gpio.c;Core/Src/freertos.c;Core/Src/i2c.c;Core/Src/spi.c;Core/Src/tim.c;Core/Src/usart.c;Core/Src/stm32f1xx_it.c;Core/Src/stm32f1xx_hal_msp.c;Core/Src/stm32f1xx_hal_timebase_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c;Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Core/Src/system_stm32f1xx.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c;Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Core/Src/system_stm32f1xx.c;;;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c;Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c;
+SourceFiles=Core/Src/main.c;Core/Src/gpio.c;Core/Src/freertos.c;Core/Src/dma.c;Core/Src/i2c.c;Core/Src/spi.c;Core/Src/tim.c;Core/Src/usart.c;Core/Src/stm32f1xx_it.c;Core/Src/stm32f1xx_hal_msp.c;Core/Src/stm32f1xx_hal_timebase_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c;Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Core/Src/system_stm32f1xx.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c;Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Core/Src/system_stm32f1xx.c;;;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c;Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c;
HeaderPath=Drivers/STM32F1xx_HAL_Driver/Inc;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;Middlewares/Third_Party/FreeRTOS/Source/include;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3;Drivers/CMSIS/Device/ST/STM32F1xx/Include;Drivers/CMSIS/Include;Core/Inc;
CDefines=USE_HAL_DRIVER;STM32F103xB;USE_HAL_DRIVER;USE_HAL_DRIVER;
[PreviousGenFiles]
AdvancedFolderStructure=true
-HeaderFileListSize=9
+HeaderFileListSize=10
HeaderFiles#0=../Core/Inc/gpio.h
HeaderFiles#1=../Core/Inc/FreeRTOSConfig.h
-HeaderFiles#2=../Core/Inc/i2c.h
-HeaderFiles#3=../Core/Inc/spi.h
-HeaderFiles#4=../Core/Inc/tim.h
-HeaderFiles#5=../Core/Inc/usart.h
-HeaderFiles#6=../Core/Inc/stm32f1xx_it.h
-HeaderFiles#7=../Core/Inc/stm32f1xx_hal_conf.h
-HeaderFiles#8=../Core/Inc/main.h
+HeaderFiles#2=../Core/Inc/dma.h
+HeaderFiles#3=../Core/Inc/i2c.h
+HeaderFiles#4=../Core/Inc/spi.h
+HeaderFiles#5=../Core/Inc/tim.h
+HeaderFiles#6=../Core/Inc/usart.h
+HeaderFiles#7=../Core/Inc/stm32f1xx_it.h
+HeaderFiles#8=../Core/Inc/stm32f1xx_hal_conf.h
+HeaderFiles#9=../Core/Inc/main.h
HeaderFolderListSize=1
HeaderPath#0=../Core/Inc
HeaderFiles=;
-SourceFileListSize=10
+SourceFileListSize=11
SourceFiles#0=../Core/Src/gpio.c
SourceFiles#1=../Core/Src/freertos.c
-SourceFiles#2=../Core/Src/i2c.c
-SourceFiles#3=../Core/Src/spi.c
-SourceFiles#4=../Core/Src/tim.c
-SourceFiles#5=../Core/Src/usart.c
-SourceFiles#6=../Core/Src/stm32f1xx_it.c
-SourceFiles#7=../Core/Src/stm32f1xx_hal_msp.c
-SourceFiles#8=../Core/Src/stm32f1xx_hal_timebase_tim.c
-SourceFiles#9=../Core/Src/main.c
+SourceFiles#2=../Core/Src/dma.c
+SourceFiles#3=../Core/Src/i2c.c
+SourceFiles#4=../Core/Src/spi.c
+SourceFiles#5=../Core/Src/tim.c
+SourceFiles#6=../Core/Src/usart.c
+SourceFiles#7=../Core/Src/stm32f1xx_it.c
+SourceFiles#8=../Core/Src/stm32f1xx_hal_msp.c
+SourceFiles#9=../Core/Src/stm32f1xx_hal_timebase_tim.c
+SourceFiles#10=../Core/Src/main.c
SourceFolderListSize=1
SourcePath#0=../Core/Src
SourceFiles=;
diff --git a/Core/Inc/main.h b/Core/Inc/main.h
index fb86e04..6801648 100644
--- a/Core/Inc/main.h
+++ b/Core/Inc/main.h
@@ -40,6 +40,8 @@ extern char flag_1s;
extern char flag_2s;
extern char flag_5s;
extern char flag_10s;
+
+extern char IC_CARD_ID[16];
/* USER CODE END ET */
/* Exported constants --------------------------------------------------------*/
diff --git a/Core/Inc/oledfont.h b/Core/Inc/oledfont.h
index 99eb40a..e05fc91 100644
--- a/Core/Inc/oledfont.h
+++ b/Core/Inc/oledfont.h
@@ -200,32 +200,75 @@ const unsigned char F8X16[] =
//部分汉字
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},
{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},
{0x40, 0x22, 0x15, 0x08, 0x16, 0x61, 0x00, 0x00, 0x40, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"好",1*/
-
- {0x20, 0x20, 0x20, 0xFE, 0x20, 0x20, 0xFF, 0x20, 0x20, 0x20, 0xFF, 0x20, 0x20, 0x20, 0x20, 0x00},
- {0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x47, 0x44, 0x44, 0x44, 0x47, 0x40, 0x40, 0x40, 0x00, 0x00}, /*"世",2*/
-
- {0x00, 0x00, 0x00, 0xFE, 0x92, 0x92, 0x92, 0xFE, 0x92, 0x92, 0x92, 0xFE, 0x00, 0x00, 0x00, 0x00},
- {0x08, 0x08, 0x04, 0x84, 0x62, 0x1E, 0x01, 0x00, 0x01, 0xFE, 0x02, 0x04, 0x04, 0x08, 0x08, 0x00}, /*"界",3*/
-
- {0x10, 0x10, 0x10, 0xFF, 0x90, 0x20, 0x98, 0x88, 0x88, 0xE9, 0x8E, 0x88, 0x88, 0xA8, 0x98, 0x00},
- {0x02, 0x42, 0x81, 0x7F, 0x00, 0x00, 0x80, 0x84, 0x4B, 0x28, 0x10, 0x28, 0x47, 0x80, 0x00, 0x00}, /*"按",4*/
-
- {0x40, 0x30, 0xEF, 0x24, 0x24, 0x80, 0xE4, 0x9C, 0x10, 0x54, 0x54, 0xFF, 0x54, 0x7C, 0x10, 0x00},
- {0x01, 0x01, 0x7F, 0x21, 0x51, 0x26, 0x18, 0x27, 0x44, 0x45, 0x45, 0x5F, 0x45, 0x45, 0x44, 0x00}, /*"键",5*/
-
- {0x00, 0x02, 0x0C, 0x80, 0x60, 0x80, 0x40, 0x30, 0x0F, 0xC8, 0x08, 0x08, 0x28, 0x18, 0x00, 0x00},
- {0x02, 0x02, 0x7E, 0x01, 0x80, 0x40, 0x20, 0x18, 0x06, 0x01, 0x06, 0x18, 0x20, 0x40, 0x80, 0x00}, /*"次",6*/
-
- {0x90, 0x52, 0x34, 0x10, 0xFF, 0x10, 0x34, 0x52, 0x80, 0x70, 0x8F, 0x08, 0x08, 0xF8, 0x08, 0x00},
- {0x82, 0x9A, 0x56, 0x63, 0x22, 0x52, 0x8E, 0x00, 0x80, 0x40, 0x33, 0x0C, 0x33, 0x40, 0x80, 0x00}, /*"数",7*/
-
-
+ {0x08, 0x04, 0x23, 0x22, 0x26, 0x2A, 0x22, 0xFA, 0x24, 0x23, 0x22, 0x26, 0x2A, 0x02, 0x02, 0x00},
+ {0x01, 0x09, 0x09, 0x09, 0x19, 0x69, 0x09, 0x09, 0x49, 0x89, 0x7D, 0x09, 0x09, 0x09, 0x01, 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*/
+ {0xF2, 0x12, 0xFE, 0x12, 0xFE, 0x12, 0xF2, 0x00, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x00, 0x00, 0x00},
+ {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},
+ {0x00, 0xFF, 0x10, 0x08, 0x06, 0x01, 0x0E, 0x10, 0x08, 0x06, 0x01, 0x4E, 0x80, 0x7F, 0x00, 0x00}, /*"网",5*/
+ {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*/
+ {0x10, 0x10, 0x10, 0xFF, 0x10, 0x50, 0x44, 0x54, 0x65, 0xC6, 0x44, 0x64, 0x54, 0x44, 0x40, 0x00},
+ {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},
+ {0x80, 0x60, 0x1F, 0x02, 0x42, 0x82, 0x7F, 0x00, 0xFF, 0x40, 0x2F, 0x10, 0x2C, 0x43, 0x80, 0x00}, /*"服",8*/
+ {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*/
+ {0x80, 0x80, 0x9E, 0x92, 0x92, 0x92, 0x9E, 0xE0, 0x80, 0x9E, 0xB2, 0xD2, 0x92, 0x9E, 0x80, 0x00},
+ {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
diff --git a/Core/Inc/rc522.h b/Core/Inc/rc522.h
index 08e29cf..fc5c533 100644
--- a/Core/Inc/rc522.h
+++ b/Core/Inc/rc522.h
@@ -174,4 +174,32 @@ char PCD_Halt(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
diff --git a/Core/Inc/stm32f1xx_hal_conf.h b/Core/Inc/stm32f1xx_hal_conf.h
index 86a5e6a..7bf0e87 100644
--- a/Core/Inc/stm32f1xx_hal_conf.h
+++ b/Core/Inc/stm32f1xx_hal_conf.h
@@ -42,7 +42,7 @@
/*#define HAL_CORTEX_MODULE_ENABLED */
/*#define HAL_CRC_MODULE_ENABLED */
/*#define HAL_DAC_MODULE_ENABLED */
-/*#define HAL_DMA_MODULE_ENABLED */
+#define HAL_DMA_MODULE_ENABLED
/*#define HAL_ETH_MODULE_ENABLED */
/*#define HAL_FLASH_MODULE_ENABLED */
#define HAL_GPIO_MODULE_ENABLED
diff --git a/Core/Inc/stm32f1xx_it.h b/Core/Inc/stm32f1xx_it.h
index 90f5856..f00aa5f 100644
--- a/Core/Inc/stm32f1xx_it.h
+++ b/Core/Inc/stm32f1xx_it.h
@@ -52,6 +52,8 @@ void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void DebugMon_Handler(void);
+void DMA1_Channel2_IRQHandler(void);
+void DMA1_Channel3_IRQHandler(void);
void TIM1_UP_IRQHandler(void);
void TIM3_IRQHandler(void);
void TIM4_IRQHandler(void);
diff --git a/Core/Src/OneNet.c b/Core/Src/OneNet.c
index 72f8fe6..231554e 100644
--- a/Core/Src/OneNet.c
+++ b/Core/Src/OneNet.c
@@ -15,33 +15,17 @@
extern unsigned char esp8266_buf[128];
-
-//==========================================================
-// 函数名称: OneNet_DevLink
-//
-// 函数功能: 与onenet创建连接
-//
-// 入口参数: 无
-//
-// 返回参数: 1-成功 0-失败
-//
-// 说明: 与onenet平台建立连接
-//==========================================================
_Bool OneNet_DevLink(void)
{
- MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包
-
- unsigned char* dataPtr;
+ MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};
_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)
{
- 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 (MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK)
@@ -52,26 +36,24 @@ _Bool OneNet_DevLink(void)
status = 0;
break;
- // case 1: printf("WARN: 连接失败:协议错误\r\n");
- // break;
- // case 2: printf("WARN: 连接失败:非法的clientid\r\n");
- // break;
- // case 3: printf("WARN: 连接失败:服务器失败\r\n");
- // break;
- // case 4: printf("WARN: 连接失败:用户名或密码错误\r\n");
- // break;
- // case 5: printf("WARN: 连接失败:非法链接(比如token非法)\r\n");
- // break;
+ case 1:
+ // Invalid protocol version
+ case 2:
+ // Invalid client-id
+ case 3:
+ // Failed to connect to broker
+ case 4:
+ // Wrong username or password
+ case 5:
+ // Not authorized
default:
break;
}
}
}
- MQTT_DeleteBuffer(&mqttPacket); //删包
+ MQTT_DeleteBuffer(&mqttPacket);
}
- // else
- // printf("WARN: MQTT_PacketConnect Failed\r\n");
return status;
}
@@ -79,105 +61,91 @@ _Bool OneNet_DevLink(void)
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));
- sprintf(text, "\"volt\":{\"value\":%.2f},", IM_Volt * 0.0001);
- strcat(buf, text);
+ cJSON* params = cJSON_CreateObject();
+ cJSON* valueObj = cJSON_CreateObject();
- memset(text, 0, sizeof(text));
- sprintf(text, "\"current\":{\"value\":%.2f},", IM_Curr * 0.0001);
- strcat(buf, text);
+ cJSON_AddItemToObject(valueObj, "value", cJSON_CreateNumber(IM_Volt * 0.0001));
+ cJSON_AddItemToObject(params, "volt", valueObj);
- memset(text, 0, sizeof(text));
- sprintf(text, "\"watt_P\":{\"value\":%.2f},", IM_Power * 0.0001);
- strcat(buf, text);
+ valueObj = cJSON_CreateObject();
+ cJSON_AddItemToObject(valueObj, "value", cJSON_CreateNumber(IM_Curr * 0.0001));
+ cJSON_AddItemToObject(params, "current", valueObj);
- memset(text, 0, sizeof(text));
- sprintf(text, "\"energy\":{\"value\":%.3f},", IM_Energy * 0.0001);
- strcat(buf, text);
+ valueObj = cJSON_CreateObject();
+ cJSON_AddItemToObject(valueObj, "value", cJSON_CreateNumber(IM_Power * 0.0001));
+ cJSON_AddItemToObject(params, "watt_P", valueObj);
- memset(text, 0, sizeof(text));
- sprintf(text, "\"output\":{\"value\":%s}",
- HAL_GPIO_ReadPin(RELAY1_GPIO_Port, RELAY1_Pin) == GPIO_PIN_RESET ? "true" : "false");
- strcat(buf, text);
+ valueObj = cJSON_CreateObject();
+ cJSON_AddItemToObject(valueObj, "value", cJSON_CreateNumber(IM_Energy * 0.0001));
+ cJSON_AddItemToObject(params, "energy", valueObj);
+
+ 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);
}
-//==========================================================
-// 函数名称: OneNet_SendData
-//
-// 函数功能: 上传数据到平台
-//
-// 入口参数: type:发送数据的格式
-//
-// 返回参数: 无
-//
-// 说明:
-//==========================================================
-
void OneNet_SendData(void)
{
- MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包
+ MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};
char buf[256];
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 (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++)
{
mqttPacket._data[mqttPacket._len++] = buf[i];
}
- ESP8266_SendData(mqttPacket._data, mqttPacket._len); //上传数据到平台
- MQTT_DeleteBuffer(&mqttPacket); //删包
+ ESP8266_SendData(mqttPacket._data, mqttPacket._len);
+ MQTT_DeleteBuffer(&mqttPacket);
}
else;
- // printf( "WARN:EDP_NewBuffer Failed\r\n");
}
}
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];
const char* topic = topic_buf;
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)
{
- 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)
{
char* req_payload = NULL;
@@ -251,22 +219,18 @@ void OneNet_RevPro(unsigned char* cmd)
}
break;
- case MQTT_PKT_PUBACK: //发送Publish消息,平台回复的Ack
-
+ case MQTT_PKT_PUBACK:
if (MQTT_UnPacketPublishAck(cmd) == 0)
break;
-
- case MQTT_PKT_SUBACK: //发送Subscribe消息的Ack
-
+ case MQTT_PKT_SUBACK:
if (MQTT_UnPacketSubscribe(cmd) == 0)
break;
-
default:
result = -1;
break;
}
- ESP8266_Clear(); //清空缓存
+ ESP8266_Clear();
if (result == -1)
return;
diff --git a/Core/Src/esp8266.c b/Core/Src/esp8266.c
index ba7f96f..c5f0f19 100644
--- a/Core/Src/esp8266.c
+++ b/Core/Src/esp8266.c
@@ -58,7 +58,7 @@ void ESP8266_Clear(void)
//
// 说明: 循环调用检测是否接收完成
//==========================================================
-_Bool ESP8266_WaitRecive(void)
+_Bool ESP8266_WaitReceive(void)
{
if (esp8266_cnt == 0) //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
return REV_WAIT;
@@ -95,7 +95,7 @@ _Bool ESP8266_SendCmd(char* cmd, char* res)
while (timeOut--)
{
- if (ESP8266_WaitRecive() == REV_OK) //如果收到数据
+ if (ESP8266_WaitReceive() == REV_OK) //如果收到数据
{
if (strstr((const char*)esp8266_buf, res) != NULL) //如果检索到关键词
{
@@ -153,7 +153,7 @@ unsigned char* ESP8266_GetIPD(unsigned short timeOut)
do
{
- if (ESP8266_WaitRecive() == REV_OK) //如果接收完成
+ if (ESP8266_WaitReceive() == REV_OK) //如果接收完成
{
ptrIPD = strstr((char*)esp8266_buf, "IPD,"); //搜索“IPD”头
if (ptrIPD == NULL) //如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间
@@ -186,7 +186,7 @@ unsigned char* ESP8266_GetIPD_soft(unsigned short timeOut)
do
{
- if (ESP8266_WaitRecive() == REV_OK) //如果接收完成
+ if (ESP8266_WaitReceive() == REV_OK) //如果接收完成
{
ptrIPD = strstr((char*)esp8266_buf, "IPD,"); //搜索“IPD”头
if (ptrIPD == NULL) //如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间
@@ -250,24 +250,3 @@ void ESP8266_SmartConfig(void)
// stop smart config
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;
-//}
diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c
index b613f3b..bcff0f2 100644
--- a/Core/Src/freertos.c
+++ b/Core/Src/freertos.c
@@ -34,6 +34,7 @@
#include
#include "retarget.h"
#include "tim.h"
+#include "rc522.h"
#include "timers.h"
/* USER CODE END Includes */
@@ -57,16 +58,18 @@
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
-char ONENET_CONNECTED = 0;
-
// Flags
char KEY_PRESSED[4] = {0, 0, 0, 0};
+
+RC522_Handle rc522Handle;
+
+char ONENET_CONNECTED = 0;
/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
- .stack_size = 256 * 4,
+ .stack_size = 1024 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for keyScanTask */
@@ -76,13 +79,6 @@ const osThreadAttr_t keyScanTask_attributes = {
.stack_size = 128 * 4,
.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 -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
@@ -92,7 +88,6 @@ void Display_IM1281B(void);
void StartDefaultTask(void *argument);
void startKeyScanTask(void *argument);
-void startCmdTask(void *argument);
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) {
/* USER CODE BEGIN Init */
+ // Peripheral initialization
+ MFRC_Init();
+ PCD_Init();
+ RC522_InitStateMachine(&rc522Handle);
+
OLED_ShowString(0,0,"initializing...",12);
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);
- 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()) {}
OneNET_Subscribe();
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_TIM_Base_Start_IT(&htim1);
@@ -145,9 +167,6 @@ void MX_FREERTOS_Init(void) {
/* creation of keyScanTask */
keyScanTaskHandle = osThreadNew(startKeyScanTask, NULL, &keyScanTask_attributes);
- /* creation of cmdTask */
- cmdTaskHandle = osThreadNew(startCmdTask, NULL, &cmdTask_attributes);
-
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
@@ -168,24 +187,30 @@ void MX_FREERTOS_Init(void) {
void StartDefaultTask(void *argument)
{
/* 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 */
for(;;)
{
-
- // osDelay(500);
- //
- // OneNet_SendData();
- // osDelay(500);
- // ESP8266_Clear();
-
- if (KEY_PRESSED[0] || KEY_PRESSED[1])
+ /* Keys handler */
+ if (KEY_PRESSED[0])
{
KEY_PRESSED[0] = 0;
- KEY_PRESSED[1] = 0;
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)
{
flag_1s = 0;
@@ -211,7 +236,22 @@ void StartDefaultTask(void *argument)
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();
+ RC522_ProcessStateMachine(&rc522Handle);
+
+ /* Remote command handler */
+ uint8_t* dataPtr = ESP8266_GetIPD_soft(0);
+ if (dataPtr != NULL)
+ {
+ OneNet_RevPro(dataPtr);
+ }
}
/* USER CODE END StartDefaultTask */
}
@@ -234,31 +274,6 @@ void startKeyScanTask(void *argument)
/* 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 --------------------------------------------------*/
/* USER CODE BEGIN Application */
void KeyScan(void)
@@ -303,24 +318,23 @@ void KeyScan(void)
void Display_IM1281B(void)
{
- OLED_ShowString(0, 0, "Volt:", 12);
- OLED_ShowString(0, 2, "Curr:", 12);
- OLED_ShowString(0, 4, "Pwr: ", 12);
- OLED_ShowString(0, 6, "Eng: ", 12);
+ OLED_ShowString(0, 5, "V:", 12);
+ OLED_ShowString(64, 5, "A:", 12);
+ OLED_ShowString(0, 7, "P:", 12);
char buffer[16];
- snprintf(buffer, sizeof(buffer), "%.2fV", IM_Volt * 0.0001);
- OLED_ShowString(40, 0, buffer, 12);
+ snprintf(buffer, sizeof(buffer), "%.2fV ", IM_Volt * 0.0001);
+ OLED_ShowString(16, 5, buffer, 12);
- snprintf(buffer, sizeof(buffer), "%.2fA", IM_Curr * 0.0001);
- OLED_ShowString(40, 2, buffer, 12);
+ snprintf(buffer, sizeof(buffer), "%.2fA ", IM_Curr * 0.0001);
+ OLED_ShowString(80, 5, buffer, 12);
- snprintf(buffer, sizeof(buffer), "%.2fW", IM_Power * 0.0001);
- OLED_ShowString(40, 4, buffer, 12);
+ snprintf(buffer, sizeof(buffer), "%.2fW ", IM_Power * 0.0001);
+ OLED_ShowString(16, 7, buffer, 12);
- snprintf(buffer, sizeof(buffer), "%.3fKWh", IM_Energy * 0.0001);
- OLED_ShowString(40, 6, buffer, 12);
+ snprintf(buffer, sizeof(buffer), "%.3fkWh", IM_Energy * 0.0001);
+ OLED_ShowString(64, 7, buffer, 12);
}
/* USER CODE END Application */
diff --git a/Core/Src/main.c b/Core/Src/main.c
index 08768c7..e9638bb 100644
--- a/Core/Src/main.c
+++ b/Core/Src/main.c
@@ -19,6 +19,7 @@
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"
+#include "dma.h"
#include "i2c.h"
#include "spi.h"
#include "tim.h"
@@ -32,7 +33,6 @@
#include "retarget.h"
#include "oled.h"
-#include "rc522.h"
#include "esp8266.h"
#include "OneNet.h"
/* USER CODE END Includes */
@@ -72,6 +72,8 @@ uint8_t rf_card_type[3];
uint8_t rf_card_id[5];
uint8_t rf_data[16];
+char IC_CARD_ID[16];
+
uint8_t ADDR = 0x01 * 4 + 0x03;
uint8_t KEY_A[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 */
MX_GPIO_Init();
+ MX_DMA_Init();
MX_I2C1_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
@@ -139,8 +142,8 @@ int main(void)
// HAL_TIM_Base_Start_IT(&htim3);
// Init RC522
- MFRC_Init();
- PCD_Reset();
+ // MFRC_Init();
+ // PCD_Reset();
HAL_UARTEx_ReceiveToIdle_IT(&huart1, (uint8_t*)UART1_RxData, 40);
HAL_UART_Receive_IT(&huart2, &UART2_RxData, 1);
@@ -162,6 +165,17 @@ int main(void)
/* USER CODE BEGIN WHILE */
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())
// {
// OLED_ShowString(0,0,"OneNet online ",12);
diff --git a/Core/Src/rc522.c b/Core/Src/rc522.c
index 3b56335..fdc87fd 100644
--- a/Core/Src/rc522.c
+++ b/Core/Src/rc522.c
@@ -5,216 +5,135 @@
#include
extern SPI_HandleTypeDef hspi1;
-
-/**************************************************************************************
-* 函数名称:MFRC_Init
-* 功能描述:MFRC初始化
-* 入口参数:无
-* 出口参数:无
-* 返 回 值:无
-* 说 明:MFRC的SPI接口速率为0~10Mbps
-***************************************************************************************/
+
void MFRC_Init(void)
{
RS522_NSS(1);
RS522_RST(1);
}
-
-
-/**************************************************************************************
-* 函数名称: SPI_RW_Byte
-* 功能描述: 模拟SPI读写一个字节
-* 入口参数: -byte:要发送的数据
-* 出口参数: -byte:接收到的数据
-***************************************************************************************/
-static uint8_t ret; //这些函数是HAL与标准库不同的地方【读写函数】
+
+static uint8_t ret;
uint8_t SPI1_RW_Byte(uint8_t byte)
{
- HAL_SPI_TransmitReceive(&hspi1, &byte, &ret, 1, 10);//把byte 写入,并读出一个值,把它存入ret
- return ret;//入口是byte 的地址,读取时用的也是ret地址,一次只写入一个值10
+ HAL_SPI_TransmitReceive(&hspi1, &byte, &ret, 1, 10);
+ return ret;
}
-
-
-/**************************************************************************************
-* 函数名称:MFRC_WriteReg
-* 功能描述:写一个寄存器
-* 入口参数:-addr:待写的寄存器地址
-* -data:待写的寄存器数据
-* 出口参数:无
-* 返 回 值:无
-* 说 明:无
-***************************************************************************************/
+
void MFRC_WriteReg(uint8_t addr, uint8_t data)
{
- uint8_t AddrByte;
- AddrByte = (addr << 1 ) & 0x7E; //求出地址字节
- RS522_NSS(0); //NSS拉低
- SPI1_RW_Byte(AddrByte); //写地址字节
- SPI1_RW_Byte(data); //写数据
- RS522_NSS(1); //NSS拉高
+ const uint8_t AddrByte = (addr << 1) & 0x7E;
+ RS522_NSS(0);
+ SPI1_RW_Byte(AddrByte);
+ SPI1_RW_Byte(data);
+ RS522_NSS(1);
}
-
-
-/**************************************************************************************
-* 函数名称:MFRC_ReadReg
-* 功能描述:读一个寄存器
-* 入口参数:-addr:待读的寄存器地址
-* 出口参数:无
-* 返 回 值:-data:读到寄存器的数据
-* 说 明:无
-***************************************************************************************/
+
uint8_t MFRC_ReadReg(uint8_t addr)
{
- uint8_t AddrByte, data;
- AddrByte = ((addr << 1 ) & 0x7E ) | 0x80; //求出地址字节
- RS522_NSS(0); //NSS拉低
- SPI1_RW_Byte(AddrByte); //写地址字节
- data = SPI1_RW_Byte(0x00); //读数据
- RS522_NSS(1); //NSS拉高
+ const uint8_t AddrByte = ((addr << 1) & 0x7E) | 0x80;
+ RS522_NSS(0);
+ SPI1_RW_Byte(AddrByte);
+ const uint8_t data = SPI1_RW_Byte(0x00);
+ RS522_NSS(1); //NSS拉高
return data;
}
-
-
-/**************************************************************************************
-* 函数名称:MFRC_SetBitMask
-* 功能描述:设置寄存器的位
-* 入口参数:-addr:待设置的寄存器地址
-* -mask:待设置寄存器的位(可同时设置多个bit)
-* 出口参数:无
-* 返 回 值:无
-* 说 明:无
-***************************************************************************************/
+
void MFRC_SetBitMask(uint8_t addr, uint8_t mask)
{
uint8_t temp;
- temp = MFRC_ReadReg(addr); //先读回寄存器的值
- MFRC_WriteReg(addr, temp | mask); //处理过的数据再写入寄存器
+ temp = MFRC_ReadReg(addr);
+ MFRC_WriteReg(addr, temp | mask);
}
-
-
-/**************************************************************************************
-* 函数名称:MFRC_ClrBitMask
-* 功能描述:清除寄存器的位
-* 入口参数:-addr:待清除的寄存器地址
-* -mask:待清除寄存器的位(可同时清除多个bit)
-* 出口参数:无
-* 返 回 值:无
-* 说 明:无
-***************************************************************************************/
+
void MFRC_ClrBitMask(uint8_t addr, uint8_t mask)
{
uint8_t temp;
- temp = MFRC_ReadReg(addr); //先读回寄存器的值
- MFRC_WriteReg(addr, temp & ~mask); //处理过的数据再写入寄存器
+ temp = MFRC_ReadReg(addr);
+ MFRC_WriteReg(addr, temp & ~mask);
}
-
-
-/**************************************************************************************
-* 函数名称:MFRC_CalulateCRC
-* 功能描述:用MFRC计算CRC结果
-* 入口参数:-pInData:带进行CRC计算的数据
-* -len:带进行CRC计算的数据长度
-* -pOutData:CRC计算结果
-* 出口参数:-pOutData:CRC计算结果
-* 返 回 值:无
-* 说 明:无
-***************************************************************************************/
-void MFRC_CalulateCRC(uint8_t *pInData, uint8_t len, uint8_t *pOutData)
+
+void MFRC_CalulateCRC(uint8_t* pInData, uint8_t len, uint8_t* pOutData)
{
//0xc1 1 2 pInData[2]
uint8_t temp;
uint32_t i;
- MFRC_ClrBitMask(MFRC_DivIrqReg, 0x04); //使能CRC中断
- MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE); //取消当前命令的执行
- MFRC_SetBitMask(MFRC_FIFOLevelReg, 0x80); //清除FIFO及其标志位
- for(i = 0; i < len; i++) //将待CRC计算的数据写入FIFO
+ MFRC_ClrBitMask(MFRC_DivIrqReg, 0x04); //使能CRC中断
+ MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE); //取消当前命令的执行
+ MFRC_SetBitMask(MFRC_FIFOLevelReg, 0x80); //清除FIFO及其标志位
+ for (i = 0; i < len; i++) //将待CRC计算的数据写入FIFO
{
MFRC_WriteReg(MFRC_FIFODataReg, *(pInData + i));
}
- MFRC_WriteReg(MFRC_CommandReg, MFRC_CALCCRC); //执行CRC计算
+ MFRC_WriteReg(MFRC_CommandReg, MFRC_CALCCRC); //执行CRC计算
i = 100000;
do
{
- temp = MFRC_ReadReg(MFRC_DivIrqReg); //读取DivIrqReg寄存器的值
+ temp = MFRC_ReadReg(MFRC_DivIrqReg); //读取DivIrqReg寄存器的值
i--;
}
- while((i != 0) && !(temp & 0x04)); //等待CRC计算完成
- pOutData[0] = MFRC_ReadReg(MFRC_CRCResultRegL); //读取CRC计算结果
+ while ((i != 0) && !(temp & 0x04)); //等待CRC计算完成
+ pOutData[0] = MFRC_ReadReg(MFRC_CRCResultRegL); //读取CRC计算结果
pOutData[1] = MFRC_ReadReg(MFRC_CRCResultRegM);
}
-
-
-/**************************************************************************************
-* 函数名称:MFRC_CmdFrame
-* 功能描述:MFRC522和ISO14443A卡通讯的命令帧函数
-* 入口参数:-cmd:MFRC522命令字
-* -pIndata:MFRC522发送给MF1卡的数据的缓冲区首地址
-* -InLenByte:发送数据的字节长度
-* -pOutdata:用于接收MF1卡片返回数据的缓冲区首地址
-* -pOutLenBit:MF1卡返回数据的位长度
-* 出口参数:-pOutdata:用于接收MF1卡片返回数据的缓冲区首地址
-* -pOutLenBit:用于MF1卡返回数据位长度的首地址
-* 返 回 值:-status:错误代码(MFRC_OK、MFRC_NOTAGERR、MFRC_ERR)
-* 说 明:无
-***************************************************************************************/
-char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pOutData, uint16_t *pOutLenBit)
+
+char MFRC_CmdFrame(uint8_t cmd, uint8_t* pInData, uint8_t InLenByte, uint8_t* pOutData, uint16_t* pOutLenBit)
{
uint8_t lastBits;
uint8_t n;
uint32_t i;
char status = MFRC_ERR;
- uint8_t irqEn = 0x00;
+ uint8_t irqEn = 0x00;
uint8_t waitFor = 0x00;
-
+
/*根据命令设置标志位*/
- switch(cmd)
+ switch (cmd)
{
- case MFRC_AUTHENT: //Mifare认证
- irqEn = 0x12;
- waitFor = 0x10; //idleIRq中断标志
- break;
- case MFRC_TRANSCEIVE: //发送并接收数据
- irqEn = 0x77;
- waitFor = 0x30; //RxIRq和idleIRq中断标志
- break;
+ case MFRC_AUTHENT: //Mifare认证
+ irqEn = 0x12;
+ waitFor = 0x10; //idleIRq中断标志
+ break;
+ case MFRC_TRANSCEIVE: //发送并接收数据
+ irqEn = 0x77;
+ waitFor = 0x30; //RxIRq和idleIRq中断标志
+ break;
}
-
+
/*发送命令帧前准备*/
- MFRC_WriteReg(MFRC_ComIEnReg, irqEn | 0x80); //开中断
- MFRC_ClrBitMask(MFRC_ComIrqReg, 0x80); //清除中断标志位SET1
- MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE); //取消当前命令的执行
- MFRC_SetBitMask(MFRC_FIFOLevelReg, 0x80); //清除FIFO缓冲区及其标志位
-
+ MFRC_WriteReg(MFRC_ComIEnReg, irqEn | 0x80); //开中断
+ MFRC_ClrBitMask(MFRC_ComIrqReg, 0x80); //清除中断标志位SET1
+ MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE); //取消当前命令的执行
+ 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_CommandReg, cmd); //执行命令
- if(cmd == MFRC_TRANSCEIVE)
+ MFRC_WriteReg(MFRC_CommandReg, cmd); //执行命令
+ if (cmd == MFRC_TRANSCEIVE)
{
- MFRC_SetBitMask(MFRC_BitFramingReg, 0x80); //启动发送
+ MFRC_SetBitMask(MFRC_BitFramingReg, 0x80); //启动发送
}
- i = 300000; //根据时钟频率调整,操作M1卡最大等待时间25ms
+ i = 300000; //根据时钟频率调整,操作M1卡最大等待时间25ms
do
{
n = MFRC_ReadReg(MFRC_ComIrqReg);
i--;
}
- while((i != 0) && !(n & 0x01) && !(n & waitFor)); //等待命令完成
- MFRC_ClrBitMask(MFRC_BitFramingReg, 0x80); //停止发送
-
+ while ((i != 0) && !(n & 0x01) && !(n & waitFor)); //等待命令完成
+ 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;
- if(n & irqEn & 0x01)
+ if (n & irqEn & 0x01)
{
status = MFRC_NOTAGERR;
}
- if(cmd == MFRC_TRANSCEIVE)
+ if (cmd == MFRC_TRANSCEIVE)
{
n = MFRC_ReadReg(MFRC_FIFOLevelReg);
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;
}
- if(n == 0)
+ if (n == 0)
{
n = 1;
}
- if(n > MFRC_MAXRLEN)
+ if (n > MFRC_MAXRLEN)
{
n = MFRC_MAXRLEN;
}
- for(i = 0; i < n; i++)
+ for (i = 0; i < n; i++)
{
pOutData[i] = MFRC_ReadReg(MFRC_FIFODataReg);
}
@@ -245,58 +164,40 @@ char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pO
status = MFRC_ERR;
}
}
-
- MFRC_SetBitMask(MFRC_ControlReg, 0x80); //停止定时器运行
- MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE); //取消当前命令的执行
-
+
+ MFRC_SetBitMask(MFRC_ControlReg, 0x80); // 停止定时器运行
+ MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE); // 取消当前命令的执行
+
return status;
}
-
-
-/**************************************************************************************
-* 函数名称:PCD_Reset
-* 功能描述:PCD复位
-* 入口参数:无
-* 出口参数:无
-* 返 回 值:无
-* 说 明:无
-***************************************************************************************/
+
void PCD_Reset(void)
{
- /*硬复位*/
- RS522_RST(1);//用到复位引脚
+ /* Hard reset */
+ RS522_RST(1); //用到复位引脚
osDelay(2);
RS522_RST(0);
osDelay(2);
RS522_RST(1);
osDelay(2);
-
- /*软复位*/
+
+ /* Soft reset */
MFRC_WriteReg(MFRC_CommandReg, MFRC_RESETPHASE);
osDelay(2);
-
- /*复位后的初始化配置*/
- MFRC_WriteReg(MFRC_ModeReg, 0x3D); //CRC初始值0x6363
- MFRC_WriteReg(MFRC_TReloadRegL, 30); //定时器重装值
+
+ /* Init after reset */
+ MFRC_WriteReg(MFRC_ModeReg, 0x3D); // CRC初始值0x6363
+ MFRC_WriteReg(MFRC_TReloadRegL, 30); // 定时器重装值
MFRC_WriteReg(MFRC_TReloadRegH, 0);
- MFRC_WriteReg(MFRC_TModeReg, 0x8D); //定时器设置
- MFRC_WriteReg(MFRC_TPrescalerReg, 0x3E); //定时器预分频值
- MFRC_WriteReg(MFRC_TxAutoReg, 0x40); //100%ASK
-
- PCD_AntennaOff(); //关天线
+ MFRC_WriteReg(MFRC_TModeReg, 0x8D); // 定时器设置
+ MFRC_WriteReg(MFRC_TPrescalerReg, 0x3E); // 定时器预分频值
+ MFRC_WriteReg(MFRC_TxAutoReg, 0x40); // 100%ASK
+
+ PCD_AntennaOff(); // 关天线
osDelay(2);
- PCD_AntennaOn(); //开天线
+ PCD_AntennaOn(); // 开天线
}
-
-
-/**************************************************************************************
-* 函数名称:PCD_AntennaOn
-* 功能描述:开启天线,使能PCD发送能量载波信号
-* 入口参数:无
-* 出口参数:无
-* 返 回 值:无
-* 说 明:每次开启或关闭天线之间应至少有1ms的间隔
-***************************************************************************************/
+
void PCD_AntennaOn(void)
{
uint8_t temp;
@@ -306,151 +207,98 @@ void PCD_AntennaOn(void)
MFRC_SetBitMask(MFRC_TxControlReg, 0x03);
}
}
-
-
-/**************************************************************************************
-* 函数名称:PCD_AntennaOff
-* 功能描述:关闭天线,失能PCD发送能量载波信号
-* 入口参数:无
-* 出口参数:无
-* 返 回 值:无
-* 说 明:每次开启或关闭天线之间应至少有1ms的间隔
-***************************************************************************************/
+
void PCD_AntennaOff(void)
{
MFRC_ClrBitMask(MFRC_TxControlReg, 0x03);
}
-
-
-/***************************************************************************************
-* 函数名称:PCD_Init
-* 功能描述:读写器初始化
-* 入口参数:无
-* 出口参数:无
-* 返 回 值:无
-* 说 明:无
-***************************************************************************************/
+
void PCD_Init(void)
{
- MFRC_Init(); //MFRC管脚配置
- PCD_Reset(); //PCD复位 并初始化配置
+ MFRC_Init(); //MFRC管脚配置
+ PCD_Reset(); //PCD复位 并初始化配置
PCD_AntennaOff(); //关闭天线
- PCD_AntennaOn(); //开启天线
+ PCD_AntennaOn(); //开启天线
}
-
-
-/***************************************************************************************
-* 函数名称:PCD_Request
-* 功能描述:寻卡
-* 入口参数: -RequestMode:讯卡方式
-* PICC_REQIDL:寻天线区内未进入休眠状态
-* PICC_REQALL:寻天线区内全部卡
-* -pCardType:用于保存卡片类型
-* 出口参数:-pCardType:卡片类型
-* 0x4400:Mifare_UltraLight
-* 0x0400:Mifare_One(S50)
-* 0x0200:Mifare_One(S70)
-* 0x0800:Mifare_Pro(X)
-* 0x4403:Mifare_DESFire
-* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
-* 说 明:无
-***************************************************************************************/
-char PCD_Request(uint8_t RequestMode, uint8_t *pCardType)
+
+char PCD_Request(uint8_t RequestMode, uint8_t* pCardType)
{
int status;
uint16_t unLen;
uint8_t CmdFrameBuf[MFRC_MAXRLEN];
-
- MFRC_ClrBitMask(MFRC_Status2Reg, 0x08);//关内部温度传感器
+
+ MFRC_ClrBitMask(MFRC_Status2Reg, 0x08); //关内部温度传感器
MFRC_WriteReg(MFRC_BitFramingReg, 0x07); //存储模式,发送模式,是否启动发送等
- MFRC_SetBitMask(MFRC_TxControlReg, 0x03);//配置调制信号13.56MHZ
-
+ MFRC_SetBitMask(MFRC_TxControlReg, 0x03); //配置调制信号13.56MHZ
+
CmdFrameBuf[0] = RequestMode;
-
+
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 + 1) = CmdFrameBuf[1];
}
-
+
return status;
}
-
-
-/***************************************************************************************
-* 函数名称:PCD_Anticoll
-* 功能描述:防冲突,获取卡号
-* 入口参数:-pSnr:用于保存卡片序列号,4字节
-* 出口参数:-pSnr:卡片序列号,4字节
-* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
-* 说 明:无
-***************************************************************************************/
-char PCD_AntiColl(uint8_t *pSnr)
+
+char PCD_AntiColl(uint8_t* pSnr)
{
char status;
uint8_t i, snr_check = 0;
- uint16_t unLen;
+ uint16_t unLen;
uint8_t CmdFrameBuf[MFRC_MAXRLEN];
-
+
MFRC_ClrBitMask(MFRC_Status2Reg, 0x08);
MFRC_WriteReg(MFRC_BitFramingReg, 0x00);
MFRC_ClrBitMask(MFRC_CollReg, 0x80);
-
+
CmdFrameBuf[0] = PICC_ANTICOLL1;
CmdFrameBuf[1] = 0x20;
-
+
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];
}
- if(snr_check != CmdFrameBuf[i])
+ if (snr_check != CmdFrameBuf[i])
{
status = PCD_ERR;
}
}
-
+
MFRC_SetBitMask(MFRC_CollReg, 0x80);
return status;
}
-
-
-/***************************************************************************************
-* 函数名称:PCD_Select
-* 功能描述:选卡
-* 入口参数:-pSnr:卡片序列号,4字节
-* 出口参数:无
-* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
-* 说 明:无
-***************************************************************************************/
-char PCD_Select(uint8_t *pSnr)
+
+char PCD_Select(uint8_t* pSnr)
{
char status;
uint8_t i;
uint16_t unLen;
uint8_t CmdFrameBuf[MFRC_MAXRLEN];
-
+
CmdFrameBuf[0] = PICC_ANTICOLL1;
CmdFrameBuf[1] = 0x70;
CmdFrameBuf[6] = 0;
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
{
CmdFrameBuf[i + 2] = *(pSnr + i);
- CmdFrameBuf[6] ^= *(pSnr + i);
+ CmdFrameBuf[6] ^= *(pSnr + i);
}
MFRC_CalulateCRC(CmdFrameBuf, 7, &CmdFrameBuf[7]);
-
+
MFRC_ClrBitMask(MFRC_Status2Reg, 0x08);
-
+
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 9, CmdFrameBuf, &unLen);
-
- if((status == PCD_OK) && (unLen == 0x18))
+
+ if ((status == PCD_OK) && (unLen == 0x18))
{
status = PCD_OK;
}
@@ -460,116 +308,82 @@ char PCD_Select(uint8_t *pSnr)
}
return status;
}
-
-
-/***************************************************************************************
-* 函数名称:PCD_AuthState
-* 功能描述:验证卡片密码
-* 入口参数:-AuthMode:验证模式
-* PICC_AUTHENT1A:验证A密码
-* PICC_AUTHENT1B:验证B密码
-* -BlockAddr:块地址(0~63)
-* -pKey:密码
-* -pSnr:卡片序列号,4字节
-* 出口参数:无
-* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
-* 说 明:验证密码时,以扇区为单位,BlockAddr参数可以是同一个扇区的任意块
-***************************************************************************************/
-char PCD_AuthState(uint8_t AuthMode, uint8_t BlockAddr, uint8_t *pKey, uint8_t *pSnr)
+
+char PCD_AuthState(uint8_t AuthMode, uint8_t BlockAddr, uint8_t* pKey, uint8_t* pSnr)
{
char status;
uint16_t unLen;
uint8_t i, CmdFrameBuf[MFRC_MAXRLEN];
CmdFrameBuf[0] = AuthMode;
CmdFrameBuf[1] = BlockAddr;
- for(i = 0; i < 6; i++)
+ for (i = 0; i < 6; i++)
{
CmdFrameBuf[i + 2] = *(pKey + i);
}
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
{
CmdFrameBuf[i + 8] = *(pSnr + i);
}
-
+
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;
}
-
+
return status;
}
-
-
-/***************************************************************************************
-* 函数名称:PCD_WriteBlock
-* 功能描述:读MF1卡数据块
-* 入口参数:-BlockAddr:块地址
-* -pData: 用于保存待写入的数据,16字节
-* 出口参数:无
-* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
-* 说 明:无
-***************************************************************************************/
-char PCD_WriteBlock(uint8_t BlockAddr, uint8_t *pData)
+
+char PCD_WriteBlock(uint8_t BlockAddr, uint8_t* pData)
{
char status;
uint16_t unLen;
uint8_t i, CmdFrameBuf[MFRC_MAXRLEN];
-
+
CmdFrameBuf[0] = PICC_WRITE;
CmdFrameBuf[1] = BlockAddr;
MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);
-
+
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;
}
-
- if(status == PCD_OK)
+
+ if (status == PCD_OK)
{
- for(i = 0; i < 16; i++)
+ for (i = 0; i < 16; i++)
{
CmdFrameBuf[i] = *(pData + i);
}
MFRC_CalulateCRC(CmdFrameBuf, 16, &CmdFrameBuf[16]);
-
+
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;
}
}
-
+
return status;
}
-
-
-/***************************************************************************************
-* 函数名称:PCD_ReadBlock
-* 功能描述:读MF1卡数据块
-* 入口参数:-BlockAddr:块地址
-* -pData: 用于保存读出的数据,16字节
-* 出口参数:-pData: 用于保存读出的数据,16字节
-* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
-* 说 明:无
-***************************************************************************************/
-char PCD_ReadBlock(uint8_t BlockAddr, uint8_t *pData)
+
+char PCD_ReadBlock(uint8_t BlockAddr, uint8_t* pData)
{
char status;
uint16_t unLen;
uint8_t i, CmdFrameBuf[MFRC_MAXRLEN];
-
+
CmdFrameBuf[0] = PICC_READ;
CmdFrameBuf[1] = BlockAddr;
MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);
-
+
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];
}
@@ -578,99 +392,75 @@ char PCD_ReadBlock(uint8_t BlockAddr, uint8_t *pData)
{
status = PCD_ERR;
}
-
+
return status;
}
-
-
-/***************************************************************************************
-* 函数名称:PCD_Value
-* 功能描述:对MF1卡数据块增减值操作
-* 入口参数:
-* -BlockAddr:块地址
-* -pValue:四字节增值的值,低位在前
-* -mode:数值块操作模式
-* PICC_INCREMENT:增值
-* PICC_DECREMENT:减值
-* 出口参数:无
-* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
-* 说 明:无
-***************************************************************************************/
-char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t *pValue)
+
+char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t* pValue)
{
//0XC1 1 Increment[4]={0x03, 0x01, 0x01, 0x01};
char status;
uint16_t unLen;
uint8_t i, CmdFrameBuf[MFRC_MAXRLEN];
-
+
CmdFrameBuf[0] = mode;
CmdFrameBuf[1] = BlockAddr;
MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);
-
+
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;
}
-
- if(status == PCD_OK)
+
+ if (status == PCD_OK)
{
- for(i = 0; i < 16; i++)
+ for (i = 0; i < 16; i++)
{
CmdFrameBuf[i] = *(pValue + i);
}
MFRC_CalulateCRC(CmdFrameBuf, 4, &CmdFrameBuf[4]);
unLen = 0;
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 6, CmdFrameBuf, &unLen);
- if(status != PCD_ERR)
+ if (status != PCD_ERR)
{
status = PCD_OK;
}
}
-
- if(status == PCD_OK)
+
+ if (status == PCD_OK)
{
CmdFrameBuf[0] = PICC_TRANSFER;
CmdFrameBuf[1] = BlockAddr;
MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);
-
+
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;
}
}
return status;
}
-
-
-/***************************************************************************************
-* 函数名称:PCD_BakValue
-* 功能描述:备份钱包(块转存)
-* 入口参数:-sourceBlockAddr:源块地址
-* -goalBlockAddr :目标块地址
-* 出口参数:无
-* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
-* 说 明:只能在同一个扇区内转存
-***************************************************************************************/
+
char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr)
{
char status;
- uint16_t unLen;
+ uint16_t unLen;
uint8_t CmdFrameBuf[MFRC_MAXRLEN];
-
+
CmdFrameBuf[0] = PICC_RESTORE;
CmdFrameBuf[1] = sourceBlockAddr;
MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);
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;
}
-
- if(status == PCD_OK)
+
+ if (status == PCD_OK)
{
CmdFrameBuf[0] = 0;
CmdFrameBuf[1] = 0;
@@ -678,134 +468,131 @@ char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr)
CmdFrameBuf[3] = 0;
MFRC_CalulateCRC(CmdFrameBuf, 4, &CmdFrameBuf[4]);
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 6, CmdFrameBuf, &unLen);
- if(status != PCD_ERR)
+ if (status != PCD_ERR)
{
status = PCD_OK;
}
}
-
- if(status != PCD_OK)
+
+ if (status != PCD_OK)
{
return PCD_ERR;
}
-
+
CmdFrameBuf[0] = PICC_TRANSFER;
CmdFrameBuf[1] = goalBlockAddr;
MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);
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;
}
-
+
return status;
}
-
-
-/***************************************************************************************
-* 函数名称:PCD_Halt
-* 功能描述:命令卡片进入休眠状态
-* 入口参数:无
-* 出口参数:无
-* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
-* 说 明:无
-***************************************************************************************/
+
char PCD_Halt(void)
{
char status;
uint16_t unLen;
uint8_t CmdFrameBuf[MFRC_MAXRLEN];
-
+
CmdFrameBuf[0] = PICC_HALT;
CmdFrameBuf[1] = 0;
MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);
-
+
status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);
-
+
return status;
}
-
-// uint8_t readUid[5]; //卡号
-// uint8_t CT[3]; //卡类型
-// uint8_t DATA[16]; //存放数据
-//
-// uint8_t KEY_A[6]= {0xff,0xff,0xff,0xff,0xff,0xff};
-// uint8_t KEY_B[6]= {0xff,0xff,0xff,0xff,0xff,0xff};
-// unsigned char buf[16]={0x01,0x02,0x03,0x04,0x05,0x06,0xff
-// ,0x07,0x80,0x69,0x18,0x17,0x16,0x15,0x14,0x13};
-//
-// uint8_t status;
-// uint8_t addr = 0x01*4 + 0x03; // 总共16个扇区。一个扇区4个块,从0开始算,表示第一扇区第三块
-// void CardCompare(void)
-// {
-// uint8_t i;
-// //status = PCD_WriteBlock(addr, buf);
-// status = PCD_Request(0x52, CT); //找到卡返回0
-// if(!status) //寻卡成功
-// {
-// status = PCD_ERR;
-// status = PCD_AntiColl(readUid); //防冲撞
-// }
-//
-// if(!status) //防冲撞成功
-// {
-// status = PCD_ERR;
-// printf("卡的类型为:%x%x%x\r\n",CT[0],CT[1],CT[2]); /* 读取卡的类型 */
-// printf("卡号:%x-%x-%x-%x\r\n",readUid[0],readUid[1],readUid[2],readUid[3]);
-// HAL_Delay(1000);
-// status=PCD_Select(readUid); /* 选卡 */
-// }
-//
-// if(!status) //选卡成功
-// {
-// status = PCD_ERR;
-// // 验证A密钥 块地址 密码 SN
-// status = PCD_AuthState(PICC_AUTHENT1A, addr, KEY_A, readUid);
-// if(status == PCD_OK)//验证A成功
-// {
-// printf("A密钥验证成功\r\n");
-// HAL_Delay(1000);
-// }
-// else
-// {
-// printf("A密钥验证失败\r\n");
-// HAL_Delay(1000);
-// }
-//
-// // 验证B密钥 块地址 密码 SN
-// status = PCD_AuthState(PICC_AUTHENT1B, addr, KEY_B, readUid);
-// if(status == PCD_OK)//验证B成功
-// {
-// printf("B密钥验证成功\r\n");
-// }
-// else
-// {
-// printf("B密钥验证失败\r\n");
-// }
-// HAL_Delay(1000);
-// }
-//
-// if(status == PCD_OK)//验证密码成功,接着读取3块
-// {
-// status = PCD_ERR;
-// status = PCD_ReadBlock(addr, DATA);
-//
-// if(status == PCD_OK)//读卡成功
-// {
-// printf("1扇区3块DATA:");
-// for(i = 0; i < 16; i++)
-// {
-// printf("%02x", DATA[i]);
-// }
-// printf("\r\n");
-//
-// }
-// else
-// {
-// printf("读卡失败\r\n");
-// }
-// HAL_Delay(1000);
-// }
-//
-// }
\ No newline at end of file
+void RC522_InitStateMachine(RC522_Handle* handle)
+{
+ handle->state = RC522_STATE_IDLE;
+ memset(handle->cardType, 0, sizeof(handle->cardType));
+ memset(handle->cardID, 0, sizeof(handle->cardID));
+ memset(handle->blockData, 0, sizeof(handle->blockData));
+ handle->blockAddr = 0x01 * 4 + 0x03;
+ memset(handle->keyA, 0xFF, sizeof(handle->keyA));
+ memset(handle->keyB, 0xFF, sizeof(handle->keyB));
+ handle->status = PCD_OK;
+}
+
+void RC522_ProcessStateMachine(RC522_Handle* handle)
+{
+ switch (handle->state)
+ {
+ case RC522_STATE_IDLE:
+ // 等待触发
+ break;
+
+ case RC522_STATE_REQUEST:
+ handle->status = PCD_Request(PICC_REQALL, handle->cardType);
+ if (handle->status == PCD_OK)
+ {
+ handle->state = RC522_STATE_ANTICOLL;
+ }
+ else
+ {
+ handle->state = RC522_STATE_IDLE;
+ }
+ break;
+
+ case RC522_STATE_ANTICOLL:
+ handle->status = PCD_AntiColl(handle->cardID);
+ if (handle->status == PCD_OK)
+ {
+ handle->state = RC522_STATE_SELECT;
+ }
+ else
+ {
+ handle->state = RC522_STATE_IDLE;
+ }
+ break;
+
+ case RC522_STATE_SELECT:
+ handle->status = PCD_Select(handle->cardID);
+ if (handle->status == PCD_OK)
+ {
+ handle->state = RC522_STATE_AUTH;
+ }
+ else
+ {
+ handle->state = RC522_STATE_IDLE;
+ }
+ break;
+
+ case RC522_STATE_AUTH:
+ handle->status = PCD_AuthState(PICC_AUTHENT1A, handle->blockAddr, handle->keyA, handle->cardID);
+ if (handle->status == PCD_OK)
+ {
+ handle->state = RC522_STATE_READ;
+ }
+ else
+ {
+ handle->state = RC522_STATE_IDLE;
+ }
+ break;
+
+ case RC522_STATE_READ:
+ handle->status = PCD_ReadBlock(handle->blockAddr, handle->blockData);
+ if (handle->status == PCD_OK)
+ {
+ handle->state = RC522_STATE_HALT;
+ }
+ else
+ {
+ handle->state = RC522_STATE_IDLE;
+ }
+ break;
+
+ case RC522_STATE_HALT:
+ PCD_Halt();
+ handle->state = RC522_STATE_IDLE;
+ break;
+
+ default:
+ handle->state = RC522_STATE_IDLE;
+ break;
+ }
+}
diff --git a/Core/Src/spi.c b/Core/Src/spi.c
index 7a372da..92665de 100644
--- a/Core/Src/spi.c
+++ b/Core/Src/spi.c
@@ -25,6 +25,8 @@
/* USER CODE END 0 */
SPI_HandleTypeDef hspi1;
+DMA_HandleTypeDef hdma_spi1_rx;
+DMA_HandleTypeDef hdma_spi1_tx;
/* SPI1 init function */
void MX_SPI1_Init(void)
@@ -87,6 +89,39 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
GPIO_InitStruct.Pull = GPIO_NOPULL;
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 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);
+ /* SPI1 DMA DeInit */
+ HAL_DMA_DeInit(spiHandle->hdmarx);
+ HAL_DMA_DeInit(spiHandle->hdmatx);
/* USER CODE BEGIN SPI1_MspDeInit 1 */
/* USER CODE END SPI1_MspDeInit 1 */
diff --git a/Core/Src/stm32f1xx_it.c b/Core/Src/stm32f1xx_it.c
index 7fe9459..d62236f 100644
--- a/Core/Src/stm32f1xx_it.c
+++ b/Core/Src/stm32f1xx_it.c
@@ -55,6 +55,8 @@
/* USER CODE END 0 */
/* External variables --------------------------------------------------------*/
+extern DMA_HandleTypeDef hdma_spi1_rx;
+extern DMA_HandleTypeDef hdma_spi1_tx;
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim3;
extern UART_HandleTypeDef huart1;
@@ -163,6 +165,34 @@ void DebugMon_Handler(void)
/* 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.
*/
diff --git a/IntelliChargingPile.ioc b/IntelliChargingPile.ioc
index 8c64fc1..6c156cc 100644
--- a/IntelliChargingPile.ioc
+++ b/IntelliChargingPile.ioc
@@ -2,9 +2,30 @@
CAD.formats=[]
CAD.pinconfig=Dual
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.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.configUSE_NEWLIB_REENTRANT=1
File.Version=6
@@ -12,17 +33,18 @@ GPIO.groupedBy=Group By Peripherals
KeepUserPlacement=false
Mcu.CPN=STM32F103C8T6
Mcu.Family=STM32F1
-Mcu.IP0=FREERTOS
-Mcu.IP1=I2C1
-Mcu.IP2=NVIC
-Mcu.IP3=RCC
-Mcu.IP4=SPI1
-Mcu.IP5=SYS
-Mcu.IP6=TIM1
-Mcu.IP7=TIM3
-Mcu.IP8=USART1
-Mcu.IP9=USART2
-Mcu.IPNb=10
+Mcu.IP0=DMA
+Mcu.IP1=FREERTOS
+Mcu.IP10=USART2
+Mcu.IP2=I2C1
+Mcu.IP3=NVIC
+Mcu.IP4=RCC
+Mcu.IP5=SPI1
+Mcu.IP6=SYS
+Mcu.IP7=TIM1
+Mcu.IP8=TIM3
+Mcu.IP9=USART1
+Mcu.IPNb=11
Mcu.Name=STM32F103C(8-B)Tx
Mcu.Package=LQFP48
Mcu.Pin0=PC13-TAMPER-RTC
@@ -57,6 +79,8 @@ Mcu.UserName=STM32F103C8Tx
MxCube.Version=6.14.0
MxDb.Version=DB.6.0.140
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.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
@@ -186,7 +210,7 @@ ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
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.AHBFreq_Value=72000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2