From 6172288bccf02d7f56d134dfe6b1e96f28ca1598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=BF=8A=E6=BD=AE?= <24472040@qq.com> Date: Thu, 4 Apr 2024 21:15:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .mxproject | 2 +- App/Inc/ads1220.h | 193 ++ App/Inc/delay.h | 7 + App/Inc/key.h | 6 +- App/Inc/m1820.h | 23 + App/Inc/myLib.h | 47 + App/Inc/oled.h | 41 + App/Inc/serial_port.h | 16 + App/Inc/tmc5160.h | 13 + App/Src/ads1220.c | 298 +++ App/Src/app.c | 65 +- App/Src/delay.c | 38 + App/Src/key.c | 311 +-- App/Src/m1820.c | 309 +++ App/Src/myLib.c | 428 ++++ App/Src/oled.c | 490 +++++ App/Src/serial_port.c | 94 + App/Src/tmc5160.c | 149 ++ .../Inc/stm32f1xx_ll_spi.h | 1936 +++++++++++++++++ Inc/app.h | 19 + Inc/main.h | 12 - Inc/spi.h | 3 - Inc/stm32f1xx_it.h | 3 +- Inc/usart.h | 3 - MDK-ARM/mfps.uvguix.EthanWu | 571 ++--- MDK-ARM/mfps.uvoptx | 151 +- MDK-ARM/mfps.uvprojx | 47 +- MDK-ARM/mfps/ads1220.crf | Bin 0 -> 639436 bytes MDK-ARM/mfps/ads1220.d | 34 + MDK-ARM/mfps/ads1220.o | Bin 0 -> 720692 bytes MDK-ARM/mfps/app.crf | Bin 635097 -> 641895 bytes MDK-ARM/mfps/app.d | 9 +- MDK-ARM/mfps/app.o | Bin 705384 -> 714628 bytes MDK-ARM/mfps/delay.crf | Bin 0 -> 634687 bytes MDK-ARM/mfps/delay.d | 35 + MDK-ARM/mfps/delay.o | Bin 0 -> 704992 bytes MDK-ARM/mfps/gpio.crf | Bin 635683 -> 635285 bytes MDK-ARM/mfps/gpio.o | Bin 700796 -> 700452 bytes MDK-ARM/mfps/i2c.crf | Bin 634831 -> 634466 bytes MDK-ARM/mfps/i2c.o | Bin 704080 -> 703760 bytes MDK-ARM/mfps/key.crf | Bin 634772 -> 638025 bytes MDK-ARM/mfps/key.d | 5 +- MDK-ARM/mfps/key.o | Bin 705928 -> 705680 bytes MDK-ARM/mfps/m1820.crf | Bin 0 -> 636149 bytes MDK-ARM/mfps/m1820.d | 33 + MDK-ARM/mfps/m1820.o | Bin 0 -> 716528 bytes MDK-ARM/mfps/main.crf | Bin 635812 -> 641972 bytes MDK-ARM/mfps/main.d | 7 +- MDK-ARM/mfps/main.o | Bin 709796 -> 714772 bytes MDK-ARM/mfps/mfps.axf | Bin 675556 -> 724408 bytes MDK-ARM/mfps/mfps.build_log.htm | 11 +- MDK-ARM/mfps/mfps.hex | 1691 ++++++++------ MDK-ARM/mfps/mfps.htm | 1709 +++++++++------ MDK-ARM/mfps/mfps.lnp | 9 +- MDK-ARM/mfps/mfps.map | 1772 +++++++++------ MDK-ARM/mfps/mfps_mfps.dep | 423 +++- MDK-ARM/mfps/mylib.crf | Bin 0 -> 634522 bytes MDK-ARM/mfps/mylib.d | 33 + MDK-ARM/mfps/mylib.o | Bin 0 -> 708636 bytes MDK-ARM/mfps/oled.crf | Bin 0 -> 648328 bytes MDK-ARM/mfps/oled.d | 38 + MDK-ARM/mfps/oled.o | Bin 0 -> 739464 bytes MDK-ARM/mfps/serial_port.crf | Bin 0 -> 636522 bytes MDK-ARM/mfps/serial_port.d | 36 + MDK-ARM/mfps/serial_port.o | Bin 0 -> 704676 bytes MDK-ARM/mfps/spi.crf | Bin 635988 -> 634566 bytes MDK-ARM/mfps/spi.o | Bin 705920 -> 703740 bytes MDK-ARM/mfps/startup_stm32f103xe.o | Bin 6792 -> 6792 bytes MDK-ARM/mfps/stm32f1xx_hal.crf | Bin 633871 -> 633871 bytes MDK-ARM/mfps/stm32f1xx_hal.o | Bin 732048 -> 731996 bytes MDK-ARM/mfps/stm32f1xx_hal_cortex.crf | Bin 633333 -> 633333 bytes MDK-ARM/mfps/stm32f1xx_hal_cortex.o | Bin 721988 -> 721932 bytes MDK-ARM/mfps/stm32f1xx_hal_dma.crf | Bin 644935 -> 644935 bytes MDK-ARM/mfps/stm32f1xx_hal_dma.o | Bin 720784 -> 720744 bytes MDK-ARM/mfps/stm32f1xx_hal_exti.crf | Bin 635491 -> 635491 bytes MDK-ARM/mfps/stm32f1xx_hal_exti.o | Bin 711352 -> 711320 bytes MDK-ARM/mfps/stm32f1xx_hal_flash.crf | Bin 637282 -> 637282 bytes MDK-ARM/mfps/stm32f1xx_hal_flash.o | Bin 719284 -> 719240 bytes MDK-ARM/mfps/stm32f1xx_hal_flash_ex.crf | Bin 638506 -> 638506 bytes MDK-ARM/mfps/stm32f1xx_hal_flash_ex.o | Bin 718672 -> 718632 bytes MDK-ARM/mfps/stm32f1xx_hal_gpio.crf | Bin 636396 -> 636396 bytes MDK-ARM/mfps/stm32f1xx_hal_gpio.o | Bin 710932 -> 710908 bytes MDK-ARM/mfps/stm32f1xx_hal_gpio_ex.crf | Bin 632527 -> 632527 bytes MDK-ARM/mfps/stm32f1xx_hal_gpio_ex.o | Bin 700768 -> 700740 bytes MDK-ARM/mfps/stm32f1xx_hal_i2c.crf | Bin 699364 -> 699364 bytes MDK-ARM/mfps/stm32f1xx_hal_i2c.o | Bin 848808 -> 848676 bytes MDK-ARM/mfps/stm32f1xx_hal_msp.crf | Bin 634282 -> 633852 bytes MDK-ARM/mfps/stm32f1xx_hal_msp.o | Bin 699608 -> 699276 bytes MDK-ARM/mfps/stm32f1xx_hal_pwr.crf | Bin 635331 -> 635331 bytes MDK-ARM/mfps/stm32f1xx_hal_pwr.o | Bin 722172 -> 722136 bytes MDK-ARM/mfps/stm32f1xx_hal_rcc.crf | Bin 644668 -> 644668 bytes MDK-ARM/mfps/stm32f1xx_hal_rcc.o | Bin 721624 -> 721584 bytes MDK-ARM/mfps/stm32f1xx_hal_rcc_ex.crf | Bin 635243 -> 635243 bytes MDK-ARM/mfps/stm32f1xx_hal_rcc_ex.o | Bin 702972 -> 702944 bytes MDK-ARM/mfps/stm32f1xx_hal_spi.crf | Bin 658789 -> 658789 bytes MDK-ARM/mfps/stm32f1xx_hal_spi.o | Bin 787592 -> 787512 bytes MDK-ARM/mfps/stm32f1xx_hal_tim.crf | Bin 699176 -> 699176 bytes MDK-ARM/mfps/stm32f1xx_hal_tim.o | Bin 899428 -> 899308 bytes MDK-ARM/mfps/stm32f1xx_hal_tim_ex.crf | Bin 659702 -> 659702 bytes MDK-ARM/mfps/stm32f1xx_hal_tim_ex.o | Bin 772632 -> 772564 bytes MDK-ARM/mfps/stm32f1xx_hal_uart.crf | Bin 660362 -> 660362 bytes MDK-ARM/mfps/stm32f1xx_hal_uart.o | Bin 798136 -> 798032 bytes MDK-ARM/mfps/stm32f1xx_hal_usart.crf | Bin 0 -> 656962 bytes MDK-ARM/mfps/stm32f1xx_hal_usart.d | 32 + MDK-ARM/mfps/stm32f1xx_hal_usart.o | Bin 0 -> 774480 bytes MDK-ARM/mfps/stm32f1xx_it.crf | Bin 635002 -> 635293 bytes MDK-ARM/mfps/stm32f1xx_it.o | Bin 721084 -> 723404 bytes MDK-ARM/mfps/system_stm32f1xx.crf | Bin 632725 -> 632725 bytes MDK-ARM/mfps/system_stm32f1xx.o | Bin 699696 -> 699672 bytes MDK-ARM/mfps/tim.crf | Bin 634630 -> 634223 bytes MDK-ARM/mfps/tim.o | Bin 703748 -> 703716 bytes MDK-ARM/mfps/tmc5160.crf | Bin 0 -> 635123 bytes MDK-ARM/mfps/tmc5160.d | 36 + MDK-ARM/mfps/tmc5160.o | Bin 0 -> 709372 bytes MDK-ARM/mfps/usart.crf | Bin 637972 -> 636988 bytes MDK-ARM/mfps/usart.o | Bin 709740 -> 707656 bytes Src/gpio.c | 20 +- Src/i2c.c | 4 +- Src/main.c | 80 +- Src/spi.c | 91 +- Src/stm32f1xx_hal_msp.c | 2 +- Src/stm32f1xx_it.c | 105 +- Src/tim.c | 22 +- Src/usart.c | 104 +- mfps.ioc | 145 +- 125 files changed, 8712 insertions(+), 3049 deletions(-) create mode 100644 App/Inc/ads1220.h create mode 100644 App/Inc/delay.h create mode 100644 App/Inc/m1820.h create mode 100644 App/Inc/myLib.h create mode 100644 App/Inc/oled.h create mode 100644 App/Inc/serial_port.h create mode 100644 App/Inc/tmc5160.h create mode 100644 App/Src/ads1220.c create mode 100644 App/Src/delay.c create mode 100644 App/Src/m1820.c create mode 100644 App/Src/myLib.c create mode 100644 App/Src/oled.c create mode 100644 App/Src/serial_port.c create mode 100644 App/Src/tmc5160.c create mode 100644 Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_spi.h create mode 100644 Inc/app.h create mode 100644 MDK-ARM/mfps/ads1220.crf create mode 100644 MDK-ARM/mfps/ads1220.d create mode 100644 MDK-ARM/mfps/ads1220.o create mode 100644 MDK-ARM/mfps/delay.crf create mode 100644 MDK-ARM/mfps/delay.d create mode 100644 MDK-ARM/mfps/delay.o create mode 100644 MDK-ARM/mfps/m1820.crf create mode 100644 MDK-ARM/mfps/m1820.d create mode 100644 MDK-ARM/mfps/m1820.o create mode 100644 MDK-ARM/mfps/mylib.crf create mode 100644 MDK-ARM/mfps/mylib.d create mode 100644 MDK-ARM/mfps/mylib.o create mode 100644 MDK-ARM/mfps/oled.crf create mode 100644 MDK-ARM/mfps/oled.d create mode 100644 MDK-ARM/mfps/oled.o create mode 100644 MDK-ARM/mfps/serial_port.crf create mode 100644 MDK-ARM/mfps/serial_port.d create mode 100644 MDK-ARM/mfps/serial_port.o create mode 100644 MDK-ARM/mfps/stm32f1xx_hal_usart.crf create mode 100644 MDK-ARM/mfps/stm32f1xx_hal_usart.d create mode 100644 MDK-ARM/mfps/stm32f1xx_hal_usart.o create mode 100644 MDK-ARM/mfps/tmc5160.crf create mode 100644 MDK-ARM/mfps/tmc5160.d create mode 100644 MDK-ARM/mfps/tmc5160.o diff --git a/.mxproject b/.mxproject index 37c7c2b..e5d7e90 100644 --- a/.mxproject +++ b/.mxproject @@ -1,5 +1,5 @@ [PreviousLibFiles] -LibFiles=Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_i2c.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_i2c.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_spi.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_tim.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_tim_ex.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;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_i2c.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_spi.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_uart.c;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_i2c.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_i2c.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_spi.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_tim.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_tim_ex.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;Drivers\CMSIS\Device\ST\STM32F1xx\Include\stm32f103xe.h;Drivers\CMSIS\Device\ST\STM32F1xx\Include\stm32f1xx.h;Drivers\CMSIS\Device\ST\STM32F1xx\Include\system_stm32f1xx.h;Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; +LibFiles=Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_i2c.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_i2c.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_spi.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_spi.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_tim.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_tim_ex.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;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_i2c.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_spi.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_uart.c;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_i2c.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_i2c.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_spi.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_spi.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_tim.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_tim_ex.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;Drivers\CMSIS\Device\ST\STM32F1xx\Include\stm32f103xe.h;Drivers\CMSIS\Device\ST\STM32F1xx\Include\stm32f1xx.h;Drivers\CMSIS\Device\ST\STM32F1xx\Include\system_stm32f1xx.h;Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; [] SourceFiles=;; diff --git a/App/Inc/ads1220.h b/App/Inc/ads1220.h new file mode 100644 index 0000000..5e6d30c --- /dev/null +++ b/App/Inc/ads1220.h @@ -0,0 +1,193 @@ +#ifndef _ADS1220_H_ +#define _ADS1220_H_ + +#include "stm32f1xx_hal.h" + +extern unsigned char PolarFlag; + +#define RESET 0X03 +#define START 0X08 +#define POWERDOWN 0X02 +#define RDATA 0X10 +#define RREG 0X20 +#define WREG 0X40 + +/*-----------输入多路复用器配置 ------------------------- +**这些位配置输入多路复用器。 +**对于 AINN = AVSS 的设置,PGA 必须禁用 (PGA_BYPASS = 1), +**并且仅可使用 增益 1、2 和 4。 +-------------------------------------------------------*/ +#define MUX_0 0X00//0000:AINP = AIN0,AINN = AIN1(默认设置) +#define MUX_1 0X10//0001:AINP = AIN0,AINN = AIN2 +#define MUX_2 0X20//0010:AINP = AIN0,AINN = AIN3 +#define MUX_3 0X30//0011:AINP = AIN1,AINN = AIN2 +#define MUX_4 0X40//0100:AINP = AIN1,AINN = AIN3 +#define MUX_5 0X50//0101:AINP = AIN2,AINN = AIN3 +#define MUX_6 0X60//0110:AINP = AIN1,AINN = AIN0 +#define MUX_7 0X70//0111:AINP = AIN3,AINN = AIN2 +#define MUX_8 0X80//1000:AINP = AIN0,AINN = AVSS +#define MUX_9 0X90//1001:AINP = AIN1,AINN = AVSS +#define MUX_10 0XA0//1010:AINP = AIN2,AINN = AVSS +#define MUX_11 0XB0//1011:AINP = AIN3,AINN = AVSS +#define MUX_12 0XC0//1100:(V(REFPx) – V(REFNx)) / 4 监视(旁路 PGA) +#define MUX_13 0XD0//1101:(AVDD – AVSS) / 4 监视(旁路 PGA) +#define MUX_14 0XE0//1110:AINP 和 AINN 短接至 (AVDD + AVSS) / 2 +//1111:保留 + +/*------------增益配置---------------------------------- +**这些位用于配置器件增益。 在不使用 PGA 的情况下, +**可使用增益 1、2 和 4。在这种情况下,通过开关电容结 构获得增益。 +------------------------------------------------------*/ +#define PGA_0 0X00//000:增益 = 1(默认设置)//FS=6.144V +#define PGA_1 0X02//001:增益 = 2//FS=4.096V +#define PGA_4 0X04//010:增益 = 4//FS=2.048V +#define PGA_8 0X06//011:增益 = 8//FS=1.024V +#define PGA_16 0X08//100:增益 = 16//FS=0.512V +#define PGA_32 0X0A//101:增益 = 32//FS=0.256V +#define PGA_64 0X0C//110:增益 = 64//FS=0.256V +#define PGA_12 0X0E//111:增益 = 128//FS=0.256V + +/*-----------------禁用和旁路内部低噪声 PGA---------------------- +**禁用 PGA 会降低整体功耗,并可将共模电压范围 (VCM) 扩展为 AVSS – 0.1V 至AVDD + 0.1V。 +**只能针对增益 1、2 和 4 禁用 PGA。 +无论 PGA_BYPASS 设置如何,都始终针对增益设置 8 至 128 启用 PGA。 +**0:PGA 已启用(默认设置) +**1:PGA 已禁用和旁路 +---------------------------------------------------------------------*/ +#define PGA_BYPASS_Enable 0x00//PGA 已启用(默认设置) +#define PGA_BYPASS_Disable 0x01//已禁用和旁路 + +/*----------------------数据速率---------------------------------- +**这些位控制数据速率设置,取决于所选工作模式。 +**表 18 列出了正常模式、占空比 模式和 Turbo 模式对应的位设置。 +-----------------------------------------------------------------*/ +#define DR_20SPS 0X00 +#define DR_45SPS 0X20 +#define DR_90SPS 0X40 +#define DR_175SPS 0X60 +#define DR_330SPS 0X80 +#define DR_600SPS 0XA0 +#define DR_1000SPS 0XC0 + +/*-----------------工作模式 --------------------------------------- +**这些位控制器件所处的工作模式。 +00:正常模式(256kHz 调制器时钟,默认设置) +01:占空比模式(内部占空比 1:4) +10:Turbo 模式(512kHz 调制器时钟) +11:保留 +------------------------------------------------------------------*/ +#define MODE_0 0x00 //正常模式(256kHz 调制器时钟,默认设置) +#define MODE_1 0x08 //占空比模式(内部占空比 1:4) +#define MODE_2 0x10 //Turbo 模式(512kHz 调制器时钟) + +/*------------------转换模式---------------------------------------- +此位用于为器件设置转换模式。 +0:单次模式(默认设置) +1:连续转换模式 +-------------------------------------------------------------------*/ +#define ConverMode_0 0x00//单次模式(默认设置) +#define ConverMode_1 0x04//连续转换模式 + +/*--------------------温度传感器模式------------------------------ +此位用于启用内部温度传感器以及将器件置于温度传感器模式下。 +启用温度传感器模式后,配置寄存器 0 的设置不会产生任何影响, +器件会使用内部 基准进行测量。 +0:禁用温度传感器(默认设置) +1:启用温度传感器 +--------------------------------------------------------------------*/ +#define TS_Disable 0x00//禁用温度传感器(默认设置) +#define TS_Enable 0x02//启用温度传感器 + +/*---------------------烧毁电流源----------------------------------- +此位用于控制 10μA 烧毁电流源。 +烧毁电流源可用于检测传感器故障(例如,传感器断路和短路)。 +0:电流源关断(默认设置) +1:电流源接通 +-------------------------------------------------------------------*/ +#define BCS_Disable 0x00//电流源关断(默认设置) +#define BCS_Enable 0x01//电流源接通 + +/*--------------------基准电压选择--------------------------------- +这些位用于选择转换所使用的基准电压源。 +00:选择 2.048V 内部基准电压(默认设置) +01:使用专用 REFP0 和 REFN0 输入选择的外部基准电压 +10:使用 AIN0/REFP1 和 AIN3/REFN1 输入选择的外部基准电压 +11:用作基准的模拟电源 (AVDD – AVSS) +--------------------------------------------------------------------*/ +#define VREF_0 0X00//选择 2.048V 内部基准电压(默认设置) +#define VREF_1 0X40//使用专用 REFP0 和 REFN0 输入选择的外部基准电压 +#define VREF_2 0X80//使用 AIN0/REFP1 和 AIN3/REFN1 输入选择的外部基准电压 +#define VREF_3 0XC0//用作基准的模拟电源 (AVDD – AVSS) + +/*----------------------FIR 滤波器配置------------------------------ +这些位用于为内部 FIR 滤波器配置滤波器系数。 +在正常模式下,这些位仅与 20SPS 设置结合使用; +在占空比模式下,这些位仅与 +5SPS 设置结合使用。对于所有其他数据速率,这些位均设置为 00。 +00:无 50Hz 或 60Hz 抑制(默认设置) +01:同时抑制 50Hz 和 60Hz +10:只抑制 50Hz +11:只抑制 60Hz +------------------------------------------------------------------*/ +#define FIR_Mode0 0x00//无 50Hz 或 60Hz 抑制(默认设置) +#define FIR_Mode1 0x10//同时抑制 50Hz 和 60Hz +#define FIR_Mode2 0x20//只抑制 50Hz +#define FIR_Mode3 0x30//只抑制 60Hz + +/*----------------------低侧电源开关配置 -------------------------- +此位用于配置 AIN3/REFN1 和 AVSS 之间连接的低侧开关的行为。 +0:开关始终处于断开状态(默认设置) +1:开关会在发送 START/SYNC 命令时自动闭合,并在发出 POWERDOWN 命令 时自动断开。 +------------------------------------------------------------------*/ +#define PSW_ON 0X00//开关始终处于断开状态(默认设置) +#define PSW_OFF 0X08//开关会在发送 START/SYNC 命令时自动闭合,并在发出 POWERDOWN 命令 时自动断开。 + +/*---------------------IDAC 电流设置----------------------------- +这些位用于为 IDAC1 和 IDAC2 激励电流源设置电流。 +----------------------------------------------------------------*/ +#define IDAC_0 0X00 //000:关断(默认设置) +#define IDAC_1 0X00 //001:10μA +#define IDAC_2 0X02 //010:50μA +#define IDAC_3 0X03 //011:100μA +#define IDAC_4 0X04 //100:250μA +#define IDAC_5 0X05 //101:500μA +#define IDAC_6 0X06 //110:1000μA +#define IDAC_7 0X07 //111:1500μA + +/*------------------------IDAC1 路由配置------------------------- +这些位用于选择 IDAC1 将路由到的通道。 +111:保留 +----------------------------------------------------------------*/ +#define IDAC1_0 0X00 //000:IDAC1 已禁用(默认设置) +#define IDAC1_1 0X20 //001:IDAC1 已连接至 AIN0/REFP1 +#define IDAC1_2 0X40 //010:IDAC1 已连接至 AIN1 +#define IDAC1_3 0X60 //011:IDAC1 已连接至 AIN2 +#define IDAC1_4 0X80 //100:IDAC1 已连接至 AIN3/REFN1 +#define IDAC1_5 0XA0 //101:IDAC1 已连接至 REFP0 +#define IDAC1_6 0XC0 //110:IDAC1 已连接至 REFN0 + +/*------------------------IDAC2 路由配置------------------------- +这些位用于选择 IDAC2 将路由到的通道。 +111:保留 +----------------------------------------------------------------*/ +#define IDAC2_0 0X00 //000:IDAC2 已禁用(默认设置) +#define IDAC2_1 0X04 //001:IDAC2 已连接至 AIN0/REFP1 +#define IDAC2_2 0X08 //010:IDAC2 已连接至 AIN1 +#define IDAC2_3 0X0c //011:IDAC2 已连接至 AIN2 +#define IDAC2_4 0X10 //100:IDAC2 已连接至 AIN3/REFN1 +#define IDAC2_5 0X14 //101:IDAC2 已连接至 REFP0 +#define IDAC2_6 0X18 //110:IDAC2 已连接至 REFN0 + +/*-----------------------DRDY 模式 ----------------------------- +该位用于控制新数据就绪时 DOUT/DRDY 引脚的行为。 +---------------------------------------------------------------*/ +#define DRDY_Mode0 0x00 //0:仅专用 DRDY 引脚用于指示数据何时就绪(默认设置) +#define DRDY_Mode1 0x02 //1:同时通过 DOUT/DRDY 和 DRDY 指示数据就绪。 + +void ADS1220_Init(void); +unsigned long GetAD(unsigned char channel); +void ADS1220_GPIOInit(void); + +#endif + + diff --git a/App/Inc/delay.h b/App/Inc/delay.h new file mode 100644 index 0000000..2dc46be --- /dev/null +++ b/App/Inc/delay.h @@ -0,0 +1,7 @@ +#ifndef _DELAY_H +#define _DELAY_H + +void delay_10ms(int tm); +void delay_us(int tm); +void delay_ns(int tm); +#endif diff --git a/App/Inc/key.h b/App/Inc/key.h index a90a726..4fba2bd 100644 --- a/App/Inc/key.h +++ b/App/Inc/key.h @@ -1,11 +1,11 @@ #ifndef _KEY_H #define _KEY_H -void Key_Init(void); +//void Key_Init(void); void Key_Scan(void); -extern int Key_State[3]; // 浣跨敤涓涓笁缁存暟缁勬弿杩癒1-K3鐨勭姸鎬侊紝1涓烘寜涓嬶紝0涓烘姮璧凤紝渚嬶細[1 0 0]->[K1鎸変笅 K2鎶捣 K3鎶捣] -extern int Key_Mode[3]; // 妯″紡0锛氭寜浣忔墽琛岋紝鎶捣鍋滄锛 +//extern int Key_State[3]; // 浣跨敤涓涓笁缁存暟缁勬弿杩癒1-K3鐨勭姸鎬侊紝1涓烘寜涓嬶紝0涓烘姮璧凤紝渚嬶細[1 0 0]->[K1鎸変笅 K2鎶捣 K3鎶捣] +//extern int Key_Mode[3]; // 妯″紡0锛氭寜浣忔墽琛岋紝鎶捣鍋滄锛 // 妯″紡1锛氬彧瑕佹寜涓嬪氨鎵ц锛屼笉鑰冭檻鎶捣锛 // 妯″紡2锛氬畬鎴愶紙鎸変笅+鎶捣锛夌殑鍔ㄤ綔鎵嶆墽琛屻 // K1, K2, K3涓夎呮ā寮忕嫭绔 diff --git a/App/Inc/m1820.h b/App/Inc/m1820.h new file mode 100644 index 0000000..6536720 --- /dev/null +++ b/App/Inc/m1820.h @@ -0,0 +1,23 @@ + +#ifndef _DELAY_H +#define _DELAY_H + +#include "main.h" + +void M1820_GPIO_Init(void); + +void M1820_Start(void); + +void M1820_Wr_Onebyte(unsigned char dat); //先写低位 + +unsigned char M1820_Rd_Onebytr(void); //先读低位 + +void M1820_Act(void); + + +#endif + + + + + diff --git a/App/Inc/myLib.h b/App/Inc/myLib.h new file mode 100644 index 0000000..6fc8a2b --- /dev/null +++ b/App/Inc/myLib.h @@ -0,0 +1,47 @@ +#ifndef _MYLIB_H +#define _MYLIB_H + +#include "main.h" + +typedef struct ASCIIFont { + uint8_t h; + uint8_t w; + uint8_t *chars; +} ASCIIFont; + +extern const ASCIIFont afont8x6; +extern const ASCIIFont afont12x6; +extern const ASCIIFont afont16x8; +extern const ASCIIFont afont24x12; + +/** + * @brief 字体结构体 + * @note 字库前4字节存储utf8编码 剩余字节存储字模数据 + * @note 字库数据可以使用波特律动LED取模助手生成(https://led.baud-dance.com) + */ +typedef struct Font { + uint8_t h; // 字高度 + uint8_t w; // 字宽度 + const uint8_t *chars; // 字库 字库前4字节存储utf8编码 剩余字节存储字模数据 + uint8_t len; // 字库长度 超过256则请改为uint16_t + const ASCIIFont *ascii; // 缺省ASCII字体 当字库中没有对应字符且需要显示ASCII字符时使用 +} Font; + +extern const Font font16x16;//声明你的想要显示数据的结构体 + +/** + * @brief 图片结构体 + * @note 图片数据可以使用波特律动LED取模助手生成(https://led.baud-dance.com) + */ +typedef struct Image { + uint8_t w; // 图片宽度 + uint8_t h; // 图片高度 + const uint8_t *data; // 图片数据 +} Image; + +extern const Image bilibiliImg; + + + +#endif + diff --git a/App/Inc/oled.h b/App/Inc/oled.h new file mode 100644 index 0000000..cb4275d --- /dev/null +++ b/App/Inc/oled.h @@ -0,0 +1,41 @@ +#ifndef _OLED_H +#define _OLED_H + +#include "main.h" +#include "MyLib.h" + +void OLED_Act(void); + +//将当前显存显示到屏幕上 +void OLED_ShowPageFrame(uint8_t page); + +typedef enum { + OLED_COLOR_NORMAL = 0, // 黑底白字 + OLED_COLOR_REVERSED // 白底黑字 +} OLED_ColorMode; + +void OLED_Init(void); +void OLED_DisPlay_On(void); +void OLED_DisPlay_Off(void); + +void OLED_NewFrame(void); +void OLED_ShowFrame(void); +void OLED_SetPixel(uint8_t x, uint8_t y, OLED_ColorMode color); + +void OLED_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, OLED_ColorMode color); +void OLED_DrawRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, OLED_ColorMode color); +void OLED_DrawFilledRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, OLED_ColorMode color); +void OLED_DrawTriangle(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t x3, uint8_t y3, OLED_ColorMode color); +void OLED_DrawFilledTriangle(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t x3, uint8_t y3, OLED_ColorMode color); +void OLED_DrawCircle(uint8_t x, uint8_t y, uint8_t r, OLED_ColorMode color); +void OLED_DrawFilledCircle(uint8_t x, uint8_t y, uint8_t r, OLED_ColorMode color); +void OLED_DrawEllipse(uint8_t x, uint8_t y, uint8_t a, uint8_t b, OLED_ColorMode color); +void OLED_DrawImage(uint8_t x, uint8_t y, const Image *img, OLED_ColorMode color); + +void OLED_PrintASCIIChar(uint8_t x, uint8_t y, char ch, const ASCIIFont *font, OLED_ColorMode color); +void OLED_PrintASCIIString(uint8_t x, uint8_t y, char *str, const ASCIIFont *font, OLED_ColorMode color); +void OLED_PrintString(uint8_t x, uint8_t y, char *str, const Font *font, OLED_ColorMode color); + +#endif + + diff --git a/App/Inc/serial_port.h b/App/Inc/serial_port.h new file mode 100644 index 0000000..63a2065 --- /dev/null +++ b/App/Inc/serial_port.h @@ -0,0 +1,16 @@ +/* + * @Author: 鍚翠繆娼 24472040@qq.com + * @Date: 2024-03-28 09:00:25 + * @LastEditors: 鍚翠繆娼 24472040@qq.com + * @LastEditTime: 2024-03-28 09:01:20 + * @FilePath: \mfps\App\Inc\serial_port.h + * @Description: 杩欐槸榛樿璁剧疆,璇疯缃甡customMade`, 鎵撳紑koroFileHeader鏌ョ湅閰嶇疆 杩涜璁剧疆: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +#ifndef _SERIAL_PORT_H +#define _SERIAL_PORT_H + +void Tx_RX_UART1(void); +void uart_test(void); + +#endif + diff --git a/App/Inc/tmc5160.h b/App/Inc/tmc5160.h new file mode 100644 index 0000000..3835a65 --- /dev/null +++ b/App/Inc/tmc5160.h @@ -0,0 +1,13 @@ +#ifndef _TMC5160_H +#define _TMC5160_H + +#include "main.h" + +void TMC5160_SPIWriteInt(uint8_t addr, uint32_t data); +void TMC5160_SPIReadInt(uint8_t addr); +void tmc5160_init(void); +void tmc5160_act(void); + +#endif + + diff --git a/App/Src/ads1220.c b/App/Src/ads1220.c new file mode 100644 index 0000000..8ebb419 --- /dev/null +++ b/App/Src/ads1220.c @@ -0,0 +1,298 @@ +#include "ads1220.h" +#include "delay.h" +#include "main.h" +unsigned char PolarFlag; +unsigned char Init_Config[4],channel0[8],channel1[8],channel2[8],channel3[8]; +unsigned char i; + +/*************************************************************************** +接线顺序 +*************************************************************************/ +//PB0 DRDY +//PA7 MISO + +#define DIN_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET); //PA7 MOSI +#define DIN_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET); //PA7 MOSI + +#define SCK_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); //PA5 SCK +#define SCK_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET); //PA5 SCK + +#define CS_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET); //PA4 CS1 +#define CS_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET); //PA4 CS1 + +#define ADS1220_MISO HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) + +#define ADS1220_DRDY HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4) + +#define DALAY_CNT 1000 + + +void ADS1220_GPIOInit(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.Pin = GPIO_PIN_5|GPIO_PIN_7; //PA5 PA7 端口配置 MOSI&SCLK + GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出 + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //IO口速度为50MHz + HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化 + HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5|GPIO_PIN_6,GPIO_PIN_SET); + + GPIO_InitStructure.Pin = GPIO_PIN_6; //端口配置 PA6 MISO + GPIO_InitStructure.Mode = GPIO_MODE_INPUT; //上拉输入 + GPIO_InitStructure.Pull = GPIO_PULLUP ; + HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); // + + GPIO_InitStructure.Pin = GPIO_PIN_4; //端口配置 PC4 DRDY + GPIO_InitStructure.Mode = GPIO_MODE_INPUT; //上拉输入 + GPIO_InitStructure.Pull = GPIO_PULLUP; //IO口速度为50MHz + HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = GPIO_PIN_4; //端口配置 PA4 CS + GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出 + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //IO口速度为50MHz + HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); +} + +/*************************************************************************** +函数名称:WriteOneByte(unsigned char 命令) + +用途:写入一个字节到ADS1220 +*************************************************************************/ +void WriteOneByte(unsigned char command) +{ + unsigned char i; + for(i = 0; i < 8;i++) + { + if(command&0x80) + { + DIN_H;//ADS1220_DIN = 1 + } + else + { + DIN_L;//ADS1220_DIN = 0;/ + } + command <<= 1; + delay_us(10); + SCK_H;//ADS1220_SCK = 1; + delay_us(10); + SCK_L;//ADS1220_SCK = 0; + delay_us(10); + } +} + + +/*************************************************************************** +*函数名称:ReadOneByte() +*用途:从ADS1220读取一个字节 +*************************************************************************/ +unsigned char ReadOneByte(void) +{ + unsigned char result,i; + + SCK_L;//SCLK_L; + for(i = 0;i<8; i++) + { + SCK_H; + delay_ns(1); + result <<= 0x01; + if(ADS1220_MISO) + result |= 0X01; + SCK_L; + delay_ns(1); + } + + return result; +} + + +/*************************************************************************** +*函数名称:ReadData() +*用途:从ADS1220读取数据 +*************************************************************************/ +unsigned long ReadData(void) +{ + unsigned long adval; + unsigned char a,b,c; + + CS_L; + delay_ns(10); + WriteOneByte(RDATA); + a = ReadOneByte(); + b = ReadOneByte(); + c = ReadOneByte(); + adval = a; + adval = (adval<<8) | b; + adval = (adval<<8) | c; + delay_ns(10); + CS_H; + + return adval; +} + +/*************************************************************************** +*函数名称:ADReset() + +*用途:复位ADS1220 + + +*************************************************************************/ +void ADReset(void) +{ + CS_L; + delay_ns(1); + WriteOneByte(RESET); + CS_H; +} + +/*************************************************************************** +函数名称:ADS1220_Init() + +*用途:ADS120初始化 +*************************************************************************/ +void ADS1220_Init(void) +{ + CS_H; + SCK_H; + DIN_H; + ADReset(); +} + +/*************************************************************************** +*函数名称:关闭电源() + +*************************************************************************/ +void ADPowerDown(void) +{ + CS_L; + WriteOneByte(POWERDOWN); + CS_H; +} + +/*************************************************************************** +*函数名称:ADStartConversion() + +*用途:开始转换 + +*参数: +*************************************************************************/ +void ADStartConversion(void) +{ + CS_L; + WriteOneByte(START); + CS_H; +} + +/*************************************************************************** +*函数名称:ReadRegister() + +*用途:从寄存器中读取数据 + +*参数:数据 +*************************************************************************/ +void ReadRegister(void) +{ + unsigned char i; + unsigned long Data; + CS_L; + WriteOneByte(RREG|0x03); + for (i=0; i< 4; i++) + { + Data += ReadOneByte(); + } + CS_H; +} + + +/*************************************************************************** +*函数名:WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData) +*用途:向寄存器写入数据 +*步骤:写地址2。写入数据 +* Params NumRegs-----寄存器的数字 +*************************************************************************/ +void WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData) +{ + unsigned char i; + CS_L; + WriteOneByte(WREG | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03))); + for (i=0; i< NumRegs; i++) + { + WriteOneByte(*pData); + pData++; + } + CS_H; +} + + +/*************************************************************************** +函数名称:CofigAD(unsigned char channel) +*用途:设置采样通道 +*参数: +*************************************************************************/ +void CofigAD(unsigned char channel) +{ + switch(channel) + { + case 0: Init_Config[0] = MUX_8 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN0,AINN = AVSS ,PGA = 1,禁用PGA + break; + case 1: Init_Config[0] = MUX_9 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN1,AINN = AVSS ,PGA = 1,禁用PGA + break; + case 2: Init_Config[0] = MUX_10 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN2,AINN = AVSS,PGA = 1,禁用PGA + break; + case 3: Init_Config[0] = MUX_11 | PGA_0 | PGA_BYPASS_Disable;//单端模式,选择通道AINP = AIN3,AINN = AVSS,PGA = 1,禁用PGA + break; + case 4: Init_Config[0] = MUX_0 | PGA_0 | PGA_BYPASS_Disable;//差分模式,选择通道AINP = AIN0,AINN = AIN1(默认设置),PGA = 1,禁用PGA + break; + } + + Init_Config[1] = 0XC0; + Init_Config[2] = 0X00; + Init_Config[3] = 0X00; + WriteRegister(0x00,0x04,Init_Config); + ReadRegister(); +} + + + +/*************************************************************************** +*函数名:GetAD(unsigned char channel) + +*目的:得到结果 +*************************************************************************/ +unsigned long GetAD(unsigned char channel) +{ + unsigned long Result; + unsigned long delay_cnt = 0; + CofigAD(channel); + ADStartConversion(); + while(ADS1220_DRDY) + { + delay_cnt++; + if(delay_cnt > DALAY_CNT) + { + break; + } + } + Result = ReadData(); + ADPowerDown(); + + if(Result & 0x800000) + { + PolarFlag = 1; + Result = ~Result; + Result = Result&0xffffff; + Result = Result+1; + } + else PolarFlag =0; + + return Result; +} + + + + + + + + + + diff --git a/App/Src/app.c b/App/Src/app.c index 6a34b21..8810896 100644 --- a/App/Src/app.c +++ b/App/Src/app.c @@ -1,22 +1,3 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : app.c - * @brief : app program body - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ #include "main.h" #include "i2c.h" #include "spi.h" @@ -24,15 +5,53 @@ #include "usart.h" #include "gpio.h" #include "key.h" +#include "app.h" +#include "serial_port.h" +#include "m1820.h" +#include "oled.h" +#include "ads1220.h" +#include "tmc5160.h" + +unsigned long tempA; +float vol; void app_act (void) { - //1、按键操作 - Key_Scan();//按键扫描 - key_act(); //按键执行功能 + //1鎸夐敭鎿嶄綔 + Key_Scan();//鎸夐敭鎵弿 + key_act(); //鎸夐敭鎵ц鍔熻兘 - //2、 + //2瀹氭椂鍣 + //if(it_1000ms_flag == 1) + //{ + // it_1000ms_flag = 0; + //HAL_GPIO_TogglePin(LED_NOR_GPIO_Port,LED_NOR_Pin); + + //M1820_Act(); + + //} + + //3 涓插彛閫氫俊 + //Tx_RX_UART1(); + //uart_test(); + //4 OLED +// if(it_100ms_flag) +// { +// it_100ms_flag = 0; +// OLED_Act(); +// } + + //5 鐢甸樆灏 浣嶇Щ浼犳劅鍣 +// tempA = GetAD(4); +// tempA = (float)tempA*1000*2.499/(1048575) + 150;//20浣嶇簿搴 + + //6 鐢垫満 + if(it_1000ms_flag) + { + it_1000ms_flag = 0; + tmc5160_act(); + } } diff --git a/App/Src/delay.c b/App/Src/delay.c new file mode 100644 index 0000000..1f8e0a3 --- /dev/null +++ b/App/Src/delay.c @@ -0,0 +1,38 @@ +#include "delay.h" +#include "main.h" +#include "tim.h" +#include "app.h" + +void delay_10ms(int tm)//延时tm*10 ms +{ + it_10ms_flag = 0; + while( tm > 0 ) + { + if(it_10ms_flag == 1) + { + it_10ms_flag = 0; + tm--; + } + } +} + + +void delay_us(int tm) +{ + int i = 0,j = 0; + for(i = 0;i < tm;i++) + { + for(j = 0;j < 1000;j++); + } +} + + +void delay_ns(int tm) +{ + int i = 0,j = 0; + for(i = 0;i < tm;i++) + { + for(j = 0;j < 10;j++); + } +} + diff --git a/App/Src/key.c b/App/Src/key.c index 9ad423c..8a9b9f6 100644 --- a/App/Src/key.c +++ b/App/Src/key.c @@ -1,38 +1,16 @@ #include "key.h" #include "main.h" - -int Key_State[3]; // 浣跨敤涓涓笁缁存暟缁勬弿杩癒1-K3鐨勭姸鎬侊紝1涓烘寜涓嬶紝0涓烘姮璧凤紝渚嬶細[1 0 0]->[K1鎸変笅 K2鎶捣 K3鎶捣] -int Key_Mode[3]; // 妯″紡0锛氭寜浣忔墽琛岋紝鎶捣鍋滄锛 - // 妯″紡1锛氬彧瑕佹寜涓嬪氨鎵ц锛屼笉鑰冭檻鎶捣锛 - // 妯″紡2锛氬畬鎴愶紙鎸変笅+鎶捣锛夌殑鍔ㄤ綔鎵嶆墽琛屻 - // K1, K2, K3涓夎呮ā寮忕嫭绔 -int Key_Busy[3] = {0, 0, 0}; - -void Key_Init(void) // 鎸夐敭鐘舵&妯″紡鍒濆鍖 -{ - Key_State[0] = 0; - Key_State[1] = 0; - Key_State[2] = 1; - Key_Mode[0] = 0; - Key_Mode[1] = 2; - Key_Mode[2] = 2; -} +#include "tmc5160.h" +#include "oled.h" unsigned char key_i = 0; -unsigned int key_cnt[3];//璁℃暟 -unsigned char key_no[3];//鍝釜鎸夐敭 -unsigned char key_msg[3];//鎸夐敭鏍囪瘑 +unsigned int key_cnt[3];//寤舵椂鐢ㄨ鏁 +unsigned char key_msg[3];//鎸夐敭浜嬩欢 unsigned char key_val[3];//鎸夐敭鍊 -#define KEY_CNT 10000 +#define KEY_CNT 100 + -//娓呴櫎 -void key_clr(char no) -{ - key_cnt[no] = 0; - key_msg[no] = 0; - key_no[no] = 0; -} void Key_Scan(void) // 鎵弿K1-K3鐨勭姸鎬 { @@ -45,23 +23,21 @@ void Key_Scan(void) // 鎵弿K1-K3鐨勭姸鎬 if(key_i >= 3) key_i = 0; if (key_val[key_i] == 0 && key_msg[key_i] == 0)//鎸夐敭鎸変笅 { - key_cnt[key_i]++; + key_cnt[key_i]++; if(key_cnt[key_i] > KEY_CNT) { key_cnt[key_i] = 0; key_msg[key_i] = 1;//鎸夐敭鎸変笅 - key_no[key_i] = 1; //鍝釜鎸夐敭 } } - if (key_val[key_i] == 1 && key_msg[key_i] == 2)//鎸夐敭鎶捣 + if (key_val[key_i] == 1 && key_msg[key_i] == 1)//鎸夐敭鎶捣 { key_cnt[key_i]++; if(key_cnt[key_i] > KEY_CNT) { key_cnt[key_i] = 0; - key_msg[key_i] = 3;//鎸夐敭鎶捣2 - key_no[key_i] = 1; //鍝釜鎸夐敭 + key_msg[key_i] = 2;//瀹屾垚鎸変笅+鎶捣 } } @@ -72,269 +48,30 @@ void Key_Scan(void) // 鎵弿K1-K3鐨勭姸鎬 //鎸夐敭鍔熻兘 + void key_act(void) { - switch(key_no[key_i]) + if(key_msg[0] == 2)//K1瀹屾垚鎸変笅+鎶捣鍚庯紝缁跨伅浜捣,钃濈伅鐔勭伃 { - case 1 : - { - if(key_msg[key_i] == 1) - { - HAL_GPIO_WritePin(GPIOA, LED_NOR_Pin, GPIO_PIN_RESET);//LED 鎵ц涓娆 - key_clr(key_i);//娓呴櫎 - key_msg[key_i] = 2; - } - - if(key_msg[key_i] == 3) - { - HAL_GPIO_WritePin(GPIOA, LED_NOR_Pin, GPIO_PIN_SET);//LED 鎵ц涓娆 - key_clr(key_i);//娓呴櫎 - } - } - break; + HAL_GPIO_WritePin(LED_NOR_GPIO_Port,LED_NOR_Pin,GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED_ERR_GPIO_Port,LED_ERR_Pin,GPIO_PIN_SET); + //tmc5160_act(); + + key_msg[0] = 0; //娓呴櫎鎸夐敭浜嬩欢 } + if(key_msg[1] == 2)//K2瀹屾垚鎸変笅+鎶捣鍚庯紝缁跨伅鐔勭伃,钃濈伅浜捣 + { + HAL_GPIO_WritePin(LED_NOR_GPIO_Port,LED_NOR_Pin,GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_ERR_GPIO_Port,LED_ERR_Pin,GPIO_PIN_RESET); + + key_msg[1] = 0; + } } -// int i = 0; -// if (Key_State[2] == 0)//K3浣胯兘K1,K2 begin -// { -// /*********************************** K1 begin **************************************/ -// // mode 0 begin -// if (Key_Mode[0] == 0) -// { -// if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0) -// { -// Key_State[0] = 1; -// } -// } -// if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎶捣寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1) -// { -// Key_State[0] = 0; -// } -// } -// } -// // mode 0 end - -// // mode 1 begin -// if (Key_Mode[0] == 1) -// { -// if ((HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0) && (Key_Busy[0] == 0)) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0) -// { -// Key_State[0] = !Key_State[0]; -// Key_Busy[0] = 1; -// } -// } -// if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎶捣寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1) -// { -// Key_Busy[0] = 0; -// } -// } -// } -// // mode 1 end - -// // mode 2 begin -// if (Key_Mode[0] == 2) -// { -// if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0) -// { -// Key_Busy[0] = 1; // 瀹屾垚鎸変笅 -// } -// } -// if ((HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1) && (Key_Busy[0] == 1)) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1) -// { -// // 瀹屾垚鎶捣 -// Key_State[0] = !Key_State[0]; -// Key_Busy[0] = 0; -// } -// } -// } -// // mode 2 end -// /*********************************** K1 end **************************************/ - -// /*********************************** K2 begin **************************************/ -// // mode 0 begin -// if (Key_Mode[1] == 0) -// { -// if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 0) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 0) -// { -// Key_State[1] = 1; -// } -// } -// if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 1) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎶捣寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 1) -// { -// Key_State[1] = 0; -// } -// } -// } -// // mode 0 end - -// // mode 1 begin -// if (Key_Mode[1] == 1) -// { -// if ((HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 0) && (Key_Busy[1] == 0)) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 0) -// { -// Key_State[1] = !Key_State[1]; -// Key_Busy[1] = 1; -// } -// } -// if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 1) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎶捣寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 1) -// { -// Key_Busy[1] = 0; -// } -// } -// } -// // mode 1 end - -// // mode 2 begin -// if (Key_Mode[1] == 2) -// { -// if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 0) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 0) -// { -// Key_Busy[1] = 1; // 瀹屾垚鎸変笅 -// } -// } -// if ((HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 1) && (Key_Busy[1] == 1)) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 1) -// { -// // 瀹屾垚鎶捣 -// Key_Mode[0] = (Key_Mode[0] + 1) * ((Key_Mode[0] + 1) < 3); // 浣跨敤K2鍒囨崲K1妯″紡 -// Key_State[1] = !Key_State[1]; -// Key_Busy[1] = 0; -// } -// } -// } -// // mode 2 end -// /*********************************** K2 end **************************************/ -// }//K3浣胯兘K1,K2 begin - -// /*********************************** K3 begin **************************************/ -// // mode 0 begin -// if (Key_Mode[2] == 0) -// { -// if (HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 0) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 0) -// { -// Key_State[2] = 1; -// } -// } -// if (HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 1) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎶捣寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 1) -// { -// Key_State[2] = 0; -// } -// } -// } -// // mode 0 end - -// // mode 1 begin -// if (Key_Mode[2] == 1) -// { -// if ((HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 0) && (Key_Busy[2] == 0)) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 0) -// { -// Key_State[2] = !Key_State[2]; -// Key_Busy[2] = 1; -// } -// } -// if (HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 1) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎶捣寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 1) -// { -// Key_Busy[2] = 0; -// } -// } -// } -// // mode 1 end - -// // mode 2 begin -// if (Key_Mode[2] == 2) -// { -// if (HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 0) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 0) -// { -// Key_Busy[2] = 1; // 瀹屾垚鎸変笅 -// } -// } -// if ((HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 1) && (Key_Busy[2] == 1)) -// { -// for (i = 0; i < 10000; i++) -// ; // 鎸変笅寤舵椂闃叉姈 -// if (HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 1) -// { -// // 瀹屾垚鎶捣 -// Key_State[2] = !Key_State[2]; -// Key_Busy[2] = 0; -// } -// } -// -// } - // mode 2 end - /*********************************** K3 end **************************************/ -//} + diff --git a/App/Src/m1820.c b/App/Src/m1820.c new file mode 100644 index 0000000..5ea5985 --- /dev/null +++ b/App/Src/m1820.c @@ -0,0 +1,309 @@ + +#include "main.h" +#include "delay.h" + +#define IO_H HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_SET) +#define IO_L HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_RESET) +#define IO_R HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_11) + +void M1820_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + + GPIO_InitStruct.Pin = GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + +} + + +unsigned char M1820_Start() +{ +// IO_H; +// delay_us(7); +// IO_L; +// delay_us(80); +// IO_H; +// delay_us(7); +// while(0 == IO_R); +// IO_H; + + + unsigned char i = 0; + IO_L; //数据线拉0 + delay_us(642); //延时480-960us + //实际延时642us + IO_H; //拉高后延时等待80us,判断DS是否响应,响应数据线会被再次拉低 + + i=0; + while(IO_R) //判断DS是否响应,拉低数据线 + { + delay_us(10); + i++; + if(i>5) + { + return 0; //判断超时,温度传感器为不存在 + } + } + return 1; //温度传感器存在 + +} + +void M1820_Wr_Onebyte(unsigned char dat) //先写低位 +{ + unsigned char i = 0; + for(i=0;i < 8;i++) + { + IO_L; + delay_us(7); + if(dat & 0x01) + { + IO_H; + } + else{ + IO_L; + } + delay_us(10);//error1采样器件器件采集自己的就行,主机什么也不用干。 + IO_H; + dat >>= 1; + } +} + +unsigned char M1820_Rd_Onebytr(void) //先读低位 +{ + unsigned char i,j,dat; + for(i=0;i<8;i++) + { + IO_L; + delay_us(7); + IO_H; + j = IO_R; + delay_us(14); + dat = (dat>>1)|(j<<7); + delay_us(5); + IO_H; + } + return dat; +} + +unsigned char Ds18b20ReadByte() //读取数据 +{ + unsigned char j,bi,rdat; + + rdat = 0; + for(j=8;j>0;j--) + { + IO_L; //1.数据线拉低 2.延时15us 3.数据线拉高,释放总线,准备读数据 + //4.延时10us 5.读数据的状态,进行数据处理 6.延时45us + delay_us(15); + + IO_H; //数据线拉高 + + delay_us(15); + + bi = IO_R; //读取1bit数据,储存数据 + rdat = ( rdat >> 1 ) | (bi << 7 ); //bi = 1, 1000 0000 | 000000 = 1000 0000 + + delay_us(45); //延时>45us + } + return rdat; +} + + +void Ds18b20WriteByte(unsigned char dat) +{ + unsigned char j; + for(j=0;j<8;j++) + { + IO_L; //1.数据线拉低 2.延时15us 3.发送数据,低位到高位 4.延时60u 5.数据线拉高 + delay_us(20); //延时15us + //DsPort = dat & 0x01; //发送数据 + if(dat & 0x01) + { + IO_H; + } + else{ + IO_L; + } + delay_us(30); //延时68us + IO_H; //数据线拉高 + dat >>= 1; //右移一位,发送下一位 + } +} + + +void ChangeTemp() //温度转换 +{ + //M1820_Start(); //器件初始化 + //delay_us(1000); //延时 + Ds18b20WriteByte(0xCC); //CC为跳过ROM,直接可以温度转换 + Ds18b20WriteByte(0x44); //44为启动温度转换,一次需要750ms,连续检测可以不进行延时 +} + + +void ReadTempCom() //温度读取指令 +{ + //M1820_Start(); //器件初始化 + delay_us(1000); //延时 + Ds18b20WriteByte(0xCC); //CC为跳过ROM,直接可以温度转换 + Ds18b20WriteByte(0xBE); //BE为读取ROM的数据,两个字节 +} + +int temp = 0; +unsigned char tmh,tml; //存储温度高/低字节 + +int ReadTemp() //封装函数,读取温度 +{ + ChangeTemp(); //温度转换 + ReadTempCom(); //温度读取 + tml = Ds18b20ReadByte(); //ROM的低字节 + tmh = Ds18b20ReadByte(); //ROM的高字节 + temp = tmh; //存储高字节 + temp <<= 8; + temp |= tml; //存储低字节 + return temp; +} + + +int temp; +unsigned char tem_h,tem_l,bai,shi,ge,shifen,baifen; + +char *p1 = "1:"; +char *p2 = "2:"; +char *p3 = "3:"; +char rom_1[8]={0x28,0xFF,0x2D,0x86,0x67,0x18,0x01,0x97};//第三个18B20 +char rom_2[8]={0X28,0X00,0X4E,0X45,0X92,0X17,0X02,0X6D}; +char rom_3[8]={0x28,0x30,0x5F,0x45,0x92,0x0A,0x02,0x54}; + +//执行 +void M1820_Act(void) +{ + ReadTemp(); + + + +// unsigned char i; +// float j=0; +// +// M1820_Start();//18b20开始信号 +// +// +// M1820_Wr_Onebyte(0xcc);//发送跳过ROM的ROM命令 +// // +// +// M1820_Wr_Onebyte(0x44); +// M1820_Start();//18b20开始信号 +// // M1820_Wr_Onebyte(0x55);//发送匹配ROM命令 +// // for(i=0;i<8;i++) +// // { +// // M1820_Wr_Onebyte(rom_1[i]); +// // } +// M1820_Wr_Onebyte(0xBE); +// +// +// +// tem_l = M1820_Rd_Onebytr(); +// tem_h = M1820_Rd_Onebytr(); +// +// +// temp = tem_h; +// temp <<= 8; +// temp |= tem_l; +// if( temp < 0 ) +// { +// temp = temp - 1; +// temp = ~temp; +// } +// j = temp; +// temp = j * 0.0625 * 100 + 0.5; +// bai = (temp / 10000) + '0'; +// shi = (temp % 10000/1000) + '0'; +// ge = (temp % 1000/100) + '0'; +// shifen = (temp % 100/10) + '0'; +// baifen = temp % 10 + '0'; + +// M1820_Start(); //18b20开始信号 +// M1820_Wr_Onebyte(0xcc); //发送跳过ROM的ROM命令 +// M1820_Wr_Onebyte(0x44); +// M1820_Start(); //18b20开始信号 +// M1820_Wr_Onebyte(0x55); //发送匹配ROM命令 +// for(i=0;i<8;i++) +// { +// M1820_Wr_Onebyte(rom_2[i]); +// } +// M1820_Wr_Onebyte(0xBE); +// tem_l = M1820_Rd_Onebytr(); +// tem_h = M1820_Rd_Onebytr(); +// temp = tem_h; +// temp <<= 8; +// temp |= tem_l; +// if( temp < 0 ) +// { +// temp = temp - 1; +// temp = ~temp; +// } +// +// j = temp; +// temp = j * 0.0625 * 100 + 0.5; +// bai = (temp / 10000) + '0'; +// shi = (temp % 10000/1000) + '0'; +// ge = (temp % 1000/100) + '0'; +// shifen = (temp % 100/10) + '0'; +// baifen = temp % 10 + '0'; + + +// M1820_Start();//18b20开始信号 +// M1820_Wr_Onebyte(0xcc);//发送跳过ROM的ROM命令 +// +//// for(i=0;i<8;i++) +//// { +//// rom_3[i] = M1820_Rd_Onebytr(); +//// } +//// for(i=0;i<8;i++) +//// { +//// printf("%c",rom_3[i]); +//// } + +// M1820_Wr_Onebyte(0x44); +// M1820_Start();//18b20开始信号 +// M1820_Wr_Onebyte(0x55);//发送匹配ROM命令 +// for(i=0;i<8;i++) +// { +// M1820_Wr_Onebyte(rom_3[i]); +// } +// M1820_Wr_Onebyte(0xBE); +// tem_l = M1820_Rd_Onebytr(); +// tem_h = M1820_Rd_Onebytr(); +// temp = tem_h; +// temp <<= 8; +// temp |= tem_l; +// if( temp < 0 ) +// { +// temp = temp - 1; +// temp = ~temp; +// } +// j = temp; +// temp = j * 0.0625 * 100 + 0.5; +// bai = (temp / 10000) + '0'; +// shi = (temp % 10000/1000) + '0'; +// ge = (temp % 1000/100) + '0'; +// shifen = (temp % 100/10) + '0'; +// baifen = temp % 10 + '0'; + +} + + + + + diff --git a/App/Src/myLib.c b/App/Src/myLib.c new file mode 100644 index 0000000..9334b18 --- /dev/null +++ b/App/Src/myLib.c @@ -0,0 +1,428 @@ +#include "myLib.h" + +// 8*6 ASCII +const unsigned char ascii_8x6[][6] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // space 空格 + {0x00, 0x00, 0x00, 0x2f, 0x00, 0x00}, // ! + {0x00, 0x00, 0x07, 0x00, 0x07, 0x00}, // " + {0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14}, // # + {0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12}, // $ + {0x00, 0x62, 0x64, 0x08, 0x13, 0x23}, // % + {0x00, 0x36, 0x49, 0x55, 0x22, 0x50}, // & + {0x00, 0x00, 0x05, 0x03, 0x00, 0x00}, // ' + {0x00, 0x00, 0x1c, 0x22, 0x41, 0x00}, // ( + {0x00, 0x00, 0x41, 0x22, 0x1c, 0x00}, // ) + {0x00, 0x14, 0x08, 0x3E, 0x08, 0x14}, // * + {0x00, 0x08, 0x08, 0x3E, 0x08, 0x08}, // + + {0x00, 0x00, 0x00, 0xA0, 0x60, 0x00}, // , + {0x00, 0x08, 0x08, 0x08, 0x08, 0x08}, // - + {0x00, 0x00, 0x60, 0x60, 0x00, 0x00}, // . + {0x00, 0x20, 0x10, 0x08, 0x04, 0x02}, // / + {0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E}, // 0 + {0x00, 0x00, 0x42, 0x7F, 0x40, 0x00}, // 1 + {0x00, 0x42, 0x61, 0x51, 0x49, 0x46}, // 2 + {0x00, 0x21, 0x41, 0x45, 0x4B, 0x31}, // 3 + {0x00, 0x18, 0x14, 0x12, 0x7F, 0x10}, // 4 + {0x00, 0x27, 0x45, 0x45, 0x45, 0x39}, // 5 + {0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30}, // 6 + {0x00, 0x01, 0x71, 0x09, 0x05, 0x03}, // 7 + {0x00, 0x36, 0x49, 0x49, 0x49, 0x36}, // 8 + {0x00, 0x06, 0x49, 0x49, 0x29, 0x1E}, // 9 + {0x00, 0x00, 0x36, 0x36, 0x00, 0x00}, // : + {0x00, 0x00, 0x56, 0x36, 0x00, 0x00}, // ; + {0x00, 0x08, 0x14, 0x22, 0x41, 0x00}, // < + {0x00, 0x14, 0x14, 0x14, 0x14, 0x14}, // = + {0x00, 0x00, 0x41, 0x22, 0x14, 0x08}, // > + {0x00, 0x02, 0x01, 0x51, 0x09, 0x06}, // ? + {0x00, 0x32, 0x49, 0x59, 0x51, 0x3E}, // @ + {0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C}, // A + {0x00, 0x7F, 0x49, 0x49, 0x49, 0x36}, // B + {0x00, 0x3E, 0x41, 0x41, 0x41, 0x22}, // C + {0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C}, // D + {0x00, 0x7F, 0x49, 0x49, 0x49, 0x41}, // E + {0x00, 0x7F, 0x09, 0x09, 0x09, 0x01}, // F + {0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A}, // G + {0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F}, // H + {0x00, 0x00, 0x41, 0x7F, 0x41, 0x00}, // I + {0x00, 0x20, 0x40, 0x41, 0x3F, 0x01}, // J + {0x00, 0x7F, 0x08, 0x14, 0x22, 0x41}, // K + {0x00, 0x7F, 0x40, 0x40, 0x40, 0x40}, // L + {0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F}, // M + {0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F}, // N + {0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E}, // O + {0x00, 0x7F, 0x09, 0x09, 0x09, 0x06}, // P + {0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E}, // Q + {0x00, 0x7F, 0x09, 0x19, 0x29, 0x46}, // R + {0x00, 0x46, 0x49, 0x49, 0x49, 0x31}, // S + {0x00, 0x01, 0x01, 0x7F, 0x01, 0x01}, // T + {0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F}, // U + {0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F}, // V + {0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F}, // W + {0x00, 0x63, 0x14, 0x08, 0x14, 0x63}, // X + {0x00, 0x07, 0x08, 0x70, 0x08, 0x07}, // Y + {0x00, 0x61, 0x51, 0x49, 0x45, 0x43}, // Z + {0x00, 0x00, 0x7F, 0x41, 0x41, 0x00}, // [ + {0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55}, // 55 + {0x00, 0x00, 0x41, 0x41, 0x7F, 0x00}, // ] + {0x00, 0x04, 0x02, 0x01, 0x02, 0x04}, // ^ + {0x00, 0x40, 0x40, 0x40, 0x40, 0x40}, // _ + {0x00, 0x00, 0x01, 0x02, 0x04, 0x00}, // ' + {0x00, 0x20, 0x54, 0x54, 0x54, 0x78}, // a + {0x00, 0x7F, 0x48, 0x44, 0x44, 0x38}, // b + {0x00, 0x38, 0x44, 0x44, 0x44, 0x20}, // c + {0x00, 0x38, 0x44, 0x44, 0x48, 0x7F}, // d + {0x00, 0x38, 0x54, 0x54, 0x54, 0x18}, // e + {0x00, 0x08, 0x7E, 0x09, 0x01, 0x02}, // f + {0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C}, // g + {0x00, 0x7F, 0x08, 0x04, 0x04, 0x78}, // h + {0x00, 0x00, 0x44, 0x7D, 0x40, 0x00}, // i + {0x00, 0x40, 0x80, 0x84, 0x7D, 0x00}, // j + {0x00, 0x7F, 0x10, 0x28, 0x44, 0x00}, // k + {0x00, 0x00, 0x41, 0x7F, 0x40, 0x00}, // l + {0x00, 0x7C, 0x04, 0x18, 0x04, 0x78}, // m + {0x00, 0x7C, 0x08, 0x04, 0x04, 0x78}, // n + {0x00, 0x38, 0x44, 0x44, 0x44, 0x38}, // o + {0x00, 0xFC, 0x24, 0x24, 0x24, 0x18}, // p + {0x00, 0x18, 0x24, 0x24, 0x18, 0xFC}, // q + {0x00, 0x7C, 0x08, 0x04, 0x04, 0x08}, // r + {0x00, 0x48, 0x54, 0x54, 0x54, 0x20}, // s + {0x00, 0x04, 0x3F, 0x44, 0x40, 0x20}, // t + {0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C}, // u + {0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C}, // v + {0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C}, // w + {0x00, 0x44, 0x28, 0x10, 0x28, 0x44}, // x + {0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C}, // y + {0x00, 0x44, 0x64, 0x54, 0x4C, 0x44}, // z + {0x14, 0x14, 0x14, 0x14, 0x14, 0x14}, // horiz lines +}; + +const ASCIIFont afont8x6 = {8, 6, (unsigned char *)ascii_8x6}; + +const unsigned char ascii_12x6[][12] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*" ",0*/ + {0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00}, /*"!",1*/ + {0x00, 0x0C, 0x02, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*""",2*/ + {0x90, 0xD0, 0xBC, 0xD0, 0xBC, 0x90, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00}, /*"#",3*/ + {0x18, 0x24, 0xFE, 0x44, 0x8C, 0x00, 0x03, 0x02, 0x07, 0x02, 0x01, 0x00}, /*"$",4*/ + {0x18, 0x24, 0xD8, 0xB0, 0x4C, 0x80, 0x00, 0x03, 0x00, 0x01, 0x02, 0x01}, /*"%",5*/ + {0xC0, 0x38, 0xE4, 0x38, 0xE0, 0x00, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02}, /*"&",6*/ + {0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"'",7*/ + {0x00, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04}, /*"(",8*/ + {0x00, 0x02, 0x04, 0xF8, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00}, /*")",9*/ + {0x90, 0x60, 0xF8, 0x60, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}, /*"*",10*/ + {0x20, 0x20, 0xFC, 0x20, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}, /*"+",11*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00}, /*",",12*/ + {0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"-",13*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}, /*".",14*/ + {0x00, 0x80, 0x60, 0x1C, 0x02, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00}, /*"/",15*/ + {0xF8, 0x04, 0x04, 0x04, 0xF8, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00}, /*"0",16*/ + {0x00, 0x08, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x02, 0x00, 0x00}, /*"1",17*/ + {0x18, 0x84, 0x44, 0x24, 0x18, 0x00, 0x03, 0x02, 0x02, 0x02, 0x02, 0x00}, /*"2",18*/ + {0x08, 0x04, 0x24, 0x24, 0xD8, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00}, /*"3",19*/ + {0x40, 0xB0, 0x88, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00}, /*"4",20*/ + {0x3C, 0x24, 0x24, 0x24, 0xC4, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00}, /*"5",21*/ + {0xF8, 0x24, 0x24, 0x2C, 0xC0, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00}, /*"6",22*/ + {0x0C, 0x04, 0xE4, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00}, /*"7",23*/ + {0xD8, 0x24, 0x24, 0x24, 0xD8, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00}, /*"8",24*/ + {0x38, 0x44, 0x44, 0x44, 0xF8, 0x00, 0x00, 0x03, 0x02, 0x02, 0x01, 0x00}, /*"9",25*/ + {0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00}, /*":",26*/ + {0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00}, /*";",27*/ + {0x00, 0x20, 0x50, 0x88, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02}, /*"<",28*/ + {0x90, 0x90, 0x90, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"=",29*/ + {0x00, 0x02, 0x04, 0x88, 0x50, 0x20, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00}, /*">",30*/ + {0x18, 0x04, 0xC4, 0x24, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00}, /*"?",31*/ + {0xF8, 0x04, 0xE4, 0x94, 0xF8, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00}, /*"@",32*/ + {0x00, 0xE0, 0x9C, 0xF0, 0x80, 0x00, 0x02, 0x03, 0x00, 0x00, 0x03, 0x02}, /*"A",33*/ + {0x04, 0xFC, 0x24, 0x24, 0xD8, 0x00, 0x02, 0x03, 0x02, 0x02, 0x01, 0x00}, /*"B",34*/ + {0xF8, 0x04, 0x04, 0x04, 0x0C, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00}, /*"C",35*/ + {0x04, 0xFC, 0x04, 0x04, 0xF8, 0x00, 0x02, 0x03, 0x02, 0x02, 0x01, 0x00}, /*"D",36*/ + {0x04, 0xFC, 0x24, 0x74, 0x0C, 0x00, 0x02, 0x03, 0x02, 0x02, 0x03, 0x00}, /*"E",37*/ + {0x04, 0xFC, 0x24, 0x74, 0x0C, 0x00, 0x02, 0x03, 0x02, 0x00, 0x00, 0x00}, /*"F",38*/ + {0xF0, 0x08, 0x04, 0x44, 0xCC, 0x40, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00}, /*"G",39*/ + {0x04, 0xFC, 0x20, 0x20, 0xFC, 0x04, 0x02, 0x03, 0x00, 0x00, 0x03, 0x02}, /*"H",40*/ + {0x04, 0x04, 0xFC, 0x04, 0x04, 0x00, 0x02, 0x02, 0x03, 0x02, 0x02, 0x00}, /*"I",41*/ + {0x00, 0x04, 0x04, 0xFC, 0x04, 0x04, 0x06, 0x04, 0x04, 0x03, 0x00, 0x00}, /*"J",42*/ + {0x04, 0xFC, 0x24, 0xD0, 0x0C, 0x04, 0x02, 0x03, 0x02, 0x00, 0x03, 0x02}, /*"K",43*/ + {0x04, 0xFC, 0x04, 0x00, 0x00, 0x00, 0x02, 0x03, 0x02, 0x02, 0x02, 0x03}, /*"L",44*/ + {0xFC, 0x3C, 0xC0, 0x3C, 0xFC, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00}, /*"M",45*/ + {0x04, 0xFC, 0x30, 0xC4, 0xFC, 0x04, 0x02, 0x03, 0x02, 0x00, 0x03, 0x00}, /*"N",46*/ + {0xF8, 0x04, 0x04, 0x04, 0xF8, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00}, /*"O",47*/ + {0x04, 0xFC, 0x24, 0x24, 0x18, 0x00, 0x02, 0x03, 0x02, 0x00, 0x00, 0x00}, /*"P",48*/ + {0xF8, 0x84, 0x84, 0x04, 0xF8, 0x00, 0x01, 0x02, 0x02, 0x07, 0x05, 0x00}, /*"Q",49*/ + {0x04, 0xFC, 0x24, 0x64, 0x98, 0x00, 0x02, 0x03, 0x02, 0x00, 0x03, 0x02}, /*"R",50*/ + {0x18, 0x24, 0x24, 0x44, 0x8C, 0x00, 0x03, 0x02, 0x02, 0x02, 0x01, 0x00}, /*"S",51*/ + {0x0C, 0x04, 0xFC, 0x04, 0x0C, 0x00, 0x00, 0x02, 0x03, 0x02, 0x00, 0x00}, /*"T",52*/ + {0x04, 0xFC, 0x00, 0x00, 0xFC, 0x04, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00}, /*"U",53*/ + {0x04, 0x7C, 0x80, 0xE0, 0x1C, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00}, /*"V",54*/ + {0x1C, 0xE0, 0x3C, 0xE0, 0x1C, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00}, /*"W",55*/ + {0x04, 0x9C, 0x60, 0x9C, 0x04, 0x00, 0x02, 0x03, 0x00, 0x03, 0x02, 0x00}, /*"X",56*/ + {0x04, 0x1C, 0xE0, 0x1C, 0x04, 0x00, 0x00, 0x02, 0x03, 0x02, 0x00, 0x00}, /*"Y",57*/ + {0x0C, 0x84, 0x64, 0x1C, 0x04, 0x00, 0x02, 0x03, 0x02, 0x02, 0x03, 0x00}, /*"Z",58*/ + {0x00, 0x00, 0xFE, 0x02, 0x02, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x00}, /*"[",59*/ + {0x00, 0x0E, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00}, /*"\",60*/ + {0x00, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x00, 0x00}, /*"]",61*/ + {0x00, 0x04, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"^",62*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, /*"_",63*/ + {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"`",64*/ + {0x00, 0x40, 0xA0, 0xA0, 0xC0, 0x00, 0x00, 0x01, 0x02, 0x02, 0x03, 0x02}, /*"a",65*/ + {0x04, 0xFC, 0x20, 0x20, 0xC0, 0x00, 0x00, 0x03, 0x02, 0x02, 0x01, 0x00}, /*"b",66*/ + {0x00, 0xC0, 0x20, 0x20, 0x60, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x00}, /*"c",67*/ + {0x00, 0xC0, 0x20, 0x24, 0xFC, 0x00, 0x00, 0x01, 0x02, 0x02, 0x03, 0x02}, /*"d",68*/ + {0x00, 0xC0, 0xA0, 0xA0, 0xC0, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x00}, /*"e",69*/ + {0x00, 0x20, 0xF8, 0x24, 0x24, 0x04, 0x00, 0x02, 0x03, 0x02, 0x02, 0x00}, /*"f",70*/ + {0x00, 0x40, 0xA0, 0xA0, 0x60, 0x20, 0x00, 0x07, 0x0A, 0x0A, 0x0A, 0x04}, /*"g",71*/ + {0x04, 0xFC, 0x20, 0x20, 0xC0, 0x00, 0x02, 0x03, 0x02, 0x00, 0x03, 0x02}, /*"h",72*/ + {0x00, 0x20, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x02, 0x00, 0x00}, /*"i",73*/ + {0x00, 0x00, 0x20, 0xE4, 0x00, 0x00, 0x08, 0x08, 0x08, 0x07, 0x00, 0x00}, /*"j",74*/ + {0x04, 0xFC, 0x80, 0xE0, 0x20, 0x20, 0x02, 0x03, 0x02, 0x00, 0x03, 0x02}, /*"k",75*/ + {0x04, 0x04, 0xFC, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x02, 0x02, 0x00}, /*"l",76*/ + {0xE0, 0x20, 0xE0, 0x20, 0xC0, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00}, /*"m",77*/ + {0x20, 0xE0, 0x20, 0x20, 0xC0, 0x00, 0x02, 0x03, 0x02, 0x00, 0x03, 0x02}, /*"n",78*/ + {0x00, 0xC0, 0x20, 0x20, 0xC0, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00}, /*"o",79*/ + {0x20, 0xE0, 0x20, 0x20, 0xC0, 0x00, 0x08, 0x0F, 0x0A, 0x02, 0x01, 0x00}, /*"p",80*/ + {0x00, 0xC0, 0x20, 0x20, 0xE0, 0x00, 0x00, 0x01, 0x02, 0x0A, 0x0F, 0x08}, /*"q",81*/ + {0x20, 0xE0, 0x40, 0x20, 0x20, 0x00, 0x02, 0x03, 0x02, 0x00, 0x00, 0x00}, /*"r",82*/ + {0x00, 0x60, 0xA0, 0xA0, 0x20, 0x00, 0x00, 0x02, 0x02, 0x02, 0x03, 0x00}, /*"s",83*/ + {0x00, 0x20, 0xF8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00}, /*"t",84*/ + {0x20, 0xE0, 0x00, 0x20, 0xE0, 0x00, 0x00, 0x01, 0x02, 0x02, 0x03, 0x02}, /*"u",85*/ + {0x20, 0xE0, 0x20, 0x80, 0x60, 0x20, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00}, /*"v",86*/ + {0x60, 0x80, 0xE0, 0x80, 0x60, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00}, /*"w",87*/ + {0x20, 0x60, 0x80, 0x60, 0x20, 0x00, 0x02, 0x03, 0x00, 0x03, 0x02, 0x00}, /*"x",88*/ + {0x20, 0xE0, 0x20, 0x80, 0x60, 0x20, 0x08, 0x08, 0x07, 0x01, 0x00, 0x00}, /*"y",89*/ + {0x00, 0x20, 0xA0, 0x60, 0x20, 0x00, 0x00, 0x02, 0x03, 0x02, 0x02, 0x00}, /*"z",90*/ + {0x00, 0x00, 0x20, 0xDE, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00}, /*"{",91*/ + {0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00}, /*"|",92*/ + {0x00, 0x02, 0xDE, 0x20, 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00}, /*"}",93*/ + {0x02, 0x01, 0x02, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"~",94*/ +}; + +const ASCIIFont afont12x6 = {12, 6, (unsigned char *)ascii_12x6}; + +const unsigned char ascii_16x8[][16] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*" ",0*/ + {0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x30, 0x00, 0x00, 0x00}, /*"!",1*/ + {0x00, 0x10, 0x0C, 0x06, 0x10, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*""",2*/ + {0x40, 0xC0, 0x78, 0x40, 0xC0, 0x78, 0x40, 0x00, 0x04, 0x3F, 0x04, 0x04, 0x3F, 0x04, 0x04, 0x00}, /*"#",3*/ + {0x00, 0x70, 0x88, 0xFC, 0x08, 0x30, 0x00, 0x00, 0x00, 0x18, 0x20, 0xFF, 0x21, 0x1E, 0x00, 0x00}, /*"$",4*/ + {0xF0, 0x08, 0xF0, 0x00, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x21, 0x1C, 0x03, 0x1E, 0x21, 0x1E, 0x00}, /*"%",5*/ + {0x00, 0xF0, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00, 0x1E, 0x21, 0x23, 0x24, 0x19, 0x27, 0x21, 0x10}, /*"&",6*/ + {0x10, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"'",7*/ + {0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x20, 0x40, 0x00}, /*"(",8*/ + {0x00, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x18, 0x07, 0x00, 0x00, 0x00}, /*")",9*/ + {0x40, 0x40, 0x80, 0xF0, 0x80, 0x40, 0x40, 0x00, 0x02, 0x02, 0x01, 0x0F, 0x01, 0x02, 0x02, 0x00}, /*"*",10*/ + {0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x01, 0x01, 0x00}, /*"+",11*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xB0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00}, /*",",12*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, /*"-",13*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00}, /*".",14*/ + {0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x04, 0x00, 0x60, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00}, /*"/",15*/ + {0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00}, /*"0",16*/ + {0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00}, /*"1",17*/ + {0x00, 0x70, 0x08, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x30, 0x28, 0x24, 0x22, 0x21, 0x30, 0x00}, /*"2",18*/ + {0x00, 0x30, 0x08, 0x88, 0x88, 0x48, 0x30, 0x00, 0x00, 0x18, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00}, /*"3",19*/ + {0x00, 0x00, 0xC0, 0x20, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x07, 0x04, 0x24, 0x24, 0x3F, 0x24, 0x00}, /*"4",20*/ + {0x00, 0xF8, 0x08, 0x88, 0x88, 0x08, 0x08, 0x00, 0x00, 0x19, 0x21, 0x20, 0x20, 0x11, 0x0E, 0x00}, /*"5",21*/ + {0x00, 0xE0, 0x10, 0x88, 0x88, 0x18, 0x00, 0x00, 0x00, 0x0F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00}, /*"6",22*/ + {0x00, 0x38, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, /*"7",23*/ + {0x00, 0x70, 0x88, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x1C, 0x22, 0x21, 0x21, 0x22, 0x1C, 0x00}, /*"8",24*/ + {0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x31, 0x22, 0x22, 0x11, 0x0F, 0x00}, /*"9",25*/ + {0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00}, /*":",26*/ + {0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00}, /*";",27*/ + {0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00}, /*"<",28*/ + {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, /*"=",29*/ + {0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00}, /*">",30*/ + {0x00, 0x70, 0x48, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x36, 0x01, 0x00, 0x00}, /*"?",31*/ + {0xC0, 0x30, 0xC8, 0x28, 0xE8, 0x10, 0xE0, 0x00, 0x07, 0x18, 0x27, 0x24, 0x23, 0x14, 0x0B, 0x00}, /*"@",32*/ + {0x00, 0x00, 0xC0, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x3C, 0x23, 0x02, 0x02, 0x27, 0x38, 0x20}, /*"A",33*/ + {0x08, 0xF8, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00}, /*"B",34*/ + {0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x07, 0x18, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00}, /*"C",35*/ + {0x08, 0xF8, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00}, /*"D",36*/ + {0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x23, 0x20, 0x18, 0x00}, /*"E",37*/ + {0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00}, /*"F",38*/ + {0xC0, 0x30, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x07, 0x18, 0x20, 0x20, 0x22, 0x1E, 0x02, 0x00}, /*"G",39*/ + {0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x21, 0x3F, 0x20}, /*"H",40*/ + {0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00}, /*"I",41*/ + {0x00, 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00}, /*"J",42*/ + {0x08, 0xF8, 0x88, 0xC0, 0x28, 0x18, 0x08, 0x00, 0x20, 0x3F, 0x20, 0x01, 0x26, 0x38, 0x20, 0x00}, /*"K",43*/ + {0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x30, 0x00}, /*"L",44*/ + {0x08, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x08, 0x00, 0x20, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x20, 0x00}, /*"M",45*/ + {0x08, 0xF8, 0x30, 0xC0, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x20, 0x00, 0x07, 0x18, 0x3F, 0x00}, /*"N",46*/ + {0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00}, /*"O",47*/ + {0x08, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x00, 0x00}, /*"P",48*/ + {0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x18, 0x24, 0x24, 0x38, 0x50, 0x4F, 0x00}, /*"Q",49*/ + {0x08, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x0C, 0x30, 0x20}, /*"R",50*/ + {0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x38, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00}, /*"S",51*/ + {0x18, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x18, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00}, /*"T",52*/ + {0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00}, /*"U",53*/ + {0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x07, 0x38, 0x0E, 0x01, 0x00, 0x00}, /*"V",54*/ + {0xF8, 0x08, 0x00, 0xF8, 0x00, 0x08, 0xF8, 0x00, 0x03, 0x3C, 0x07, 0x00, 0x07, 0x3C, 0x03, 0x00}, /*"W",55*/ + {0x08, 0x18, 0x68, 0x80, 0x80, 0x68, 0x18, 0x08, 0x20, 0x30, 0x2C, 0x03, 0x03, 0x2C, 0x30, 0x20}, /*"X",56*/ + {0x08, 0x38, 0xC8, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00}, /*"Y",57*/ + {0x10, 0x08, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x20, 0x38, 0x26, 0x21, 0x20, 0x20, 0x18, 0x00}, /*"Z",58*/ + {0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x00}, /*"[",59*/ + {0x00, 0x0C, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x38, 0xC0, 0x00}, /*"\",60*/ + {0x00, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00}, /*"]",61*/ + {0x00, 0x00, 0x04, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"^",62*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, /*"_",63*/ + {0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"`",64*/ + {0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x19, 0x24, 0x22, 0x22, 0x22, 0x3F, 0x20}, /*"a",65*/ + {0x08, 0xF8, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00}, /*"b",66*/ + {0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x20, 0x11, 0x00}, /*"c",67*/ + {0x00, 0x00, 0x00, 0x80, 0x80, 0x88, 0xF8, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x10, 0x3F, 0x20}, /*"d",68*/ + {0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x22, 0x22, 0x22, 0x22, 0x13, 0x00}, /*"e",69*/ + {0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x18, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00}, /*"f",70*/ + {0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x6B, 0x94, 0x94, 0x94, 0x93, 0x60, 0x00}, /*"g",71*/ + {0x08, 0xF8, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20}, /*"h",72*/ + {0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00}, /*"i",73*/ + {0x00, 0x00, 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00}, /*"j",74*/ + {0x08, 0xF8, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x24, 0x02, 0x2D, 0x30, 0x20, 0x00}, /*"k",75*/ + {0x00, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00}, /*"l",76*/ + {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x3F}, /*"m",77*/ + {0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20}, /*"n",78*/ + {0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00}, /*"o",79*/ + {0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xA1, 0x20, 0x20, 0x11, 0x0E, 0x00}, /*"p",80*/ + {0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0xA0, 0xFF, 0x80}, /*"q",81*/ + {0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x20, 0x3F, 0x21, 0x20, 0x00, 0x01, 0x00}, /*"r",82*/ + {0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x33, 0x24, 0x24, 0x24, 0x24, 0x19, 0x00}, /*"s",83*/ + {0x00, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x00, 0x00}, /*"t",84*/ + {0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20}, /*"u",85*/ + {0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x01, 0x0E, 0x30, 0x08, 0x06, 0x01, 0x00}, /*"v",86*/ + {0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x0F, 0x30, 0x0C, 0x03, 0x0C, 0x30, 0x0F, 0x00}, /*"w",87*/ + {0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x31, 0x2E, 0x0E, 0x31, 0x20, 0x00}, /*"x",88*/ + {0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x81, 0x8E, 0x70, 0x18, 0x06, 0x01, 0x00}, /*"y",89*/ + {0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x21, 0x30, 0x2C, 0x22, 0x21, 0x30, 0x00}, /*"z",90*/ + {0x00, 0x00, 0x00, 0x00, 0x80, 0x7C, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x40}, /*"{",91*/ + {0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00}, /*"|",92*/ + {0x00, 0x02, 0x02, 0x7C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00}, /*"}",93*/ + {0x00, 0x06, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"~",94*/ +}; + +const ASCIIFont afont16x8 = {16, 8, (unsigned char *)ascii_16x8}; + +const unsigned char ascii_24x12[][36] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*" ",0*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00}, /*"!",1*/ + {0x00, 0x00, 0x80, 0x60, 0x30, 0x1C, 0x8C, 0x60, 0x30, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*""",2*/ + {0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x86, 0xE6, 0x9F, 0x86, 0x86, 0x86, 0x86, 0xE6, 0x9F, 0x86, 0x00, 0x00, 0x01, 0x1F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x01, 0x00}, /*"#",3*/ + {0x00, 0x00, 0x80, 0xC0, 0x60, 0x20, 0xF8, 0x20, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0C, 0x18, 0xFF, 0x70, 0xE1, 0x81, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x10, 0x10, 0x7F, 0x10, 0x0F, 0x07, 0x00, 0x00}, /*"$",4*/ + {0x80, 0x60, 0x20, 0x60, 0x80, 0x00, 0x00, 0x00, 0xE0, 0x20, 0x00, 0x00, 0x0F, 0x30, 0x20, 0x30, 0x9F, 0x70, 0xDC, 0x37, 0x10, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x03, 0x00, 0x07, 0x18, 0x10, 0x18, 0x07, 0x00}, /*"%",5*/ + {0x00, 0x00, 0xC0, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x1F, 0x38, 0xE8, 0x87, 0x03, 0xC4, 0x3C, 0x04, 0x00, 0x00, 0x07, 0x0F, 0x18, 0x10, 0x10, 0x0B, 0x07, 0x0D, 0x10, 0x10, 0x08, 0x00}, /*"&",6*/ + {0x00, 0x80, 0x8C, 0x4C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"'",7*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x30, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x18, 0x20, 0x40, 0x00}, /*"(",8*/ + {0x00, 0x04, 0x08, 0x30, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x18, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*")",9*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x66, 0x66, 0x3C, 0x18, 0xFF, 0x18, 0x3C, 0x66, 0x66, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"*",10*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"+",11*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8C, 0x4C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*",",12*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"-",13*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*".",14*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x70, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x38, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"/",15*/ + {0x00, 0x00, 0x80, 0xC0, 0x60, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x01, 0x07, 0x0E, 0x18, 0x10, 0x10, 0x18, 0x0E, 0x07, 0x01, 0x00}, /*"0",16*/ + {0x00, 0x00, 0x80, 0x80, 0x80, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x10, 0x00, 0x00}, /*"1",17*/ + {0x00, 0x80, 0x40, 0x20, 0x20, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x80, 0x40, 0x20, 0x38, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x1C, 0x1A, 0x19, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00}, /*"2",18*/ + {0x00, 0x80, 0xC0, 0x20, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x10, 0x10, 0x18, 0x2F, 0xE7, 0x80, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0F, 0x07, 0x00, 0x00}, /*"3",19*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xB0, 0x88, 0x86, 0x81, 0x80, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x00}, /*"4",20*/ + {0x00, 0x00, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x10, 0x08, 0x08, 0x08, 0x18, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x07, 0x0B, 0x10, 0x10, 0x10, 0x10, 0x1C, 0x0F, 0x03, 0x00, 0x00}, /*"5",21*/ + {0x00, 0x00, 0x80, 0xC0, 0x40, 0x20, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x21, 0x10, 0x08, 0x08, 0x08, 0x18, 0xF0, 0xE0, 0x00, 0x00, 0x01, 0x07, 0x0C, 0x18, 0x10, 0x10, 0x10, 0x08, 0x0F, 0x03, 0x00}, /*"6",22*/ + {0x00, 0x00, 0xC0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xE0, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"7",23*/ + {0x00, 0x80, 0xC0, 0x60, 0x20, 0x20, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x87, 0xEF, 0x2C, 0x18, 0x18, 0x30, 0x30, 0x68, 0xCF, 0x83, 0x00, 0x00, 0x07, 0x0F, 0x08, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0F, 0x07, 0x00}, /*"8",24*/ + {0x00, 0x00, 0xC0, 0xC0, 0x20, 0x20, 0x20, 0x20, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x60, 0x40, 0x40, 0x40, 0x20, 0x10, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x10, 0x10, 0x10, 0x08, 0x0F, 0x03, 0x00, 0x00}, /*"9",25*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00}, /*":",26*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00}, /*";",27*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x10, 0x28, 0x44, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00}, /*"<",28*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"=",29*/ + {0x00, 0x00, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x82, 0x44, 0x28, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}, /*">",30*/ + {0x00, 0xC0, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x30, 0xE0, 0xC0, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0xF0, 0x10, 0x08, 0x0C, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"?",31*/ + {0x00, 0x00, 0x00, 0xC0, 0x40, 0x60, 0x20, 0x20, 0x20, 0x40, 0xC0, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0xF0, 0x0E, 0x03, 0xC1, 0xFE, 0x03, 0x80, 0x7F, 0x00, 0x01, 0x07, 0x0E, 0x08, 0x11, 0x11, 0x10, 0x11, 0x09, 0x04, 0x02}, /*"@",32*/ + {0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7C, 0x43, 0x40, 0x47, 0x7F, 0xF8, 0x80, 0x00, 0x00, 0x10, 0x18, 0x1F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x1F, 0x1C, 0x10}, /*"A",33*/ + {0x20, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x18, 0x2F, 0xE7, 0x80, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0F, 0x07, 0x00}, /*"B",34*/ + {0x00, 0x00, 0x80, 0xC0, 0x40, 0x20, 0x20, 0x20, 0x20, 0x60, 0xE0, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x07, 0x0E, 0x18, 0x10, 0x10, 0x10, 0x08, 0x04, 0x03, 0x00}, /*"C",35*/ + {0x20, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x40, 0xC0, 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x10, 0x18, 0x08, 0x0E, 0x07, 0x01, 0x00}, /*"D",36*/ + {0x20, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x18, 0x06, 0x00}, /*"E",37*/ + {0x20, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x60, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00, 0x01, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"F",38*/ + {0x00, 0x00, 0x80, 0xC0, 0x60, 0x20, 0x20, 0x20, 0x40, 0xE0, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0x00, 0x00, 0x40, 0x40, 0xC0, 0xC1, 0x40, 0x40, 0x00, 0x01, 0x07, 0x0E, 0x18, 0x10, 0x10, 0x10, 0x0F, 0x0F, 0x00, 0x00}, /*"G",39*/ + {0x20, 0xE0, 0xE0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0xE0, 0xE0, 0x20, 0x00, 0xFF, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0xFF, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10}, /*"H",40*/ + {0x00, 0x00, 0x20, 0x20, 0x20, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x10, 0x00, 0x00}, /*"I",41*/ + {0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x60, 0xE0, 0x80, 0x80, 0x80, 0xC0, 0x7F, 0x3F, 0x00, 0x00, 0x00}, /*"J",42*/ + {0x20, 0xE0, 0xE0, 0x20, 0x00, 0x00, 0x20, 0xA0, 0x60, 0x20, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0x30, 0x18, 0x7C, 0xE3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x01, 0x13, 0x1F, 0x1C, 0x18, 0x10}, /*"K",43*/ + {0x20, 0xE0, 0xE0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x18, 0x06, 0x00}, /*"L",44*/ + {0x20, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0x20, 0x00, 0xFF, 0x01, 0x3F, 0xFE, 0xC0, 0xE0, 0x1E, 0x01, 0xFF, 0xFF, 0x00, 0x10, 0x1F, 0x10, 0x00, 0x03, 0x1F, 0x03, 0x00, 0x10, 0x1F, 0x1F, 0x10}, /*"M",45*/ + {0x20, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xE0, 0x20, 0x00, 0xFF, 0x00, 0x03, 0x07, 0x1C, 0x78, 0xE0, 0x80, 0x00, 0xFF, 0x00, 0x10, 0x1F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x00}, /*"N",46*/ + {0x00, 0x00, 0x80, 0xC0, 0x60, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x01, 0x07, 0x0E, 0x18, 0x10, 0x10, 0x18, 0x0C, 0x07, 0x01, 0x00}, /*"O",47*/ + {0x20, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x1F, 0x0F, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"P",48*/ + {0x00, 0x00, 0x80, 0xC0, 0x60, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x01, 0x07, 0x0E, 0x11, 0x11, 0x13, 0x3C, 0x7C, 0x67, 0x21, 0x00}, /*"Q",49*/ + {0x20, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x10, 0x10, 0x30, 0xF0, 0xD0, 0x08, 0x0F, 0x07, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1C, 0x10, 0x10}, /*"R",50*/ + {0x00, 0x80, 0xC0, 0x60, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0xE0, 0x00, 0x00, 0x07, 0x0F, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0xE0, 0x81, 0x00, 0x00, 0x1F, 0x0C, 0x08, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0F, 0x07, 0x00}, /*"S",51*/ + {0x80, 0x60, 0x20, 0x20, 0x20, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x60, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x00, 0x00}, /*"T",52*/ + {0x20, 0xE0, 0xE0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xE0, 0x20, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x07, 0x0F, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x07, 0x00}, /*"U",53*/ + {0x20, 0x60, 0xE0, 0xE0, 0x20, 0x00, 0x00, 0x00, 0x20, 0xE0, 0x60, 0x20, 0x00, 0x00, 0x07, 0x7F, 0xF8, 0x80, 0x00, 0x80, 0x7C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00}, /*"V",54*/ + {0x20, 0xE0, 0xE0, 0x20, 0x00, 0xE0, 0xE0, 0x20, 0x00, 0x20, 0xE0, 0x20, 0x00, 0x07, 0xFF, 0xF8, 0xE0, 0x1F, 0xFF, 0xFC, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1F, 0x03, 0x00, 0x01, 0x1F, 0x03, 0x00, 0x00, 0x00}, /*"W",55*/ + {0x00, 0x20, 0x60, 0xE0, 0xA0, 0x00, 0x00, 0x20, 0xE0, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8F, 0x7C, 0xF8, 0xC6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x18, 0x1E, 0x13, 0x00, 0x01, 0x17, 0x1F, 0x18, 0x10, 0x00}, /*"X",56*/ + {0x20, 0x60, 0xE0, 0xE0, 0x20, 0x00, 0x00, 0x00, 0x20, 0xE0, 0x60, 0x20, 0x00, 0x00, 0x01, 0x07, 0x3E, 0xF8, 0xE0, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x00, 0x00, 0x00}, /*"Y",57*/ + {0x00, 0x80, 0x60, 0x20, 0x20, 0x20, 0x20, 0xA0, 0xE0, 0xE0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x3E, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1C, 0x1F, 0x17, 0x10, 0x10, 0x10, 0x10, 0x18, 0x06, 0x00}, /*"Z",58*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00}, /*"[",59*/ + {0x00, 0x00, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1C, 0x60, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x70, 0x80, 0x00}, /*"\",60*/ + {0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00}, /*"]",61*/ + {0x00, 0x00, 0x00, 0x10, 0x08, 0x0C, 0x04, 0x0C, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"^",62*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, /*"_",63*/ + {0x00, 0x00, 0x00, 0x04, 0x04, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"`",64*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0xD8, 0x44, 0x64, 0x24, 0x24, 0xFC, 0xF8, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x18, 0x10, 0x10, 0x10, 0x08, 0x1F, 0x1F, 0x10, 0x18}, /*"a",65*/ + {0x00, 0x20, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x08, 0x04, 0x04, 0x0C, 0xF8, 0xF0, 0x00, 0x00, 0x00, 0x1F, 0x0F, 0x18, 0x10, 0x10, 0x10, 0x18, 0x0F, 0x03, 0x00}, /*"b",66*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x18, 0x04, 0x04, 0x04, 0x3C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x08, 0x06, 0x00, 0x00}, /*"c",67*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x1C, 0x04, 0x04, 0x04, 0x08, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x18, 0x10, 0x10, 0x10, 0x08, 0x1F, 0x0F, 0x08, 0x00}, /*"d",68*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x48, 0x44, 0x44, 0x44, 0x4C, 0x78, 0x70, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x0C, 0x18, 0x10, 0x10, 0x10, 0x08, 0x04, 0x00}, /*"e",69*/ + {0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x00, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00}, /*"f",70*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xF8, 0x8C, 0x04, 0x04, 0x8C, 0xF8, 0x74, 0x04, 0x0C, 0x00, 0x70, 0x76, 0xCF, 0x8D, 0x8D, 0x8D, 0x89, 0xC8, 0x78, 0x70, 0x00}, /*"g",71*/ + {0x00, 0x20, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x08, 0x04, 0x04, 0x04, 0xFC, 0xF8, 0x00, 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, /*"h",72*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x10, 0x00, 0x00}, /*"i",73*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x80, 0x80, 0xC0, 0x7F, 0x3F, 0x00, 0x00, 0x00}, /*"j",74*/ + {0x00, 0x20, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0xC0, 0xF4, 0x1C, 0x04, 0x04, 0x00, 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x11, 0x00, 0x03, 0x1F, 0x1C, 0x10, 0x10, 0x00}, /*"k",75*/ + {0x00, 0x00, 0x20, 0x20, 0x20, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x10, 0x00, 0x00}, /*"l",76*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFC, 0xFC, 0x08, 0x04, 0xFC, 0xFC, 0x08, 0x04, 0xFC, 0xFC, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x1F, 0x1F, 0x10, 0x00, 0x1F, 0x1F, 0x10}, /*"m",77*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFC, 0xFC, 0x08, 0x08, 0x04, 0x04, 0xFC, 0xF8, 0x00, 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, /*"n",78*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0x18, 0x0C, 0x04, 0x04, 0x0C, 0x18, 0xF0, 0xE0, 0x00, 0x00, 0x03, 0x0F, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x0F, 0x03, 0x00}, /*"o",79*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFC, 0xFC, 0x08, 0x04, 0x04, 0x04, 0x0C, 0xF8, 0xF0, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x88, 0x90, 0x10, 0x10, 0x1C, 0x0F, 0x03, 0x00}, /*"p",80*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x1C, 0x04, 0x04, 0x04, 0x08, 0xF8, 0xFC, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x18, 0x10, 0x10, 0x90, 0x88, 0xFF, 0xFF, 0x80, 0x00}, /*"q",81*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xFC, 0xFC, 0x10, 0x08, 0x04, 0x04, 0x0C, 0x0C, 0x00, 0x10, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00}, /*"r",82*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0xCC, 0xC4, 0x84, 0x84, 0x84, 0x0C, 0x1C, 0x00, 0x00, 0x00, 0x1E, 0x18, 0x10, 0x10, 0x10, 0x11, 0x19, 0x0F, 0x06, 0x00}, /*"s",83*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x0C, 0x00, 0x00}, /*"t",84*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFC, 0xFE, 0x00, 0x00, 0x00, 0x04, 0xFC, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x18, 0x10, 0x10, 0x08, 0x1F, 0x0F, 0x08, 0x00}, /*"u",85*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0C, 0x3C, 0xFC, 0xC4, 0x00, 0x00, 0xC4, 0x3C, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x1E, 0x0E, 0x01, 0x00, 0x00, 0x00}, /*"v",86*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3C, 0xFC, 0xC4, 0x00, 0xE4, 0x7C, 0xFC, 0x84, 0x80, 0x7C, 0x04, 0x00, 0x00, 0x07, 0x1F, 0x07, 0x00, 0x00, 0x07, 0x1F, 0x07, 0x00, 0x00}, /*"w",87*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1C, 0x7C, 0xE4, 0xC0, 0x34, 0x1C, 0x04, 0x04, 0x00, 0x00, 0x10, 0x10, 0x1C, 0x16, 0x01, 0x13, 0x1F, 0x1C, 0x18, 0x10, 0x00}, /*"x",88*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0C, 0x3C, 0xFC, 0xC4, 0x00, 0xC4, 0x3C, 0x04, 0x04, 0x00, 0x00, 0x00, 0xC0, 0x80, 0xC1, 0x37, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00}, /*"y",89*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x04, 0x04, 0xC4, 0xF4, 0x7C, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1C, 0x1F, 0x17, 0x11, 0x10, 0x10, 0x18, 0x0E, 0x00}, /*"z",90*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x60, 0x40, 0x00, 0x00}, /*"{",91*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"|",92*/ + {0x00, 0x00, 0x04, 0x0C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"}",93*/ + {0x00, 0x18, 0x06, 0x02, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + /*"~",94*/ /*"~",94*/ +}; + +const ASCIIFont afont24x12 = {24, 12, (unsigned char *)ascii_24x12}; + +const uint8_t zh16x16[][36] = { +/* 0 */ {0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}, +/* 1 狐 */ {0xe7,0x8b,0x90,0x00,0x22,0x14,0x08,0xf4,0x02,0x00,0xfc,0x04,0xfc,0x04,0x02,0xfe,0x03,0x02,0x00,0x00,0x44,0x82,0x41,0x3f,0x80,0x60,0x1f,0x00,0x7f,0x28,0x10,0x61,0x0e,0x30,0x40,0x00,}, +/* 2 狸 */ {0xe7,0x8b,0xb8,0x00,0x40,0x22,0x14,0x08,0xf4,0x02,0x00,0xfe,0x92,0x92,0xfe,0x92,0x92,0xfe,0x00,0x00,0x08,0x44,0x82,0x41,0x3f,0x00,0x40,0x44,0x44,0x44,0x7f,0x44,0x44,0x44,0x40,0x00,}, +/* 3 小 */ {0xe5,0xb0,0x8f,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x20,0x40,0x80,0x00,0x00,0x08,0x04,0x03,0x00,0x00,0x40,0x80,0x7f,0x00,0x00,0x00,0x00,0x00,0x01,0x0e,0x00,}, +/* 4 豆 */ {0xe8,0xb1,0x86,0x00,0x00,0x02,0x02,0xf2,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xf2,0x02,0x02,0x00,0x00,0x40,0x40,0x40,0x4b,0x52,0x62,0x42,0x42,0x42,0x62,0x52,0x4b,0x40,0x40,0x40,0x00,} +}; +const Font font16x16 = {16, 16, (const uint8_t *)zh16x16, 5, &afont16x8}; + +const uint8_t bilibiliData[] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x86, 0x8f, 0x9f, 0xbf, 0xff, 0xfc, 0xf8, 0xf8, 0xe0, 0xe0, 0xc0, 0x80, + 0x80, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0xe0, 0xf8, 0xf8, 0xfc, 0xfe, 0xbf, 0x9f, 0x8f, 0x86, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, + 0x20, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x07, 0x07, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x07, 0x07, 0x03, +}; +const Image bilibiliImg = {51, 48, bilibiliData}; + + diff --git a/App/Src/oled.c b/App/Src/oled.c new file mode 100644 index 0000000..e3d4e83 --- /dev/null +++ b/App/Src/oled.c @@ -0,0 +1,490 @@ +#include "oled.h" +#include "main.h" +#include "i2c.h" +#include "app.h" +#include +#include "string.h" +#include "MyLib.h" + +#define OLED_ADDRESS 0x78 //电阻焊在了0x3C,左移一位得到0x78 +// OLED参数 +#define OLED_PAGE 8 // OLED页数 +#define OLED_ROW 8 * OLED_PAGE // OLED行数 +#define OLED_COLUMN 128 // OLED列数 + +// 显存 +uint8_t OLED_GRAM[OLED_PAGE][OLED_COLUMN]; + +void OLED_Send(uint8_t *data, uint8_t len)//发送数据 8bit * len +{ + HAL_I2C_Master_Transmit(&hi2c1, OLED_ADDRESS, data, len, 20);//1000 +} + +void OLED_SendCmd(uint8_t cmd)//发送命令 [0x00;cmd] +{ + static uint8_t sendBuffer[2] = {0}; + sendBuffer[1] = cmd; + OLED_Send(sendBuffer, 2); +} + + +//OLED初始化 +void OLED_Init(void) { + + OLED_SendCmd(0xAE); /*关闭显示 display off*/ + + OLED_SendCmd(0x20);//设置显示模式 + OLED_SendCmd(0x10);//设置为页显示模式 + OLED_SendCmd(0xB0);//设置起始页的地址模式0-7 + + OLED_SendCmd(0xC0);// 0xc0上下反置 0xc8正常 + + OLED_SendCmd(0x00); + OLED_SendCmd(0x10); + + OLED_SendCmd(0x40);//--set start line address,从RAM中哪一行起读取显示内容 + + OLED_SendCmd(0x81);//设置对比度 + + OLED_SendCmd(0xFF);//亮度调节 0x00~0xff + OLED_SendCmd(0xA0);// 0xa0左右反置 0xa1正常 + + OLED_SendCmd(0xA6);//设置显示方式;bit0:1,反相显示;0,正常显示 + OLED_SendCmd(0xA8); + + OLED_SendCmd(0x3F); + + OLED_SendCmd(0xA4);//全局显示开启;0xa4正常,0xa5无视命令点亮全屏 + + OLED_SendCmd(0xD3); + OLED_SendCmd(0x00); + + OLED_SendCmd(0xD5); + OLED_SendCmd(0xF0); + + OLED_SendCmd(0xD9); + OLED_SendCmd(0x22); + + OLED_SendCmd(0xDA); + OLED_SendCmd(0x12); + + OLED_SendCmd(0xDB); + OLED_SendCmd(0x20); + + OLED_SendCmd(0x8D);//设置电荷泵开关 + OLED_SendCmd(0x14);//开 + + OLED_NewFrame(); + OLED_ShowFrame(); + + OLED_SendCmd(0xAF); /*开启显示 display ON*/ + +} + + + +//开启OLED显示 +void OLED_DisPlay_On() +{ + OLED_SendCmd(0x8D); // 电荷泵使能 + OLED_SendCmd(0x14); // 开启电荷泵 + OLED_SendCmd(0xAF); // 点亮屏幕 +} + + +//关闭OLED显示 +void OLED_DisPlay_Off() +{ + OLED_SendCmd(0x8D); // 电荷泵使能 + OLED_SendCmd(0x10); // 关闭电荷泵 + OLED_SendCmd(0xAE); // 关闭屏幕 +} + + +//设置颜色模式 黑底白字或白底黑字 +//颜色模式COLOR_NORMAL(黑底白字) / COLOR_REVERSED(白底黑字) +void OLED_SetColorMode(OLED_ColorMode mode) +{ + if (mode == OLED_COLOR_NORMAL) + { + OLED_SendCmd(0xA6); // 正常显示 + } + if (mode == OLED_COLOR_REVERSED) + { + OLED_SendCmd(0xA7); // 反色显示 + } +} + + +/**********************显存操作函数begin*************************/ +//清空显存 绘制新的一帧 +void OLED_NewFrame() +{ + memset(OLED_GRAM, 0, sizeof(OLED_GRAM)); +} + +//将当前显存显示到屏幕上 +void OLED_ShowFrame() +{ + static uint8_t sendBuffer[OLED_COLUMN + 1]; + sendBuffer[0] = 0x40; + for (uint8_t i = 0; i < OLED_PAGE; i++) + { + OLED_SendCmd(0xB0 + i); // 设置页地址 + OLED_SendCmd(0x00); // 设置列地址低4位 + OLED_SendCmd(0x10); // 设置列地址高4位 + memcpy(sendBuffer + 1, OLED_GRAM[i], OLED_COLUMN); + OLED_Send(sendBuffer, OLED_COLUMN + 1); + } +} + +//将当前显存显示到屏幕上 +void OLED_ShowPageFrame(uint8_t page) +{ + static uint8_t sendBuffer[OLED_COLUMN + 1]; + sendBuffer[0] = 0x40; + { + OLED_SendCmd(0xB0 + page); // 设置页地址 + OLED_SendCmd(0x00); // 设置列地址低4位 + OLED_SendCmd(0x10); // 设置列地址高4位 + memcpy(sendBuffer + 1, OLED_GRAM[page], OLED_COLUMN); + OLED_Send(sendBuffer, OLED_COLUMN + 1); + } +} + + +/** + * @brief 设置一个像素点 + * @param x 横坐标 + * @param y 纵坐标 + * @param color 颜色 + */ +void OLED_SetPixel(uint8_t x, uint8_t y, OLED_ColorMode color) +{ + if (x >= OLED_COLUMN || y >= OLED_ROW) + return; + if (!color) + { + OLED_GRAM[y / 8][x] |= 1 << (y % 8); + } + else + { + OLED_GRAM[y / 8][x] &= ~(1 << (y % 8)); + } +} + +/** + * @brief 设置显存中一字节数据的某几位 + * @param page 页地址 + * @param column 列地址 + * @param data 数据 + * @param start 起始位 + * @param end 结束位 + * @param color 颜色 + * @note 此函数将显存中的某一字节的第start位到第end位设置为与data相同 + * @note start和end的范围为0-7, start必须小于等于end + * @note 此函数与OLED_SetByte_Fine的区别在于此函数只能设置显存中的某一真实字节 + */ +void OLED_SetByte_Fine(uint8_t page, uint8_t column, uint8_t data, uint8_t start, uint8_t end, OLED_ColorMode color) +{ + static uint8_t temp; + if (page >= OLED_PAGE || column >= OLED_COLUMN) + return; + if (color) + data = ~data; + + temp = data | (0xff << (end + 1)) | (0xff >> (8 - start)); + OLED_GRAM[page][column] &= temp; + temp = data & ~(0xff << (end + 1)) & ~(0xff >> (8 - start)); + OLED_GRAM[page][column] |= temp; + // 使用OLED_SetPixel实现 + // for (uint8_t i = start; i <= end; i++) { + // OLED_SetPixel(column, page * 8 + i, !((data >> i) & 0x01)); + // } +} + +/** + * @brief 设置显存中的一字节数据 + * @param page 页地址 + * @param column 列地址 + * @param data 数据 + * @param color 颜色 + * @note 此函数将显存中的某一字节设置为data的值 + */ +void OLED_SetByte(uint8_t page, uint8_t column, uint8_t data, OLED_ColorMode color) +{ + if (page >= OLED_PAGE || column >= OLED_COLUMN) + return; + if (color) + data = ~data; + OLED_GRAM[page][column] = data; +} + +/** + * @brief 设置显存中的一字节数据的某几位 + * @param x 横坐标 + * @param y 纵坐标 + * @param data 数据 + * @param len 位数 + * @param color 颜色 + * @note 此函数将显存中从(x,y)开始向下数len位设置为与data相同 + * @note len的范围为1-8 + * @note 此函数与OLED_SetByte_Fine的区别在于此函数的横坐标和纵坐标是以像素为单位的, 可能出现跨两个真实字节的情况(跨页) + */ +void OLED_SetBits_Fine(uint8_t x, uint8_t y, uint8_t data, uint8_t len, OLED_ColorMode color) +{ + uint8_t page = y / 8; + uint8_t bit = y % 8; + if (bit + len > 8) + { + OLED_SetByte_Fine(page, x, data << bit, bit, 7, color); + OLED_SetByte_Fine(page + 1, x, data >> (8 - bit), 0, len + bit - 1 - 8, color); + } + else + { + OLED_SetByte_Fine(page, x, data << bit, bit, bit + len - 1, color); + } + // 使用OLED_SetPixel实现 + // for (uint8_t i = 0; i < len; i++) { + // OLED_SetPixel(x, y + i, !((data >> i) & 0x01)); + // } +} + +/** + * @brief 设置显存中一字节长度的数据 + * @param x 横坐标 + * @param y 纵坐标 + * @param data 数据 + * @param color 颜色 + * @note 此函数将显存中从(x,y)开始向下数8位设置为与data相同 + * @note 此函数与OLED_SetByte的区别在于此函数的横坐标和纵坐标是以像素为单位的, 可能出现跨两个真实字节的情况(跨页) + */ +void OLED_SetBits(uint8_t x, uint8_t y, uint8_t data, OLED_ColorMode color) +{ + uint8_t page = y / 8; + uint8_t bit = y % 8; + OLED_SetByte_Fine(page, x, data << bit, bit, 7, color); + if (bit) + { + OLED_SetByte_Fine(page + 1, x, data >> (8 - bit), 0, bit - 1, color); + } +} + +/** + * @brief 设置一块显存区域 + * @param x 起始横坐标 + * @param y 起始纵坐标 + * @param data 数据的起始地址 + * @param w 宽度 + * @param h 高度 + * @param color 颜色 + * @note 此函数将显存中从(x,y)开始的w*h个像素设置为data中的数据 + * @note data的数据应该采用列行式排列 + */ +void OLED_SetBlock(uint8_t x, uint8_t y, const uint8_t *data, uint8_t w, uint8_t h, OLED_ColorMode color) +{ + uint8_t fullRow = h / 8; // 完整的行数 + uint8_t partBit = h % 8; // 不完整的字节中的有效位数 + for (uint8_t i = 0; i < w; i++) + { + for (uint8_t j = 0; j < fullRow; j++) + { + OLED_SetBits(x + i, y + j * 8, data[i + j * w], color); + } + } + if (partBit) + { + uint16_t fullNum = w * fullRow; // 完整的字节数 + for (uint8_t i = 0; i < w; i++) + { + OLED_SetBits_Fine(x + i, y + (fullRow * 8), data[fullNum + i], partBit, color); + } + } + // 使用OLED_SetPixel实现 + // for (uint8_t i = 0; i < w; i++) { + // for (uint8_t j = 0; j < h; j++) { + // for (uint8_t k = 0; k < 8; k++) { + // if (j * 8 + k >= h) break; // 防止越界(不完整的字节 + // OLED_SetPixel(x + i, y + j * 8 + k, !((data[i + j * w] >> k) & 0x01)); + // } + // } + // } +} +/**********************显存操作函数end*************************/ + +// ================================ 文字绘制 ================================ + +/** + * @brief 绘制一个ASCII字符 + * @param x 起始点横坐标 + * @param y 起始点纵坐标 + * @param ch 字符 + * @param font 字体 + * @param color 颜色 + */ +void OLED_PrintASCIIChar(uint8_t x, uint8_t y, char ch, const ASCIIFont *font, OLED_ColorMode color) +{ + OLED_SetBlock(x, y, font->chars + (ch - ' ') * (((font->h + 7) / 8) * font->w), font->w, font->h, color); +} + +/** + * @brief 绘制一个ASCII字符串 + * @param x 起始点横坐标 + * @param y 起始点纵坐标 + * @param str 字符串 + * @param font 字体 + * @param color 颜色 + */ +void OLED_PrintASCIIString(uint8_t x, uint8_t y, char *str, const ASCIIFont *font, OLED_ColorMode color) +{ + uint8_t x0 = x; + while (*str) + { + OLED_PrintASCIIChar(x0, y, *str, font, color); + x0 += font->w; + str++; + } +} + +/** + * @brief 获取UTF-8编码的字符长度 + */ +uint8_t _OLED_GetUTF8Len(char *string) +{ + if ((string[0] & 0x80) == 0x00) + { + return 1; + } + else if ((string[0] & 0xE0) == 0xC0) + { + return 2; + } + else if ((string[0] & 0xF0) == 0xE0) + { + return 3; + } + else if ((string[0] & 0xF8) == 0xF0) + { + return 4; + } + return 0; +} + +/** + * @brief 绘制字符串 + * @param x 起始点横坐标 + * @param y 起始点纵坐标 + * @param str 字符串 + * @param font 字体 + * @param color 颜色 + * + * @note 为保证字符串中的中文会被自动识别并绘制, 需: + * 1. 编译器字符集设置为UTF-8 + * 2. 使用波特律动LED取模工具生成字模(https://led.baud-dance.com) + */ +/** + * @brief 绘制字符串 + * @param x 起始点横坐标 + * @param y 起始点纵坐标 + * @param str 字符串 + * @param font 字体 + * @param color 颜色 + * + * @note 为保证字符串中的中文会被自动识别并绘制, 需: + * 1. 编译器字符集设置为UTF-8 + * 2. 使用波特律动LED取模工具生成字模(https://led.baud-dance.com) + */ +void OLED_PrintString(uint8_t x, uint8_t y, char *str, const Font *font, OLED_ColorMode color) +{ + uint16_t i = 0; // 字符串索引 + uint8_t oneLen = (((font->h + 7) / 8) * font->w) + 4; // 一个字模占多少字节 + uint8_t found; // 是否找到字模 + uint8_t utf8Len; // UTF-8编码长度 + uint8_t *head; // 字模头指针 + while (str[i]) + { + found = 0; + utf8Len = _OLED_GetUTF8Len(str + i); + if (utf8Len == 0) + break; // 有问题的UTF-8编码 + + // 寻找字符 TODO 优化查找算法, 二分查找或者hash + for (uint8_t j = 0; j < font->len; j++) + { + head = (uint8_t *)(font->chars) + (j * oneLen); + if (memcmp(str + i, head, utf8Len) == 0) + { + OLED_SetBlock(x, y, head + 4, font->w, font->h, color); + // 移动光标 + x += font->w; + i += utf8Len; + found = 1; + break; + } + } + + // 若未找到字模,且为ASCII字符, 则缺省显示ASCII字符 + if (found == 0) + { + if (utf8Len == 1) + { + OLED_PrintASCIIChar(x, y, str[i], font->ascii, color); + // 移动光标 + x += font->ascii->w; + i += utf8Len; + } + else + { + OLED_PrintASCIIChar(x, y, ' ', font->ascii, color); + x += font->ascii->w; + i += utf8Len; + } + } + } +} + +void OLED_Act(void) +{ + float v = 0; +// if(it_1000ms_flag == 1) +// { +// it_1000ms_flag = 0; +// HAL_GPIO_TogglePin(LED_NOR_GPIO_Port,LED_NOR_Pin);//功能指示灯 +// } + + //OLED_NewFrame();//清除显存 + + //OLED_PrintASCIIChar(64, 32, '1', &afont16x8, OLED_COLOR_NORMAL); //ASCII单字符示例 + //OLED_PrintASCIIString(64, 32, "123456", &afont16x8, OLED_COLOR_NORMAL); //ASCII字符串示例 + //OLED_PrintString(20,20 , , &afont16x8, OLED_COLOR_NORMAL); + + OLED_PrintASCIIString(30, 0 , "Vol", &afont24x12, OLED_COLOR_NORMAL); +// OLED_ShowPageFrame(0); +// OLED_ShowPageFrame(1); +// OLED_ShowPageFrame(2); + + char str[20]; // +// for(i = 0;i < 15;i++)str[i] = 0x20; +// str[i] = 0x00; +// OLED_PrintASCIIString(30, 32, str, &afont24x12, OLED_COLOR_NORMAL); + + v = tempA; + v /= 10; + sprintf(str, "%.1f",v ); // 将数转换为字符串 + OLED_PrintASCIIString(30, 32, str, &afont24x12, OLED_COLOR_NORMAL); + +// OLED_ShowPageFrame(0); +// OLED_ShowPageFrame(1); +// OLED_ShowPageFrame(2); +// +// OLED_ShowPageFrame(4); +// OLED_ShowPageFrame(5); +// OLED_ShowPageFrame(6); + + + OLED_ShowFrame();//显示当前显存内容 +} + + + + diff --git a/App/Src/serial_port.c b/App/Src/serial_port.c new file mode 100644 index 0000000..ca29586 --- /dev/null +++ b/App/Src/serial_port.c @@ -0,0 +1,94 @@ +#include "serial_port.h" +#include "main.h" +#include "usart.h" +#include "string.h" +#include "app.h" + +// HAL_UART_Transmit( &huartx, &data, timeout )//不带中断,不连续传输 +// HAL_UART_Receive( &huartx, &data, timeout ) +// HAL_UART_Transmit_IT( &huartx, &data, data_size )//带中断,连续传输 +// HAL_UART_Receive_IT( &huartx, &data, data_size ) + +// HAL_SPI_Transmit( &hspix, &data, data_size,timeout )//不带中断,不连续传输 +// HAL_SPI_Receive( &hspix, &data, data_size,timeout ) +// HAL_SPI_Transmit_IT( &hspix, &data, data_size )//带中断,连续传输 +// HAL_SPI_Receive_IT( &hspix, &data, data_size ) + + + +// 使用LP-300-SP的Type-A接口与计算机进行通信 + +char text_r[20] = "empty "; +char text_t[20] = "empty"; +int text_s = 0; + +//单片机与PC进行通信 +//void Tx_RX_UART1(void) +//{ +///***********************单片机状态0******************************/ +// if( text_s == 0 ) +// { +// if( it_1000ms_flag == 1)//0状态下每隔1秒发送一次当前的text_t +// { +// it_1000ms_flag = 0; +// HAL_UART_Transmit_IT( &huart1, (uint8_t*)text_t, 20); +// +// } +// HAL_UART_Receive_IT( &huart1,(uint8_t*)text_r,20);//读 +// if( strncmp( (char*)text_r ,"start", 20 ) == 0 )//收到PC的start信号后,向PC发送"How are you" +// { +// text_s = 1;//单片机状态转为1 +// +// strcpy((char*)text_t," How are you?"); +// HAL_UART_Transmit_IT( &huart1, (uint8_t*)text_t, 20); +// } +// +// +// } +///***********************单片机状态0******************************/ +// +// +///***********************单片机状态1******************************/ +// if( text_s == 1 ) +// { +// HAL_UART_Receive_IT( &huart1,(uint8_t*)text_r,20);//读 +// +// if( strncmp( (char*)text_r ,"3Q", 20 ) == 0 )//收到3Q回复You are welcome +// { +// strcpy((char*)text_t,"You are welcome"); +// HAL_UART_Transmit_IT( &huart1, (uint8_t*)text_t, 20); +// +// } +// +// if( strncmp( (char*)text_r ,"end", 20 ) == 0 )//收到PC的end信号后,向PC发送"See you again" +// { +// strcpy((char*)text_t,"See you again"); +// HAL_UART_Transmit_IT( &huart1, (uint8_t*)text_t, 20); +// +// if( it_1000ms_flag ==1 )//等待1秒后单片机状态转为0 +// { +// it_1000ms_flag = 0; +// text_s = 0; +// } +// } +// } +///***********************单片机状态1******************************/ +//} + + +void uart_test(void) +{ + + if( it_1000ms_flag == 1) + { + it_1000ms_flag = 0; + + //HAL_UART_Receive_IT( &huart1, (uint8_t*)text_r, 20); + + //HAL_UART_Transmit_IT( &huart1, (uint8_t*)text_r, 20); + } + + + +} + diff --git a/App/Src/tmc5160.c b/App/Src/tmc5160.c new file mode 100644 index 0000000..05a8cb5 --- /dev/null +++ b/App/Src/tmc5160.c @@ -0,0 +1,149 @@ +#include "tmc5160.h" +#include "main.h" +#include "gpio.h" +#include "spi.h" +#include "delay.h" + +// CS2置于 “低电平” 使能SPI +// 写的时候高位地址要加上 0x80 +// 手册第5章是寄存器表,5.3.1是斜坡相关寄存器;第11章有实际单位换算表;第20章 图20.3 有运动控制流程图 +// 寄存器 "RAMPMODE"->"0x20" 斜坡运动模式: 0->位置模式;1->速度模式至正VMAMX;2->速度模式至负VMAX;3->速度保持不变,最多使用2位 +// 寄存器 "VSTART"->"0x23" 电机起动速度,最多使用18位,VSTART<=VSTOP +// 寄存器 "A1"->"0x24" VSTART->V1的加速度,最多使用16位 +// 寄存器 "V1"->"0x25" 第一加/减速阶段速度阈值,最多使用20位;取0时禁用A1和D1,仅用AMAX和DMAX +// 寄存器 "AMAX"->"0x26" V1->VMAX的加速度,最多使用16位 +// 寄存器 "DMAX"->"0x28" VMAX->V1的减速度,最多使用16位 +// 寄存器 "VMAX"->"0x27" 斜坡运动目标速度,最多使用23位 +// 寄存器 "D1"->"0x2A" V1->VSTOP的减速度,最多使用16位,不要在位置模式下置0 +// 寄存器 "VSTOP"->"0x2B" 电机停止速度,最多使用18位,VSTART<=VSTOP,位置模式下>=10 + +#define CS2_L HAL_GPIO_WritePin(CS2_GPIO_Port,CS2_Pin,GPIO_PIN_RESET); //CS2低电平 +#define CS2_H HAL_GPIO_WritePin(CS2_GPIO_Port,CS2_Pin,GPIO_PIN_SET); //CS2高电平 + + + +void tmc5160_init() +{ + + // 纯SPI模式 + TMC5160_SPIWriteInt(0x00, 0x0000000C); // writing value 0x0000000C = 12 = 0.0 to address 0 = 0x00(GCONF) 0x00000008 不能移动 会左右抖动 + TMC5160_SPIWriteInt(0x03, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 1 = 0x03(SLAVECONF) + TMC5160_SPIWriteInt(0x05, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 2 = 0x05(X_COMPARE) + TMC5160_SPIWriteInt(0x06, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 3 = 0x06(OTP_PROG) + TMC5160_SPIWriteInt(0x08, 0x0000000E); // writing value 0x00000011 = 17 = 0.0 to address 4 = 0x08(FACTORY_CONF) + TMC5160_SPIWriteInt(0x09, 0x00010606); // writing value 0x00010606 = 67078 = 0.0 to address 5 = 0x09(SHORT_CONF) + TMC5160_SPIWriteInt(0x0A, 0x00080400); // writing value 0x00080400 = 525312 = 0.0 to address 6 = 0x0A(DRV_CONF) + TMC5160_SPIWriteInt(0x0B, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 7 = 0x0B(GLOBAL_SCALER) + // 速度相关的驱动控制寄存器 + TMC5160_SPIWriteInt(0x10, 0x00071405); // writing value 0x00070707 = 460551 = 0.0 to address 8 = 0x10(IHOLD_IRUN) + TMC5160_SPIWriteInt(0x11, 0x0000000A); // writing value 0x0000000A = 10 = 0.0 to address 9 = 0x11(TPOWERDOWN) + TMC5160_SPIWriteInt(0x13, 0x00000010); // writing value 0x00000041 = 65 = 0.0 to address 10 = 0x13(TPWMTHRS) + TMC5160_SPIWriteInt(0x14, 0x00000010); // writing value 0x00004189 = 16777 = 0.0 to address 11 = 0x14(TCOOLTHRS) + TMC5160_SPIWriteInt(0x15, 0x00000010); // writing value 0x00000000 = 0 = 0.0 to address 12 = 0x15(THIGH) + // 斜波发生器运动寄存器 + TMC5160_SPIWriteInt(0x20, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 13 = 0x20(RAMPMODE) + TMC5160_SPIWriteInt(0x21, 0x00000000); // writing value 0xFFCC12F0 = 0 = 0.0 to address 14 = 0x21(XACTUAL) + TMC5160_SPIWriteInt(0x23, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 15 = 0x23(VSTART) + TMC5160_SPIWriteInt(0x24, 0x000003E8); // writing value 0x00001F07 = 7943 = 0.0 to address 16 = 0x24(A1) + TMC5160_SPIWriteInt(0x25, 0x0000C350); // writing value 0x0000C350 = 50000 = 0.0 to address 17 = 0x25(V1) + TMC5160_SPIWriteInt(0x26, 0x00000277); // writing value 0x00004DF1 = 19953 = 0.0 to address 18 = 0x26(AMAX) + TMC5160_SPIWriteInt(0x27, 0x00006220); // writing value 0x0006D3A0 = 447392 = 0.0 to address 19 = 0x27(VMAX) + TMC5160_SPIWriteInt(0x28, 0x000002BC); // writing value 0x00009B83 = 39811 = 0.0 to address 20 = 0x28(DMAX) + TMC5160_SPIWriteInt(0x2A, 0x00000578); // writing value 0x00007B87 = 31623 = 0.0 to address 21 = 0x2A(D1) + TMC5160_SPIWriteInt(0x2B, 0x0000000A); // writing value 0x0000000A = 10 = 0.0 to address 22 = 0x2B(VSTOP) + TMC5160_SPIWriteInt(0x2C, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 23 = 0x2C(TZEROWAIT) + TMC5160_SPIWriteInt(0x2D, 0x00000000); // writing value 0xFFCC12F0 = 0 = 0.0 to address 24 = 0x2D(XTARGET) + + TMC5160_SPIWriteInt(0x33, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 25 = 0x33(VDCMIN) + TMC5160_SPIWriteInt(0x34, 0x00000000); // writing value 0x00000400 = 1024 = 0.0 to address 26 = 0x34(SW_MODE) + // 编码器寄存器 + TMC5160_SPIWriteInt(0x38, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 27 = 0x38(ENCMODE) + TMC5160_SPIWriteInt(0x39, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 28 = 0x39(X_ENC) + TMC5160_SPIWriteInt(0x3A, 0x00010000); // writing value 0x00010000 = 65536 = 0.0 to address 29 = 0x3A(ENC_CONST) + TMC5160_SPIWriteInt(0x3D, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 30 = 0x3D(ENC_DEVIATION) + // 电机驱动寄存器-电机微步控制寄存器 + TMC5160_SPIWriteInt(0x60, 0xAAAAB554); // writing value 0xAAAAB554 = 0 = 0.0 to address 31 = 0x60(MSLUT[0]) + TMC5160_SPIWriteInt(0x61, 0x4A9554AA); // writing value 0x4A9554AA = 1251300522 = 0.0 to address 32 = 0x61(MSLUT[1]) + TMC5160_SPIWriteInt(0x62, 0x24492929); // writing value 0x24492929 = 608774441 = 0.0 to address 33 = 0x62(MSLUT[2]) + TMC5160_SPIWriteInt(0x63, 0x10104222); // writing value 0x10104222 = 269500962 = 0.0 to address 34 = 0x63(MSLUT[3]) + TMC5160_SPIWriteInt(0x64, 0xFBFFFFFF); // writing value 0xFBFFFFFF = 0 = 0.0 to address 35 = 0x64(MSLUT[4]) + TMC5160_SPIWriteInt(0x65, 0xB5BB777D); // writing value 0xB5BB777D = 0 = 0.0 to address 36 = 0x65(MSLUT[5]) + TMC5160_SPIWriteInt(0x66, 0x49295556); // writing value 0x49295556 = 1227445590 = 0.0 to address 37 = 0x66(MSLUT[6]) + TMC5160_SPIWriteInt(0x67, 0x00404222); // writing value 0x00404222 = 4211234 = 0.0 to address 38 = 0x67(MSLUT[7]) + TMC5160_SPIWriteInt(0x68, 0xFFFF8056); // writing value 0xFFFF8056 = 0 = 0.0 to address 39 = 0x68(MSLUTSEL) + TMC5160_SPIWriteInt(0x69, 0x00F70000); // writing value 0x00F70000 = 16187392 = 0.0 to address 40 = 0x69(MSLUTSTART) + // 电机驱动寄存器-驱动寄存器组 + TMC5160_SPIWriteInt(0x6C, 0x04410153); // writing value 0x00410153 = 4260179 = 0.0 to address 41 = 0x6C(CHOPCONF) + TMC5160_SPIWriteInt(0x6D, 0x00000000); // writing value 0x00030000 = 196608 = 0.0 to address 42 = 0x6D(COOLCONF) + TMC5160_SPIWriteInt(0x6E, 0x00000000); // writing value 0x00000000 = 0 = 0.0 to address 43 = 0x6E(DCCTRL) + TMC5160_SPIWriteInt(0x70, 0xC40C001E); // writing value 0xC40C001E = 0 = 0.0 to address 44 = 0x70(PWMCONF) + +} + + + +uint8_t data_t[5];//存放发送8bit*5的数据 +void TMC5160_SPIWriteInt(uint8_t addr, uint32_t data)//将40位数据转换成5组8位数据并向电机发送 +{ + CS2_L; + delay_ns(10); + + data_t[0] = addr | 0x80; //前8位为地址,写命令时需要加上0x80 + int i; + for(i=1;i<5;i++) //后32位为数据 + { + data_t[i] = (uint8_t)( data >> (32 - 8 * i) ); //32bit数据转换成8bit*4个 + } + + + HAL_SPI_Transmit_IT(&hspi2, data_t, 5); + + + CS2_H; + delay_ns(10); +} + +uint8_t data_r[5];//存放接收的8bit数据 +void TMC5160_SPIReadInt(uint8_t addr)//从电机读取数据,先发送读请求,再接收数据 +{ + CS2_L; + delay_ns(10); + + data_t[0] = addr & 0x7f; //前8位为地址 + int i; + for(i=1;i<5;i++) //后32位为数据,读访问时置零 + { + data_t[i] = 0; + } + + + HAL_SPI_Transmit_IT(&hspi2, data_t, 5); //发送读取addr地址的请求,如果前一次访问是读访问,则传输回来的数据是前一个数据报一起传输的地址对应的读取值 + + HAL_SPI_Transmit_IT(&hspi2, data_t, 5); //发两次才能读到上次操作的数据 + + HAL_SPI_Receive_IT(&hspi2, data_r, 5); //接收数据 + + CS2_H; + delay_ns(10); + +} + + +uint8_t data_r4 = 0; //用于观测读取到的地址 +uint32_t data_r32 = 0;//用于观测读取到的数据 +void tmc5160_act() +{ + + //TMC5160_SPIWriteInt(0x21,0x00000000); //XACTUAL = 0 实际位置归零 + //TMC5160_SPIWriteInt(0x2D,0x0000C800); //XTARGET = 51200 转动一圈 + + TMC5160_SPIWriteInt(0x20,0x00000001); + + TMC5160_SPIReadInt(0x20); + + data_r4 = data_r[0]; + data_r32 = (data_r[1]<<24)+(data_r[2]<<16)+(data_r[3]<<8)+data_r[4]; +// TMC5160_SPIWriteInt(0x20,0x00000001);//RAMPMODE = 1 速度模式至+VMAX + +} + diff --git a/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_spi.h b/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_spi.h new file mode 100644 index 0000000..37e00b1 --- /dev/null +++ b/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_spi.h @@ -0,0 +1,1936 @@ +/** + ****************************************************************************** + * @file stm32f1xx_ll_spi.h + * @author MCD Application Team + * @brief Header file of SPI LL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F1xx_LL_SPI_H +#define STM32F1xx_LL_SPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.h" + +/** @addtogroup STM32F1xx_LL_Driver + * @{ + */ + +#if defined (SPI1) || defined (SPI2) || defined (SPI3) + +/** @defgroup SPI_LL SPI + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup SPI_LL_ES_INIT SPI Exported Init structure + * @{ + */ + +/** + * @brief SPI Init structures definition + */ +typedef struct +{ + uint32_t TransferDirection; /*!< Specifies the SPI unidirectional or bidirectional data mode. + This parameter can be a value of @ref SPI_LL_EC_TRANSFER_MODE. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetTransferDirection().*/ + + uint32_t Mode; /*!< Specifies the SPI mode (Master/Slave). + This parameter can be a value of @ref SPI_LL_EC_MODE. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetMode().*/ + + uint32_t DataWidth; /*!< Specifies the SPI data width. + This parameter can be a value of @ref SPI_LL_EC_DATAWIDTH. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetDataWidth().*/ + + uint32_t ClockPolarity; /*!< Specifies the serial clock steady state. + This parameter can be a value of @ref SPI_LL_EC_POLARITY. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetClockPolarity().*/ + + uint32_t ClockPhase; /*!< Specifies the clock active edge for the bit capture. + This parameter can be a value of @ref SPI_LL_EC_PHASE. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetClockPhase().*/ + + uint32_t NSS; /*!< Specifies whether the NSS signal is managed by hardware (NSS pin) or by software using the SSI bit. + This parameter can be a value of @ref SPI_LL_EC_NSS_MODE. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetNSSMode().*/ + + uint32_t BaudRate; /*!< Specifies the BaudRate prescaler value which will be used to configure the transmit and receive SCK clock. + This parameter can be a value of @ref SPI_LL_EC_BAUDRATEPRESCALER. + @note The communication clock is derived from the master clock. The slave clock does not need to be set. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetBaudRatePrescaler().*/ + + uint32_t BitOrder; /*!< Specifies whether data transfers start from MSB or LSB bit. + This parameter can be a value of @ref SPI_LL_EC_BIT_ORDER. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetTransferBitOrder().*/ + + uint32_t CRCCalculation; /*!< Specifies if the CRC calculation is enabled or not. + This parameter can be a value of @ref SPI_LL_EC_CRC_CALCULATION. + + This feature can be modified afterwards using unitary functions @ref LL_SPI_EnableCRC() and @ref LL_SPI_DisableCRC().*/ + + uint32_t CRCPoly; /*!< Specifies the polynomial used for the CRC calculation. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetCRCPolynomial().*/ + +} LL_SPI_InitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup SPI_LL_Exported_Constants SPI Exported Constants + * @{ + */ + +/** @defgroup SPI_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_SPI_ReadReg function + * @{ + */ +#define LL_SPI_SR_RXNE SPI_SR_RXNE /*!< Rx buffer not empty flag */ +#define LL_SPI_SR_TXE SPI_SR_TXE /*!< Tx buffer empty flag */ +#define LL_SPI_SR_BSY SPI_SR_BSY /*!< Busy flag */ +#define LL_SPI_SR_CRCERR SPI_SR_CRCERR /*!< CRC error flag */ +#define LL_SPI_SR_MODF SPI_SR_MODF /*!< Mode fault flag */ +#define LL_SPI_SR_OVR SPI_SR_OVR /*!< Overrun flag */ +#define LL_SPI_SR_FRE SPI_SR_FRE /*!< TI mode frame format error flag */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions + * @{ + */ +#define LL_SPI_CR2_RXNEIE SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ +#define LL_SPI_CR2_TXEIE SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ +#define LL_SPI_CR2_ERRIE SPI_CR2_ERRIE /*!< Error interrupt enable */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_MODE Operation Mode + * @{ + */ +#define LL_SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) /*!< Master configuration */ +#define LL_SPI_MODE_SLAVE 0x00000000U /*!< Slave configuration */ +/** + * @} + */ + + +/** @defgroup SPI_LL_EC_PHASE Clock Phase + * @{ + */ +#define LL_SPI_PHASE_1EDGE 0x00000000U /*!< First clock transition is the first data capture edge */ +#define LL_SPI_PHASE_2EDGE (SPI_CR1_CPHA) /*!< Second clock transition is the first data capture edge */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_POLARITY Clock Polarity + * @{ + */ +#define LL_SPI_POLARITY_LOW 0x00000000U /*!< Clock to 0 when idle */ +#define LL_SPI_POLARITY_HIGH (SPI_CR1_CPOL) /*!< Clock to 1 when idle */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_BAUDRATEPRESCALER Baud Rate Prescaler + * @{ + */ +#define LL_SPI_BAUDRATEPRESCALER_DIV2 0x00000000U /*!< BaudRate control equal to fPCLK/2 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV4 (SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/4 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV8 (SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/8 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV16 (SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/16 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV32 (SPI_CR1_BR_2) /*!< BaudRate control equal to fPCLK/32 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV64 (SPI_CR1_BR_2 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/64 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV128 (SPI_CR1_BR_2 | SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/128 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV256 (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/256 */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_BIT_ORDER Transmission Bit Order + * @{ + */ +#define LL_SPI_LSB_FIRST (SPI_CR1_LSBFIRST) /*!< Data is transmitted/received with the LSB first */ +#define LL_SPI_MSB_FIRST 0x00000000U /*!< Data is transmitted/received with the MSB first */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_TRANSFER_MODE Transfer Mode + * @{ + */ +#define LL_SPI_FULL_DUPLEX 0x00000000U /*!< Full-Duplex mode. Rx and Tx transfer on 2 lines */ +#define LL_SPI_SIMPLEX_RX (SPI_CR1_RXONLY) /*!< Simplex Rx mode. Rx transfer only on 1 line */ +#define LL_SPI_HALF_DUPLEX_RX (SPI_CR1_BIDIMODE) /*!< Half-Duplex Rx mode. Rx transfer on 1 line */ +#define LL_SPI_HALF_DUPLEX_TX (SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE) /*!< Half-Duplex Tx mode. Tx transfer on 1 line */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_NSS_MODE Slave Select Pin Mode + * @{ + */ +#define LL_SPI_NSS_SOFT (SPI_CR1_SSM) /*!< NSS managed internally. NSS pin not used and free */ +#define LL_SPI_NSS_HARD_INPUT 0x00000000U /*!< NSS pin used in Input. Only used in Master mode */ +#define LL_SPI_NSS_HARD_OUTPUT (((uint32_t)SPI_CR2_SSOE << 16U)) /*!< NSS pin used in Output. Only used in Slave mode as chip select */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_DATAWIDTH Datawidth + * @{ + */ +#define LL_SPI_DATAWIDTH_8BIT 0x00000000U /*!< Data length for SPI transfer: 8 bits */ +#define LL_SPI_DATAWIDTH_16BIT (SPI_CR1_DFF) /*!< Data length for SPI transfer: 16 bits */ +/** + * @} + */ +#if defined(USE_FULL_LL_DRIVER) + +/** @defgroup SPI_LL_EC_CRC_CALCULATION CRC Calculation + * @{ + */ +#define LL_SPI_CRCCALCULATION_DISABLE 0x00000000U /*!< CRC calculation disabled */ +#define LL_SPI_CRCCALCULATION_ENABLE (SPI_CR1_CRCEN) /*!< CRC calculation enabled */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup SPI_LL_Exported_Macros SPI Exported Macros + * @{ + */ + +/** @defgroup SPI_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in SPI register + * @param __INSTANCE__ SPI Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_SPI_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in SPI register + * @param __INSTANCE__ SPI Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_SPI_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup SPI_LL_Exported_Functions SPI Exported Functions + * @{ + */ + +/** @defgroup SPI_LL_EF_Configuration Configuration + * @{ + */ + +/** + * @brief Enable SPI peripheral + * @rmtoll CR1 SPE LL_SPI_Enable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_Enable(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR1, SPI_CR1_SPE); +} + +/** + * @brief Disable SPI peripheral + * @note When disabling the SPI, follow the procedure described in the Reference Manual. + * @rmtoll CR1 SPE LL_SPI_Disable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_Disable(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); +} + +/** + * @brief Check if SPI peripheral is enabled + * @rmtoll CR1 SPE LL_SPI_IsEnabled + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabled(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR1, SPI_CR1_SPE) == (SPI_CR1_SPE)) ? 1UL : 0UL); +} + +/** + * @brief Set SPI operation mode to Master or Slave + * @note This bit should not be changed when communication is ongoing. + * @rmtoll CR1 MSTR LL_SPI_SetMode\n + * CR1 SSI LL_SPI_SetMode + * @param SPIx SPI Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_SPI_MODE_MASTER + * @arg @ref LL_SPI_MODE_SLAVE + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetMode(SPI_TypeDef *SPIx, uint32_t Mode) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI, Mode); +} + +/** + * @brief Get SPI operation mode (Master or Slave) + * @rmtoll CR1 MSTR LL_SPI_GetMode\n + * CR1 SSI LL_SPI_GetMode + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_MODE_MASTER + * @arg @ref LL_SPI_MODE_SLAVE + */ +__STATIC_INLINE uint32_t LL_SPI_GetMode(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI)); +} + + +/** + * @brief Set clock phase + * @note This bit should not be changed when communication is ongoing. + * This bit is not used in SPI TI mode. + * @rmtoll CR1 CPHA LL_SPI_SetClockPhase + * @param SPIx SPI Instance + * @param ClockPhase This parameter can be one of the following values: + * @arg @ref LL_SPI_PHASE_1EDGE + * @arg @ref LL_SPI_PHASE_2EDGE + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetClockPhase(SPI_TypeDef *SPIx, uint32_t ClockPhase) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_CPHA, ClockPhase); +} + +/** + * @brief Get clock phase + * @rmtoll CR1 CPHA LL_SPI_GetClockPhase + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_PHASE_1EDGE + * @arg @ref LL_SPI_PHASE_2EDGE + */ +__STATIC_INLINE uint32_t LL_SPI_GetClockPhase(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPHA)); +} + +/** + * @brief Set clock polarity + * @note This bit should not be changed when communication is ongoing. + * This bit is not used in SPI TI mode. + * @rmtoll CR1 CPOL LL_SPI_SetClockPolarity + * @param SPIx SPI Instance + * @param ClockPolarity This parameter can be one of the following values: + * @arg @ref LL_SPI_POLARITY_LOW + * @arg @ref LL_SPI_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_CPOL, ClockPolarity); +} + +/** + * @brief Get clock polarity + * @rmtoll CR1 CPOL LL_SPI_GetClockPolarity + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_POLARITY_LOW + * @arg @ref LL_SPI_POLARITY_HIGH + */ +__STATIC_INLINE uint32_t LL_SPI_GetClockPolarity(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPOL)); +} + +/** + * @brief Set baud rate prescaler + * @note These bits should not be changed when communication is ongoing. SPI BaudRate = fPCLK/Prescaler. + * @rmtoll CR1 BR LL_SPI_SetBaudRatePrescaler + * @param SPIx SPI Instance + * @param BaudRate This parameter can be one of the following values: + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetBaudRatePrescaler(SPI_TypeDef *SPIx, uint32_t BaudRate) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_BR, BaudRate); +} + +/** + * @brief Get baud rate prescaler + * @rmtoll CR1 BR LL_SPI_GetBaudRatePrescaler + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 + */ +__STATIC_INLINE uint32_t LL_SPI_GetBaudRatePrescaler(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_BR)); +} + +/** + * @brief Set transfer bit order + * @note This bit should not be changed when communication is ongoing. This bit is not used in SPI TI mode. + * @rmtoll CR1 LSBFIRST LL_SPI_SetTransferBitOrder + * @param SPIx SPI Instance + * @param BitOrder This parameter can be one of the following values: + * @arg @ref LL_SPI_LSB_FIRST + * @arg @ref LL_SPI_MSB_FIRST + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetTransferBitOrder(SPI_TypeDef *SPIx, uint32_t BitOrder) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_LSBFIRST, BitOrder); +} + +/** + * @brief Get transfer bit order + * @rmtoll CR1 LSBFIRST LL_SPI_GetTransferBitOrder + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_LSB_FIRST + * @arg @ref LL_SPI_MSB_FIRST + */ +__STATIC_INLINE uint32_t LL_SPI_GetTransferBitOrder(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_LSBFIRST)); +} + +/** + * @brief Set transfer direction mode + * @note For Half-Duplex mode, Rx Direction is set by default. + * In master mode, the MOSI pin is used and in slave mode, the MISO pin is used for Half-Duplex. + * @rmtoll CR1 RXONLY LL_SPI_SetTransferDirection\n + * CR1 BIDIMODE LL_SPI_SetTransferDirection\n + * CR1 BIDIOE LL_SPI_SetTransferDirection + * @param SPIx SPI Instance + * @param TransferDirection This parameter can be one of the following values: + * @arg @ref LL_SPI_FULL_DUPLEX + * @arg @ref LL_SPI_SIMPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_TX + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetTransferDirection(SPI_TypeDef *SPIx, uint32_t TransferDirection) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE, TransferDirection); +} + +/** + * @brief Get transfer direction mode + * @rmtoll CR1 RXONLY LL_SPI_GetTransferDirection\n + * CR1 BIDIMODE LL_SPI_GetTransferDirection\n + * CR1 BIDIOE LL_SPI_GetTransferDirection + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_FULL_DUPLEX + * @arg @ref LL_SPI_SIMPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_TX + */ +__STATIC_INLINE uint32_t LL_SPI_GetTransferDirection(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE)); +} + +/** + * @brief Set frame data width + * @rmtoll CR1 DFF LL_SPI_SetDataWidth + * @param SPIx SPI Instance + * @param DataWidth This parameter can be one of the following values: + * @arg @ref LL_SPI_DATAWIDTH_8BIT + * @arg @ref LL_SPI_DATAWIDTH_16BIT + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetDataWidth(SPI_TypeDef *SPIx, uint32_t DataWidth) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_DFF, DataWidth); +} + +/** + * @brief Get frame data width + * @rmtoll CR1 DFF LL_SPI_GetDataWidth + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_DATAWIDTH_8BIT + * @arg @ref LL_SPI_DATAWIDTH_16BIT + */ +__STATIC_INLINE uint32_t LL_SPI_GetDataWidth(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_DFF)); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_CRC_Management CRC Management + * @{ + */ + +/** + * @brief Enable CRC + * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. + * @rmtoll CR1 CRCEN LL_SPI_EnableCRC + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableCRC(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR1, SPI_CR1_CRCEN); +} + +/** + * @brief Disable CRC + * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. + * @rmtoll CR1 CRCEN LL_SPI_DisableCRC + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableCRC(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR1, SPI_CR1_CRCEN); +} + +/** + * @brief Check if CRC is enabled + * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. + * @rmtoll CR1 CRCEN LL_SPI_IsEnabledCRC + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledCRC(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR1, SPI_CR1_CRCEN) == (SPI_CR1_CRCEN)) ? 1UL : 0UL); +} + +/** + * @brief Set CRCNext to transfer CRC on the line + * @note This bit has to be written as soon as the last data is written in the SPIx_DR register. + * @rmtoll CR1 CRCNEXT LL_SPI_SetCRCNext + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetCRCNext(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR1, SPI_CR1_CRCNEXT); +} + +/** + * @brief Set polynomial for CRC calculation + * @rmtoll CRCPR CRCPOLY LL_SPI_SetCRCPolynomial + * @param SPIx SPI Instance + * @param CRCPoly This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetCRCPolynomial(SPI_TypeDef *SPIx, uint32_t CRCPoly) +{ + WRITE_REG(SPIx->CRCPR, (uint16_t)CRCPoly); +} + +/** + * @brief Get polynomial for CRC calculation + * @rmtoll CRCPR CRCPOLY LL_SPI_GetCRCPolynomial + * @param SPIx SPI Instance + * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF + */ +__STATIC_INLINE uint32_t LL_SPI_GetCRCPolynomial(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_REG(SPIx->CRCPR)); +} + +/** + * @brief Get Rx CRC + * @rmtoll RXCRCR RXCRC LL_SPI_GetRxCRC + * @param SPIx SPI Instance + * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF + */ +__STATIC_INLINE uint32_t LL_SPI_GetRxCRC(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_REG(SPIx->RXCRCR)); +} + +/** + * @brief Get Tx CRC + * @rmtoll TXCRCR TXCRC LL_SPI_GetTxCRC + * @param SPIx SPI Instance + * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF + */ +__STATIC_INLINE uint32_t LL_SPI_GetTxCRC(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_REG(SPIx->TXCRCR)); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_NSS_Management Slave Select Pin Management + * @{ + */ + +/** + * @brief Set NSS mode + * @note LL_SPI_NSS_SOFT Mode is not used in SPI TI mode. + * @rmtoll CR1 SSM LL_SPI_SetNSSMode\n + * @rmtoll CR2 SSOE LL_SPI_SetNSSMode + * @param SPIx SPI Instance + * @param NSS This parameter can be one of the following values: + * @arg @ref LL_SPI_NSS_SOFT + * @arg @ref LL_SPI_NSS_HARD_INPUT + * @arg @ref LL_SPI_NSS_HARD_OUTPUT + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetNSSMode(SPI_TypeDef *SPIx, uint32_t NSS) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_SSM, NSS); + MODIFY_REG(SPIx->CR2, SPI_CR2_SSOE, ((uint32_t)(NSS >> 16U))); +} + +/** + * @brief Get NSS mode + * @rmtoll CR1 SSM LL_SPI_GetNSSMode\n + * @rmtoll CR2 SSOE LL_SPI_GetNSSMode + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_NSS_SOFT + * @arg @ref LL_SPI_NSS_HARD_INPUT + * @arg @ref LL_SPI_NSS_HARD_OUTPUT + */ +__STATIC_INLINE uint32_t LL_SPI_GetNSSMode(SPI_TypeDef *SPIx) +{ + uint32_t Ssm = (READ_BIT(SPIx->CR1, SPI_CR1_SSM)); + uint32_t Ssoe = (READ_BIT(SPIx->CR2, SPI_CR2_SSOE) << 16U); + return (Ssm | Ssoe); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_FLAG_Management FLAG Management + * @{ + */ + +/** + * @brief Check if Rx buffer is not empty + * @rmtoll SR RXNE LL_SPI_IsActiveFlag_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_RXNE(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_RXNE) == (SPI_SR_RXNE)) ? 1UL : 0UL); +} + +/** + * @brief Check if Tx buffer is empty + * @rmtoll SR TXE LL_SPI_IsActiveFlag_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_TXE(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_TXE) == (SPI_SR_TXE)) ? 1UL : 0UL); +} + +/** + * @brief Get CRC error flag + * @rmtoll SR CRCERR LL_SPI_IsActiveFlag_CRCERR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_CRCERR(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_CRCERR) == (SPI_SR_CRCERR)) ? 1UL : 0UL); +} + +/** + * @brief Get mode fault error flag + * @rmtoll SR MODF LL_SPI_IsActiveFlag_MODF + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_MODF(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_MODF) == (SPI_SR_MODF)) ? 1UL : 0UL); +} + +/** + * @brief Get overrun error flag + * @rmtoll SR OVR LL_SPI_IsActiveFlag_OVR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_OVR(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_OVR) == (SPI_SR_OVR)) ? 1UL : 0UL); +} + +/** + * @brief Get busy flag + * @note The BSY flag is cleared under any one of the following conditions: + * -When the SPI is correctly disabled + * -When a fault is detected in Master mode (MODF bit set to 1) + * -In Master mode, when it finishes a data transmission and no new data is ready to be + * sent + * -In Slave mode, when the BSY flag is set to '0' for at least one SPI clock cycle between + * each data transfer. + * @rmtoll SR BSY LL_SPI_IsActiveFlag_BSY + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_BSY(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_BSY) == (SPI_SR_BSY)) ? 1UL : 0UL); +} + + +/** + * @brief Clear CRC error flag + * @rmtoll SR CRCERR LL_SPI_ClearFlag_CRCERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_CRCERR(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->SR, SPI_SR_CRCERR); +} + +/** + * @brief Clear mode fault error flag + * @note Clearing this flag is done by a read access to the SPIx_SR + * register followed by a write access to the SPIx_CR1 register + * @rmtoll SR MODF LL_SPI_ClearFlag_MODF + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_MODF(SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg_sr; + tmpreg_sr = SPIx->SR; + (void) tmpreg_sr; + CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); +} + +/** + * @brief Clear overrun error flag + * @note Clearing this flag is done by a read access to the SPIx_DR + * register followed by a read access to the SPIx_SR register + * @rmtoll SR OVR LL_SPI_ClearFlag_OVR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_OVR(SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg; + tmpreg = SPIx->DR; + (void) tmpreg; + tmpreg = SPIx->SR; + (void) tmpreg; +} + +/** + * @brief Clear frame format error flag + * @note Clearing this flag is done by reading SPIx_SR register + * @rmtoll SR FRE LL_SPI_ClearFlag_FRE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_FRE(SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg; + tmpreg = SPIx->SR; + (void) tmpreg; +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_IT_Management Interrupt Management + * @{ + */ + +/** + * @brief Enable error interrupt + * @note This bit controls the generation of an interrupt when an error condition occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). + * @rmtoll CR2 ERRIE LL_SPI_EnableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableIT_ERR(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_ERRIE); +} + +/** + * @brief Enable Rx buffer not empty interrupt + * @rmtoll CR2 RXNEIE LL_SPI_EnableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableIT_RXNE(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_RXNEIE); +} + +/** + * @brief Enable Tx buffer empty interrupt + * @rmtoll CR2 TXEIE LL_SPI_EnableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableIT_TXE(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_TXEIE); +} + +/** + * @brief Disable error interrupt + * @note This bit controls the generation of an interrupt when an error condition occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). + * @rmtoll CR2 ERRIE LL_SPI_DisableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableIT_ERR(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_ERRIE); +} + +/** + * @brief Disable Rx buffer not empty interrupt + * @rmtoll CR2 RXNEIE LL_SPI_DisableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableIT_RXNE(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_RXNEIE); +} + +/** + * @brief Disable Tx buffer empty interrupt + * @rmtoll CR2 TXEIE LL_SPI_DisableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableIT_TXE(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_TXEIE); +} + +/** + * @brief Check if error interrupt is enabled + * @rmtoll CR2 ERRIE LL_SPI_IsEnabledIT_ERR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_ERR(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR2, SPI_CR2_ERRIE) == (SPI_CR2_ERRIE)) ? 1UL : 0UL); +} + +/** + * @brief Check if Rx buffer not empty interrupt is enabled + * @rmtoll CR2 RXNEIE LL_SPI_IsEnabledIT_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_RXNE(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR2, SPI_CR2_RXNEIE) == (SPI_CR2_RXNEIE)) ? 1UL : 0UL); +} + +/** + * @brief Check if Tx buffer empty interrupt + * @rmtoll CR2 TXEIE LL_SPI_IsEnabledIT_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_TXE(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR2, SPI_CR2_TXEIE) == (SPI_CR2_TXEIE)) ? 1UL : 0UL); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_DMA_Management DMA Management + * @{ + */ + +/** + * @brief Enable DMA Rx + * @rmtoll CR2 RXDMAEN LL_SPI_EnableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableDMAReq_RX(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); +} + +/** + * @brief Disable DMA Rx + * @rmtoll CR2 RXDMAEN LL_SPI_DisableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableDMAReq_RX(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); +} + +/** + * @brief Check if DMA Rx is enabled + * @rmtoll CR2 RXDMAEN LL_SPI_IsEnabledDMAReq_RX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_RX(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR2, SPI_CR2_RXDMAEN) == (SPI_CR2_RXDMAEN)) ? 1UL : 0UL); +} + +/** + * @brief Enable DMA Tx + * @rmtoll CR2 TXDMAEN LL_SPI_EnableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableDMAReq_TX(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); +} + +/** + * @brief Disable DMA Tx + * @rmtoll CR2 TXDMAEN LL_SPI_DisableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableDMAReq_TX(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); +} + +/** + * @brief Check if DMA Tx is enabled + * @rmtoll CR2 TXDMAEN LL_SPI_IsEnabledDMAReq_TX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_TX(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR2, SPI_CR2_TXDMAEN) == (SPI_CR2_TXDMAEN)) ? 1UL : 0UL); +} + +/** + * @brief Get the data register address used for DMA transfer + * @rmtoll DR DR LL_SPI_DMA_GetRegAddr + * @param SPIx SPI Instance + * @retval Address of data register + */ +__STATIC_INLINE uint32_t LL_SPI_DMA_GetRegAddr(SPI_TypeDef *SPIx) +{ + return (uint32_t) &(SPIx->DR); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_DATA_Management DATA Management + * @{ + */ + +/** + * @brief Read 8-Bits in the data register + * @rmtoll DR DR LL_SPI_ReceiveData8 + * @param SPIx SPI Instance + * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint8_t LL_SPI_ReceiveData8(SPI_TypeDef *SPIx) +{ + return (*((__IO uint8_t *)&SPIx->DR)); +} + +/** + * @brief Read 16-Bits in the data register + * @rmtoll DR DR LL_SPI_ReceiveData16 + * @param SPIx SPI Instance + * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint16_t LL_SPI_ReceiveData16(SPI_TypeDef *SPIx) +{ + return (uint16_t)(READ_REG(SPIx->DR)); +} + +/** + * @brief Write 8-Bits in the data register + * @rmtoll DR DR LL_SPI_TransmitData8 + * @param SPIx SPI Instance + * @param TxData Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_SPI_TransmitData8(SPI_TypeDef *SPIx, uint8_t TxData) +{ +#if defined (__GNUC__) + __IO uint8_t *spidr = ((__IO uint8_t *)&SPIx->DR); + *spidr = TxData; +#else + *((__IO uint8_t *)&SPIx->DR) = TxData; +#endif /* __GNUC__ */ +} + +/** + * @brief Write 16-Bits in the data register + * @rmtoll DR DR LL_SPI_TransmitData16 + * @param SPIx SPI Instance + * @param TxData Value between Min_Data=0x00 and Max_Data=0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_SPI_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) +{ +#if defined (__GNUC__) + __IO uint16_t *spidr = ((__IO uint16_t *)&SPIx->DR); + *spidr = TxData; +#else + SPIx->DR = TxData; +#endif /* __GNUC__ */ +} + +/** + * @} + */ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup SPI_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_SPI_DeInit(SPI_TypeDef *SPIx); +ErrorStatus LL_SPI_Init(SPI_TypeDef *SPIx, LL_SPI_InitTypeDef *SPI_InitStruct); +void LL_SPI_StructInit(LL_SPI_InitTypeDef *SPI_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ +/** + * @} + */ + +/** + * @} + */ + +#if defined(SPI_I2S_SUPPORT) +/** @defgroup I2S_LL I2S + * @{ + */ + +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2S_LL_ES_INIT I2S Exported Init structure + * @{ + */ + +/** + * @brief I2S Init structure definition + */ + +typedef struct +{ + uint32_t Mode; /*!< Specifies the I2S operating mode. + This parameter can be a value of @ref I2S_LL_EC_MODE + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetTransferMode().*/ + + uint32_t Standard; /*!< Specifies the standard used for the I2S communication. + This parameter can be a value of @ref I2S_LL_EC_STANDARD + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetStandard().*/ + + + uint32_t DataFormat; /*!< Specifies the data format for the I2S communication. + This parameter can be a value of @ref I2S_LL_EC_DATA_FORMAT + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetDataFormat().*/ + + + uint32_t MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. + This parameter can be a value of @ref I2S_LL_EC_MCLK_OUTPUT + + This feature can be modified afterwards using unitary functions @ref LL_I2S_EnableMasterClock() or @ref LL_I2S_DisableMasterClock.*/ + + + uint32_t AudioFreq; /*!< Specifies the frequency selected for the I2S communication. + This parameter can be a value of @ref I2S_LL_EC_AUDIO_FREQ + + Audio Frequency can be modified afterwards using Reference manual formulas to calculate Prescaler Linear, Parity + and unitary functions @ref LL_I2S_SetPrescalerLinear() and @ref LL_I2S_SetPrescalerParity() to set it.*/ + + + uint32_t ClockPolarity; /*!< Specifies the idle state of the I2S clock. + This parameter can be a value of @ref I2S_LL_EC_POLARITY + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetClockPolarity().*/ + +} LL_I2S_InitTypeDef; + +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup I2S_LL_Exported_Constants I2S Exported Constants + * @{ + */ + +/** @defgroup I2S_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_I2S_ReadReg function + * @{ + */ +#define LL_I2S_SR_RXNE LL_SPI_SR_RXNE /*!< Rx buffer not empty flag */ +#define LL_I2S_SR_TXE LL_SPI_SR_TXE /*!< Tx buffer empty flag */ +#define LL_I2S_SR_BSY LL_SPI_SR_BSY /*!< Busy flag */ +#define LL_I2S_SR_UDR SPI_SR_UDR /*!< Underrun flag */ +#define LL_I2S_SR_OVR LL_SPI_SR_OVR /*!< Overrun flag */ +#define LL_I2S_SR_FRE LL_SPI_SR_FRE /*!< TI mode frame format error flag */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions + * @{ + */ +#define LL_I2S_CR2_RXNEIE LL_SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ +#define LL_I2S_CR2_TXEIE LL_SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ +#define LL_I2S_CR2_ERRIE LL_SPI_CR2_ERRIE /*!< Error interrupt enable */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_DATA_FORMAT Data format + * @{ + */ +#define LL_I2S_DATAFORMAT_16B 0x00000000U /*!< Data length 16 bits, Channel length 16bit */ +#define LL_I2S_DATAFORMAT_16B_EXTENDED (SPI_I2SCFGR_CHLEN) /*!< Data length 16 bits, Channel length 32bit */ +#define LL_I2S_DATAFORMAT_24B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_0) /*!< Data length 24 bits, Channel length 32bit */ +#define LL_I2S_DATAFORMAT_32B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_1) /*!< Data length 16 bits, Channel length 32bit */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_POLARITY Clock Polarity + * @{ + */ +#define LL_I2S_POLARITY_LOW 0x00000000U /*!< Clock steady state is low level */ +#define LL_I2S_POLARITY_HIGH (SPI_I2SCFGR_CKPOL) /*!< Clock steady state is high level */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_STANDARD I2s Standard + * @{ + */ +#define LL_I2S_STANDARD_PHILIPS 0x00000000U /*!< I2S standard philips */ +#define LL_I2S_STANDARD_MSB (SPI_I2SCFGR_I2SSTD_0) /*!< MSB justified standard (left justified) */ +#define LL_I2S_STANDARD_LSB (SPI_I2SCFGR_I2SSTD_1) /*!< LSB justified standard (right justified) */ +#define LL_I2S_STANDARD_PCM_SHORT (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1) /*!< PCM standard, short frame synchronization */ +#define LL_I2S_STANDARD_PCM_LONG (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1 | SPI_I2SCFGR_PCMSYNC) /*!< PCM standard, long frame synchronization */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_MODE Operation Mode + * @{ + */ +#define LL_I2S_MODE_SLAVE_TX 0x00000000U /*!< Slave Tx configuration */ +#define LL_I2S_MODE_SLAVE_RX (SPI_I2SCFGR_I2SCFG_0) /*!< Slave Rx configuration */ +#define LL_I2S_MODE_MASTER_TX (SPI_I2SCFGR_I2SCFG_1) /*!< Master Tx configuration */ +#define LL_I2S_MODE_MASTER_RX (SPI_I2SCFGR_I2SCFG_0 | SPI_I2SCFGR_I2SCFG_1) /*!< Master Rx configuration */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_PRESCALER_FACTOR Prescaler Factor + * @{ + */ +#define LL_I2S_PRESCALER_PARITY_EVEN 0x00000000U /*!< Odd factor: Real divider value is = I2SDIV * 2 */ +#define LL_I2S_PRESCALER_PARITY_ODD (SPI_I2SPR_ODD >> 8U) /*!< Odd factor: Real divider value is = (I2SDIV * 2)+1 */ +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) + +/** @defgroup I2S_LL_EC_MCLK_OUTPUT MCLK Output + * @{ + */ +#define LL_I2S_MCLK_OUTPUT_DISABLE 0x00000000U /*!< Master clock output is disabled */ +#define LL_I2S_MCLK_OUTPUT_ENABLE (SPI_I2SPR_MCKOE) /*!< Master clock output is enabled */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_AUDIO_FREQ Audio Frequency + * @{ + */ + +#define LL_I2S_AUDIOFREQ_192K 192000U /*!< Audio Frequency configuration 192000 Hz */ +#define LL_I2S_AUDIOFREQ_96K 96000U /*!< Audio Frequency configuration 96000 Hz */ +#define LL_I2S_AUDIOFREQ_48K 48000U /*!< Audio Frequency configuration 48000 Hz */ +#define LL_I2S_AUDIOFREQ_44K 44100U /*!< Audio Frequency configuration 44100 Hz */ +#define LL_I2S_AUDIOFREQ_32K 32000U /*!< Audio Frequency configuration 32000 Hz */ +#define LL_I2S_AUDIOFREQ_22K 22050U /*!< Audio Frequency configuration 22050 Hz */ +#define LL_I2S_AUDIOFREQ_16K 16000U /*!< Audio Frequency configuration 16000 Hz */ +#define LL_I2S_AUDIOFREQ_11K 11025U /*!< Audio Frequency configuration 11025 Hz */ +#define LL_I2S_AUDIOFREQ_8K 8000U /*!< Audio Frequency configuration 8000 Hz */ +#define LL_I2S_AUDIOFREQ_DEFAULT 2U /*!< Audio Freq not specified. Register I2SDIV = 2 */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup I2S_LL_Exported_Macros I2S Exported Macros + * @{ + */ + +/** @defgroup I2S_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in I2S register + * @param __INSTANCE__ I2S Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_I2S_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in I2S register + * @param __INSTANCE__ I2S Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_I2S_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup I2S_LL_Exported_Functions I2S Exported Functions + * @{ + */ + +/** @defgroup I2S_LL_EF_Configuration Configuration + * @{ + */ + +/** + * @brief Select I2S mode and Enable I2S peripheral + * @rmtoll I2SCFGR I2SMOD LL_I2S_Enable\n + * I2SCFGR I2SE LL_I2S_Enable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_Enable(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); +} + +/** + * @brief Disable I2S peripheral + * @rmtoll I2SCFGR I2SE LL_I2S_Disable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_Disable(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); +} + +/** + * @brief Check if I2S peripheral is enabled + * @rmtoll I2SCFGR I2SE LL_I2S_IsEnabled + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabled(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SE) == (SPI_I2SCFGR_I2SE)) ? 1UL : 0UL); +} + +/** + * @brief Set I2S data frame length + * @rmtoll I2SCFGR DATLEN LL_I2S_SetDataFormat\n + * I2SCFGR CHLEN LL_I2S_SetDataFormat + * @param SPIx SPI Instance + * @param DataFormat This parameter can be one of the following values: + * @arg @ref LL_I2S_DATAFORMAT_16B + * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED + * @arg @ref LL_I2S_DATAFORMAT_24B + * @arg @ref LL_I2S_DATAFORMAT_32B + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetDataFormat(SPI_TypeDef *SPIx, uint32_t DataFormat) +{ + MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN, DataFormat); +} + +/** + * @brief Get I2S data frame length + * @rmtoll I2SCFGR DATLEN LL_I2S_GetDataFormat\n + * I2SCFGR CHLEN LL_I2S_GetDataFormat + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_DATAFORMAT_16B + * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED + * @arg @ref LL_I2S_DATAFORMAT_24B + * @arg @ref LL_I2S_DATAFORMAT_32B + */ +__STATIC_INLINE uint32_t LL_I2S_GetDataFormat(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)); +} + +/** + * @brief Set I2S clock polarity + * @rmtoll I2SCFGR CKPOL LL_I2S_SetClockPolarity + * @param SPIx SPI Instance + * @param ClockPolarity This parameter can be one of the following values: + * @arg @ref LL_I2S_POLARITY_LOW + * @arg @ref LL_I2S_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) +{ + SET_BIT(SPIx->I2SCFGR, ClockPolarity); +} + +/** + * @brief Get I2S clock polarity + * @rmtoll I2SCFGR CKPOL LL_I2S_GetClockPolarity + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_POLARITY_LOW + * @arg @ref LL_I2S_POLARITY_HIGH + */ +__STATIC_INLINE uint32_t LL_I2S_GetClockPolarity(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_CKPOL)); +} + +/** + * @brief Set I2S standard protocol + * @rmtoll I2SCFGR I2SSTD LL_I2S_SetStandard\n + * I2SCFGR PCMSYNC LL_I2S_SetStandard + * @param SPIx SPI Instance + * @param Standard This parameter can be one of the following values: + * @arg @ref LL_I2S_STANDARD_PHILIPS + * @arg @ref LL_I2S_STANDARD_MSB + * @arg @ref LL_I2S_STANDARD_LSB + * @arg @ref LL_I2S_STANDARD_PCM_SHORT + * @arg @ref LL_I2S_STANDARD_PCM_LONG + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetStandard(SPI_TypeDef *SPIx, uint32_t Standard) +{ + MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC, Standard); +} + +/** + * @brief Get I2S standard protocol + * @rmtoll I2SCFGR I2SSTD LL_I2S_GetStandard\n + * I2SCFGR PCMSYNC LL_I2S_GetStandard + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_STANDARD_PHILIPS + * @arg @ref LL_I2S_STANDARD_MSB + * @arg @ref LL_I2S_STANDARD_LSB + * @arg @ref LL_I2S_STANDARD_PCM_SHORT + * @arg @ref LL_I2S_STANDARD_PCM_LONG + */ +__STATIC_INLINE uint32_t LL_I2S_GetStandard(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC)); +} + +/** + * @brief Set I2S transfer mode + * @rmtoll I2SCFGR I2SCFG LL_I2S_SetTransferMode + * @param SPIx SPI Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_I2S_MODE_SLAVE_TX + * @arg @ref LL_I2S_MODE_SLAVE_RX + * @arg @ref LL_I2S_MODE_MASTER_TX + * @arg @ref LL_I2S_MODE_MASTER_RX + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetTransferMode(SPI_TypeDef *SPIx, uint32_t Mode) +{ + MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG, Mode); +} + +/** + * @brief Get I2S transfer mode + * @rmtoll I2SCFGR I2SCFG LL_I2S_GetTransferMode + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_MODE_SLAVE_TX + * @arg @ref LL_I2S_MODE_SLAVE_RX + * @arg @ref LL_I2S_MODE_MASTER_TX + * @arg @ref LL_I2S_MODE_MASTER_RX + */ +__STATIC_INLINE uint32_t LL_I2S_GetTransferMode(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG)); +} + +/** + * @brief Set I2S linear prescaler + * @rmtoll I2SPR I2SDIV LL_I2S_SetPrescalerLinear + * @param SPIx SPI Instance + * @param PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetPrescalerLinear(SPI_TypeDef *SPIx, uint8_t PrescalerLinear) +{ + MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_I2SDIV, PrescalerLinear); +} + +/** + * @brief Get I2S linear prescaler + * @rmtoll I2SPR I2SDIV LL_I2S_GetPrescalerLinear + * @param SPIx SPI Instance + * @retval PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_I2S_GetPrescalerLinear(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_I2SDIV)); +} + +/** + * @brief Set I2S parity prescaler + * @rmtoll I2SPR ODD LL_I2S_SetPrescalerParity + * @param SPIx SPI Instance + * @param PrescalerParity This parameter can be one of the following values: + * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN + * @arg @ref LL_I2S_PRESCALER_PARITY_ODD + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetPrescalerParity(SPI_TypeDef *SPIx, uint32_t PrescalerParity) +{ + MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_ODD, PrescalerParity << 8U); +} + +/** + * @brief Get I2S parity prescaler + * @rmtoll I2SPR ODD LL_I2S_GetPrescalerParity + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN + * @arg @ref LL_I2S_PRESCALER_PARITY_ODD + */ +__STATIC_INLINE uint32_t LL_I2S_GetPrescalerParity(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_ODD) >> 8U); +} + +/** + * @brief Enable the master clock output (Pin MCK) + * @rmtoll I2SPR MCKOE LL_I2S_EnableMasterClock + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableMasterClock(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); +} + +/** + * @brief Disable the master clock output (Pin MCK) + * @rmtoll I2SPR MCKOE LL_I2S_DisableMasterClock + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableMasterClock(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); +} + +/** + * @brief Check if the master clock output (Pin MCK) is enabled + * @rmtoll I2SPR MCKOE LL_I2S_IsEnabledMasterClock + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledMasterClock(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE) == (SPI_I2SPR_MCKOE)) ? 1UL : 0UL); +} + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_FLAG FLAG Management + * @{ + */ + +/** + * @brief Check if Rx buffer is not empty + * @rmtoll SR RXNE LL_I2S_IsActiveFlag_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_RXNE(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_RXNE(SPIx); +} + +/** + * @brief Check if Tx buffer is empty + * @rmtoll SR TXE LL_I2S_IsActiveFlag_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_TXE(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_TXE(SPIx); +} + +/** + * @brief Get busy flag + * @rmtoll SR BSY LL_I2S_IsActiveFlag_BSY + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_BSY(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_BSY(SPIx); +} + +/** + * @brief Get overrun error flag + * @rmtoll SR OVR LL_I2S_IsActiveFlag_OVR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_OVR(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_OVR(SPIx); +} + +/** + * @brief Get underrun error flag + * @rmtoll SR UDR LL_I2S_IsActiveFlag_UDR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_UDR(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_UDR) == (SPI_SR_UDR)) ? 1UL : 0UL); +} + + +/** + * @brief Get channel side flag. + * @note 0: Channel Left has to be transmitted or has been received\n + * 1: Channel Right has to be transmitted or has been received\n + * It has no significance in PCM mode. + * @rmtoll SR CHSIDE LL_I2S_IsActiveFlag_CHSIDE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_CHSIDE(SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_CHSIDE) == (SPI_SR_CHSIDE)) ? 1UL : 0UL); +} + +/** + * @brief Clear overrun error flag + * @rmtoll SR OVR LL_I2S_ClearFlag_OVR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_ClearFlag_OVR(SPI_TypeDef *SPIx) +{ + LL_SPI_ClearFlag_OVR(SPIx); +} + +/** + * @brief Clear underrun error flag + * @rmtoll SR UDR LL_I2S_ClearFlag_UDR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_ClearFlag_UDR(SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg; + tmpreg = SPIx->SR; + (void)tmpreg; +} + +/** + * @brief Clear frame format error flag + * @rmtoll SR FRE LL_I2S_ClearFlag_FRE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_ClearFlag_FRE(SPI_TypeDef *SPIx) +{ + LL_SPI_ClearFlag_FRE(SPIx); +} + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_IT Interrupt Management + * @{ + */ + +/** + * @brief Enable error IT + * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). + * @rmtoll CR2 ERRIE LL_I2S_EnableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableIT_ERR(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableIT_ERR(SPIx); +} + +/** + * @brief Enable Rx buffer not empty IT + * @rmtoll CR2 RXNEIE LL_I2S_EnableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableIT_RXNE(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableIT_RXNE(SPIx); +} + +/** + * @brief Enable Tx buffer empty IT + * @rmtoll CR2 TXEIE LL_I2S_EnableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableIT_TXE(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableIT_TXE(SPIx); +} + +/** + * @brief Disable error IT + * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). + * @rmtoll CR2 ERRIE LL_I2S_DisableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableIT_ERR(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableIT_ERR(SPIx); +} + +/** + * @brief Disable Rx buffer not empty IT + * @rmtoll CR2 RXNEIE LL_I2S_DisableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableIT_RXNE(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableIT_RXNE(SPIx); +} + +/** + * @brief Disable Tx buffer empty IT + * @rmtoll CR2 TXEIE LL_I2S_DisableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableIT_TXE(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableIT_TXE(SPIx); +} + +/** + * @brief Check if ERR IT is enabled + * @rmtoll CR2 ERRIE LL_I2S_IsEnabledIT_ERR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_ERR(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledIT_ERR(SPIx); +} + +/** + * @brief Check if RXNE IT is enabled + * @rmtoll CR2 RXNEIE LL_I2S_IsEnabledIT_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_RXNE(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledIT_RXNE(SPIx); +} + +/** + * @brief Check if TXE IT is enabled + * @rmtoll CR2 TXEIE LL_I2S_IsEnabledIT_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_TXE(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledIT_TXE(SPIx); +} + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_DMA DMA Management + * @{ + */ + +/** + * @brief Enable DMA Rx + * @rmtoll CR2 RXDMAEN LL_I2S_EnableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableDMAReq_RX(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableDMAReq_RX(SPIx); +} + +/** + * @brief Disable DMA Rx + * @rmtoll CR2 RXDMAEN LL_I2S_DisableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableDMAReq_RX(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableDMAReq_RX(SPIx); +} + +/** + * @brief Check if DMA Rx is enabled + * @rmtoll CR2 RXDMAEN LL_I2S_IsEnabledDMAReq_RX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_RX(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledDMAReq_RX(SPIx); +} + +/** + * @brief Enable DMA Tx + * @rmtoll CR2 TXDMAEN LL_I2S_EnableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableDMAReq_TX(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableDMAReq_TX(SPIx); +} + +/** + * @brief Disable DMA Tx + * @rmtoll CR2 TXDMAEN LL_I2S_DisableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableDMAReq_TX(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableDMAReq_TX(SPIx); +} + +/** + * @brief Check if DMA Tx is enabled + * @rmtoll CR2 TXDMAEN LL_I2S_IsEnabledDMAReq_TX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_TX(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledDMAReq_TX(SPIx); +} + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_DATA DATA Management + * @{ + */ + +/** + * @brief Read 16-Bits in data register + * @rmtoll DR DR LL_I2S_ReceiveData16 + * @param SPIx SPI Instance + * @retval RxData Value between Min_Data=0x0000 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint16_t LL_I2S_ReceiveData16(SPI_TypeDef *SPIx) +{ + return LL_SPI_ReceiveData16(SPIx); +} + +/** + * @brief Write 16-Bits in data register + * @rmtoll DR DR LL_I2S_TransmitData16 + * @param SPIx SPI Instance + * @param TxData Value between Min_Data=0x0000 and Max_Data=0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_I2S_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) +{ + LL_SPI_TransmitData16(SPIx, TxData); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2S_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_I2S_DeInit(SPI_TypeDef *SPIx); +ErrorStatus LL_I2S_Init(SPI_TypeDef *SPIx, LL_I2S_InitTypeDef *I2S_InitStruct); +void LL_I2S_StructInit(LL_I2S_InitTypeDef *I2S_InitStruct); +void LL_I2S_ConfigPrescaler(SPI_TypeDef *SPIx, uint32_t PrescalerLinear, uint32_t PrescalerParity); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* SPI_I2S_SUPPORT */ + +#endif /* defined (SPI1) || defined (SPI2) || defined (SPI3) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F1xx_LL_SPI_H */ + diff --git a/Inc/app.h b/Inc/app.h new file mode 100644 index 0000000..6621ad1 --- /dev/null +++ b/Inc/app.h @@ -0,0 +1,19 @@ +#ifndef _APP_H +#define _APP_H + +void app_act (void); + +extern int it_5ms_cnt ,it_5ms_flag; +extern int it_10ms_cnt ,it_10ms_flag; +extern int it_50ms_cnt ,it_50ms_flag; +extern int it_100ms_cnt ,it_100ms_flag; +extern int it_300ms_cnt ,it_300ms_flag; +extern int it_500ms_cnt ,it_500ms_flag; +extern int it_1000ms_cnt ,it_1000ms_flag; +extern int it_1us_cnt; + +extern unsigned long tempA; + + +#endif + diff --git a/Inc/main.h b/Inc/main.h index 6076dd3..bc96fab 100644 --- a/Inc/main.h +++ b/Inc/main.h @@ -59,14 +59,8 @@ void Error_Handler(void); /* Private defines -----------------------------------------------------------*/ #define RS485_EN1_Pin GPIO_PIN_1 #define RS485_EN1_GPIO_Port GPIOA -#define RS485_TXD1_Pin GPIO_PIN_2 -#define RS485_TXD1_GPIO_Port GPIOA -#define RS485_RXD1_Pin GPIO_PIN_3 -#define RS485_RXD1_GPIO_Port GPIOA #define CS1_Pin GPIO_PIN_4 #define CS1_GPIO_Port GPIOA -#define SPI_DRDY_Pin GPIO_PIN_4 -#define SPI_DRDY_GPIO_Port GPIOC #define OCIN1_Pin GPIO_PIN_5 #define OCIN1_GPIO_Port GPIOC #define OCIN2_Pin GPIO_PIN_0 @@ -79,8 +73,6 @@ void Error_Handler(void); #define RXD3_GPIO_Port GPIOB #define CS2_Pin GPIO_PIN_7 #define CS2_GPIO_Port GPIOC -#define STOP1_Pin GPIO_PIN_8 -#define STOP1_GPIO_Port GPIOC #define STOP2_Pin GPIO_PIN_9 #define STOP2_GPIO_Port GPIOC #define LED_ERR_Pin GPIO_PIN_11 @@ -89,10 +81,6 @@ void Error_Handler(void); #define LED_NOR_GPIO_Port GPIOA #define KEY3_Pin GPIO_PIN_15 #define KEY3_GPIO_Port GPIOA -#define TEMP_TX_Pin GPIO_PIN_10 -#define TEMP_TX_GPIO_Port GPIOC -#define TEMP_RX_Pin GPIO_PIN_11 -#define TEMP_RX_GPIO_Port GPIOC #define KEY2_Pin GPIO_PIN_12 #define KEY2_GPIO_Port GPIOC #define KEY1_Pin GPIO_PIN_2 diff --git a/Inc/spi.h b/Inc/spi.h index 43636ac..5d4e747 100644 --- a/Inc/spi.h +++ b/Inc/spi.h @@ -32,15 +32,12 @@ extern "C" { /* USER CODE END Includes */ -extern SPI_HandleTypeDef hspi1; - extern SPI_HandleTypeDef hspi2; /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ -void MX_SPI1_Init(void); void MX_SPI2_Init(void); /* USER CODE BEGIN Prototypes */ diff --git a/Inc/stm32f1xx_it.h b/Inc/stm32f1xx_it.h index c4bd99e..02b9957 100644 --- a/Inc/stm32f1xx_it.h +++ b/Inc/stm32f1xx_it.h @@ -55,14 +55,13 @@ void SVC_Handler(void); void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); +void TIM1_UP_IRQHandler(void); void I2C1_EV_IRQHandler(void); void I2C1_ER_IRQHandler(void); -void SPI1_IRQHandler(void); void SPI2_IRQHandler(void); void USART1_IRQHandler(void); void USART2_IRQHandler(void); void USART3_IRQHandler(void); -void UART4_IRQHandler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/Inc/usart.h b/Inc/usart.h index 2bfae13..4280d40 100644 --- a/Inc/usart.h +++ b/Inc/usart.h @@ -32,8 +32,6 @@ extern "C" { /* USER CODE END Includes */ -extern UART_HandleTypeDef huart4; - extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart2; @@ -44,7 +42,6 @@ extern UART_HandleTypeDef huart3; /* USER CODE END Private defines */ -void MX_UART4_Init(void); void MX_USART1_UART_Init(void); void MX_USART2_UART_Init(void); void MX_USART3_UART_Init(void); diff --git a/MDK-ARM/mfps.uvguix.EthanWu b/MDK-ARM/mfps.uvguix.EthanWu index ba1130b..95fbb44 100644 --- a/MDK-ARM/mfps.uvguix.EthanWu +++ b/MDK-ARM/mfps.uvguix.EthanWu @@ -6,7 +6,7 @@
### uVision Project, (C) Keil Software
- C:\Users\EthanWu\Desktop\work\2024.3.26\mfps\App\Src + C:\Users\EthanWu\Desktop\work\2024.4.3\mfps\App\Inc @@ -25,7 +25,7 @@ 204 Performance Analyzer - 930 + 552 139 139 100 @@ -93,25 +93,25 @@ 2 3 - -1 - -1 + -32000 + -32000 -1 -1 - 78 - 78 - 1230 - 671 + 86 + 569 + 1721 + 840 0 - 413 - 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000003000000010000000100000037433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E332E32365C6D6670735C5372635C6D61696E2E6300000000066D61696E2E6300000000C5D4F200FFFFFFFF3A433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E332E32365C6D6670735C4170705C5372635C6170702E6300000000056170702E6300000000FFDC7800FFFFFFFF3A433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E332E32365C6D6670735C4170705C496E635C6170702E6800000000056170702E6800000000BECEA100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD5000100000000000000020000003001000066000000000600007B020000 + 1073 + 0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000000A000000040000000100000039433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E342E335C6D6670735C4170705C5372635C6170702E6300000000056170702E6300000000C5D4F200FFFFFFFF3A433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E342E335C6D6670735C4170705C5372635C6F6C65642E6300000000066F6C65642E6300000000FFDC7800FFFFFFFF39433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E342E335C6D6670735C4170705C5372635C6B65792E6300000000056B65792E6300000000BECEA100FFFFFFFF36433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E342E335C6D6670735C5372635C6D61696E2E6300000000066D61696E2E6300000000F0A0A100FFFFFFFF3D433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E342E335C6D6670735C4170705C5372635C746D63353136302E630000000009746D63353136302E6300000000BCA8E100FFFFFFFF3D433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E342E335C6D6670735C4170705C496E635C746D63353136302E680000000009746D63353136302E68000000009CC1B600FFFFFFFF3B433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E342E335C6D6670735C4170705C5372635C64656C61792E63000000000764656C61792E6300000000F7B88600FFFFFFFF35433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E342E335C6D6670735C5372635C7370692E6300000000057370692E6300000000D9ADC200FFFFFFFF49433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E342E335C6D6670735C4D444B2D41524D5C737461727475705F73746D33326631303378652E730000000015737461727475705F73746D33326631303378652E7300000000A5C2D700FFFFFFFF60433A5C55736572735C457468616E57755C4465736B746F705C776F726B5C323032342E342E335C6D6670735C447269766572735C53544D3332463178785F48414C5F4472697665725C5372635C73746D3332663178785F68616C5F7370692E63000000001373746D3332663178785F68616C5F7370692E6300000000B3A6BE00FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD50001000000000000000200000030010000660000000006000097020000 @@ -150,7 +150,7 @@ 0 16 - 0300000066000000290100004B020000 + 03000000660000002901000067020000 16 @@ -170,7 +170,7 @@ 0 16 - 0300000066000000290100004B020000 + 03000000660000002901000067020000 16 @@ -450,7 +450,7 @@ 0 16 - 0300000066000000290100004B020000 + 03000000660000002901000067020000 16 @@ -470,7 +470,7 @@ 0 16 - 0300000066000000290100004B020000 + 03000000660000002901000067020000 16 @@ -490,7 +490,7 @@ 0 16 - 000000007C020000000600000E030000 + 030000009B020000FD050000F5020000 16 @@ -526,11 +526,11 @@ 0 32767 0 - 4096 + 32768 0 16 - 030000007F020000FD050000F5020000 + 030000009B020000FD050000F5020000 16 @@ -1150,7 +1150,7 @@ 0 16 - 0300000066000000290100004B020000 + 03000000660000002901000067020000 16 @@ -1160,17 +1160,17 @@ 38007 38007 - 0 + 1 0 0 0 32767 0 - 4096 + 32768 0 16 - 030000007F020000FD050000F5020000 + 030000009B020000FD050000F5020000 16 @@ -1186,11 +1186,11 @@ 0 32767 0 - 4096 + 32768 0 16 - 030000007F020000FD050000F5020000 + 030000009B020000FD050000F5020000 16 @@ -1246,11 +1246,11 @@ 0 32767 0 - 4096 + 32768 0 16 - 030000007F020000FD050000F5020000 + 030000009B020000FD050000F5020000 16 @@ -1266,11 +1266,11 @@ 0 32767 0 - 4096 + 32768 0 16 - 030000007F020000FD050000F5020000 + 030000009B020000FD050000F5020000 16 @@ -1799,14 +1799,14 @@ 3312 - 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFC4000000BD00000070040000C1000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000C40000006600000070040000D4000000C40000004F00000070040000BD0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFFAC0300004F000000B0030000A5010000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000B00300006600000070040000BC010000B00300004F00000070040000A501000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF2C0100004F00000030010000640200000100000002000010040000000100000012FFFFFF07050000FFFFFFFF05000000ED0300006D000000C3000000C4000000739400000180001000000100000000000000660000002C0100007B020000000000004F0000002C010000640200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000091010000700400009501000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB0900000180008000000000000000000000AC010000700400002E0200000000000095010000700400001702000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFF38020000950100003C0200001702000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000640200000006000068020000010000000100001004000000010000001EFEFFFFD2000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000000000007F02000000060000250300000000000068020000000600000E0300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFC4000000BD00000070040000C1000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000C40000006600000070040000D4000000C40000004F00000070040000BD0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFFAC0300004F000000B0030000A5010000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000B00300006600000070040000BC010000B00300004F00000070040000A501000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF2C0100004F00000030010000800200000100000002000010040000000100000012FFFFFF07050000FFFFFFFF05000000ED0300006D000000C3000000C4000000739400000180001000000100000000000000660000002C01000097020000000000004F0000002C010000800200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000091010000700400009501000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB0900000180008000000000000000000000AC010000700400002E0200000000000095010000700400001702000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFF38020000950100003C0200001702000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF000000008002000000060000840200000100000001000010040000000100000044FFFFFF01010000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000000000009B02000000060000250300000000000084020000000600000E0300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572010000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 59392 File - 2580 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000086B65795F666C616796000000000000000300086B65795F666C61670564656C617907636F756E746572000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + 2560 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000094F4C45445F53656E6496000000000000000100094F4C45445F53656E6400000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 1423 @@ -1822,7 +1822,7 @@ Build 968 - 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000046D66707396000000000000000100046D667073000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000046D66707396000000000000000100046D667073000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 583 @@ -1838,7 +1838,7 @@ Debug 2373 - 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 898 @@ -1871,11 +1871,11 @@ 0 16 - C40000004F00000000060000BD000000 + C40000004F00000070040000BD000000 16 - C40000006600000000060000D4000000 + C40000006600000070040000D4000000 @@ -1891,36 +1891,16 @@ 0 16 - 0300000066000000BD0000006F020000 + 030000006600000029010000DD010000 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 109 109 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000BD0000006F020000 - - - 16 - 70000000870000005301000043020000 - - - - 1465 - 1465 1 0 0 @@ -1931,11 +1911,31 @@ 0 16 - 07030000A3020000FD050000F5020000 + 030000006600000029010000DD010000 16 - 7000000087000000A8020000F5000000 + 560000006D0000003901000029020000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0300000011020000FD050000AE020000 + + + 16 + 560000006D0000008E020000DB000000 @@ -1947,15 +1947,15 @@ 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -1967,15 +1967,15 @@ 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -1987,15 +1987,15 @@ 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -2015,7 +2015,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2031,16 +2031,36 @@ 0 16 - C700000066000000FD050000A4000000 + C7000000660000006D040000A4000000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 1935 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0300000011020000FD050000AE020000 + + + 16 + 560000006D000000160100000D010000 + + + + 1936 + 1936 1 0 0 @@ -2051,51 +2071,31 @@ 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 70000000870000003001000027010000 - - - - 1936 - 1936 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 07030000A3020000FD050000F5020000 - - - 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 1937 1937 - 0 + 1 0 0 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2107,15 +2107,15 @@ 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -2127,15 +2127,15 @@ 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -2147,15 +2147,15 @@ 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -2167,21 +2167,21 @@ 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 195 195 - 0 + 1 0 0 0 @@ -2191,17 +2191,17 @@ 0 16 - 0300000066000000BD0000006F020000 + 030000006600000029010000DD010000 16 - 70000000870000005301000043020000 + 560000006D0000003901000029020000 196 196 - 0 + 1 0 0 0 @@ -2211,36 +2211,16 @@ 0 16 - 0300000066000000BD0000006F020000 + 030000006600000029010000DD010000 16 - 70000000870000005301000043020000 + 560000006D0000003901000029020000 197 197 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 03000000C00100006D040000FE010000 - - - 16 - 7000000087000000A8020000F5000000 - - - - 198 - 198 1 0 0 @@ -2251,11 +2231,31 @@ 0 16 - 000000008C020000000300000E030000 + 03000000E2020000FD050000F5020000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 00000000950100000006000026020000 + + + 16 + 560000006D0000008E020000DB000000 @@ -2271,11 +2271,11 @@ 0 16 - 03000000C00100006D040000FE010000 + 03000000E2020000FD050000F5020000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -2291,11 +2291,11 @@ 0 16 - C700000066000000FD050000A4000000 + C7000000660000006D040000A4000000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -2311,11 +2311,11 @@ 0 16 - C700000066000000FD050000A4000000 + C7000000660000006D040000A4000000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -2355,7 +2355,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2367,15 +2367,15 @@ 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -2391,11 +2391,11 @@ 0 16 - C700000066000000FD050000A4000000 + C7000000660000006D040000A4000000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -2411,11 +2411,11 @@ 0 16 - C700000066000000FD050000A4000000 + C7000000660000006D040000A4000000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -2431,11 +2431,11 @@ 0 16 - C700000066000000FD050000A4000000 + C7000000660000006D040000A4000000 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2451,11 +2451,11 @@ 0 16 - C700000066000000FD050000A4000000 + C7000000660000006D040000A4000000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -2475,7 +2475,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2495,7 +2495,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2515,7 +2515,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2535,7 +2535,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2555,7 +2555,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2575,7 +2575,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2595,7 +2595,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2615,7 +2615,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2635,7 +2635,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2655,7 +2655,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2675,7 +2675,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2695,7 +2695,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2715,7 +2715,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2735,7 +2735,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2755,7 +2755,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2775,7 +2775,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2795,7 +2795,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2815,7 +2815,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2835,7 +2835,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2855,7 +2855,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2875,32 +2875,12 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 38003 38003 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000BD0000006F020000 - - - 16 - 70000000870000005301000043020000 - - - - 38007 - 38007 0 0 0 @@ -2911,11 +2891,31 @@ 0 16 - 03000000C00100006D040000FE010000 + 030000006600000029010000DD010000 16 - 7000000087000000A8020000F5000000 + 560000006D0000003901000029020000 + + + + 38007 + 38007 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000E2020000FD050000F5020000 + + + 16 + 560000006D0000008E020000DB000000 @@ -2931,11 +2931,11 @@ 0 16 - 03000000C00100006D040000FE010000 + 03000000E2020000FD050000F5020000 16 - 70000000870000005301000043020000 + 560000006D0000003901000029020000 @@ -2947,15 +2947,15 @@ 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2967,15 +2967,15 @@ 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -2991,11 +2991,11 @@ 0 16 - 03000000C00100006D040000FE010000 + 03000000E2020000FD050000F5020000 16 - 70000000870000005301000043020000 + 560000006D0000003901000029020000 @@ -3011,11 +3011,11 @@ 0 16 - 03000000C00100006D040000FE010000 + 03000000E2020000FD050000F5020000 16 - 70000000870000005301000043020000 + 560000006D0000003901000029020000 @@ -3031,11 +3031,11 @@ 0 16 - C700000066000000FD050000A4000000 + C7000000660000006D040000A4000000 16 - 7000000087000000A8020000F5000000 + 560000006D0000008E020000DB000000 @@ -3055,7 +3055,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3075,7 +3075,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3095,7 +3095,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3115,7 +3115,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3135,7 +3135,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3155,7 +3155,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3175,7 +3175,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3195,7 +3195,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3215,7 +3215,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3235,7 +3235,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3255,7 +3255,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3275,7 +3275,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3295,7 +3295,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3315,7 +3315,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3335,7 +3335,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3355,7 +3355,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3375,7 +3375,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3395,7 +3395,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3415,7 +3415,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3435,7 +3435,7 @@ 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 @@ -3527,27 +3527,27 @@ 0 32767 0 - 4096 + 32768 0 16 - 07030000A3020000FD050000F5020000 + 0300000011020000FD050000AE020000 16 - 70000000870000003001000027010000 + 560000006D000000160100000D010000 - 3311 - 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFC4000000BD00000000060000C1000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000C40000006600000000060000D4000000C40000004F00000000060000BD0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFFAC0300004F000000B0030000A5010000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000B00300006600000070040000BC010000B00300004F00000070040000A501000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFC00000004F000000C400000088020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000000000066000000C00000009F020000000000004F000000C0000000880200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7300000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000001000000FFFFFFFFFFFFFFFF0000000088020000000600008C02000001000000010000100400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB0900000180008000000100000004030000A30200000006000025030000040300008C020000000600000E03000000000000404100560F0000001343616C6C20537461636B202B204C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFF000000000000000001000000000000000100000001000000FFFFFFFF000300008C020000040300000E03000001000000020000100400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000000000000FFFFFFFFFFFFFFFF00000000A501000070040000A9010000000000000100000004000000010000000000000000000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF010000779400000180008000000000000000000000C0010000700400002E02000000000000A901000070040000170200000000000040820046060000000C4275696C64204F757470757400000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0642726F777365000000007794000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + 3312 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFC4000000BD00000070040000C1000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000C40000006600000070040000D4000000C40000004F00000070040000BD0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFFAC0300004F000000B0030000A5010000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000B00300006600000070040000BC010000B00300004F00000070040000A501000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF2C0100004F00000030010000F60100000100000002000010040000000100000012FFFFFF07050000FFFFFFFF05000000ED0300006D000000C3000000C4000000739400000180001000000100000000000000660000002C0100000D020000000000004F0000002C010000F60100000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000001000000FFFFFFFFFFFFFFFF00000000F601000000060000FA010000010000000100001004000000010000009AFEFFFF0701000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000001000000000000001102000000060000DE02000000000000FA01000000060000C702000000000000404100560F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031010000009007000001000000FFFFFFFFFFFFFFFF0757617463682032010000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFF050000000000000001000000000000000000000001000000FFFFFFFF38020000950100003C0200001702000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000C702000000060000CB020000010000000100001004000000010000002EFEFFFFE2000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF010000779400000180008000000100000000000000E2020000000600002503000000000000CB020000000600000E0300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572010000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 59392 File - 2565 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000564656C617996000000000000000200086B65795F666C61670564656C61790000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000100150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + 2560 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000094F4C45445F53656E6496000000000000000100094F4C45445F53656E6400000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000300150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 1423 @@ -3562,8 +3562,8 @@ 59399 Build - 955 - 00200000000000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000000002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050FFFFFFFF00960000000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000000240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + 968 + 00200000000000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000004001D000000000000000000000000000000000100000001000000018030800000000004001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000004006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000004002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000040000000000000000000000000000000000000100000001000000960000000300205000000000046D66707396000000000000000100046D667073000000000180EB880000000004002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000400230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000004004E00000000000000000000000000000000010000000100000001807202000000000400530000000000000000000000000000000001000000010000000180BE010000000004005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 583 @@ -3579,7 +3579,7 @@ Debug 2362 - 00200000010000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000004002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020001002D0000000000000000000000000000000001000000010000000180F07F0000020000002E0000000000000000000000000000000001000000010000000180E8880000020000003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F0100000200010032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000002000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000002000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + 00200000010000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020000002D0000000000000000000000000000000001000000010000000180F07F0000020000002E0000000000000000000000000000000001000000010000000180E8880000020000003700000000000000000000000000000000010000000100000001803B010000020000002F0000000000000000000000000000000001000000010000000180BB8A00000200000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000100310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F0100000200000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000002000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000002000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 898 @@ -3603,31 +3603,94 @@ 0 100 - 1 + 4 - ../Src/main.c - 14 - 101 - 121 + ..\App\Src\app.c + 4 + 23 + 37 1 0 - ..\App\Src\app.c - 16 - 1 - 21 - 0 + ..\App\Src\oled.c + 19 + 445 + 485 + 1 0 - ..\App\Inc\app.h + ..\App\Src\key.c + 6 + 32 + 50 + 1 + + 0 + + + ../Src/main.c + 0 + 72 + 81 + 1 + + 0 + + + ..\App\Src\tmc5160.c + 17 + 104 + 127 + 1 + + 0 + + + ..\App\Inc\tmc5160.h + 24 + 1 + 8 + 1 + + 0 + + + ..\App\Src\delay.c 0 1 - 6 - 0 + 35 + 1 + + 0 + + + ../Src/spi.c + 38 + 75 + 93 + 1 + + 0 + + + startup_stm32f103xe.s + 0 + 136 + 148 + 1 + + 0 + + + ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c + 0 + 1437 + 1425 + 1 0 diff --git a/MDK-ARM/mfps.uvoptx b/MDK-ARM/mfps.uvoptx index e989560..2d2f4cb 100644 --- a/MDK-ARM/mfps.uvoptx +++ b/MDK-ARM/mfps.uvoptx @@ -145,10 +145,59 @@ 0 ST-LINKIII-KEIL_SWO - -UH -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL040000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 -WK0 + -UH -O2254 -SF1800 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL040000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 -WK0 - + + + 0 + 0 + 145 + 1 +
134233086
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\App\Src\tmc5160.c + + \\mfps\../App/Src/tmc5160.c\145 +
+
+ + + 0 + 1 + key_msg + + + 1 + 1 + key_val + + + 2 + 1 + key_cnt + + + 3 + 1 + data_r4 + + + 4 + 1 + data_r32 + + + 5 + 1 + data_r + + 0 @@ -558,20 +607,20 @@ 0 0 0 - ..\App\Src\key.c - key.c + ..\App\Src\app.c + app.c 0 0 5 28 - 5 + 1 0 0 0 - ..\App\Inc\key.h - key.h + ..\App\Src\delay.c + delay.c 0 0 @@ -582,8 +631,92 @@ 0 0 0 - ..\App\Src\app.c - app.c + ..\App\Src\key.c + key.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\App\Src\serial_port.c + serial_port.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\App\Src\oled.c + oled.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\App\Src\ads1220.c + ads1220.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\App\Src\m1820.c + m1820.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\App\Src\myLib.c + myLib.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\App\Src\tmc5160.c + tmc5160.c + 0 + 0 + + + 5 + 36 + 5 + 0 + 0 + 0 + ..\App\Inc\tmc5160.h + tmc5160.h 0 0 diff --git a/MDK-ARM/mfps.uvprojx b/MDK-ARM/mfps.uvprojx index 4e7830e..81c5c48 100644 --- a/MDK-ARM/mfps.uvprojx +++ b/MDK-ARM/mfps.uvprojx @@ -340,7 +340,7 @@ STM32F103xE,USE_HAL_DRIVER - ../Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;..\App\Src;..\App\Inc + ../Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../App/Src;../App/Inc @@ -1605,20 +1605,55 @@ App + + app.c + 1 + ..\App\Src\app.c + + + delay.c + 1 + ..\App\Src\delay.c + key.c 1 ..\App\Src\key.c - key.h - 5 - ..\App\Inc\key.h + serial_port.c + 1 + ..\App\Src\serial_port.c - app.c + oled.c 1 - ..\App\Src\app.c + ..\App\Src\oled.c + + + ads1220.c + 1 + ..\App\Src\ads1220.c + + + m1820.c + 1 + ..\App\Src\m1820.c + + + myLib.c + 1 + ..\App\Src\myLib.c + + + tmc5160.c + 1 + ..\App\Src\tmc5160.c + + + tmc5160.h + 5 + ..\App\Inc\tmc5160.h diff --git a/MDK-ARM/mfps/ads1220.crf b/MDK-ARM/mfps/ads1220.crf new file mode 100644 index 0000000000000000000000000000000000000000..634126420a9e3d4c59f32226622056b1e5952eac GIT binary patch literal 639436 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

