From ba2ce4e0cedef090862fc8b549ba54d0a1f7bcdb Mon Sep 17 00:00:00 2001 From: Timothy Yin Date: Fri, 9 May 2025 01:07:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=9C=BA=EF=BC=8C=E5=AE=8C=E6=88=90=E5=88=B7=E5=8D=A1=E3=80=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=8A=E6=8A=A5=E3=80=81=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 716 +++++++++++++++++++++++++++++++- .mxproject | 38 +- Core/Inc/main.h | 2 + Core/Inc/oledfont.h | 87 +++- Core/Inc/rc522.h | 28 ++ Core/Inc/stm32f1xx_hal_conf.h | 2 +- Core/Inc/stm32f1xx_it.h | 2 + Core/Src/OneNet.c | 152 +++---- Core/Src/esp8266.c | 29 +- Core/Src/freertos.c | 142 ++++--- Core/Src/main.c | 20 +- Core/Src/rc522.c | 755 ++++++++++++---------------------- Core/Src/spi.c | 38 ++ Core/Src/stm32f1xx_it.c | 30 ++ IntelliChargingPile.ioc | 50 ++- 15 files changed, 1346 insertions(+), 745 deletions(-) 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 @@ - + + + + + + + + - + + + @@ -417,35 +1097,29 @@ - file://$PROJECT_DIR$/Core/Src/OneNet.c - 195 - + + 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