Mutually Recursive functions -

  • ADC1_2_IRQHandler   ⇒   ADC1_2_IRQHandler
    -
  • BusFault_Handler   ⇒   BusFault_Handler
    -
  • HardFault_Handler   ⇒   HardFault_Handler
    -
  • MemManage_Handler   ⇒   MemManage_Handler
    -
  • NMI_Handler   ⇒   NMI_Handler
    -
  • UART_EndRxTransfer   ⇒   UART_EndRxTransfer
    -
  • UsageFault_Handler   ⇒   UsageFault_Handler
    +
  • ADC1_2_IRQHandler   ⇒   ADC1_2_IRQHandler
    +
  • BusFault_Handler   ⇒   BusFault_Handler
    +
  • HardFault_Handler   ⇒   HardFault_Handler
    +
  • MemManage_Handler   ⇒   MemManage_Handler
    +
  • NMI_Handler   ⇒   NMI_Handler
    +
  • UART_EndRxTransfer   ⇒   UART_EndRxTransfer
    +
  • UsageFault_Handler   ⇒   UsageFault_Handler

    Function Pointers

      -
    • ADC1_2_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • ADC3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • BusFault_Handler from stm32f1xx_it.o(i.BusFault_Handler) referenced from startup_stm32f103xe.o(RESET) -
    • CAN1_RX1_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • CAN1_SCE_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DMA1_Channel1_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DMA1_Channel2_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DMA1_Channel3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DMA1_Channel4_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DMA1_Channel5_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DMA1_Channel6_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DMA1_Channel7_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DMA2_Channel1_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DMA2_Channel2_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DMA2_Channel3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DMA2_Channel4_5_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • DebugMon_Handler from stm32f1xx_it.o(i.DebugMon_Handler) referenced from startup_stm32f103xe.o(RESET) -
    • EXTI0_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • EXTI15_10_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • EXTI1_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • EXTI2_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • EXTI3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • EXTI4_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • EXTI9_5_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • FLASH_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • FSMC_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • HardFault_Handler from stm32f1xx_it.o(i.HardFault_Handler) referenced from startup_stm32f103xe.o(RESET) -
    • I2C1_ER_IRQHandler from stm32f1xx_it.o(i.I2C1_ER_IRQHandler) referenced from startup_stm32f103xe.o(RESET) -
    • I2C1_EV_IRQHandler from stm32f1xx_it.o(i.I2C1_EV_IRQHandler) referenced from startup_stm32f103xe.o(RESET) -
    • I2C2_ER_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • I2C2_EV_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • I2C_DMAAbort from stm32f1xx_hal_i2c.o(i.I2C_DMAAbort) referenced from stm32f1xx_hal_i2c.o(i.I2C_ITError) -
    • I2C_DMAAbort from stm32f1xx_hal_i2c.o(i.I2C_DMAAbort) referenced from stm32f1xx_hal_i2c.o(i.I2C_Slave_STOPF) -
    • MemManage_Handler from stm32f1xx_it.o(i.MemManage_Handler) referenced from startup_stm32f103xe.o(RESET) -
    • NMI_Handler from stm32f1xx_it.o(i.NMI_Handler) referenced from startup_stm32f103xe.o(RESET) -
    • PVD_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • PendSV_Handler from stm32f1xx_it.o(i.PendSV_Handler) referenced from startup_stm32f103xe.o(RESET) -
    • RCC_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • RTC_Alarm_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • RTC_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • Reset_Handler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • SDIO_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • SPI1_IRQHandler from stm32f1xx_it.o(i.SPI1_IRQHandler) referenced from startup_stm32f103xe.o(RESET) -
    • SPI2_IRQHandler from stm32f1xx_it.o(i.SPI2_IRQHandler) referenced from startup_stm32f103xe.o(RESET) -
    • SPI3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • SPI_DMAAbortOnError from stm32f1xx_hal_spi.o(i.SPI_DMAAbortOnError) referenced from stm32f1xx_hal_spi.o(i.HAL_SPI_IRQHandler) -
    • SVC_Handler from stm32f1xx_it.o(i.SVC_Handler) referenced from startup_stm32f103xe.o(RESET) -
    • SysTick_Handler from stm32f1xx_it.o(i.SysTick_Handler) referenced from startup_stm32f103xe.o(RESET) -
    • SystemInit from system_stm32f1xx.o(i.SystemInit) referenced from startup_stm32f103xe.o(.text) -
    • TAMPER_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM1_BRK_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM1_CC_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM1_TRG_COM_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM1_UP_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM2_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM4_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM5_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM6_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM7_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM8_BRK_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM8_CC_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM8_TRG_COM_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • TIM8_UP_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • UART4_IRQHandler from stm32f1xx_it.o(i.UART4_IRQHandler) referenced from startup_stm32f103xe.o(RESET) -
    • UART5_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • UART_DMAAbortOnError from stm32f1xx_hal_uart.o(i.UART_DMAAbortOnError) referenced from stm32f1xx_hal_uart.o(i.HAL_UART_IRQHandler) -
    • USART1_IRQHandler from stm32f1xx_it.o(i.USART1_IRQHandler) referenced from startup_stm32f103xe.o(RESET) -
    • USART2_IRQHandler from stm32f1xx_it.o(i.USART2_IRQHandler) referenced from startup_stm32f103xe.o(RESET) -
    • USART3_IRQHandler from stm32f1xx_it.o(i.USART3_IRQHandler) referenced from startup_stm32f103xe.o(RESET) -
    • USBWakeUp_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • USB_HP_CAN1_TX_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • USB_LP_CAN1_RX0_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • UsageFault_Handler from stm32f1xx_it.o(i.UsageFault_Handler) referenced from startup_stm32f103xe.o(RESET) -
    • WWDG_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) -
    • __main from __main.o(!!!main) referenced from startup_stm32f103xe.o(.text) +
    • ADC1_2_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • ADC3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • BusFault_Handler from stm32f1xx_it.o(i.BusFault_Handler) referenced from startup_stm32f103xe.o(RESET) +
    • CAN1_RX1_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • CAN1_SCE_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DMA1_Channel1_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DMA1_Channel2_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DMA1_Channel3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DMA1_Channel4_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DMA1_Channel5_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DMA1_Channel6_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DMA1_Channel7_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DMA2_Channel1_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DMA2_Channel2_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DMA2_Channel3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DMA2_Channel4_5_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • DebugMon_Handler from stm32f1xx_it.o(i.DebugMon_Handler) referenced from startup_stm32f103xe.o(RESET) +
    • EXTI0_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • EXTI15_10_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • EXTI1_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • EXTI2_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • EXTI3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • EXTI4_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • EXTI9_5_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • FLASH_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • FSMC_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • HardFault_Handler from stm32f1xx_it.o(i.HardFault_Handler) referenced from startup_stm32f103xe.o(RESET) +
    • I2C1_ER_IRQHandler from stm32f1xx_it.o(i.I2C1_ER_IRQHandler) referenced from startup_stm32f103xe.o(RESET) +
    • I2C1_EV_IRQHandler from stm32f1xx_it.o(i.I2C1_EV_IRQHandler) referenced from startup_stm32f103xe.o(RESET) +
    • I2C2_ER_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • I2C2_EV_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • I2C_DMAAbort from stm32f1xx_hal_i2c.o(i.I2C_DMAAbort) referenced from stm32f1xx_hal_i2c.o(i.I2C_ITError) +
    • I2C_DMAAbort from stm32f1xx_hal_i2c.o(i.I2C_DMAAbort) referenced from stm32f1xx_hal_i2c.o(i.I2C_Slave_STOPF) +
    • MemManage_Handler from stm32f1xx_it.o(i.MemManage_Handler) referenced from startup_stm32f103xe.o(RESET) +
    • NMI_Handler from stm32f1xx_it.o(i.NMI_Handler) referenced from startup_stm32f103xe.o(RESET) +
    • PVD_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • PendSV_Handler from stm32f1xx_it.o(i.PendSV_Handler) referenced from startup_stm32f103xe.o(RESET) +
    • RCC_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • RTC_Alarm_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • RTC_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • Reset_Handler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • SDIO_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • SPI1_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • SPI2_IRQHandler from stm32f1xx_it.o(i.SPI2_IRQHandler) referenced from startup_stm32f103xe.o(RESET) +
    • SPI3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • SPI_2linesRxISR_16BIT from stm32f1xx_hal_spi.o(i.SPI_2linesRxISR_16BIT) referenced from stm32f1xx_hal_spi.o(i.HAL_SPI_TransmitReceive_IT) +
    • SPI_2linesRxISR_8BIT from stm32f1xx_hal_spi.o(i.SPI_2linesRxISR_8BIT) referenced from stm32f1xx_hal_spi.o(i.HAL_SPI_TransmitReceive_IT) +
    • SPI_2linesTxISR_16BIT from stm32f1xx_hal_spi.o(i.SPI_2linesTxISR_16BIT) referenced from stm32f1xx_hal_spi.o(i.HAL_SPI_TransmitReceive_IT) +
    • SPI_2linesTxISR_8BIT from stm32f1xx_hal_spi.o(i.SPI_2linesTxISR_8BIT) referenced from stm32f1xx_hal_spi.o(i.HAL_SPI_TransmitReceive_IT) +
    • SPI_DMAAbortOnError from stm32f1xx_hal_spi.o(i.SPI_DMAAbortOnError) referenced from stm32f1xx_hal_spi.o(i.HAL_SPI_IRQHandler) +
    • SPI_RxISR_16BIT from stm32f1xx_hal_spi.o(i.SPI_RxISR_16BIT) referenced from stm32f1xx_hal_spi.o(i.HAL_SPI_Receive_IT) +
    • SPI_RxISR_8BIT from stm32f1xx_hal_spi.o(i.SPI_RxISR_8BIT) referenced from stm32f1xx_hal_spi.o(i.HAL_SPI_Receive_IT) +
    • SPI_TxISR_16BIT from stm32f1xx_hal_spi.o(i.SPI_TxISR_16BIT) referenced from stm32f1xx_hal_spi.o(i.HAL_SPI_Transmit_IT) +
    • SPI_TxISR_8BIT from stm32f1xx_hal_spi.o(i.SPI_TxISR_8BIT) referenced from stm32f1xx_hal_spi.o(i.HAL_SPI_Transmit_IT) +
    • SVC_Handler from stm32f1xx_it.o(i.SVC_Handler) referenced from startup_stm32f103xe.o(RESET) +
    • SysTick_Handler from stm32f1xx_it.o(i.SysTick_Handler) referenced from startup_stm32f103xe.o(RESET) +
    • SystemInit from system_stm32f1xx.o(i.SystemInit) referenced from startup_stm32f103xe.o(.text) +
    • TAMPER_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM1_BRK_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM1_CC_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM1_TRG_COM_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM1_UP_IRQHandler from stm32f1xx_it.o(i.TIM1_UP_IRQHandler) referenced from startup_stm32f103xe.o(RESET) +
    • TIM2_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM3_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM4_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM5_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM6_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM7_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM8_BRK_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM8_CC_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM8_TRG_COM_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • TIM8_UP_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • UART4_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • UART5_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • UART_DMAAbortOnError from stm32f1xx_hal_uart.o(i.UART_DMAAbortOnError) referenced from stm32f1xx_hal_uart.o(i.HAL_UART_IRQHandler) +
    • USART1_IRQHandler from stm32f1xx_it.o(i.USART1_IRQHandler) referenced from startup_stm32f103xe.o(RESET) +
    • USART2_IRQHandler from stm32f1xx_it.o(i.USART2_IRQHandler) referenced from startup_stm32f103xe.o(RESET) +
    • USART3_IRQHandler from stm32f1xx_it.o(i.USART3_IRQHandler) referenced from startup_stm32f103xe.o(RESET) +
    • USBWakeUp_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • USB_HP_CAN1_TX_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • USB_LP_CAN1_RX0_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • UsageFault_Handler from stm32f1xx_it.o(i.UsageFault_Handler) referenced from startup_stm32f103xe.o(RESET) +
    • WWDG_IRQHandler from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET) +
    • __main from __main.o(!!!main) referenced from startup_stm32f103xe.o(.text)

    Global Symbols

    -

    __main (Thumb, 8 bytes, Stack size 0 bytes, __main.o(!!!main)) -

    [Calls]