From d01a2e6f3c0d05af3ce71ae8969b37410bf8efb9 Mon Sep 17 00:00:00 2001 From: cnlohr <lohr85@gmail.com> Date: Sat, 27 Apr 2024 14:00:00 -0700 Subject: [PATCH 1/3] Move attic to https://github.com/cnlohr/ch32v003fun_attic --- attic/EVT/Makefile | 47 - attic/EVT/README.md | 28 - attic/NHC-Link042/LibUSB/LibUSB.c | 430 - attic/NHC-Link042/LibUSB/LibUSB.h | 64 - attic/NHC-Link042/NHC-Link042.uvprojx | 564 -- .../Device/ST/STM32F0xx/Include/stm32f0xx.h | 5111 ------------ .../ST/STM32F0xx/Include/system_stm32f0xx.h | 104 - .../Device/ST/STM32F0xx/Release_Notes.html | 228 - .../Templates/TrueSTUDIO/startup_stm32f030.s | 280 - .../Templates/TrueSTUDIO/startup_stm32f031.s | 275 - .../Templates/TrueSTUDIO/startup_stm32f042.s | 289 - .../Templates/TrueSTUDIO/startup_stm32f051.s | 295 - .../Templates/TrueSTUDIO/startup_stm32f072.s | 304 - .../Templates/TrueSTUDIO/startup_stm32f0xx.s | 293 - .../TrueSTUDIO/startup_stm32f0xx_ld.s | 273 - .../Source/Templates/arm/startup_stm32f030.s | 244 - .../Source/Templates/arm/startup_stm32f031.s | 239 - .../Source/Templates/arm/startup_stm32f042.s | 254 - .../Source/Templates/arm/startup_stm32f051.s | 257 - .../Source/Templates/arm/startup_stm32f072.s | 264 - .../Source/Templates/arm/startup_stm32f0xx.s | 257 - .../Templates/arm/startup_stm32f0xx_ld.s | 239 - .../Templates/gcc_ride7/startup_stm32f030.s | 294 - .../Templates/gcc_ride7/startup_stm32f031.s | 287 - .../Templates/gcc_ride7/startup_stm32f042.s | 302 - .../Templates/gcc_ride7/startup_stm32f051.s | 307 - .../Templates/gcc_ride7/startup_stm32f072.s | 316 - .../Templates/gcc_ride7/startup_stm32f0xx.s | 304 - .../Source/Templates/iar/startup_stm32f030.s | 300 - .../Source/Templates/iar/startup_stm32f031.s | 288 - .../Source/Templates/iar/startup_stm32f042.s | 318 - .../Source/Templates/iar/startup_stm32f051.s | 333 - .../Source/Templates/iar/startup_stm32f072.s | 346 - .../Source/Templates/iar/startup_stm32f0xx.s | 333 - .../Templates/iar/startup_stm32f0xx_ld.s | 288 - .../Source/Templates/system_stm32f0xx.c | 358 - .../CMSIS/Include/arm_common_tables.h | 93 - .../CMSIS/Include/arm_const_structs.h | 85 - .../Libraries/CMSIS/Include/arm_math.h | 7306 ----------------- .../Libraries/CMSIS/Include/core_cm0.h | 682 -- .../Libraries/CMSIS/Include/core_cm0plus.h | 793 -- .../Libraries/CMSIS/Include/core_cm3.h | 1627 ---- .../Libraries/CMSIS/Include/core_cm4.h | 1772 ---- .../Libraries/CMSIS/Include/core_cm4_simd.h | 673 -- .../Libraries/CMSIS/Include/core_cmFunc.h | 636 -- .../Libraries/CMSIS/Include/core_cmInstr.h | 688 -- .../Libraries/CMSIS/Include/core_sc000.h | 813 -- .../Libraries/CMSIS/Include/core_sc300.h | 1598 ---- .../inc/stm32f0xx_adc.h | 450 - .../inc/stm32f0xx_can.h | 643 -- .../inc/stm32f0xx_cec.h | 300 - .../inc/stm32f0xx_comp.h | 245 - .../inc/stm32f0xx_crc.h | 122 - .../inc/stm32f0xx_crs.h | 183 - .../inc/stm32f0xx_dac.h | 312 - .../inc/stm32f0xx_dbgmcu.h | 107 - .../inc/stm32f0xx_dma.h | 377 - .../inc/stm32f0xx_exti.h | 216 - .../inc/stm32f0xx_flash.h | 430 - .../inc/stm32f0xx_gpio.h | 358 - .../inc/stm32f0xx_i2c.h | 478 -- .../inc/stm32f0xx_iwdg.h | 140 - .../inc/stm32f0xx_misc.h | 143 - .../inc/stm32f0xx_pwr.h | 197 - .../inc/stm32f0xx_rcc.h | 608 -- .../inc/stm32f0xx_rtc.h | 807 -- .../inc/stm32f0xx_spi.h | 588 -- .../inc/stm32f0xx_syscfg.h | 262 - .../inc/stm32f0xx_tim.h | 1186 --- .../inc/stm32f0xx_usart.h | 599 -- .../inc/stm32f0xx_wwdg.h | 109 - .../src/stm32f0xx_adc.c | 1240 --- .../src/stm32f0xx_can.c | 1631 ---- .../src/stm32f0xx_cec.c | 607 -- .../src/stm32f0xx_comp.c | 408 - .../src/stm32f0xx_crc.c | 361 - .../src/stm32f0xx_crs.c | 466 -- .../src/stm32f0xx_dac.c | 692 -- .../src/stm32f0xx_dbgmcu.c | 218 - .../src/stm32f0xx_dma.c | 705 -- .../src/stm32f0xx_exti.c | 314 - .../src/stm32f0xx_flash.c | 1256 --- .../src/stm32f0xx_gpio.c | 540 -- .../src/stm32f0xx_i2c.c | 1585 ---- .../src/stm32f0xx_iwdg.c | 293 - .../src/stm32f0xx_misc.c | 167 - .../src/stm32f0xx_pwr.c | 566 -- .../src/stm32f0xx_rcc.c | 1741 ---- .../src/stm32f0xx_rtc.c | 2518 ------ .../src/stm32f0xx_spi.c | 1334 --- .../src/stm32f0xx_syscfg.c | 320 - .../src/stm32f0xx_tim.c | 3349 -------- .../src/stm32f0xx_usart.c | 2096 ----- .../src/stm32f0xx_wwdg.c | 303 - .../STM32_USB_Device_Driver/inc/usb_bsp.h | 48 - .../inc/usb_conf_template.h | 76 - .../STM32_USB_Device_Driver/inc/usb_core.h | 495 -- .../STM32_USB_Device_Driver/inc/usb_dcd.h | 228 - .../STM32_USB_Device_Driver/inc/usb_dcd_int.h | 70 - .../STM32_USB_Device_Driver/inc/usb_regs.h | 233 - .../src/usb_bsp_template.c | 82 - .../STM32_USB_Device_Driver/src/usb_core.c | 712 -- .../STM32_USB_Device_Driver/src/usb_dcd.c | 648 -- .../STM32_USB_Device_Driver/src/usb_dcd_int.c | 369 - .../Class/audio/inc/usbd_audio_core.h | 141 - .../Class/audio/src/usbd_audio_core.c | 776 -- .../Class/ccid/inc/usbd_ccid_cmd.h | 190 - .../Class/ccid/inc/usbd_ccid_core.h | 63 - .../Class/ccid/inc/usbd_ccid_if.h | 184 - .../Class/ccid/src/usbd_ccid_cmd.c | 1091 --- .../Class/ccid/src/usbd_ccid_core.c | 455 - .../Class/ccid/src/usbd_ccid_if.c | 428 - .../Class/cdc/inc/usbd_cdc_core.h | 95 - .../Class/cdc/inc/usbd_cdc_if_template.h | 47 - .../Class/cdc/src/usbd_cdc_core.c | 600 -- .../Class/cdc/src/usbd_cdc_if_template.c | 203 - .../Class/dfu/inc/usbd_dfu_core.h | 142 - .../Class/dfu/inc/usbd_dfu_mal.h | 78 - .../Class/dfu/inc/usbd_flash_if.h | 50 - .../Class/dfu/inc/usbd_mem_if_template.h | 51 - .../Class/dfu/src/usbd_dfu_core.c | 842 -- .../Class/dfu/src/usbd_dfu_mal.c | 256 - .../Class/dfu/src/usbd_flash_if.c | 164 - .../Class/dfu/src/usbd_mem_if_template.c | 137 - .../Class/hid/inc/usbd_custom_hid_core.h | 65 - .../Class/hid/inc/usbd_hid_core.h | 64 - .../Class/hid/src/usbd_custom_hid_core.c | 622 -- .../Class/hid/src/usbd_hid_core.c | 342 - .../inc/usbd_hid_cdc_wrapper.h | 51 - .../src/usbd_hid_cdc_wrapper.c | 404 - .../inc/usbd_hid_msc_wrapper.h | 51 - .../src/usbd_hid_msc_wrapper.c | 326 - .../Class/msc/inc/usbd_msc_bot.h | 116 - .../Class/msc/inc/usbd_msc_core.h | 53 - .../Class/msc/inc/usbd_msc_data.h | 53 - .../Class/msc/inc/usbd_msc_mem.h | 60 - .../Class/msc/inc/usbd_msc_scsi.h | 145 - .../Class/msc/src/usbd_msc_bot.c | 319 - .../Class/msc/src/usbd_msc_core.c | 310 - .../Class/msc/src/usbd_msc_data.c | 71 - .../Class/msc/src/usbd_msc_scsi.c | 661 -- .../Class/msc/src/usbd_storage_template.c | 175 - .../Core/inc/usbd_conf_template.h | 159 - .../Core/inc/usbd_core.h | 59 - .../Core/inc/usbd_def.h | 100 - .../Core/inc/usbd_ioreq.h | 68 - .../Core/inc/usbd_pwr.h | 65 - .../Core/inc/usbd_req.h | 55 - .../Core/inc/usbd_usr.h | 50 - .../Core/src/usbd_core.c | 366 - .../Core/src/usbd_ioreq.c | 175 - .../Core/src/usbd_req.c | 693 -- attic/NHC-Link042/User/NHC_WCH_SDI.c | 430 - attic/NHC-Link042/User/NHC_WCH_SDI.h | 57 - attic/NHC-Link042/User/config.h | 7 - attic/NHC-Link042/User/it.c | 0 attic/NHC-Link042/User/main.c | 36 - attic/NHC-Link042/User/stm32_it.c | 182 - attic/NHC-Link042/User/stm32_it.h | 64 - attic/NHC-Link042/User/stm32f0xx_conf.h | 83 - attic/NHC-Link042/User/system_stm32f0xx.c | 331 - attic/NHC-Link042/User/usb_bsp.c | 183 - attic/NHC-Link042/User/usb_conf.h | 86 - attic/NHC-Link042/User/usbd_conf.h | 62 - attic/NHC-Link042/User/usbd_desc.c | 257 - attic/NHC-Link042/User/usbd_desc.h | 75 - attic/NHC-Link042/User/usbd_pwr.c | 233 - attic/NHC-Link042/User/usbd_usr.c | 118 - attic/ch32v003evt/LICENSE | 12 - attic/ch32v003evt/ch32v003.ld | 159 - attic/ch32v003evt/ch32v00x.h | 2402 ------ attic/ch32v003evt/ch32v00x_conf.h | 1813 ---- attic/ch32v003evt/core_riscv.h | 632 -- attic/ch32v003evt/embedlibc.c | 649 -- attic/ch32v003evt/startup_ch32v003.c | 193 - attic/ch32v003evt/system_ch32v00x.h | 28 - attic/cnlohr-notes.txt | 7 - attic/dont_use_wch_printf.c | 84 - attic/external_crystal_run_from_ram_turbo.c | 54 - attic/flashtests/wch_erase.c | 18 - attic/flashtests/wch_printf.c | 35 - attic/flashtests/wch_query.c | 39 - attic/flashtests/wch_reset.c | 15 - attic/flashtests/wch_write_simple.c | 125 - attic/on-wire-protocol-notes.txt | 175 - attic/wch_dump_flash.c | 54 - {attic => misc}/factory_bootloader.bin | Bin 187 files changed, 86379 deletions(-) delete mode 100644 attic/EVT/Makefile delete mode 100644 attic/EVT/README.md delete mode 100644 attic/NHC-Link042/LibUSB/LibUSB.c delete mode 100644 attic/NHC-Link042/LibUSB/LibUSB.h delete mode 100644 attic/NHC-Link042/NHC-Link042.uvprojx delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Include/stm32f0xx.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Include/system_stm32f0xx.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Release_Notes.html delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f030.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f031.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f042.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f051.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f072.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f0xx.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f0xx_ld.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f030.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f031.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f042.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f051.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f072.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f0xx.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f0xx_ld.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f030.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f031.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f042.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f051.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f072.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f0xx.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f030.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f031.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f042.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f051.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f072.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f0xx.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f0xx_ld.s delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/system_stm32f0xx.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_common_tables.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_const_structs.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_math.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm0.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm0plus.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm3.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm4.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm4_simd.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cmFunc.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cmInstr.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_sc000.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_sc300.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_adc.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_can.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_cec.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_comp.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_crc.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_crs.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dac.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dbgmcu.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dma.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_exti.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_flash.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_gpio.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_i2c.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_iwdg.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_misc.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_pwr.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_rcc.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_rtc.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_spi.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_syscfg.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_tim.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_usart.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_wwdg.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_adc.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_can.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_cec.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_comp.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_crc.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_crs.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dac.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dbgmcu.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dma.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_exti.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_flash.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_gpio.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_i2c.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_iwdg.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_misc.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_pwr.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_rcc.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_rtc.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_spi.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_tim.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_usart.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_wwdg.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_bsp.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_conf_template.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_core.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_dcd.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_dcd_int.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_regs.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_bsp_template.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_core.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_dcd.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_dcd_int.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/audio/src/usbd_audio_core.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_cmd.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_core.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_if.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_cmd.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_core.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_if.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_if_template.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_if_template.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_dfu_core.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_dfu_mal.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_flash_if.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_mem_if_template.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_dfu_core.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_dfu_mal.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_flash_if.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_mem_if_template.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/inc/usbd_custom_hid_core.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/inc/usbd_hid_core.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/src/usbd_custom_hid_core.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/src/usbd_hid_core.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_cdc_wrapper/inc/usbd_hid_cdc_wrapper.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_cdc_wrapper/src/usbd_hid_cdc_wrapper.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_msc_wrapper/inc/usbd_hid_msc_wrapper.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_msc_wrapper/src/usbd_hid_msc_wrapper.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_bot.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_core.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_data.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_mem.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_scsi.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_storage_template.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_conf_template.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_core.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_def.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_ioreq.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_pwr.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_req.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_usr.h delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_core.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_ioreq.c delete mode 100644 attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_req.c delete mode 100644 attic/NHC-Link042/User/NHC_WCH_SDI.c delete mode 100644 attic/NHC-Link042/User/NHC_WCH_SDI.h delete mode 100644 attic/NHC-Link042/User/config.h delete mode 100644 attic/NHC-Link042/User/it.c delete mode 100644 attic/NHC-Link042/User/main.c delete mode 100644 attic/NHC-Link042/User/stm32_it.c delete mode 100644 attic/NHC-Link042/User/stm32_it.h delete mode 100644 attic/NHC-Link042/User/stm32f0xx_conf.h delete mode 100644 attic/NHC-Link042/User/system_stm32f0xx.c delete mode 100644 attic/NHC-Link042/User/usb_bsp.c delete mode 100644 attic/NHC-Link042/User/usb_conf.h delete mode 100644 attic/NHC-Link042/User/usbd_conf.h delete mode 100644 attic/NHC-Link042/User/usbd_desc.c delete mode 100644 attic/NHC-Link042/User/usbd_desc.h delete mode 100644 attic/NHC-Link042/User/usbd_pwr.c delete mode 100644 attic/NHC-Link042/User/usbd_usr.c delete mode 100644 attic/ch32v003evt/LICENSE delete mode 100644 attic/ch32v003evt/ch32v003.ld delete mode 100644 attic/ch32v003evt/ch32v00x.h delete mode 100644 attic/ch32v003evt/ch32v00x_conf.h delete mode 100644 attic/ch32v003evt/core_riscv.h delete mode 100644 attic/ch32v003evt/embedlibc.c delete mode 100644 attic/ch32v003evt/startup_ch32v003.c delete mode 100644 attic/ch32v003evt/system_ch32v00x.h delete mode 100644 attic/cnlohr-notes.txt delete mode 100644 attic/dont_use_wch_printf.c delete mode 100644 attic/external_crystal_run_from_ram_turbo.c delete mode 100644 attic/flashtests/wch_erase.c delete mode 100644 attic/flashtests/wch_printf.c delete mode 100644 attic/flashtests/wch_query.c delete mode 100644 attic/flashtests/wch_reset.c delete mode 100644 attic/flashtests/wch_write_simple.c delete mode 100644 attic/on-wire-protocol-notes.txt delete mode 100644 attic/wch_dump_flash.c rename {attic => misc}/factory_bootloader.bin (100%) diff --git a/attic/EVT/Makefile b/attic/EVT/Makefile deleted file mode 100644 index a7938f4..0000000 --- a/attic/EVT/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -TARGET:=GPIO_Toggle - -all : flash - -PREFIX:=riscv64-unknown-elf - -GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User - -CFLAGS:= \ - -g -Os -flto -ffunction-sections \ - -static-libgcc -lgcc \ - -march=rv32ec \ - -mabi=ilp32e \ - -I/usr/include/newlib \ - -nostdlib \ - -I$(GPIO_Toggle) \ - -IEXAM/SRC/Core \ - -IEXAM/SRC/Debug \ - -IEXAM/SRC/Debug \ - -IEXAM/SRC/Peripheral/inc - -LDFLAGS:=-T EXAM/SRC/Ld/Link.ld - -SYSTEM_C:=EXAM/SRC/Startup/startup_ch32v00x.S \ - EXAM/SRC/Debug/debug.c \ - EXAM/SRC/Peripheral/src/ch32v00x_gpio.c \ - EXAM/SRC/Peripheral/src/ch32v00x_rcc.c \ - EXAM/SRC/Peripheral/src/ch32v00x_usart.c \ - EXAM/SRC/Peripheral/src/ch32v00x_misc.c \ - ../ch32v003evt/embedlibc.c - -$(TARGET).elf : $(GPIO_Toggle)/ch32v00x_it.c $(GPIO_Toggle)/main.c $(GPIO_Toggle)/system_ch32v00x.c $(SYSTEM_C) - $(PREFIX)-gcc -o $@ $^ $(CFLAGS) $(LDFLAGS) - -$(TARGET).hex : GPIO_Toggle.elf - $(PREFIX)-size $^ - $(PREFIX)-objdump -S $^ > $(TARGET).lst - $(PREFIX)-objdump -t $^ > $(TARGET).map - #$(PREFIX)-objcopy -O binary $< $@ - $(PREFIX)-objcopy -O ihex $< $@ - - -flash : $(TARGET).hex - -clean : - rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).lst $(TARGET).map - diff --git a/attic/EVT/README.md b/attic/EVT/README.md deleted file mode 100644 index e46758c..0000000 --- a/attic/EVT/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# General Tooling Notes For Using Official EVT With GCC but without Moun River - -This shows how to build the CH32V003 demo binaries without the horrifying MounRiver Studio. - -* Product page: https://www.wch.cn/products/CH32V003.html -* or English: http://www.wch-ic.com/products/CH32V003.html -* It has, for the English datasheet http://www.wch-ic.com/downloads/file/359.html "CH32V003DS0.PDF" -* It also has the TRM http://www.wch-ic.com/downloads/CH32V003RM_PDF.html in English -* Sadly, the EVT is CN only. https://www.wch.cn/downloads/CH32V003EVT_ZIP.html - It contains schematics for the devboard, evaluation board reference (instructions) and the rest of the dev system, minus the MounRiver Studio (MRS). -* Software from WCH for WCH-Link: https://www.wch-ic.com/products/WCH-Link.html -* Get https://www.wch.cn/downloads/WCH-LinkUtility_ZIP.html - -## Steps to run an EVT sample - -1. Install WCHLinkDrv_WHQL_S.exe from Wch-LinkUtil/Drv_Link -2. Copy contents of EVT (CH32V003EVT.ZIP) "EXAM" Folder in to the EVT folder. -3. On WSL or Debian based OSes `apt-get install build-essential libnewlib-dev gcc-riscv64-unknown-elf` -4. cd into `EVT` on WSL or Linux -5. Type `make` -6. Open Wch-LinkUtil -7. Select series "CH32V00X" from pull-down. -8. Open the produced .hex file. -9. Target->Program (F10) -10. Target->Reset (F12) - -Profit. - - diff --git a/attic/NHC-Link042/LibUSB/LibUSB.c b/attic/NHC-Link042/LibUSB/LibUSB.c deleted file mode 100644 index 548bdbc..0000000 --- a/attic/NHC-Link042/LibUSB/LibUSB.c +++ /dev/null @@ -1,430 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_hid_core.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides the HID core functions. - * - * @verbatim - * - * =================================================================== - * HID Class Description - * =================================================================== - * This module manages the HID class V1.11 following the "Device Class Definition - * for Human Interface Devices (HID) Version 1.11 Jun 27, 2001". - * This driver implements the following aspects of the specification: - * - The Boot Interface Subclass - * - The Mouse protocol - * - Usage Page : Generic Desktop - * - Usage : Joystick - * - Collection : Application - * - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "LibUSB.h" -#include "NHC_WCH_SDI.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static uint8_t USBD_HID_Init (void *pdev, - uint8_t cfgidx); - -static uint8_t USBD_HID_DeInit (void *pdev, - uint8_t cfgidx); - -static uint8_t USBD_HID_Setup (void *pdev, - USB_SETUP_REQ *req); - -static uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length); - -static uint8_t USBD_HID_DataIn (void *pdev, uint8_t epnum); - -static uint8_t USBD_HID_DataOut (void *pdev, uint8_t epnum); - -USBD_Class_cb_TypeDef USBD_HID_cb = -{ - USBD_HID_Init, - USBD_HID_DeInit, - USBD_HID_Setup, - NULL, /*EP0_TxSent*/ - NULL, /*EP0_RxReady*/ - USBD_HID_DataIn, /*DataIn*/ - USBD_HID_DataOut, /*DataOut*/ - NULL, /*SOF */ - USBD_HID_GetCfgDesc, -}; - -static uint32_t USBD_HID_AltSet = 0; - -static uint32_t USBD_HID_Protocol = 0; - -static uint32_t USBD_HID_IdleState = 0; - -uint8_t rxBuff[64]; -uint8_t txBuff[64]; - -/* USB HID device Configuration Descriptor */ -const uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ - USB_HID_CONFIG_DESC_SIZ, - /* wTotalLength: Bytes returned */ - 0x00, - 0x01, /*bNumInterfaces: 1 interface*/ - 0x01, /*bConfigurationValue: Configuration value*/ - 0x00, /*iConfiguration: Index of string descriptor describing - the configuration*/ - 0xC0, /*bmAttributes: bus powered and Support Remote Wake-up */ - 0xfa, /*MaxPower 100 mA: this current is used for detecting Vbus*/ - - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /*bLength: Interface Descriptor size*/ - USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ - 0x00, /*bInterfaceNumber: Number of Interface*/ - 0x00, /*bAlternateSetting: Alternate setting*/ - 0x02, /*bNumEndpoints*/ - 0xff, /*bInterfaceClass: HID*/ - 0xff, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ - 0xff, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ - 0, /*iInterface: Index of string descriptor*/ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - - 0x07, /*bLength: Endpoint Descriptor size*/ - USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ - - HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/ - 0x02, /*bmAttributes: Interrupt endpoint*/ - 0x40,//HID_IN_PACKET, /*wMaxPacketSize: 4 Byte max */ - 0x00, - 0x01, /*bInterval: Polling Interval (10 ms)*/ - /* 34 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ - /* Endpoint descriptor type */ - 0x01, /* bEndpointAddress: */ - /* Endpoint Address (OUT) */ - 0x02, /* bmAttributes: Interrupt endpoint */ - 0x40, /* wMaxPacketSize: 2 Bytes max */ - 0x00, - 0x01, /* bInterval: Polling Interval (20 ms) */ - /* 41 */ -} ; - -const uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] = -{ - 0x06, 0x00, 0xFF, // Usage Page = 0xFF00 (Vendor Defined Page 1) - 0x09, 0x01, // Usage (Vendor Usage 1) - 0xA1, 0x01, // Collection (Application) - 0x19, 0x01, // Usage Minimum - 0x29, 0x40, // Usage Maximum //64 input usages total (0x01 to 0x40) - 0x15, 0x01, // Logical Minimum (data bytes in the report may have minimum value = 0x00) - 0x25, 0x40, // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255) - 0x75, 0x08, // Report Size: 8-bit field size - 0x95, 0x40, // Report Count: Make sixty-four 8-bit fields (the next time the parser hits an "Input", "Output", or "Feature" item) - 0x81, 0x00, // Input (Data, Array, Abs): Instantiates input packet fields based on the above report size, count, logical min/max, and usage. - 0x19, 0x01, // Usage Minimum - 0x29, 0x40, // Usage Maximum //64 output usages total (0x01 to 0x40) - 0x91, 0x00, // Output (Data, Array, Abs): Instantiates output packet fields. Uses same report size and count as "Input" fields, since nothing new/different was specified to the parser since the "Input" item. - 0xC0 -}; - -/* Private function ----------------------------------------------------------*/ -/** - * @brief USBD_HID_Init - * Initialize the HID interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_HID_Init (void *pdev, - uint8_t cfgidx) -{ - DCD_PMA_Config(pdev , HID_IN_EP,USB_SNG_BUF,HID_IN_TX_ADDRESS); - DCD_PMA_Config(pdev , HID_OUT_EP,USB_SNG_BUF,HID_IN_TX_ADDRESS+0x40); - /* Open EP IN */ - DCD_EP_Open(pdev, - HID_IN_EP, - /*HID_IN_PACKET*/0x40, - USB_EP_BULK); - - /* Open EP OUT */ - DCD_EP_Open(pdev, - HID_OUT_EP, - /*HID_OUT_PACKET*/0x40, - USB_EP_BULK); - DCD_EP_PrepareRx(pdev, HID_OUT_EP, rxBuff, 0x40); - return USBD_OK; -} - -/** - * @brief USBD_HID_Init - * DeInitialize the HID layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_HID_DeInit (void *pdev, - uint8_t cfgidx) -{ - /* Close HID EPs */ - DCD_EP_Close (pdev , HID_IN_EP); - DCD_EP_Close (pdev , HID_OUT_EP); - - - return USBD_OK; -} - -/** - * @brief USBD_HID_Setup - * Handle the HID specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_HID_Setup (void *pdev, - USB_SETUP_REQ *req) -{ - uint16_t len = 0; - uint8_t *pbuf = NULL; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS : - switch (req->bRequest) - { - case HID_REQ_SET_PROTOCOL: - USBD_HID_Protocol = (uint8_t)(req->wValue); - break; - - case HID_REQ_GET_PROTOCOL: - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_HID_Protocol, - 1); - break; - - case HID_REQ_SET_IDLE: - USBD_HID_IdleState = (uint8_t)(req->wValue >> 8); - break; - - case HID_REQ_GET_IDLE: - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_HID_IdleState, - 1); - break; - - default: - USBD_CtlError (pdev, req); - return USBD_FAIL; - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - if( req->wValue >> 8 == HID_REPORT_DESC) - { - len = MIN(HID_MOUSE_REPORT_DESC_SIZE , req->wLength); - pbuf = (uint8_t *)HID_MOUSE_ReportDesc; - } - else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE) - { - pbuf = (uint8_t *)USBD_HID_CfgDesc + 0x12; - len = MIN(USB_HID_DESC_SIZ , req->wLength); - } - - USBD_CtlSendData (pdev, - pbuf, - len); - - break; - - case USB_REQ_GET_INTERFACE : - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_HID_AltSet, - 1); - break; - - case USB_REQ_SET_INTERFACE : - USBD_HID_AltSet = (uint8_t)(req->wValue); - break; - } - } - return USBD_OK; -} - -/** - * @brief USBD_HID_GetCfgDesc - * return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length) -{ - *length = sizeof (USBD_HID_CfgDesc); - return (uint8_t *)USBD_HID_CfgDesc; -} - -static uint8_t USBD_HID_DataIn (void *pdev, - uint8_t epnum) -{ - - /* Ensure that the FIFO is empty before a new transfer, this condition could - be caused by a new transfer before the end of the previous transfer */ - //DCD_EP_Flush(pdev, HID_IN_EP); - return USBD_OK; -} - -uint8_t u8Buff[4 * 1024]; -#define WCH_SDI_INIT 0xA0 -#define WCH_SDI_EXIT 0xA1 -#define WCH_SDI_READ 0xA2 -#define WCH_SDI_WRITE 0xA3 -#define WCH_SDI_READ_MEM 0xA4 -#define WCH_SDI_WRITE_MEM 0xA5 -#define DELAY_US_CMD 0xA6 - -/** - * @brief USBD_HID_DataOut - * handle data OUT Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ - -uint32_t u32Check = 1; - -#define busy_on GPIO_SetBits(GPIOA, GPIO_Pin_1) -#define busy_off GPIO_ResetBits(GPIOA, GPIO_Pin_1) - -uint32_t u8tou32(uint8_t *p) -{ - uint32_t u32Tmp; - - u32Tmp = p[3]; - u32Tmp <<= 8; - u32Tmp += p[2]; - u32Tmp <<= 8; - u32Tmp += p[1]; - u32Tmp <<= 8; - u32Tmp += p[0]; - - return u32Tmp; -} - -#define BUSY_1() GPIO_ResetBits(GPIOC, GPIO_Pin_9) -#define BUSY_0() GPIO_SetBits(GPIOC, GPIO_Pin_9) - -void u32tou8(uint32_t u32In, uint8_t *p) -{ - p[0] = u32In; - u32In >>= 8; - p[1] = u32In; - u32In >>= 8; - p[2] = u32In; - u32In >>= 8; - p[3] = u32In; -} - -void NHC_Delay_Us(uint16_t u16Delay); - -static uint8_t USBD_HID_DataOut (void *pdev, - uint8_t epnum) -{ - uint32_t u32Address; - //uint32_t u32Len; - uint32_t u32Tmp; - //uint32_t *pu32; - uint32_t i; - uint32_t n; - //uint8_t *p; - - busy_on; - - switch (rxBuff[0]) { - case WCH_SDI_INIT: - NHC_WchSdi_Init(); - break; - case WCH_SDI_EXIT: - NHC_WchSdi_Exit(); - break; - case WCH_SDI_READ: - u32Tmp = u8tou32(rxBuff + 2); - txBuff[0] = NHC_WchSdi_Read(rxBuff[1], &u32Tmp); - u32tou8(u32Tmp, txBuff + 1); - DCD_EP_Tx(pdev, HID_IN_EP, txBuff, 0x40); - break; - case WCH_SDI_WRITE: - u32Tmp = u8tou32(rxBuff + 2); - NHC_WchSdi_Write(rxBuff[1], u32Tmp); - break; - case WCH_SDI_READ_MEM: - u32Address = u8tou32(rxBuff + 1); - txBuff[0] = NHC_WchSdi_ReadMem(u32Address, &u32Tmp, rxBuff[5]); - u32tou8(u32Tmp, txBuff + 1); - DCD_EP_Tx(pdev, HID_IN_EP, txBuff, 0x40); - break; - case WCH_SDI_WRITE_MEM: - u32Address = u8tou32(rxBuff + 1); - u32Tmp = u8tou32(rxBuff + 5); - NHC_WchSdi_WriteMem(u32Address, u32Tmp, rxBuff[9]); - break; - case DELAY_US_CMD: - u32Tmp = u8tou32(rxBuff + 1); - if (u32Tmp < 50000) - { - NHC_Delay_Us(u32Tmp); - } - else - { - n = u32Tmp / 50000; - for (i = 0; i < n; ++i) - { - NHC_Delay_Us(50000); - } - n = u32Tmp % 50000; - if (n) - { - NHC_Delay_Us(n); - } - } - break; - } - - busy_off; - - DCD_EP_PrepareRx(pdev, HID_OUT_EP, rxBuff, 0x40); - return USBD_OK; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/LibUSB/LibUSB.h b/attic/NHC-Link042/LibUSB/LibUSB.h deleted file mode 100644 index 5216d0a..0000000 --- a/attic/NHC-Link042/LibUSB/LibUSB.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_hid_core.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header file for the usbd_hid_core.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_HID_CORE_H_ -#define __USB_HID_CORE_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" - -/* Exported defines ----------------------------------------------------------*/ -#define USB_HID_CONFIG_DESC_SIZ 0x20 -#define USB_HID_DESC_SIZ 9 -#define HID_MOUSE_REPORT_DESC_SIZE 28 - -#define HID_DESCRIPTOR_TYPE 0x21 -#define HID_REPORT_DESC 0x22 - - -#define HID_REQ_SET_PROTOCOL 0x0B -#define HID_REQ_GET_PROTOCOL 0x03 - -#define HID_REQ_SET_IDLE 0x0A -#define HID_REQ_GET_IDLE 0x02 - -#define HID_REQ_SET_REPORT 0x09 -#define HID_REQ_GET_REPORT 0x01 - -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern USBD_Class_cb_TypeDef USBD_HID_cb; - -/* Exported functions ------------------------------------------------------- */ - -uint8_t USBD_HID_SendReport (USB_CORE_HANDLE *pdev, - uint8_t *report, - uint16_t len); -#endif /* __USB_HID_CORE_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/NHC-Link042.uvprojx b/attic/NHC-Link042/NHC-Link042.uvprojx deleted file mode 100644 index b35aa43..0000000 --- a/attic/NHC-Link042/NHC-Link042.uvprojx +++ /dev/null @@ -1,564 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no" ?> -<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd"> - - <SchemaVersion>2.1</SchemaVersion> - - <Header>### uVision Project, (C) Keil Software</Header> - - <Targets> - <Target> - <TargetName>NHC-Link042</TargetName> - <ToolsetNumber>0x4</ToolsetNumber> - <ToolsetName>ARM-ADS</ToolsetName> - <pCCUsed>5060960::V5.06 update 7 (build 960)::.\v6</pCCUsed> - <uAC6>0</uAC6> - <TargetOption> - <TargetCommonOption> - <Device>STM32F042F6</Device> - <Vendor>STMicroelectronics</Vendor> - <PackID>Keil.STM32F0xx_DFP.2.1.1</PackID> - <PackURL>https://www.keil.com/pack/</PackURL> - <Cpu>IROM(0x08000000,0x8000) IRAM(0x20000000,0x1800) CPUTYPE("Cortex-M0") CLOCK(12000000) ELITTLE</Cpu> - <FlashUtilSpec></FlashUtilSpec> - <StartupFile></StartupFile> - <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F0xx_32 -FS08000000 -FL08000 -FP0($$Device:STM32F042F6$Flash\STM32F0xx_32.FLM))</FlashDriverDll> - <DeviceId>0</DeviceId> - <RegisterFile>$$Device:STM32F042F6$Device\Include\stm32f0xx.h</RegisterFile> - <MemoryEnv></MemoryEnv> - <Cmp></Cmp> - <Asm></Asm> - <Linker></Linker> - <OHString></OHString> - <InfinionOptionDll></InfinionOptionDll> - <SLE66CMisc></SLE66CMisc> - <SLE66AMisc></SLE66AMisc> - <SLE66LinkerMisc></SLE66LinkerMisc> - <SFDFile>$$Device:STM32F042F6$SVD\STM32F042x.svd</SFDFile> - <bCustSvd>0</bCustSvd> - <UseEnv>0</UseEnv> - <BinPath></BinPath> - <IncludePath></IncludePath> - <LibPath></LibPath> - <RegisterFilePath></RegisterFilePath> - <DBRegisterFilePath></DBRegisterFilePath> - <TargetStatus> - <Error>0</Error> - <ExitCodeStop>0</ExitCodeStop> - <ButtonStop>0</ButtonStop> - <NotGenerated>0</NotGenerated> - <InvalidFlash>1</InvalidFlash> - </TargetStatus> - <OutputDirectory>.\obj\</OutputDirectory> - <OutputName>NHC-Link042</OutputName> - <CreateExecutable>1</CreateExecutable> - <CreateLib>0</CreateLib> - <CreateHexFile>1</CreateHexFile> - <DebugInformation>1</DebugInformation> - <BrowseInformation>1</BrowseInformation> - <ListingPath>.\lst\</ListingPath> - <HexFormatSelection>1</HexFormatSelection> - <Merge32K>0</Merge32K> - <CreateBatchFile>0</CreateBatchFile> - <BeforeCompile> - <RunUserProg1>0</RunUserProg1> - <RunUserProg2>0</RunUserProg2> - <UserProg1Name></UserProg1Name> - <UserProg2Name></UserProg2Name> - <UserProg1Dos16Mode>0</UserProg1Dos16Mode> - <UserProg2Dos16Mode>0</UserProg2Dos16Mode> - <nStopU1X>0</nStopU1X> - <nStopU2X>0</nStopU2X> - </BeforeCompile> - <BeforeMake> - <RunUserProg1>0</RunUserProg1> - <RunUserProg2>0</RunUserProg2> - <UserProg1Name></UserProg1Name> - <UserProg2Name></UserProg2Name> - <UserProg1Dos16Mode>0</UserProg1Dos16Mode> - <UserProg2Dos16Mode>0</UserProg2Dos16Mode> - <nStopB1X>0</nStopB1X> - <nStopB2X>0</nStopB2X> - </BeforeMake> - <AfterMake> - <RunUserProg1>0</RunUserProg1> - <RunUserProg2>0</RunUserProg2> - <UserProg1Name></UserProg1Name> - <UserProg2Name></UserProg2Name> - <UserProg1Dos16Mode>0</UserProg1Dos16Mode> - <UserProg2Dos16Mode>0</UserProg2Dos16Mode> - <nStopA1X>0</nStopA1X> - <nStopA2X>0</nStopA2X> - </AfterMake> - <SelectedForBatchBuild>0</SelectedForBatchBuild> - <SVCSIdString></SVCSIdString> - </TargetCommonOption> - <CommonProperty> - <UseCPPCompiler>0</UseCPPCompiler> - <RVCTCodeConst>0</RVCTCodeConst> - <RVCTZI>0</RVCTZI> - <RVCTOtherData>0</RVCTOtherData> - <ModuleSelection>0</ModuleSelection> - <IncludeInBuild>1</IncludeInBuild> - <AlwaysBuild>0</AlwaysBuild> - <GenerateAssemblyFile>0</GenerateAssemblyFile> - <AssembleAssemblyFile>0</AssembleAssemblyFile> - <PublicsOnly>0</PublicsOnly> - <StopOnExitCode>3</StopOnExitCode> - <CustomArgument></CustomArgument> - <IncludeLibraryModules></IncludeLibraryModules> - <ComprImg>1</ComprImg> - </CommonProperty> - <DllOption> - <SimDllName>SARMCM3.DLL</SimDllName> - <SimDllArguments> </SimDllArguments> - <SimDlgDll>DARMCM1.DLL</SimDlgDll> - <SimDlgDllArguments>-pCM0</SimDlgDllArguments> - <TargetDllName>SARMCM3.DLL</TargetDllName> - <TargetDllArguments> </TargetDllArguments> - <TargetDlgDll>TARMCM1.DLL</TargetDlgDll> - <TargetDlgDllArguments>-pCM0</TargetDlgDllArguments> - </DllOption> - <DebugOption> - <OPTHX> - <HexSelection>1</HexSelection> - <HexRangeLowAddress>0</HexRangeLowAddress> - <HexRangeHighAddress>0</HexRangeHighAddress> - <HexOffset>0</HexOffset> - <Oh166RecLen>16</Oh166RecLen> - </OPTHX> - </DebugOption> - <Utilities> - <Flash1> - <UseTargetDll>1</UseTargetDll> - <UseExternalTool>0</UseExternalTool> - <RunIndependent>0</RunIndependent> - <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging> - <Capability>1</Capability> - <DriverSelection>4096</DriverSelection> - </Flash1> - <bUseTDR>1</bUseTDR> - <Flash2>BIN\UL2CM3.DLL</Flash2> - <Flash3></Flash3> - <Flash4></Flash4> - <pFcarmOut></pFcarmOut> - <pFcarmGrp></pFcarmGrp> - <pFcArmRoot></pFcArmRoot> - <FcArmLst>0</FcArmLst> - </Utilities> - <TargetArmAds> - <ArmAdsMisc> - <GenerateListings>0</GenerateListings> - <asHll>1</asHll> - <asAsm>1</asAsm> - <asMacX>1</asMacX> - <asSyms>1</asSyms> - <asFals>1</asFals> - <asDbgD>1</asDbgD> - <asForm>1</asForm> - <ldLst>0</ldLst> - <ldmm>1</ldmm> - <ldXref>1</ldXref> - <BigEnd>0</BigEnd> - <AdsALst>1</AdsALst> - <AdsACrf>1</AdsACrf> - <AdsANop>0</AdsANop> - <AdsANot>0</AdsANot> - <AdsLLst>1</AdsLLst> - <AdsLmap>1</AdsLmap> - <AdsLcgr>1</AdsLcgr> - <AdsLsym>1</AdsLsym> - <AdsLszi>1</AdsLszi> - <AdsLtoi>1</AdsLtoi> - <AdsLsun>1</AdsLsun> - <AdsLven>1</AdsLven> - <AdsLsxf>1</AdsLsxf> - <RvctClst>0</RvctClst> - <GenPPlst>0</GenPPlst> - <AdsCpuType>"Cortex-M0"</AdsCpuType> - <RvctDeviceName></RvctDeviceName> - <mOS>0</mOS> - <uocRom>0</uocRom> - <uocRam>0</uocRam> - <hadIROM>1</hadIROM> - <hadIRAM>1</hadIRAM> - <hadXRAM>0</hadXRAM> - <uocXRam>0</uocXRam> - <RvdsVP>0</RvdsVP> - <RvdsMve>0</RvdsMve> - <RvdsCdeCp>0</RvdsCdeCp> - <nBranchProt>0</nBranchProt> - <hadIRAM2>0</hadIRAM2> - <hadIROM2>0</hadIROM2> - <StupSel>8</StupSel> - <useUlib>1</useUlib> - <EndSel>0</EndSel> - <uLtcg>0</uLtcg> - <nSecure>0</nSecure> - <RoSelD>3</RoSelD> - <RwSelD>3</RwSelD> - <CodeSel>0</CodeSel> - <OptFeed>0</OptFeed> - <NoZi1>0</NoZi1> - <NoZi2>0</NoZi2> - <NoZi3>0</NoZi3> - <NoZi4>0</NoZi4> - <NoZi5>0</NoZi5> - <Ro1Chk>0</Ro1Chk> - <Ro2Chk>0</Ro2Chk> - <Ro3Chk>0</Ro3Chk> - <Ir1Chk>1</Ir1Chk> - <Ir2Chk>0</Ir2Chk> - <Ra1Chk>0</Ra1Chk> - <Ra2Chk>0</Ra2Chk> - <Ra3Chk>0</Ra3Chk> - <Im1Chk>1</Im1Chk> - <Im2Chk>0</Im2Chk> - <OnChipMemories> - <Ocm1> - <Type>0</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </Ocm1> - <Ocm2> - <Type>0</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </Ocm2> - <Ocm3> - <Type>0</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </Ocm3> - <Ocm4> - <Type>0</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </Ocm4> - <Ocm5> - <Type>0</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </Ocm5> - <Ocm6> - <Type>0</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </Ocm6> - <IRAM> - <Type>0</Type> - <StartAddress>0x20000000</StartAddress> - <Size>0x1800</Size> - </IRAM> - <IROM> - <Type>1</Type> - <StartAddress>0x8000000</StartAddress> - <Size>0x8000</Size> - </IROM> - <XRAM> - <Type>0</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </XRAM> - <OCR_RVCT1> - <Type>1</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </OCR_RVCT1> - <OCR_RVCT2> - <Type>1</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </OCR_RVCT2> - <OCR_RVCT3> - <Type>1</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </OCR_RVCT3> - <OCR_RVCT4> - <Type>1</Type> - <StartAddress>0x8000000</StartAddress> - <Size>0x4000</Size> - </OCR_RVCT4> - <OCR_RVCT5> - <Type>1</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </OCR_RVCT5> - <OCR_RVCT6> - <Type>0</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </OCR_RVCT6> - <OCR_RVCT7> - <Type>0</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </OCR_RVCT7> - <OCR_RVCT8> - <Type>0</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </OCR_RVCT8> - <OCR_RVCT9> - <Type>0</Type> - <StartAddress>0x20000000</StartAddress> - <Size>0x2000</Size> - </OCR_RVCT9> - <OCR_RVCT10> - <Type>0</Type> - <StartAddress>0x0</StartAddress> - <Size>0x0</Size> - </OCR_RVCT10> - </OnChipMemories> - <RvctStartVector></RvctStartVector> - </ArmAdsMisc> - <Cads> - <interw>1</interw> - <Optim>4</Optim> - <oTime>0</oTime> - <SplitLS>0</SplitLS> - <OneElfS>0</OneElfS> - <Strict>0</Strict> - <EnumInt>0</EnumInt> - <PlainCh>0</PlainCh> - <Ropi>0</Ropi> - <Rwpi>0</Rwpi> - <wLevel>0</wLevel> - <uThumb>0</uThumb> - <uSurpInc>0</uSurpInc> - <uC99>0</uC99> - <uGnu>0</uGnu> - <useXO>0</useXO> - <v6Lang>1</v6Lang> - <v6LangP>1</v6LangP> - <vShortEn>1</vShortEn> - <vShortWch>1</vShortWch> - <v6Lto>0</v6Lto> - <v6WtE>0</v6WtE> - <v6Rtti>0</v6Rtti> - <VariousControls> - <MiscControls></MiscControls> - <Define>USE_STDPERIPH_DRIVER,STM32F042, INTERNAL_PULLUP, USB_CLOCK_SOURCE_CRS</Define> - <Undefine></Undefine> - <IncludePath>.\User;.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\CMSIS\Device\ST\STM32F0xx\Include;.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32F0xx_StdPeriph_Driver\inc;.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32_USB_Device_Driver\inc;.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32_USB_Device_Library\Core\inc;.\LibUSB;.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\CMSIS\Include</IncludePath> - </VariousControls> - </Cads> - <Aads> - <interw>1</interw> - <Ropi>0</Ropi> - <Rwpi>0</Rwpi> - <thumb>0</thumb> - <SplitLS>0</SplitLS> - <SwStkChk>0</SwStkChk> - <NoWarn>0</NoWarn> - <uSurpInc>0</uSurpInc> - <useXO>0</useXO> - <ClangAsOpt>1</ClangAsOpt> - <VariousControls> - <MiscControls></MiscControls> - <Define></Define> - <Undefine></Undefine> - <IncludePath></IncludePath> - </VariousControls> - </Aads> - <LDads> - <umfTarg>1</umfTarg> - <Ropi>0</Ropi> - <Rwpi>0</Rwpi> - <noStLib>0</noStLib> - <RepFail>1</RepFail> - <useFile>0</useFile> - <TextAddressRange>0x08000000</TextAddressRange> - <DataAddressRange>0x20000000</DataAddressRange> - <pXoBase></pXoBase> - <ScatterFile></ScatterFile> - <IncludeLibs></IncludeLibs> - <IncludeLibsPath></IncludeLibsPath> - <Misc></Misc> - <LinkerInputFile></LinkerInputFile> - <DisabledWarnings></DisabledWarnings> - </LDads> - </TargetArmAds> - </TargetOption> - <Groups> - <Group> - <GroupName>User</GroupName> - <Files> - <File> - <FileName>it.c</FileName> - <FileType>1</FileType> - <FilePath>.\User\it.c</FilePath> - </File> - <File> - <FileName>main.c</FileName> - <FileType>1</FileType> - <FilePath>.\User\main.c</FilePath> - </File> - <File> - <FileName>usb_bsp.c</FileName> - <FileType>1</FileType> - <FilePath>.\User\usb_bsp.c</FilePath> - </File> - <File> - <FileName>usbd_pwr.c</FileName> - <FileType>1</FileType> - <FilePath>.\User\usbd_pwr.c</FilePath> - </File> - <File> - <FileName>usbd_desc.c</FileName> - <FileType>1</FileType> - <FilePath>.\User\usbd_desc.c</FilePath> - </File> - <File> - <FileName>usbd_usr.c</FileName> - <FileType>1</FileType> - <FilePath>.\User\usbd_usr.c</FilePath> - </File> - <File> - <FileName>stm32_it.c</FileName> - <FileType>1</FileType> - <FilePath>.\User\stm32_it.c</FilePath> - </File> - <File> - <FileName>NHC_WCH_SDI.c</FileName> - <FileType>1</FileType> - <FilePath>.\User\NHC_WCH_SDI.c</FilePath> - </File> - <File> - <FileName>NHC_WCH_SDI.h</FileName> - <FileType>5</FileType> - <FilePath>.\User\NHC_WCH_SDI.h</FilePath> - </File> - <File> - <FileName>config.h</FileName> - <FileType>5</FileType> - <FilePath>.\User\config.h</FilePath> - </File> - <File> - <FileName>usbd_desc.h</FileName> - <FileType>5</FileType> - <FilePath>.\User\usbd_desc.h</FilePath> - </File> - </Files> - </Group> - <Group> - <GroupName>USB_Class</GroupName> - <Files> - <File> - <FileName>LibUSB.c</FileName> - <FileType>1</FileType> - <FilePath>.\LibUSB\LibUSB.c</FilePath> - </File> - </Files> - </Group> - <Group> - <GroupName>CMSIS</GroupName> - <Files> - <File> - <FileName>system_stm32f0xx.c</FileName> - <FileType>1</FileType> - <FilePath>.\User\system_stm32f0xx.c</FilePath> - </File> - <File> - <FileName>startup_stm32f042.s</FileName> - <FileType>2</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\CMSIS\Device\ST\STM32F0xx\Source\Templates\arm\startup_stm32f042.s</FilePath> - </File> - </Files> - </Group> - <Group> - <GroupName>LIB</GroupName> - <Files> - <File> - <FileName>stm32f0xx_crs.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_crs.c</FilePath> - </File> - <File> - <FileName>stm32f0xx_exti.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_exti.c</FilePath> - </File> - <File> - <FileName>stm32f0xx_gpio.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_gpio.c</FilePath> - </File> - <File> - <FileName>stm32f0xx_rcc.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_rcc.c</FilePath> - </File> - <File> - <FileName>stm32f0xx_syscfg.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_syscfg.c</FilePath> - </File> - <File> - <FileName>stm32f0xx_tim.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_tim.c</FilePath> - </File> - <File> - <FileName>stm32f0xx_misc.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_misc.c</FilePath> - </File> - </Files> - </Group> - <Group> - <GroupName>USB_Lib</GroupName> - <Files> - <File> - <FileName>usb_core.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32_USB_Device_Driver\src\usb_core.c</FilePath> - </File> - <File> - <FileName>usb_dcd.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32_USB_Device_Driver\src\usb_dcd.c</FilePath> - </File> - <File> - <FileName>usb_dcd_int.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32_USB_Device_Driver\src\usb_dcd_int.c</FilePath> - </File> - <File> - <FileName>usbd_core.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32_USB_Device_Library\Core\src\usbd_core.c</FilePath> - </File> - <File> - <FileName>usbd_ioreq.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32_USB_Device_Library\Core\src\usbd_ioreq.c</FilePath> - </File> - <File> - <FileName>usbd_req.c</FileName> - <FileType>1</FileType> - <FilePath>.\STM32F0x2_USB-FS-Device_Lib V1.0.0\Libraries\STM32_USB_Device_Library\Core\src\usbd_req.c</FilePath> - </File> - </Files> - </Group> - </Groups> - </Target> - </Targets> - - <RTE> - <apis/> - <components/> - <files/> - </RTE> - - <LayerInfo> - <Layers> - <Layer> - <LayName>Template</LayName> - <LayTarg>0</LayTarg> - <LayPrjMark>1</LayPrjMark> - </Layer> - </Layers> - </LayerInfo> - -</Project> diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Include/stm32f0xx.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Include/stm32f0xx.h deleted file mode 100644 index 53c8c01..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Include/stm32f0xx.h +++ /dev/null @@ -1,5111 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx.h - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief CMSIS Cortex-M0 Device Peripheral Access Layer Header File. - * This file contains all the peripheral register's definitions, bits - * definitions and memory mapping for STM32F0xx devices. - * - * The file is the unique include file that the application programmer - * is using in the C source code, usually in main.c. This file contains: - * - Configuration section that allows to select: - * - The device used in the target application - * - To use or not the peripheral’s drivers in application code(i.e. - * code will be based on direct access to peripheral’s registers - * rather than drivers API), this option is controlled by - * "#define USE_STDPERIPH_DRIVER" - * - To change few application-specific parameters such as the HSE - * crystal frequency - * - Data structures and the address mapping for all peripherals - * - Peripheral's registers declarations and bits definition - * - Macros to access peripheral’s registers hardware - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f0xx - * @{ - */ - -#ifndef __STM32F0XX_H -#define __STM32F0XX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup Library_configuration_section - * @{ - */ - -/* Uncomment the line below according to the target STM32F0 device used in your - application - */ - -#if !defined (STM32F030) && !defined (STM32F031) && !defined (STM32F051) && !defined (STM32F072) && !defined (STM32F042) - /* #define STM32F030 */ - /* #define STM32F031 */ - /* #define STM32F051 */ - #define STM32F072 - /* #define STM32F042 */ -#endif - -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - */ - -/* Old STM32F0XX definition, maintained for legacy purpose */ -#if defined(STM32F0XX) || defined(STM32F0XX_MD) - #define STM32F051 -#endif /* STM32F0XX */ - -/* Old STM32F0XX_LD definition, maintained for legacy purpose */ -#ifdef STM32F0XX_LD - #define STM32F031 -#endif /* STM32F0XX_LD */ - -/* Old STM32F0XX_HD definition, maintained for legacy purpose */ -#ifdef STM32F0XX_HD - #define STM32F072 -#endif /* STM32F0XX_HD */ - -/* Old STM32F030X6/X8 definition, maintained for legacy purpose */ -#if defined (STM32F030X8) || defined (STM32F030X6) - #define STM32F030 -#endif /* STM32F030X8 or STM32F030X6 */ - - -#if !defined (STM32F030) && !defined (STM32F031) && !defined (STM32F051) && !defined (STM32F072) && !defined (STM32F042) - #error "Please select first the target STM32F0xx device used in your application (in stm32f0xx.h file)" -#endif - -#if !defined USE_STDPERIPH_DRIVER -/** - * @brief Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will - be based on direct access to peripherals registers - */ - /*#define USE_STDPERIPH_DRIVER*/ -#endif /* USE_STDPERIPH_DRIVER */ - -/** - * @brief In the following line adjust the value of External High Speed oscillator (HSE) - used in your application - - Tip: To avoid modifying this file each time you need to use different HSE, you - can define the HSE value in your toolchain compiler preprocessor. - */ -#if !defined (HSE_VALUE) -#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/ -#endif /* HSE_VALUE */ - -/** - * @brief In the following line adjust the External High Speed oscillator (HSE) Startup - Timeout value - */ -#if !defined (HSE_STARTUP_TIMEOUT) -#define HSE_STARTUP_TIMEOUT ((uint16_t)0x5000) /*!< Time out for HSE start up */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup - Timeout value - */ -#if !defined (HSI_STARTUP_TIMEOUT) -#define HSI_STARTUP_TIMEOUT ((uint16_t)0x5000) /*!< Time out for HSI start up */ -#endif /* HSI_STARTUP_TIMEOUT */ - -#if !defined (HSI_VALUE) -#define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal High Speed oscillator in Hz. - The real value may vary depending on the variations - in voltage and temperature. */ -#endif /* HSI_VALUE */ - -#if !defined (HSI14_VALUE) -#define HSI14_VALUE ((uint32_t)14000000) /*!< Value of the Internal High Speed oscillator for ADC in Hz. - The real value may vary depending on the variations - in voltage and temperature. */ -#endif /* HSI14_VALUE */ - -#if !defined (HSI48_VALUE) -#define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal High Speed oscillator for USB in Hz. - The real value may vary depending on the variations - in voltage and temperature. */ -#endif /* HSI48_VALUE */ - -#if !defined (LSI_VALUE) -#define LSI_VALUE ((uint32_t)40000) /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature. */ -#endif /* LSI_VALUE */ - -#if !defined (LSE_VALUE) -#define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -/** - * @brief STM32F0xx Standard Peripheral Library version number V1.3.1 - */ -#define __STM32F0XX_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ -#define __STM32F0XX_STDPERIPH_VERSION_SUB1 (0x03) /*!< [23:16] sub1 version */ -#define __STM32F0XX_STDPERIPH_VERSION_SUB2 (0x01) /*!< [15:8] sub2 version */ -#define __STM32F0XX_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __STM32F0XX_STDPERIPH_VERSION ((__STM32F0XX_STDPERIPH_VERSION_MAIN << 24)\ - |(__STM32F0XX_STDPERIPH_VERSION_SUB1 << 16)\ - |(__STM32F0XX_STDPERIPH_VERSION_SUB2 << 8)\ - |(__STM32F0XX_STDPERIPH_VERSION_RC)) - -/** - * @} - */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief STM32F0xx Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -#define __CM0_REV 0 /*!< Core Revision r0p0 */ -#define __MPU_PRESENT 0 /*!< STM32F0xx do not provide MPU */ -#define __NVIC_PRIO_BITS 2 /*!< STM32F0xx uses 2 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/*!< Interrupt Number Definition */ -typedef enum IRQn -{ -/****** Cortex-M0 Processor Exceptions Numbers ******************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - HardFault_IRQn = -13, /*!< 3 Cortex-M0 Hard Fault Interrupt */ - SVC_IRQn = -5, /*!< 11 Cortex-M0 SV Call Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M0 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M0 System Tick Interrupt */ - -#if defined (STM32F051) -/****** STM32F051 specific Interrupt Numbers *************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detect Interrupt */ - RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */ - FLASH_IRQn = 3, /*!< FLASH Interrupt */ - RCC_IRQn = 4, /*!< RCC Interrupt */ - EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */ - EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */ - EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */ - TS_IRQn = 8, /*!< Touch sense controller Interrupt */ - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */ - DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */ - DMA1_Channel4_5_IRQn = 11, /*!< DMA1 Channel 4 and Channel 5 Interrupts */ - ADC1_COMP_IRQn = 12, /*!< ADC1, COMP1 and COMP2 Interrupts */ - TIM1_BRK_UP_TRG_COM_IRQn = 13, /*!< TIM1 Break, Update, Trigger and Commutation Interrupts */ - TIM1_CC_IRQn = 14, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 15, /*!< TIM2 Interrupt */ - TIM3_IRQn = 16, /*!< TIM3 Interrupt */ - TIM6_DAC_IRQn = 17, /*!< TIM6 and DAC Interrupts */ - TIM14_IRQn = 19, /*!< TIM14 Interrupt */ - TIM15_IRQn = 20, /*!< TIM15 Interrupt */ - TIM16_IRQn = 21, /*!< TIM16 Interrupt */ - TIM17_IRQn = 22, /*!< TIM17 Interrupt */ - I2C1_IRQn = 23, /*!< I2C1 Interrupt */ - I2C2_IRQn = 24, /*!< I2C2 Interrupt */ - SPI1_IRQn = 25, /*!< SPI1 Interrupt */ - SPI2_IRQn = 26, /*!< SPI2 Interrupt */ - USART1_IRQn = 27, /*!< USART1 Interrupt */ - USART2_IRQn = 28, /*!< USART2 Interrupt */ - CEC_IRQn = 30 /*!< CEC Interrupt */ -#elif defined (STM32F031) -/****** STM32F031 specific Interrupt Numbers *************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detect Interrupt */ - RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */ - FLASH_IRQn = 3, /*!< FLASH Interrupt */ - RCC_IRQn = 4, /*!< RCC Interrupt */ - EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */ - EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */ - EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */ - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */ - DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */ - DMA1_Channel4_5_IRQn = 11, /*!< DMA1 Channel 4 and Channel 5 Interrupts */ - ADC1_IRQn = 12, /*!< ADC1 Interrupt */ - TIM1_BRK_UP_TRG_COM_IRQn = 13, /*!< TIM1 Break, Update, Trigger and Commutation Interrupts */ - TIM1_CC_IRQn = 14, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 15, /*!< TIM2 Interrupt */ - TIM3_IRQn = 16, /*!< TIM3 Interrupt */ - TIM14_IRQn = 19, /*!< TIM14 Interrupt */ - TIM16_IRQn = 21, /*!< TIM16 Interrupt */ - TIM17_IRQn = 22, /*!< TIM17 Interrupt */ - I2C1_IRQn = 23, /*!< I2C1 Interrupt */ - SPI1_IRQn = 25, /*!< SPI1 Interrupt */ - USART1_IRQn = 27 /*!< USART1 Interrupt */ -#elif defined (STM32F030) -/****** STM32F030 specific Interrupt Numbers *************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */ - FLASH_IRQn = 3, /*!< FLASH Interrupt */ - RCC_IRQn = 4, /*!< RCC Interrupt */ - EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */ - EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */ - EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */ - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */ - DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */ - DMA1_Channel4_5_IRQn = 11, /*!< DMA1 Channel 4 and Channel 5 Interrupts */ - ADC1_IRQn = 12, /*!< ADC1 Interrupt */ - TIM1_BRK_UP_TRG_COM_IRQn = 13, /*!< TIM1 Break, Update, Trigger and Commutation Interrupts */ - TIM1_CC_IRQn = 14, /*!< TIM1 Capture Compare Interrupt */ - TIM3_IRQn = 16, /*!< TIM3 Interrupt */ - TIM14_IRQn = 19, /*!< TIM14 Interrupt */ - TIM15_IRQn = 20, /*!< TIM15 Interrupt */ - TIM16_IRQn = 21, /*!< TIM16 Interrupt */ - TIM17_IRQn = 22, /*!< TIM17 Interrupt */ - I2C1_IRQn = 23, /*!< I2C1 Interrupt */ - I2C2_IRQn = 24, /*!< I2C2 Interrupt */ - SPI1_IRQn = 25, /*!< SPI1 Interrupt */ - SPI2_IRQn = 26, /*!< SPI2 Interrupt */ - USART1_IRQn = 27, /*!< USART1 Interrupt */ - USART2_IRQn = 28 /*!< USART2 Interrupt */ -#elif defined (STM32F072) - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_VDDIO2_IRQn = 1, /*!< PVD and VDDIO2 supply comparator through EXTI Line detect Interrupt */ - RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */ - FLASH_IRQn = 3, /*!< FLASH Interrupt */ - RCC_CRS_IRQn = 4, /*!< RCC and CRS Interrupts */ - EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */ - EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */ - EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */ - TSC_IRQn = 8, /*!< TSC Interrupt */ - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */ - DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */ - DMA1_Channel4_5_6_7_IRQn = 11, /*!< DMA1 Channel 4, Channel 5, Channel 6 and Channel 7 Interrupts */ - ADC1_COMP_IRQn = 12, /*!< ADC1, COMP1 and COMP2 Interrupts */ - TIM1_BRK_UP_TRG_COM_IRQn = 13, /*!< TIM1 Break, Update, Trigger and Commutation Interrupts */ - TIM1_CC_IRQn = 14, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 15, /*!< TIM2 Interrupt */ - TIM3_IRQn = 16, /*!< TIM3 Interrupt */ - TIM6_DAC_IRQn = 17, /*!< TIM6 and DAC Interrupts */ - TIM7_IRQn = 18, /*!< TIM7 Interrupts */ - TIM14_IRQn = 19, /*!< TIM14 Interrupt */ - TIM15_IRQn = 20, /*!< TIM15 Interrupt */ - TIM16_IRQn = 21, /*!< TIM16 Interrupt */ - TIM17_IRQn = 22, /*!< TIM17 Interrupt */ - I2C1_IRQn = 23, /*!< I2C1 Interrupt */ - I2C2_IRQn = 24, /*!< I2C2 Interrupt */ - SPI1_IRQn = 25, /*!< SPI1 Interrupt */ - SPI2_IRQn = 26, /*!< SPI2 Interrupt */ - USART1_IRQn = 27, /*!< USART1 Interrupt */ - USART2_IRQn = 28, /*!< USART2 Interrupt */ - USART3_4_IRQn = 29, /*!< USART3 and USART4 Interrupts */ - CEC_CAN_IRQn = 30, /*!< CEC and CAN Interrupts */ - USB_IRQn = 31 /*!< USB Low Priority global Interrupt */ -#elif defined (STM32F042) - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_VDDIO2_IRQn = 1, /*!< PVD and VDDIO2 supply comparator through EXTI Line detect Interrupt */ - RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */ - FLASH_IRQn = 3, /*!< FLASH Interrupt */ - RCC_CRS_IRQn = 4, /*!< RCC and CRS Interrupts */ - EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */ - EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */ - EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */ - TSC_IRQn = 8, /*!< TSC Interrupt */ - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */ - DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */ - DMA1_Channel4_5_IRQn = 11, /*!< DMA1 Channel 4, Channel 5 Interrupts */ - ADC1_IRQn = 12, /*!< ADC1 Interrupts */ - TIM1_BRK_UP_TRG_COM_IRQn = 13, /*!< TIM1 Break, Update, Trigger and Commutation Interrupts */ - TIM1_CC_IRQn = 14, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 15, /*!< TIM2 Interrupt */ - TIM3_IRQn = 16, /*!< TIM3 Interrupt */ - TIM14_IRQn = 19, /*!< TIM14 Interrupt */ - TIM16_IRQn = 21, /*!< TIM16 Interrupt */ - TIM17_IRQn = 22, /*!< TIM17 Interrupt */ - I2C1_IRQn = 23, /*!< I2C1 Interrupt */ - SPI1_IRQn = 25, /*!< SPI1 Interrupt */ - SPI2_IRQn = 26, /*!< SPI2 Interrupt */ - USART1_IRQn = 27, /*!< USART1 Interrupt */ - USART2_IRQn = 28, /*!< USART2 Interrupt */ - CEC_CAN_IRQn = 30, /*!< CEC and CAN Interrupts */ - USB_IRQn = 31 /*!< USB Low Priority global Interrupt */ -#endif /* STM32F051 */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm0.h" -#include "system_stm32f0xx.h" -#include <stdint.h> - -/** @addtogroup Exported_types - * @{ - */ - -typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; - -typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; -#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) - -typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t ISR; /*!< ADC Interrupt and Status register, Address offset:0x00 */ - __IO uint32_t IER; /*!< ADC Interrupt Enable register, Address offset:0x04 */ - __IO uint32_t CR; /*!< ADC Control register, Address offset:0x08 */ - __IO uint32_t CFGR1; /*!< ADC Configuration register 1, Address offset:0x0C */ - __IO uint32_t CFGR2; /*!< ADC Configuration register 2, Address offset:0x10 */ - __IO uint32_t SMPR; /*!< ADC Sampling time register, Address offset:0x14 */ - uint32_t RESERVED1; /*!< Reserved, 0x18 */ - uint32_t RESERVED2; /*!< Reserved, 0x1C */ - __IO uint32_t TR; /*!< ADC watchdog threshold register, Address offset:0x20 */ - uint32_t RESERVED3; /*!< Reserved, 0x24 */ - __IO uint32_t CHSELR; /*!< ADC channel selection register, Address offset:0x28 */ - uint32_t RESERVED4[5]; /*!< Reserved, 0x2C */ - __IO uint32_t DR; /*!< ADC data register, Address offset:0x40 */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CCR; -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - -/** - * @brief HDMI-CEC - */ - -typedef struct -{ - __IO uint32_t CR; /*!< CEC control register, Address offset:0x00 */ - __IO uint32_t CFGR; /*!< CEC configuration register, Address offset:0x04 */ - __IO uint32_t TXDR; /*!< CEC Tx data register , Address offset:0x08 */ - __IO uint32_t RXDR; /*!< CEC Rx Data Register, Address offset:0x0C */ - __IO uint32_t ISR; /*!< CEC Interrupt and Status Register, Address offset:0x10 */ - __IO uint32_t IER; /*!< CEC interrupt enable register, Address offset:0x14 */ -}CEC_TypeDef; - -/** - * @brief Comparator - */ - -typedef struct -{ - __IO uint32_t CSR; /*!< COMP comparator control and status register, Address offset: 0x1C */ -} COMP_TypeDef; - - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ - uint32_t RESERVED2; /*!< Reserved, 0x0C */ - __IO uint32_t INIT; /*!< Initial CRC value register, Address offset: 0x10 */ - __IO uint32_t POL; /*!< CRC polynomial register, Address offset: 0x14 */ -} CRC_TypeDef; - -/** - * @brief Clock Recovery System - */ -typedef struct -{ -__IO uint32_t CR; /*!< CRS ccontrol register, Address offset: 0x00 */ -__IO uint32_t CFGR; /*!< CRS configuration register, Address offset: 0x04 */ -__IO uint32_t ISR; /*!< CRS interrupt and status register, Address offset: 0x08 */ -__IO uint32_t ICR; /*!< CRS interrupt flag clear register, Address offset: 0x0C */ -} CRS_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CCR; /*!< DMA channel x configuration register */ - __IO uint32_t CNDTR; /*!< DMA channel x number of data register */ - __IO uint32_t CPAR; /*!< DMA channel x peripheral address register */ - __IO uint32_t CMAR; /*!< DMA channel x memory address register */ -} DMA_Channel_TypeDef; - -typedef struct -{ - __IO uint32_t ISR; /*!< DMA interrupt status register, Address offset: 0x00 */ - __IO uint32_t IFCR; /*!< DMA interrupt flag clear register, Address offset: 0x04 */ -} DMA_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!<EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!<EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!<EXTI Rising trigger selection register , Address offset: 0x08 */ - __IO uint32_t FTSR; /*!<EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!<EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!<EXTI Pending register, Address offset: 0x14 */ -}EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ -typedef struct -{ - __IO uint32_t ACR; /*!<FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!<FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!<FLASH OPT key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!<FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!<FLASH control register, Address offset: 0x10 */ - __IO uint32_t AR; /*!<FLASH address register, Address offset: 0x14 */ - __IO uint32_t RESERVED; /*!< Reserved, 0x18 */ - __IO uint32_t OBR; /*!<FLASH option bytes register, Address offset: 0x1C */ - __IO uint32_t WRPR; /*!<FLASH option bytes register, Address offset: 0x20 */ -} FLASH_TypeDef; - - -/** - * @brief Option Bytes Registers - */ -typedef struct -{ - __IO uint16_t RDP; /*!< FLASH option byte Read protection, Address offset: 0x00 */ - __IO uint16_t USER; /*!< FLASH option byte user options, Address offset: 0x02 */ - __IO uint16_t DATA0; /*!< User data byte 0 (stored in FLASH_OBR[23:16]), Address offset: 0x04 */ - __IO uint16_t DATA1; /*!< User data byte 1 (stored in FLASH_OBR[31:24]), Address offset: 0x06 */ - __IO uint16_t WRP0; /*!< FLASH option byte write protection 0, Address offset: 0x08 */ - __IO uint16_t WRP1; /*!< FLASH option byte write protection 1, Address offset: 0x0A */ - __IO uint16_t WRP2; /*!< FLASH option byte write protection 2, Address offset: 0x0C */ - __IO uint16_t WRP3; /*!< FLASH option byte write protection 3, Address offset: 0x0E */ -} OB_TypeDef; - - -/** - * @brief General Purpose IO - */ - -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint16_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - uint16_t RESERVED0; /*!< Reserved, 0x06 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint16_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - uint16_t RESERVED1; /*!< Reserved, 0x12 */ - __IO uint16_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - uint16_t RESERVED2; /*!< Reserved, 0x16 */ - __IO uint32_t BSRR; /*!< GPIO port bit set/reset registerBSRR, Address offset: 0x18 */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function low register, Address offset: 0x20-0x24 */ - __IO uint16_t BRR; /*!< GPIO bit reset register, Address offset: 0x28 */ - uint16_t RESERVED3; /*!< Reserved, 0x2A */ -}GPIO_TypeDef; - -/** - * @brief SysTem Configuration - */ - -typedef struct -{ - __IO uint32_t CFGR1; /*!< SYSCFG configuration register 1, Address offset: 0x00 */ - uint32_t RESERVED; /*!< Reserved, 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration register, Address offset: 0x14-0x08 */ - __IO uint32_t CFGR2; /*!< SYSCFG configuration register 2, Address offset: 0x18 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - __IO uint32_t OAR1; /*!< I2C Own address 1 register, Address offset: 0x08 */ - __IO uint32_t OAR2; /*!< I2C Own address 2 register, Address offset: 0x0C */ - __IO uint32_t TIMINGR; /*!< I2C Timing register, Address offset: 0x10 */ - __IO uint32_t TIMEOUTR; /*!< I2C Timeout register, Address offset: 0x14 */ - __IO uint32_t ISR; /*!< I2C Interrupt and status register, Address offset: 0x18 */ - __IO uint32_t ICR; /*!< I2C Interrupt clear register, Address offset: 0x1C */ - __IO uint32_t PECR; /*!< I2C PEC register, Address offset: 0x20 */ - __IO uint32_t RXDR; /*!< I2C Receive data register, Address offset: 0x24 */ - __IO uint32_t TXDR; /*!< I2C Transmit data register, Address offset: 0x28 */ -}I2C_TypeDef; - - -/** - * @brief Independent WATCHDOG - */ -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ - __IO uint32_t WINR; /*!< IWDG Window register, Address offset: 0x10 */ -} IWDG_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - - -/** - * @brief Reset and Clock Control - */ -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x04 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x08 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x0C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHBENR; /*!< RCC AHB peripheral clock register, Address offset: 0x14 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x18 */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x1C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x20 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x24 */ - __IO uint32_t AHBRSTR; /*!< RCC AHB peripheral reset register, Address offset: 0x28 */ - __IO uint32_t CFGR2; /*!< RCC clock configuration register 2, Address offset: 0x2C */ - __IO uint32_t CFGR3; /*!< RCC clock configuration register 3, Address offset: 0x30 */ - __IO uint32_t CR2; /*!< RCC clock control register 2, Address offset: 0x34 */ -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register,(only for STM32F072 devices) Address offset: 0x14 */ - uint32_t RESERVED1; /*!< Reserved, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - uint32_t RESERVED2; /*!< Reserved, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ - __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ - __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - __IO uint32_t ALRMASSR; /*!< RTC alarm A sub second register, Address offset: 0x44 */ - uint32_t RESERVED3; /*!< Reserved, Address offset: 0x48 */ - uint32_t RESERVED4; /*!< Reserved, Address offset: 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 0, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ -} RTC_TypeDef; - -/* Old register name definition maintained for legacy purpose */ -#define CAL CALR - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint16_t CR1; /*!< SPI Control register 1 (not used in I2S mode), Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t CR2; /*!< SPI Control register 2, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t SR; /*!< SPI Status register, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t DR; /*!< SPI data register, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t RXCRCR; /*!< SPI Rx CRC register (not used in I2S mode), Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t TXCRCR; /*!< SPI Tx CRC register (not used in I2S mode), Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ - __IO uint16_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - uint16_t RESERVED7; /*!< Reserved, 0x1E */ - __IO uint16_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ - uint16_t RESERVED8; /*!< Reserved, 0x22 */ -} SPI_TypeDef; - - -/** - * @brief TIM - */ -typedef struct -{ - __IO uint16_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t SMCR; /*!< TIM slave Mode Control register, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t SR; /*!< TIM status register, Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ - __IO uint16_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - uint16_t RESERVED7; /*!< Reserved, 0x1E */ - __IO uint16_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - uint16_t RESERVED8; /*!< Reserved, 0x22 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint16_t PSC; /*!< TIM prescaler register, Address offset: 0x28 */ - uint16_t RESERVED10; /*!< Reserved, 0x2A */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint16_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - uint16_t RESERVED12; /*!< Reserved, 0x32 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint16_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - uint16_t RESERVED17; /*!< Reserved, 0x26 */ - __IO uint16_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - uint16_t RESERVED18; /*!< Reserved, 0x4A */ - __IO uint16_t DMAR; /*!< TIM DMA address for full transfer register, Address offset: 0x4C */ - uint16_t RESERVED19; /*!< Reserved, 0x4E */ - __IO uint16_t OR; /*!< TIM option register, Address offset: 0x50 */ - uint16_t RESERVED20; /*!< Reserved, 0x52 */ -} TIM_TypeDef; - -/** - * @brief Touch Sensing Controller (TSC) - */ -typedef struct -{ - __IO uint32_t CR; /*!< TSC control register, Address offset: 0x00 */ - __IO uint32_t IER; /*!< TSC interrupt enable register, Address offset: 0x04 */ - __IO uint32_t ICR; /*!< TSC interrupt clear register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< TSC interrupt status register, Address offset: 0x0C */ - __IO uint32_t IOHCR; /*!< TSC I/O hysteresis control register, Address offset: 0x10 */ - __IO uint32_t RESERVED1; /*!< Reserved, Address offset: 0x14 */ - __IO uint32_t IOASCR; /*!< TSC I/O analog switch control register, Address offset: 0x18 */ - __IO uint32_t RESERVED2; /*!< Reserved, Address offset: 0x1C */ - __IO uint32_t IOSCR; /*!< TSC I/O sampling control register, Address offset: 0x20 */ - __IO uint32_t RESERVED3; /*!< Reserved, Address offset: 0x24 */ - __IO uint32_t IOCCR; /*!< TSC I/O channel control register, Address offset: 0x28 */ - __IO uint32_t RESERVED4; /*!< Reserved, Address offset: 0x2C */ - __IO uint32_t IOGCSR; /*!< TSC I/O group control status register, Address offset: 0x30 */ - __IO uint32_t IOGXCR[8]; /*!< TSC I/O group x counter register, Address offset: 0x34-50 */ -} TSC_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x04 */ - __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x08 */ - __IO uint16_t BRR; /*!< USART Baud rate register, Address offset: 0x0C */ - uint16_t RESERVED1; /*!< Reserved, 0x0E */ - __IO uint16_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x10 */ - uint16_t RESERVED2; /*!< Reserved, 0x12 */ - __IO uint32_t RTOR; /*!< USART Receiver Time Out register, Address offset: 0x14 */ - __IO uint16_t RQR; /*!< USART Request register, Address offset: 0x18 */ - uint16_t RESERVED3; /*!< Reserved, 0x1A */ - __IO uint32_t ISR; /*!< USART Interrupt and status register, Address offset: 0x1C */ - __IO uint32_t ICR; /*!< USART Interrupt flag Clear register, Address offset: 0x20 */ - __IO uint16_t RDR; /*!< USART Receive Data register, Address offset: 0x24 */ - uint16_t RESERVED4; /*!< Reserved, 0x26 */ - __IO uint16_t TDR; /*!< USART Transmit Data register, Address offset: 0x28 */ - uint16_t RESERVED5; /*!< Reserved, 0x2A */ -} USART_TypeDef; - - -/** - * @brief Window WATCHDOG - */ -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; - - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ - -#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */ -#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ - -/*!< Peripheral memory map */ -#define APBPERIPH_BASE PERIPH_BASE -#define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x08000000) - -#define TIM2_BASE (APBPERIPH_BASE + 0x00000000) -#define TIM3_BASE (APBPERIPH_BASE + 0x00000400) -#define TIM6_BASE (APBPERIPH_BASE + 0x00001000) -#define TIM7_BASE (APBPERIPH_BASE + 0x00001400) -#define TIM14_BASE (APBPERIPH_BASE + 0x00002000) -#define RTC_BASE (APBPERIPH_BASE + 0x00002800) -#define WWDG_BASE (APBPERIPH_BASE + 0x00002C00) -#define IWDG_BASE (APBPERIPH_BASE + 0x00003000) -#define SPI2_BASE (APBPERIPH_BASE + 0x00003800) -#define USART2_BASE (APBPERIPH_BASE + 0x00004400) -#define USART3_BASE (APBPERIPH_BASE + 0x00004800) -#define USART4_BASE (APBPERIPH_BASE + 0x00004C00) -#define I2C1_BASE (APBPERIPH_BASE + 0x00005400) -#define I2C2_BASE (APBPERIPH_BASE + 0x00005800) -#define CAN_BASE (APBPERIPH_BASE + 0x00006400) -#define CRS_BASE (APBPERIPH_BASE + 0x00006C00) -#define PWR_BASE (APBPERIPH_BASE + 0x00007000) -#define DAC_BASE (APBPERIPH_BASE + 0x00007400) -#define CEC_BASE (APBPERIPH_BASE + 0x00007800) - -#define SYSCFG_BASE (APBPERIPH_BASE + 0x00010000) -#define COMP_BASE (APBPERIPH_BASE + 0x0001001C) -#define EXTI_BASE (APBPERIPH_BASE + 0x00010400) -#define ADC1_BASE (APBPERIPH_BASE + 0x00012400) -#define ADC_BASE (APBPERIPH_BASE + 0x00012708) -#define TIM1_BASE (APBPERIPH_BASE + 0x00012C00) -#define SPI1_BASE (APBPERIPH_BASE + 0x00013000) -#define USART1_BASE (APBPERIPH_BASE + 0x00013800) -#define TIM15_BASE (APBPERIPH_BASE + 0x00014000) -#define TIM16_BASE (APBPERIPH_BASE + 0x00014400) -#define TIM17_BASE (APBPERIPH_BASE + 0x00014800) -#define DBGMCU_BASE (APBPERIPH_BASE + 0x00015800) - -#define DMA1_BASE (AHBPERIPH_BASE + 0x00000000) -#define DMA1_Channel1_BASE (DMA1_BASE + 0x00000008) -#define DMA1_Channel2_BASE (DMA1_BASE + 0x0000001C) -#define DMA1_Channel3_BASE (DMA1_BASE + 0x00000030) -#define DMA1_Channel4_BASE (DMA1_BASE + 0x00000044) -#define DMA1_Channel5_BASE (DMA1_BASE + 0x00000058) -#define DMA1_Channel6_BASE (DMA1_BASE + 0x0000006C) -#define DMA1_Channel7_BASE (DMA1_BASE + 0x00000080) - -#define RCC_BASE (AHBPERIPH_BASE + 0x00001000) -#define FLASH_R_BASE (AHBPERIPH_BASE + 0x00002000) /*!< FLASH registers base address */ -#define OB_BASE ((uint32_t)0x1FFFF800) /*!< FLASH Option Bytes base address */ -#define CRC_BASE (AHBPERIPH_BASE + 0x00003000) -#define TSC_BASE (AHBPERIPH_BASE + 0x00004000) - -#define GPIOA_BASE (AHB2PERIPH_BASE + 0x00000000) -#define GPIOB_BASE (AHB2PERIPH_BASE + 0x00000400) -#define GPIOC_BASE (AHB2PERIPH_BASE + 0x00000800) -#define GPIOD_BASE (AHB2PERIPH_BASE + 0x00000C00) -#define GPIOE_BASE (AHB2PERIPH_BASE + 0x00001000) -#define GPIOF_BASE (AHB2PERIPH_BASE + 0x00001400) - -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ - -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define USART4 ((USART_TypeDef *) USART4_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define CAN ((CAN_TypeDef *) CAN_BASE) -#define CRS ((CRS_TypeDef *) CRS_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) -#define CEC ((CEC_TypeDef *) CEC_BASE) - -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define COMP ((COMP_TypeDef *) COMP_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define TIM15 ((TIM_TypeDef *) TIM15_BASE) -#define TIM16 ((TIM_TypeDef *) TIM16_BASE) -#define TIM17 ((TIM_TypeDef *) TIM17_BASE) -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) - -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) -#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE) -#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE) -#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE) -#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE) -#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE) -#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define OB ((OB_TypeDef *) OB_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define TSC ((TSC_TypeDef *) TSC_BASE) - -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers Bits Definition */ -/******************************************************************************/ -/******************************************************************************/ -/* */ -/* Analog to Digital Converter (ADC) */ -/* */ -/******************************************************************************/ -/******************** Bits definition for ADC_ISR register ******************/ -#define ADC_ISR_AWD ((uint32_t)0x00000080) /*!< Analog watchdog flag */ -#define ADC_ISR_OVR ((uint32_t)0x00000010) /*!< Overrun flag */ -#define ADC_ISR_EOSEQ ((uint32_t)0x00000008) /*!< End of Sequence flag */ -#define ADC_ISR_EOC ((uint32_t)0x00000004) /*!< End of Conversion */ -#define ADC_ISR_EOSMP ((uint32_t)0x00000002) /*!< End of sampling flag */ -#define ADC_ISR_ADRDY ((uint32_t)0x00000001) /*!< ADC Ready */ - -/* Old EOSEQ bit definition, maintained for legacy purpose */ -#define ADC_ISR_EOS ADC_ISR_EOSEQ - -/******************** Bits definition for ADC_IER register ******************/ -#define ADC_IER_AWDIE ((uint32_t)0x00000080) /*!< Analog Watchdog interrupt enable */ -#define ADC_IER_OVRIE ((uint32_t)0x00000010) /*!< Overrun interrupt enable */ -#define ADC_IER_EOSEQIE ((uint32_t)0x00000008) /*!< End of Sequence of conversion interrupt enable */ -#define ADC_IER_EOCIE ((uint32_t)0x00000004) /*!< End of Conversion interrupt enable */ -#define ADC_IER_EOSMPIE ((uint32_t)0x00000002) /*!< End of sampling interrupt enable */ -#define ADC_IER_ADRDYIE ((uint32_t)0x00000001) /*!< ADC Ready interrupt enable */ - -/* Old EOSEQIE bit definition, maintained for legacy purpose */ -#define ADC_IER_EOSIE ADC_IER_EOSEQIE - -/******************** Bits definition for ADC_CR register *******************/ -#define ADC_CR_ADCAL ((uint32_t)0x80000000) /*!< ADC calibration */ -#define ADC_CR_ADSTP ((uint32_t)0x00000010) /*!< ADC stop of conversion command */ -#define ADC_CR_ADSTART ((uint32_t)0x00000004) /*!< ADC start of conversion */ -#define ADC_CR_ADDIS ((uint32_t)0x00000002) /*!< ADC disable command */ -#define ADC_CR_ADEN ((uint32_t)0x00000001) /*!< ADC enable control */ - -/******************* Bits definition for ADC_CFGR1 register *****************/ -#define ADC_CFGR1_AWDCH ((uint32_t)0x7C000000) /*!< AWDCH[4:0] bits (Analog watchdog channel select bits) */ -#define ADC_CFGR1_AWDCH_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define ADC_CFGR1_AWDCH_1 ((uint32_t)0x08000000) /*!< Bit 1 */ -#define ADC_CFGR1_AWDCH_2 ((uint32_t)0x10000000) /*!< Bit 2 */ -#define ADC_CFGR1_AWDCH_3 ((uint32_t)0x20000000) /*!< Bit 3 */ -#define ADC_CFGR1_AWDCH_4 ((uint32_t)0x40000000) /*!< Bit 4 */ -#define ADC_CFGR1_AWDEN ((uint32_t)0x00800000) /*!< Analog watchdog enable on regular channels */ -#define ADC_CFGR1_AWDSGL ((uint32_t)0x00400000) /*!< Enable the watchdog on a single channel or on all channels */ -#define ADC_CFGR1_DISCEN ((uint32_t)0x00010000) /*!< Discontinuous mode on regular channels */ -#define ADC_CFGR1_AUTOFF ((uint32_t)0x00008000) /*!< ADC auto power off */ -#define ADC_CFGR1_WAIT ((uint32_t)0x00004000) /*!< ADC wait conversion mode */ -#define ADC_CFGR1_CONT ((uint32_t)0x00002000) /*!< Continuous Conversion */ -#define ADC_CFGR1_OVRMOD ((uint32_t)0x00001000) /*!< Overrun mode */ -#define ADC_CFGR1_EXTEN ((uint32_t)0x00000C00) /*!< EXTEN[1:0] bits (External Trigger Conversion mode for regular channels) */ -#define ADC_CFGR1_EXTEN_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define ADC_CFGR1_EXTEN_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define ADC_CFGR1_EXTSEL ((uint32_t)0x000001C0) /*!< EXTSEL[2:0] bits (External Event Select for regular group) */ -#define ADC_CFGR1_EXTSEL_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define ADC_CFGR1_EXTSEL_1 ((uint32_t)0x00000080) /*!< Bit 1 */ -#define ADC_CFGR1_EXTSEL_2 ((uint32_t)0x00000100) /*!< Bit 2 */ -#define ADC_CFGR1_ALIGN ((uint32_t)0x00000020) /*!< Data Alignment */ -#define ADC_CFGR1_RES ((uint32_t)0x00000018) /*!< RES[1:0] bits (Resolution) */ -#define ADC_CFGR1_RES_0 ((uint32_t)0x00000008) /*!< Bit 0 */ -#define ADC_CFGR1_RES_1 ((uint32_t)0x00000010) /*!< Bit 1 */ -#define ADC_CFGR1_SCANDIR ((uint32_t)0x00000004) /*!< Sequence scan direction */ -#define ADC_CFGR1_DMACFG ((uint32_t)0x00000002) /*!< Direct memory access configuration */ -#define ADC_CFGR1_DMAEN ((uint32_t)0x00000001) /*!< Direct memory access enable */ - -/* Old WAIT bit definition, maintained for legacy purpose */ -#define ADC_CFGR1_AUTDLY ADC_CFGR1_WAIT - -/******************* Bits definition for ADC_CFGR2 register *****************/ -#define ADC_CFGR2_CKMODE ((uint32_t)0xC0000000) /*!< ADC clock mode */ -#define ADC_CFGR2_CKMODE_1 ((uint32_t)0x80000000) /*!< ADC clocked by PCLK div4 */ -#define ADC_CFGR2_CKMODE_0 ((uint32_t)0x40000000) /*!< ADC clocked by PCLK div2 */ - -/* Old bit definition, maintained for legacy purpose */ -#define ADC_CFGR2_JITOFFDIV4 ADC_CFGR2_CKMODE_1 /*!< ADC clocked by PCLK div4 */ -#define ADC_CFGR2_JITOFFDIV2 ADC_CFGR2_CKMODE_0 /*!< ADC clocked by PCLK div2 */ - -/****************** Bit definition for ADC_SMPR register ********************/ -#define ADC_SMPR_SMP ((uint32_t)0x00000007) /*!< SMP[2:0] bits (Sampling time selection) */ -#define ADC_SMPR_SMP_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SMPR_SMP_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SMPR_SMP_2 ((uint32_t)0x00000004) /*!< Bit 2 */ - -/* Old bit definition, maintained for legacy purpose */ -#define ADC_SMPR1_SMPR ADC_SMPR_SMP /*!< SMP[2:0] bits (Sampling time selection) */ -#define ADC_SMPR1_SMPR_0 ADC_SMPR_SMP_0 /*!< Bit 0 */ -#define ADC_SMPR1_SMPR_1 ADC_SMPR_SMP_1 /*!< Bit 1 */ -#define ADC_SMPR1_SMPR_2 ADC_SMPR_SMP_2 /*!< Bit 2 */ - -/******************* Bit definition for ADC_TR register ********************/ -#define ADC_TR_HT ((uint32_t)0x0FFF0000) /*!< Analog watchdog high threshold */ -#define ADC_TR_LT ((uint32_t)0x00000FFF) /*!< Analog watchdog low threshold */ - -/* Old bit definition, maintained for legacy purpose */ -#define ADC_HTR_HT ADC_TR_HT /*!< Analog watchdog high threshold */ -#define ADC_LTR_LT ADC_TR_LT /*!< Analog watchdog low threshold */ - -/****************** Bit definition for ADC_CHSELR register ******************/ -#define ADC_CHSELR_CHSEL18 ((uint32_t)0x00040000) /*!< Channel 18 selection */ -#define ADC_CHSELR_CHSEL17 ((uint32_t)0x00020000) /*!< Channel 17 selection */ -#define ADC_CHSELR_CHSEL16 ((uint32_t)0x00010000) /*!< Channel 16 selection */ -#define ADC_CHSELR_CHSEL15 ((uint32_t)0x00008000) /*!< Channel 15 selection */ -#define ADC_CHSELR_CHSEL14 ((uint32_t)0x00004000) /*!< Channel 14 selection */ -#define ADC_CHSELR_CHSEL13 ((uint32_t)0x00002000) /*!< Channel 13 selection */ -#define ADC_CHSELR_CHSEL12 ((uint32_t)0x00001000) /*!< Channel 12 selection */ -#define ADC_CHSELR_CHSEL11 ((uint32_t)0x00000800) /*!< Channel 11 selection */ -#define ADC_CHSELR_CHSEL10 ((uint32_t)0x00000400) /*!< Channel 10 selection */ -#define ADC_CHSELR_CHSEL9 ((uint32_t)0x00000200) /*!< Channel 9 selection */ -#define ADC_CHSELR_CHSEL8 ((uint32_t)0x00000100) /*!< Channel 8 selection */ -#define ADC_CHSELR_CHSEL7 ((uint32_t)0x00000080) /*!< Channel 7 selection */ -#define ADC_CHSELR_CHSEL6 ((uint32_t)0x00000040) /*!< Channel 6 selection */ -#define ADC_CHSELR_CHSEL5 ((uint32_t)0x00000020) /*!< Channel 5 selection */ -#define ADC_CHSELR_CHSEL4 ((uint32_t)0x00000010) /*!< Channel 4 selection */ -#define ADC_CHSELR_CHSEL3 ((uint32_t)0x00000008) /*!< Channel 3 selection */ -#define ADC_CHSELR_CHSEL2 ((uint32_t)0x00000004) /*!< Channel 2 selection */ -#define ADC_CHSELR_CHSEL1 ((uint32_t)0x00000002) /*!< Channel 1 selection */ -#define ADC_CHSELR_CHSEL0 ((uint32_t)0x00000001) /*!< Channel 0 selection */ - -/******************** Bit definition for ADC_DR register ********************/ -#define ADC_DR_DATA ((uint32_t)0x0000FFFF) /*!< Regular data */ - -/******************* Bit definition for ADC_CCR register ********************/ -#define ADC_CCR_VBATEN ((uint32_t)0x01000000) /*!< Voltage battery enable */ -#define ADC_CCR_TSEN ((uint32_t)0x00800000) /*!< Tempurature sensore enable */ -#define ADC_CCR_VREFEN ((uint32_t)0x00400000) /*!< Vrefint enable */ - -/******************************************************************************/ -/* */ -/* Controller Area Network (CAN ) */ -/* */ -/******************************************************************************/ -/******************* Bit definition for CAN_MCR register ********************/ -#define CAN_MCR_INRQ ((uint16_t)0x0001) /*!<Initialization Request */ -#define CAN_MCR_SLEEP ((uint16_t)0x0002) /*!<Sleep Mode Request */ -#define CAN_MCR_TXFP ((uint16_t)0x0004) /*!<Transmit FIFO Priority */ -#define CAN_MCR_RFLM ((uint16_t)0x0008) /*!<Receive FIFO Locked Mode */ -#define CAN_MCR_NART ((uint16_t)0x0010) /*!<No Automatic Retransmission */ -#define CAN_MCR_AWUM ((uint16_t)0x0020) /*!<Automatic Wakeup Mode */ -#define CAN_MCR_ABOM ((uint16_t)0x0040) /*!<Automatic Bus-Off Management */ -#define CAN_MCR_TTCM ((uint16_t)0x0080) /*!<Time Triggered Communication Mode */ -#define CAN_MCR_RESET ((uint16_t)0x8000) /*!<bxCAN software master reset */ - -/******************* Bit definition for CAN_MSR register ********************/ -#define CAN_MSR_INAK ((uint16_t)0x0001) /*!<Initialization Acknowledge */ -#define CAN_MSR_SLAK ((uint16_t)0x0002) /*!<Sleep Acknowledge */ -#define CAN_MSR_ERRI ((uint16_t)0x0004) /*!<Error Interrupt */ -#define CAN_MSR_WKUI ((uint16_t)0x0008) /*!<Wakeup Interrupt */ -#define CAN_MSR_SLAKI ((uint16_t)0x0010) /*!<Sleep Acknowledge Interrupt */ -#define CAN_MSR_TXM ((uint16_t)0x0100) /*!<Transmit Mode */ -#define CAN_MSR_RXM ((uint16_t)0x0200) /*!<Receive Mode */ -#define CAN_MSR_SAMP ((uint16_t)0x0400) /*!<Last Sample Point */ -#define CAN_MSR_RX ((uint16_t)0x0800) /*!<CAN Rx Signal */ - -/******************* Bit definition for CAN_TSR register ********************/ -#define CAN_TSR_RQCP0 ((uint32_t)0x00000001) /*!<Request Completed Mailbox0 */ -#define CAN_TSR_TXOK0 ((uint32_t)0x00000002) /*!<Transmission OK of Mailbox0 */ -#define CAN_TSR_ALST0 ((uint32_t)0x00000004) /*!<Arbitration Lost for Mailbox0 */ -#define CAN_TSR_TERR0 ((uint32_t)0x00000008) /*!<Transmission Error of Mailbox0 */ -#define CAN_TSR_ABRQ0 ((uint32_t)0x00000080) /*!<Abort Request for Mailbox0 */ -#define CAN_TSR_RQCP1 ((uint32_t)0x00000100) /*!<Request Completed Mailbox1 */ -#define CAN_TSR_TXOK1 ((uint32_t)0x00000200) /*!<Transmission OK of Mailbox1 */ -#define CAN_TSR_ALST1 ((uint32_t)0x00000400) /*!<Arbitration Lost for Mailbox1 */ -#define CAN_TSR_TERR1 ((uint32_t)0x00000800) /*!<Transmission Error of Mailbox1 */ -#define CAN_TSR_ABRQ1 ((uint32_t)0x00008000) /*!<Abort Request for Mailbox 1 */ -#define CAN_TSR_RQCP2 ((uint32_t)0x00010000) /*!<Request Completed Mailbox2 */ -#define CAN_TSR_TXOK2 ((uint32_t)0x00020000) /*!<Transmission OK of Mailbox 2 */ -#define CAN_TSR_ALST2 ((uint32_t)0x00040000) /*!<Arbitration Lost for mailbox 2 */ -#define CAN_TSR_TERR2 ((uint32_t)0x00080000) /*!<Transmission Error of Mailbox 2 */ -#define CAN_TSR_ABRQ2 ((uint32_t)0x00800000) /*!<Abort Request for Mailbox 2 */ -#define CAN_TSR_CODE ((uint32_t)0x03000000) /*!<Mailbox Code */ - -#define CAN_TSR_TME ((uint32_t)0x1C000000) /*!<TME[2:0] bits */ -#define CAN_TSR_TME0 ((uint32_t)0x04000000) /*!<Transmit Mailbox 0 Empty */ -#define CAN_TSR_TME1 ((uint32_t)0x08000000) /*!<Transmit Mailbox 1 Empty */ -#define CAN_TSR_TME2 ((uint32_t)0x10000000) /*!<Transmit Mailbox 2 Empty */ - -#define CAN_TSR_LOW ((uint32_t)0xE0000000) /*!<LOW[2:0] bits */ -#define CAN_TSR_LOW0 ((uint32_t)0x20000000) /*!<Lowest Priority Flag for Mailbox 0 */ -#define CAN_TSR_LOW1 ((uint32_t)0x40000000) /*!<Lowest Priority Flag for Mailbox 1 */ -#define CAN_TSR_LOW2 ((uint32_t)0x80000000) /*!<Lowest Priority Flag for Mailbox 2 */ - -/******************* Bit definition for CAN_RF0R register *******************/ -#define CAN_RF0R_FMP0 ((uint8_t)0x03) /*!<FIFO 0 Message Pending */ -#define CAN_RF0R_FULL0 ((uint8_t)0x08) /*!<FIFO 0 Full */ -#define CAN_RF0R_FOVR0 ((uint8_t)0x10) /*!<FIFO 0 Overrun */ -#define CAN_RF0R_RFOM0 ((uint8_t)0x20) /*!<Release FIFO 0 Output Mailbox */ - -/******************* Bit definition for CAN_RF1R register *******************/ -#define CAN_RF1R_FMP1 ((uint8_t)0x03) /*!<FIFO 1 Message Pending */ -#define CAN_RF1R_FULL1 ((uint8_t)0x08) /*!<FIFO 1 Full */ -#define CAN_RF1R_FOVR1 ((uint8_t)0x10) /*!<FIFO 1 Overrun */ -#define CAN_RF1R_RFOM1 ((uint8_t)0x20) /*!<Release FIFO 1 Output Mailbox */ - -/******************** Bit definition for CAN_IER register *******************/ -#define CAN_IER_TMEIE ((uint32_t)0x00000001) /*!<Transmit Mailbox Empty Interrupt Enable */ -#define CAN_IER_FMPIE0 ((uint32_t)0x00000002) /*!<FIFO Message Pending Interrupt Enable */ -#define CAN_IER_FFIE0 ((uint32_t)0x00000004) /*!<FIFO Full Interrupt Enable */ -#define CAN_IER_FOVIE0 ((uint32_t)0x00000008) /*!<FIFO Overrun Interrupt Enable */ -#define CAN_IER_FMPIE1 ((uint32_t)0x00000010) /*!<FIFO Message Pending Interrupt Enable */ -#define CAN_IER_FFIE1 ((uint32_t)0x00000020) /*!<FIFO Full Interrupt Enable */ -#define CAN_IER_FOVIE1 ((uint32_t)0x00000040) /*!<FIFO Overrun Interrupt Enable */ -#define CAN_IER_EWGIE ((uint32_t)0x00000100) /*!<Error Warning Interrupt Enable */ -#define CAN_IER_EPVIE ((uint32_t)0x00000200) /*!<Error Passive Interrupt Enable */ -#define CAN_IER_BOFIE ((uint32_t)0x00000400) /*!<Bus-Off Interrupt Enable */ -#define CAN_IER_LECIE ((uint32_t)0x00000800) /*!<Last Error Code Interrupt Enable */ -#define CAN_IER_ERRIE ((uint32_t)0x00008000) /*!<Error Interrupt Enable */ -#define CAN_IER_WKUIE ((uint32_t)0x00010000) /*!<Wakeup Interrupt Enable */ -#define CAN_IER_SLKIE ((uint32_t)0x00020000) /*!<Sleep Interrupt Enable */ - -/******************** Bit definition for CAN_ESR register *******************/ -#define CAN_ESR_EWGF ((uint32_t)0x00000001) /*!<Error Warning Flag */ -#define CAN_ESR_EPVF ((uint32_t)0x00000002) /*!<Error Passive Flag */ -#define CAN_ESR_BOFF ((uint32_t)0x00000004) /*!<Bus-Off Flag */ - -#define CAN_ESR_LEC ((uint32_t)0x00000070) /*!<LEC[2:0] bits (Last Error Code) */ -#define CAN_ESR_LEC_0 ((uint32_t)0x00000010) /*!<Bit 0 */ -#define CAN_ESR_LEC_1 ((uint32_t)0x00000020) /*!<Bit 1 */ -#define CAN_ESR_LEC_2 ((uint32_t)0x00000040) /*!<Bit 2 */ - -#define CAN_ESR_TEC ((uint32_t)0x00FF0000) /*!<Least significant byte of the 9-bit Transmit Error Counter */ -#define CAN_ESR_REC ((uint32_t)0xFF000000) /*!<Receive Error Counter */ - -/******************* Bit definition for CAN_BTR register ********************/ -#define CAN_BTR_BRP ((uint32_t)0x000003FF) /*!<Baud Rate Prescaler */ -#define CAN_BTR_TS1 ((uint32_t)0x000F0000) /*!<Time Segment 1 */ -#define CAN_BTR_TS2 ((uint32_t)0x00700000) /*!<Time Segment 2 */ -#define CAN_BTR_SJW ((uint32_t)0x03000000) /*!<Resynchronization Jump Width */ -#define CAN_BTR_LBKM ((uint32_t)0x40000000) /*!<Loop Back Mode (Debug) */ -#define CAN_BTR_SILM ((uint32_t)0x80000000) /*!<Silent Mode */ - -/*!<Mailbox registers */ -/****************** Bit definition for CAN_TI0R register ********************/ -#define CAN_TI0R_TXRQ ((uint32_t)0x00000001) /*!<Transmit Mailbox Request */ -#define CAN_TI0R_RTR ((uint32_t)0x00000002) /*!<Remote Transmission Request */ -#define CAN_TI0R_IDE ((uint32_t)0x00000004) /*!<Identifier Extension */ -#define CAN_TI0R_EXID ((uint32_t)0x001FFFF8) /*!<Extended Identifier */ -#define CAN_TI0R_STID ((uint32_t)0xFFE00000) /*!<Standard Identifier or Extended Identifier */ - -/****************** Bit definition for CAN_TDT0R register *******************/ -#define CAN_TDT0R_DLC ((uint32_t)0x0000000F) /*!<Data Length Code */ -#define CAN_TDT0R_TGT ((uint32_t)0x00000100) /*!<Transmit Global Time */ -#define CAN_TDT0R_TIME ((uint32_t)0xFFFF0000) /*!<Message Time Stamp */ - -/****************** Bit definition for CAN_TDL0R register *******************/ -#define CAN_TDL0R_DATA0 ((uint32_t)0x000000FF) /*!<Data byte 0 */ -#define CAN_TDL0R_DATA1 ((uint32_t)0x0000FF00) /*!<Data byte 1 */ -#define CAN_TDL0R_DATA2 ((uint32_t)0x00FF0000) /*!<Data byte 2 */ -#define CAN_TDL0R_DATA3 ((uint32_t)0xFF000000) /*!<Data byte 3 */ - -/****************** Bit definition for CAN_TDH0R register *******************/ -#define CAN_TDH0R_DATA4 ((uint32_t)0x000000FF) /*!<Data byte 4 */ -#define CAN_TDH0R_DATA5 ((uint32_t)0x0000FF00) /*!<Data byte 5 */ -#define CAN_TDH0R_DATA6 ((uint32_t)0x00FF0000) /*!<Data byte 6 */ -#define CAN_TDH0R_DATA7 ((uint32_t)0xFF000000) /*!<Data byte 7 */ - -/******************* Bit definition for CAN_TI1R register *******************/ -#define CAN_TI1R_TXRQ ((uint32_t)0x00000001) /*!<Transmit Mailbox Request */ -#define CAN_TI1R_RTR ((uint32_t)0x00000002) /*!<Remote Transmission Request */ -#define CAN_TI1R_IDE ((uint32_t)0x00000004) /*!<Identifier Extension */ -#define CAN_TI1R_EXID ((uint32_t)0x001FFFF8) /*!<Extended Identifier */ -#define CAN_TI1R_STID ((uint32_t)0xFFE00000) /*!<Standard Identifier or Extended Identifier */ - -/******************* Bit definition for CAN_TDT1R register ******************/ -#define CAN_TDT1R_DLC ((uint32_t)0x0000000F) /*!<Data Length Code */ -#define CAN_TDT1R_TGT ((uint32_t)0x00000100) /*!<Transmit Global Time */ -#define CAN_TDT1R_TIME ((uint32_t)0xFFFF0000) /*!<Message Time Stamp */ - -/******************* Bit definition for CAN_TDL1R register ******************/ -#define CAN_TDL1R_DATA0 ((uint32_t)0x000000FF) /*!<Data byte 0 */ -#define CAN_TDL1R_DATA1 ((uint32_t)0x0000FF00) /*!<Data byte 1 */ -#define CAN_TDL1R_DATA2 ((uint32_t)0x00FF0000) /*!<Data byte 2 */ -#define CAN_TDL1R_DATA3 ((uint32_t)0xFF000000) /*!<Data byte 3 */ - -/******************* Bit definition for CAN_TDH1R register ******************/ -#define CAN_TDH1R_DATA4 ((uint32_t)0x000000FF) /*!<Data byte 4 */ -#define CAN_TDH1R_DATA5 ((uint32_t)0x0000FF00) /*!<Data byte 5 */ -#define CAN_TDH1R_DATA6 ((uint32_t)0x00FF0000) /*!<Data byte 6 */ -#define CAN_TDH1R_DATA7 ((uint32_t)0xFF000000) /*!<Data byte 7 */ - -/******************* Bit definition for CAN_TI2R register *******************/ -#define CAN_TI2R_TXRQ ((uint32_t)0x00000001) /*!<Transmit Mailbox Request */ -#define CAN_TI2R_RTR ((uint32_t)0x00000002) /*!<Remote Transmission Request */ -#define CAN_TI2R_IDE ((uint32_t)0x00000004) /*!<Identifier Extension */ -#define CAN_TI2R_EXID ((uint32_t)0x001FFFF8) /*!<Extended identifier */ -#define CAN_TI2R_STID ((uint32_t)0xFFE00000) /*!<Standard Identifier or Extended Identifier */ - -/******************* Bit definition for CAN_TDT2R register ******************/ -#define CAN_TDT2R_DLC ((uint32_t)0x0000000F) /*!<Data Length Code */ -#define CAN_TDT2R_TGT ((uint32_t)0x00000100) /*!<Transmit Global Time */ -#define CAN_TDT2R_TIME ((uint32_t)0xFFFF0000) /*!<Message Time Stamp */ - -/******************* Bit definition for CAN_TDL2R register ******************/ -#define CAN_TDL2R_DATA0 ((uint32_t)0x000000FF) /*!<Data byte 0 */ -#define CAN_TDL2R_DATA1 ((uint32_t)0x0000FF00) /*!<Data byte 1 */ -#define CAN_TDL2R_DATA2 ((uint32_t)0x00FF0000) /*!<Data byte 2 */ -#define CAN_TDL2R_DATA3 ((uint32_t)0xFF000000) /*!<Data byte 3 */ - -/******************* Bit definition for CAN_TDH2R register ******************/ -#define CAN_TDH2R_DATA4 ((uint32_t)0x000000FF) /*!<Data byte 4 */ -#define CAN_TDH2R_DATA5 ((uint32_t)0x0000FF00) /*!<Data byte 5 */ -#define CAN_TDH2R_DATA6 ((uint32_t)0x00FF0000) /*!<Data byte 6 */ -#define CAN_TDH2R_DATA7 ((uint32_t)0xFF000000) /*!<Data byte 7 */ - -/******************* Bit definition for CAN_RI0R register *******************/ -#define CAN_RI0R_RTR ((uint32_t)0x00000002) /*!<Remote Transmission Request */ -#define CAN_RI0R_IDE ((uint32_t)0x00000004) /*!<Identifier Extension */ -#define CAN_RI0R_EXID ((uint32_t)0x001FFFF8) /*!<Extended Identifier */ -#define CAN_RI0R_STID ((uint32_t)0xFFE00000) /*!<Standard Identifier or Extended Identifier */ - -/******************* Bit definition for CAN_RDT0R register ******************/ -#define CAN_RDT0R_DLC ((uint32_t)0x0000000F) /*!<Data Length Code */ -#define CAN_RDT0R_FMI ((uint32_t)0x0000FF00) /*!<Filter Match Index */ -#define CAN_RDT0R_TIME ((uint32_t)0xFFFF0000) /*!<Message Time Stamp */ - -/******************* Bit definition for CAN_RDL0R register ******************/ -#define CAN_RDL0R_DATA0 ((uint32_t)0x000000FF) /*!<Data byte 0 */ -#define CAN_RDL0R_DATA1 ((uint32_t)0x0000FF00) /*!<Data byte 1 */ -#define CAN_RDL0R_DATA2 ((uint32_t)0x00FF0000) /*!<Data byte 2 */ -#define CAN_RDL0R_DATA3 ((uint32_t)0xFF000000) /*!<Data byte 3 */ - -/******************* Bit definition for CAN_RDH0R register ******************/ -#define CAN_RDH0R_DATA4 ((uint32_t)0x000000FF) /*!<Data byte 4 */ -#define CAN_RDH0R_DATA5 ((uint32_t)0x0000FF00) /*!<Data byte 5 */ -#define CAN_RDH0R_DATA6 ((uint32_t)0x00FF0000) /*!<Data byte 6 */ -#define CAN_RDH0R_DATA7 ((uint32_t)0xFF000000) /*!<Data byte 7 */ - -/******************* Bit definition for CAN_RI1R register *******************/ -#define CAN_RI1R_RTR ((uint32_t)0x00000002) /*!<Remote Transmission Request */ -#define CAN_RI1R_IDE ((uint32_t)0x00000004) /*!<Identifier Extension */ -#define CAN_RI1R_EXID ((uint32_t)0x001FFFF8) /*!<Extended identifier */ -#define CAN_RI1R_STID ((uint32_t)0xFFE00000) /*!<Standard Identifier or Extended Identifier */ - -/******************* Bit definition for CAN_RDT1R register ******************/ -#define CAN_RDT1R_DLC ((uint32_t)0x0000000F) /*!<Data Length Code */ -#define CAN_RDT1R_FMI ((uint32_t)0x0000FF00) /*!<Filter Match Index */ -#define CAN_RDT1R_TIME ((uint32_t)0xFFFF0000) /*!<Message Time Stamp */ - -/******************* Bit definition for CAN_RDL1R register ******************/ -#define CAN_RDL1R_DATA0 ((uint32_t)0x000000FF) /*!<Data byte 0 */ -#define CAN_RDL1R_DATA1 ((uint32_t)0x0000FF00) /*!<Data byte 1 */ -#define CAN_RDL1R_DATA2 ((uint32_t)0x00FF0000) /*!<Data byte 2 */ -#define CAN_RDL1R_DATA3 ((uint32_t)0xFF000000) /*!<Data byte 3 */ - -/******************* Bit definition for CAN_RDH1R register ******************/ -#define CAN_RDH1R_DATA4 ((uint32_t)0x000000FF) /*!<Data byte 4 */ -#define CAN_RDH1R_DATA5 ((uint32_t)0x0000FF00) /*!<Data byte 5 */ -#define CAN_RDH1R_DATA6 ((uint32_t)0x00FF0000) /*!<Data byte 6 */ -#define CAN_RDH1R_DATA7 ((uint32_t)0xFF000000) /*!<Data byte 7 */ - -/*!<CAN filter registers */ -/******************* Bit definition for CAN_FMR register ********************/ -#define CAN_FMR_FINIT ((uint8_t)0x01) /*!<Filter Init Mode */ - -/******************* Bit definition for CAN_FM1R register *******************/ -#define CAN_FM1R_FBM ((uint16_t)0x3FFF) /*!<Filter Mode */ -#define CAN_FM1R_FBM0 ((uint16_t)0x0001) /*!<Filter Init Mode bit 0 */ -#define CAN_FM1R_FBM1 ((uint16_t)0x0002) /*!<Filter Init Mode bit 1 */ -#define CAN_FM1R_FBM2 ((uint16_t)0x0004) /*!<Filter Init Mode bit 2 */ -#define CAN_FM1R_FBM3 ((uint16_t)0x0008) /*!<Filter Init Mode bit 3 */ -#define CAN_FM1R_FBM4 ((uint16_t)0x0010) /*!<Filter Init Mode bit 4 */ -#define CAN_FM1R_FBM5 ((uint16_t)0x0020) /*!<Filter Init Mode bit 5 */ -#define CAN_FM1R_FBM6 ((uint16_t)0x0040) /*!<Filter Init Mode bit 6 */ -#define CAN_FM1R_FBM7 ((uint16_t)0x0080) /*!<Filter Init Mode bit 7 */ -#define CAN_FM1R_FBM8 ((uint16_t)0x0100) /*!<Filter Init Mode bit 8 */ -#define CAN_FM1R_FBM9 ((uint16_t)0x0200) /*!<Filter Init Mode bit 9 */ -#define CAN_FM1R_FBM10 ((uint16_t)0x0400) /*!<Filter Init Mode bit 10 */ -#define CAN_FM1R_FBM11 ((uint16_t)0x0800) /*!<Filter Init Mode bit 11 */ -#define CAN_FM1R_FBM12 ((uint16_t)0x1000) /*!<Filter Init Mode bit 12 */ -#define CAN_FM1R_FBM13 ((uint16_t)0x2000) /*!<Filter Init Mode bit 13 */ - -/******************* Bit definition for CAN_FS1R register *******************/ -#define CAN_FS1R_FSC ((uint16_t)0x3FFF) /*!<Filter Scale Configuration */ -#define CAN_FS1R_FSC0 ((uint16_t)0x0001) /*!<Filter Scale Configuration bit 0 */ -#define CAN_FS1R_FSC1 ((uint16_t)0x0002) /*!<Filter Scale Configuration bit 1 */ -#define CAN_FS1R_FSC2 ((uint16_t)0x0004) /*!<Filter Scale Configuration bit 2 */ -#define CAN_FS1R_FSC3 ((uint16_t)0x0008) /*!<Filter Scale Configuration bit 3 */ -#define CAN_FS1R_FSC4 ((uint16_t)0x0010) /*!<Filter Scale Configuration bit 4 */ -#define CAN_FS1R_FSC5 ((uint16_t)0x0020) /*!<Filter Scale Configuration bit 5 */ -#define CAN_FS1R_FSC6 ((uint16_t)0x0040) /*!<Filter Scale Configuration bit 6 */ -#define CAN_FS1R_FSC7 ((uint16_t)0x0080) /*!<Filter Scale Configuration bit 7 */ -#define CAN_FS1R_FSC8 ((uint16_t)0x0100) /*!<Filter Scale Configuration bit 8 */ -#define CAN_FS1R_FSC9 ((uint16_t)0x0200) /*!<Filter Scale Configuration bit 9 */ -#define CAN_FS1R_FSC10 ((uint16_t)0x0400) /*!<Filter Scale Configuration bit 10 */ -#define CAN_FS1R_FSC11 ((uint16_t)0x0800) /*!<Filter Scale Configuration bit 11 */ -#define CAN_FS1R_FSC12 ((uint16_t)0x1000) /*!<Filter Scale Configuration bit 12 */ -#define CAN_FS1R_FSC13 ((uint16_t)0x2000) /*!<Filter Scale Configuration bit 13 */ - -/****************** Bit definition for CAN_FFA1R register *******************/ -#define CAN_FFA1R_FFA ((uint16_t)0x3FFF) /*!<Filter FIFO Assignment */ -#define CAN_FFA1R_FFA0 ((uint16_t)0x0001) /*!<Filter FIFO Assignment for Filter 0 */ -#define CAN_FFA1R_FFA1 ((uint16_t)0x0002) /*!<Filter FIFO Assignment for Filter 1 */ -#define CAN_FFA1R_FFA2 ((uint16_t)0x0004) /*!<Filter FIFO Assignment for Filter 2 */ -#define CAN_FFA1R_FFA3 ((uint16_t)0x0008) /*!<Filter FIFO Assignment for Filter 3 */ -#define CAN_FFA1R_FFA4 ((uint16_t)0x0010) /*!<Filter FIFO Assignment for Filter 4 */ -#define CAN_FFA1R_FFA5 ((uint16_t)0x0020) /*!<Filter FIFO Assignment for Filter 5 */ -#define CAN_FFA1R_FFA6 ((uint16_t)0x0040) /*!<Filter FIFO Assignment for Filter 6 */ -#define CAN_FFA1R_FFA7 ((uint16_t)0x0080) /*!<Filter FIFO Assignment for Filter 7 */ -#define CAN_FFA1R_FFA8 ((uint16_t)0x0100) /*!<Filter FIFO Assignment for Filter 8 */ -#define CAN_FFA1R_FFA9 ((uint16_t)0x0200) /*!<Filter FIFO Assignment for Filter 9 */ -#define CAN_FFA1R_FFA10 ((uint16_t)0x0400) /*!<Filter FIFO Assignment for Filter 10 */ -#define CAN_FFA1R_FFA11 ((uint16_t)0x0800) /*!<Filter FIFO Assignment for Filter 11 */ -#define CAN_FFA1R_FFA12 ((uint16_t)0x1000) /*!<Filter FIFO Assignment for Filter 12 */ -#define CAN_FFA1R_FFA13 ((uint16_t)0x2000) /*!<Filter FIFO Assignment for Filter 13 */ - -/******************* Bit definition for CAN_FA1R register *******************/ -#define CAN_FA1R_FACT ((uint16_t)0x3FFF) /*!<Filter Active */ -#define CAN_FA1R_FACT0 ((uint16_t)0x0001) /*!<Filter 0 Active */ -#define CAN_FA1R_FACT1 ((uint16_t)0x0002) /*!<Filter 1 Active */ -#define CAN_FA1R_FACT2 ((uint16_t)0x0004) /*!<Filter 2 Active */ -#define CAN_FA1R_FACT3 ((uint16_t)0x0008) /*!<Filter 3 Active */ -#define CAN_FA1R_FACT4 ((uint16_t)0x0010) /*!<Filter 4 Active */ -#define CAN_FA1R_FACT5 ((uint16_t)0x0020) /*!<Filter 5 Active */ -#define CAN_FA1R_FACT6 ((uint16_t)0x0040) /*!<Filter 6 Active */ -#define CAN_FA1R_FACT7 ((uint16_t)0x0080) /*!<Filter 7 Active */ -#define CAN_FA1R_FACT8 ((uint16_t)0x0100) /*!<Filter 8 Active */ -#define CAN_FA1R_FACT9 ((uint16_t)0x0200) /*!<Filter 9 Active */ -#define CAN_FA1R_FACT10 ((uint16_t)0x0400) /*!<Filter 10 Active */ -#define CAN_FA1R_FACT11 ((uint16_t)0x0800) /*!<Filter 11 Active */ -#define CAN_FA1R_FACT12 ((uint16_t)0x1000) /*!<Filter 12 Active */ -#define CAN_FA1R_FACT13 ((uint16_t)0x2000) /*!<Filter 13 Active */ - -/******************* Bit definition for CAN_F0R1 register *******************/ -#define CAN_F0R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F0R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F0R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F0R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F0R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F0R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F0R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F0R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F0R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F0R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F0R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F0R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F0R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F0R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F0R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F0R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F0R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F0R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F0R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F0R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F0R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F0R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F0R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F0R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F0R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F0R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F0R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F0R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F0R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F0R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F0R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F0R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F1R1 register *******************/ -#define CAN_F1R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F1R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F1R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F1R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F1R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F1R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F1R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F1R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F1R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F1R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F1R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F1R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F1R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F1R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F1R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F1R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F1R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F1R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F1R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F1R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F1R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F1R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F1R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F1R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F1R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F1R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F1R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F1R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F1R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F1R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F1R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F1R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F2R1 register *******************/ -#define CAN_F2R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F2R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F2R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F2R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F2R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F2R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F2R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F2R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F2R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F2R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F2R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F2R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F2R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F2R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F2R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F2R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F2R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F2R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F2R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F2R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F2R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F2R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F2R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F2R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F2R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F2R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F2R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F2R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F2R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F2R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F2R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F2R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F3R1 register *******************/ -#define CAN_F3R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F3R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F3R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F3R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F3R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F3R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F3R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F3R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F3R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F3R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F3R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F3R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F3R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F3R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F3R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F3R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F3R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F3R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F3R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F3R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F3R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F3R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F3R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F3R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F3R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F3R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F3R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F3R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F3R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F3R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F3R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F3R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F4R1 register *******************/ -#define CAN_F4R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F4R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F4R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F4R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F4R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F4R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F4R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F4R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F4R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F4R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F4R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F4R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F4R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F4R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F4R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F4R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F4R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F4R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F4R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F4R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F4R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F4R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F4R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F4R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F4R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F4R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F4R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F4R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F4R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F4R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F4R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F4R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F5R1 register *******************/ -#define CAN_F5R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F5R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F5R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F5R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F5R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F5R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F5R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F5R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F5R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F5R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F5R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F5R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F5R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F5R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F5R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F5R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F5R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F5R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F5R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F5R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F5R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F5R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F5R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F5R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F5R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F5R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F5R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F5R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F5R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F5R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F5R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F5R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F6R1 register *******************/ -#define CAN_F6R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F6R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F6R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F6R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F6R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F6R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F6R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F6R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F6R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F6R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F6R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F6R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F6R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F6R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F6R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F6R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F6R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F6R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F6R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F6R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F6R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F6R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F6R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F6R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F6R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F6R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F6R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F6R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F6R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F6R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F6R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F6R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F7R1 register *******************/ -#define CAN_F7R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F7R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F7R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F7R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F7R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F7R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F7R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F7R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F7R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F7R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F7R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F7R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F7R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F7R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F7R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F7R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F7R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F7R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F7R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F7R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F7R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F7R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F7R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F7R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F7R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F7R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F7R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F7R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F7R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F7R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F7R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F7R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F8R1 register *******************/ -#define CAN_F8R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F8R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F8R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F8R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F8R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F8R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F8R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F8R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F8R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F8R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F8R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F8R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F8R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F8R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F8R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F8R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F8R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F8R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F8R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F8R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F8R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F8R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F8R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F8R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F8R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F8R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F8R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F8R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F8R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F8R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F8R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F8R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F9R1 register *******************/ -#define CAN_F9R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F9R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F9R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F9R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F9R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F9R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F9R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F9R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F9R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F9R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F9R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F9R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F9R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F9R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F9R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F9R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F9R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F9R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F9R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F9R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F9R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F9R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F9R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F9R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F9R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F9R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F9R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F9R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F9R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F9R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F9R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F9R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F10R1 register ******************/ -#define CAN_F10R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F10R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F10R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F10R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F10R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F10R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F10R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F10R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F10R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F10R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F10R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F10R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F10R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F10R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F10R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F10R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F10R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F10R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F10R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F10R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F10R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F10R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F10R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F10R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F10R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F10R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F10R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F10R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F10R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F10R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F10R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F10R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F11R1 register ******************/ -#define CAN_F11R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F11R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F11R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F11R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F11R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F11R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F11R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F11R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F11R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F11R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F11R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F11R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F11R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F11R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F11R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F11R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F11R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F11R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F11R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F11R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F11R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F11R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F11R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F11R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F11R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F11R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F11R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F11R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F11R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F11R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F11R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F11R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F12R1 register ******************/ -#define CAN_F12R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F12R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F12R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F12R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F12R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F12R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F12R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F12R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F12R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F12R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F12R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F12R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F12R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F12R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F12R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F12R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F12R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F12R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F12R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F12R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F12R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F12R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F12R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F12R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F12R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F12R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F12R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F12R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F12R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F12R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F12R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F12R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F13R1 register ******************/ -#define CAN_F13R1_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F13R1_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F13R1_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F13R1_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F13R1_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F13R1_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F13R1_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F13R1_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F13R1_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F13R1_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F13R1_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F13R1_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F13R1_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F13R1_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F13R1_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F13R1_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F13R1_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F13R1_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F13R1_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F13R1_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F13R1_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F13R1_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F13R1_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F13R1_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F13R1_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F13R1_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F13R1_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F13R1_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F13R1_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F13R1_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F13R1_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F13R1_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F0R2 register *******************/ -#define CAN_F0R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F0R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F0R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F0R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F0R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F0R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F0R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F0R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F0R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F0R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F0R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F0R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F0R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F0R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F0R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F0R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F0R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F0R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F0R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F0R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F0R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F0R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F0R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F0R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F0R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F0R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F0R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F0R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F0R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F0R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F0R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F0R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F1R2 register *******************/ -#define CAN_F1R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F1R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F1R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F1R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F1R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F1R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F1R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F1R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F1R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F1R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F1R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F1R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F1R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F1R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F1R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F1R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F1R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F1R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F1R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F1R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F1R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F1R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F1R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F1R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F1R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F1R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F1R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F1R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F1R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F1R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F1R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F1R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F2R2 register *******************/ -#define CAN_F2R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F2R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F2R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F2R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F2R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F2R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F2R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F2R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F2R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F2R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F2R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F2R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F2R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F2R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F2R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F2R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F2R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F2R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F2R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F2R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F2R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F2R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F2R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F2R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F2R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F2R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F2R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F2R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F2R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F2R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F2R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F2R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F3R2 register *******************/ -#define CAN_F3R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F3R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F3R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F3R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F3R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F3R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F3R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F3R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F3R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F3R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F3R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F3R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F3R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F3R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F3R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F3R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F3R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F3R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F3R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F3R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F3R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F3R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F3R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F3R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F3R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F3R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F3R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F3R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F3R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F3R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F3R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F3R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F4R2 register *******************/ -#define CAN_F4R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F4R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F4R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F4R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F4R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F4R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F4R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F4R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F4R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F4R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F4R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F4R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F4R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F4R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F4R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F4R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F4R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F4R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F4R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F4R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F4R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F4R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F4R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F4R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F4R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F4R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F4R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F4R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F4R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F4R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F4R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F4R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F5R2 register *******************/ -#define CAN_F5R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F5R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F5R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F5R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F5R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F5R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F5R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F5R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F5R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F5R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F5R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F5R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F5R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F5R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F5R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F5R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F5R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F5R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F5R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F5R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F5R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F5R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F5R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F5R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F5R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F5R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F5R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F5R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F5R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F5R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F5R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F5R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F6R2 register *******************/ -#define CAN_F6R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F6R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F6R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F6R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F6R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F6R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F6R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F6R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F6R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F6R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F6R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F6R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F6R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F6R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F6R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F6R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F6R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F6R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F6R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F6R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F6R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F6R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F6R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F6R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F6R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F6R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F6R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F6R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F6R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F6R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F6R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F6R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F7R2 register *******************/ -#define CAN_F7R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F7R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F7R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F7R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F7R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F7R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F7R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F7R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F7R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F7R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F7R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F7R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F7R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F7R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F7R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F7R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F7R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F7R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F7R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F7R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F7R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F7R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F7R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F7R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F7R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F7R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F7R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F7R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F7R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F7R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F7R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F7R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F8R2 register *******************/ -#define CAN_F8R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F8R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F8R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F8R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F8R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F8R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F8R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F8R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F8R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F8R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F8R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F8R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F8R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F8R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F8R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F8R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F8R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F8R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F8R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F8R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F8R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F8R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F8R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F8R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F8R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F8R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F8R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F8R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F8R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F8R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F8R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F8R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F9R2 register *******************/ -#define CAN_F9R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F9R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F9R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F9R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F9R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F9R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F9R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F9R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F9R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F9R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F9R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F9R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F9R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F9R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F9R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F9R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F9R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F9R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F9R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F9R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F9R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F9R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F9R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F9R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F9R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F9R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F9R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F9R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F9R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F9R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F9R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F9R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F10R2 register ******************/ -#define CAN_F10R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F10R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F10R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F10R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F10R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F10R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F10R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F10R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F10R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F10R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F10R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F10R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F10R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F10R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F10R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F10R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F10R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F10R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F10R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F10R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F10R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F10R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F10R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F10R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F10R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F10R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F10R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F10R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F10R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F10R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F10R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F10R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F11R2 register ******************/ -#define CAN_F11R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F11R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F11R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F11R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F11R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F11R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F11R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F11R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F11R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F11R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F11R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F11R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F11R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F11R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F11R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F11R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F11R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F11R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F11R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F11R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F11R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F11R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F11R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F11R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F11R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F11R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F11R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F11R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F11R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F11R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F11R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F11R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F12R2 register ******************/ -#define CAN_F12R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F12R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F12R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F12R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F12R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F12R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F12R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F12R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F12R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F12R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F12R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F12R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F12R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F12R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F12R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F12R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F12R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F12R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F12R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F12R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F12R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F12R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F12R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F12R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F12R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F12R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F12R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F12R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F12R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F12R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F12R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F12R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - -/******************* Bit definition for CAN_F13R2 register ******************/ -#define CAN_F13R2_FB0 ((uint32_t)0x00000001) /*!<Filter bit 0 */ -#define CAN_F13R2_FB1 ((uint32_t)0x00000002) /*!<Filter bit 1 */ -#define CAN_F13R2_FB2 ((uint32_t)0x00000004) /*!<Filter bit 2 */ -#define CAN_F13R2_FB3 ((uint32_t)0x00000008) /*!<Filter bit 3 */ -#define CAN_F13R2_FB4 ((uint32_t)0x00000010) /*!<Filter bit 4 */ -#define CAN_F13R2_FB5 ((uint32_t)0x00000020) /*!<Filter bit 5 */ -#define CAN_F13R2_FB6 ((uint32_t)0x00000040) /*!<Filter bit 6 */ -#define CAN_F13R2_FB7 ((uint32_t)0x00000080) /*!<Filter bit 7 */ -#define CAN_F13R2_FB8 ((uint32_t)0x00000100) /*!<Filter bit 8 */ -#define CAN_F13R2_FB9 ((uint32_t)0x00000200) /*!<Filter bit 9 */ -#define CAN_F13R2_FB10 ((uint32_t)0x00000400) /*!<Filter bit 10 */ -#define CAN_F13R2_FB11 ((uint32_t)0x00000800) /*!<Filter bit 11 */ -#define CAN_F13R2_FB12 ((uint32_t)0x00001000) /*!<Filter bit 12 */ -#define CAN_F13R2_FB13 ((uint32_t)0x00002000) /*!<Filter bit 13 */ -#define CAN_F13R2_FB14 ((uint32_t)0x00004000) /*!<Filter bit 14 */ -#define CAN_F13R2_FB15 ((uint32_t)0x00008000) /*!<Filter bit 15 */ -#define CAN_F13R2_FB16 ((uint32_t)0x00010000) /*!<Filter bit 16 */ -#define CAN_F13R2_FB17 ((uint32_t)0x00020000) /*!<Filter bit 17 */ -#define CAN_F13R2_FB18 ((uint32_t)0x00040000) /*!<Filter bit 18 */ -#define CAN_F13R2_FB19 ((uint32_t)0x00080000) /*!<Filter bit 19 */ -#define CAN_F13R2_FB20 ((uint32_t)0x00100000) /*!<Filter bit 20 */ -#define CAN_F13R2_FB21 ((uint32_t)0x00200000) /*!<Filter bit 21 */ -#define CAN_F13R2_FB22 ((uint32_t)0x00400000) /*!<Filter bit 22 */ -#define CAN_F13R2_FB23 ((uint32_t)0x00800000) /*!<Filter bit 23 */ -#define CAN_F13R2_FB24 ((uint32_t)0x01000000) /*!<Filter bit 24 */ -#define CAN_F13R2_FB25 ((uint32_t)0x02000000) /*!<Filter bit 25 */ -#define CAN_F13R2_FB26 ((uint32_t)0x04000000) /*!<Filter bit 26 */ -#define CAN_F13R2_FB27 ((uint32_t)0x08000000) /*!<Filter bit 27 */ -#define CAN_F13R2_FB28 ((uint32_t)0x10000000) /*!<Filter bit 28 */ -#define CAN_F13R2_FB29 ((uint32_t)0x20000000) /*!<Filter bit 29 */ -#define CAN_F13R2_FB30 ((uint32_t)0x40000000) /*!<Filter bit 30 */ -#define CAN_F13R2_FB31 ((uint32_t)0x80000000) /*!<Filter bit 31 */ - - -/******************************************************************************/ -/* */ -/* HDMI-CEC (CEC) */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for CEC_CR register *********************/ -#define CEC_CR_CECEN ((uint32_t)0x00000001) /*!< CEC Enable */ -#define CEC_CR_TXSOM ((uint32_t)0x00000002) /*!< CEC Tx Start Of Message */ -#define CEC_CR_TXEOM ((uint32_t)0x00000004) /*!< CEC Tx End Of Message */ - -/******************* Bit definition for CEC_CFGR register *******************/ -#define CEC_CFGR_SFT ((uint32_t)0x00000007) /*!< CEC Signal Free Time */ -#define CEC_CFGR_RXTOL ((uint32_t)0x00000008) /*!< CEC Tolerance */ -#define CEC_CFGR_BRESTP ((uint32_t)0x00000010) /*!< CEC Rx Stop */ -#define CEC_CFGR_BREGEN ((uint32_t)0x00000020) /*!< CEC Bit Rising Error generation */ -#define CEC_CFGR_LREGEN ((uint32_t)0x00000040) /*!< CEC Long Period Error generation */ -#define CEC_CFGR_BRDNOGEN ((uint32_t)0x00000080) /*!< CEC Broadcast no Error generation */ -#define CEC_CFGR_SFTOPT ((uint32_t)0x00000100) /*!< CEC Signal Free Time optional */ -#define CEC_CFGR_OAR ((uint32_t)0x7FFF0000) /*!< CEC Own Address */ -#define CEC_CFGR_LSTN ((uint32_t)0x80000000) /*!< CEC Listen mode */ - -/******************* Bit definition for CEC_TXDR register *******************/ -#define CEC_TXDR_TXD ((uint32_t)0x000000FF) /*!< CEC Tx Data */ - -/******************* Bit definition for CEC_RXDR register *******************/ -#define CEC_TXDR_RXD ((uint32_t)0x000000FF) /*!< CEC Rx Data */ - -/******************* Bit definition for CEC_ISR register ********************/ -#define CEC_ISR_RXBR ((uint32_t)0x00000001) /*!< CEC Rx-Byte Received */ -#define CEC_ISR_RXEND ((uint32_t)0x00000002) /*!< CEC End Of Reception */ -#define CEC_ISR_RXOVR ((uint32_t)0x00000004) /*!< CEC Rx-Overrun */ -#define CEC_ISR_BRE ((uint32_t)0x00000008) /*!< CEC Rx Bit Rising Error */ -#define CEC_ISR_SBPE ((uint32_t)0x00000010) /*!< CEC Rx Short Bit period Error */ -#define CEC_ISR_LBPE ((uint32_t)0x00000020) /*!< CEC Rx Long Bit period Error */ -#define CEC_ISR_RXACKE ((uint32_t)0x00000040) /*!< CEC Rx Missing Acknowledge */ -#define CEC_ISR_ARBLST ((uint32_t)0x00000080) /*!< CEC Arbitration Lost */ -#define CEC_ISR_TXBR ((uint32_t)0x00000100) /*!< CEC Tx Byte Request */ -#define CEC_ISR_TXEND ((uint32_t)0x00000200) /*!< CEC End of Transmission */ -#define CEC_ISR_TXUDR ((uint32_t)0x00000400) /*!< CEC Tx-Buffer Underrun */ -#define CEC_ISR_TXERR ((uint32_t)0x00000800) /*!< CEC Tx-Error */ -#define CEC_ISR_TXACKE ((uint32_t)0x00001000) /*!< CEC Tx Missing Acknowledge */ - -/******************* Bit definition for CEC_IER register ********************/ -#define CEC_IER_RXBRIE ((uint32_t)0x00000001) /*!< CEC Rx-Byte Received IT Enable */ -#define CEC_IER_RXENDIE ((uint32_t)0x00000002) /*!< CEC End Of Reception IT Enable */ -#define CEC_IER_RXOVRIE ((uint32_t)0x00000004) /*!< CEC Rx-Overrun IT Enable */ -#define CEC_IER_BREIEIE ((uint32_t)0x00000008) /*!< CEC Rx Bit Rising Error IT Enable */ -#define CEC_IER_SBPEIE ((uint32_t)0x00000010) /*!< CEC Rx Short Bit period Error IT Enable*/ -#define CEC_IER_LBPEIE ((uint32_t)0x00000020) /*!< CEC Rx Long Bit period Error IT Enable */ -#define CEC_IER_RXACKEIE ((uint32_t)0x00000040) /*!< CEC Rx Missing Acknowledge IT Enable */ -#define CEC_IER_ARBLSTIE ((uint32_t)0x00000080) /*!< CEC Arbitration Lost IT Enable */ -#define CEC_IER_TXBRIE ((uint32_t)0x00000100) /*!< CEC Tx Byte Request IT Enable */ -#define CEC_IER_TXENDIE ((uint32_t)0x00000200) /*!< CEC End of Transmission IT Enable */ -#define CEC_IER_TXUDRIE ((uint32_t)0x00000400) /*!< CEC Tx-Buffer Underrun IT Enable */ -#define CEC_IER_TXERRIE ((uint32_t)0x00000800) /*!< CEC Tx-Error IT Enable */ -#define CEC_IER_TXACKEIE ((uint32_t)0x00001000) /*!< CEC Tx Missing Acknowledge IT Enable */ - -/******************************************************************************/ -/* */ -/* Analog Comparators (COMP) */ -/* */ -/******************************************************************************/ -/*********************** Bit definition for COMP_CSR register ***************/ -/* COMP1 bits definition */ -#define COMP_CSR_COMP1EN ((uint32_t)0x00000001) /*!< COMP1 enable */ -#define COMP_CSR_COMP1SW1 ((uint32_t)0x00000002) /*!< SW1 switch control */ -#define COMP_CSR_COMP1MODE ((uint32_t)0x0000000C) /*!< COMP1 power mode */ -#define COMP_CSR_COMP1MODE_0 ((uint32_t)0x00000004) /*!< COMP1 power mode bit 0 */ -#define COMP_CSR_COMP1MODE_1 ((uint32_t)0x00000008) /*!< COMP1 power mode bit 1 */ -#define COMP_CSR_COMP1INSEL ((uint32_t)0x00000070) /*!< COMP1 inverting input select */ -#define COMP_CSR_COMP1INSEL_0 ((uint32_t)0x00000010) /*!< COMP1 inverting input select bit 0 */ -#define COMP_CSR_COMP1INSEL_1 ((uint32_t)0x00000020) /*!< COMP1 inverting input select bit 1 */ -#define COMP_CSR_COMP1INSEL_2 ((uint32_t)0x00000040) /*!< COMP1 inverting input select bit 2 */ -#define COMP_CSR_COMP1OUTSEL ((uint32_t)0x00000700) /*!< COMP1 output select */ -#define COMP_CSR_COMP1OUTSEL_0 ((uint32_t)0x00000100) /*!< COMP1 output select bit 0 */ -#define COMP_CSR_COMP1OUTSEL_1 ((uint32_t)0x00000200) /*!< COMP1 output select bit 1 */ -#define COMP_CSR_COMP1OUTSEL_2 ((uint32_t)0x00000400) /*!< COMP1 output select bit 2 */ -#define COMP_CSR_COMP1POL ((uint32_t)0x00000800) /*!< COMP1 output polarity */ -#define COMP_CSR_COMP1HYST ((uint32_t)0x00003000) /*!< COMP1 hysteresis */ -#define COMP_CSR_COMP1HYST_0 ((uint32_t)0x00001000) /*!< COMP1 hysteresis bit 0 */ -#define COMP_CSR_COMP1HYST_1 ((uint32_t)0x00002000) /*!< COMP1 hysteresis bit 1 */ -#define COMP_CSR_COMP1OUT ((uint32_t)0x00004000) /*!< COMP1 output level */ -#define COMP_CSR_COMP1LOCK ((uint32_t)0x00008000) /*!< COMP1 lock */ -/* COMP2 bits definition */ -#define COMP_CSR_COMP2EN ((uint32_t)0x00010000) /*!< COMP2 enable */ -#define COMP_CSR_COMP2MODE ((uint32_t)0x000C0000) /*!< COMP2 power mode */ -#define COMP_CSR_COMP2MODE_0 ((uint32_t)0x00040000) /*!< COMP2 power mode bit 0 */ -#define COMP_CSR_COMP2MODE_1 ((uint32_t)0x00080000) /*!< COMP2 power mode bit 1 */ -#define COMP_CSR_COMP2INSEL ((uint32_t)0x00700000) /*!< COMP2 inverting input select */ -#define COMP_CSR_COMP2INSEL_0 ((uint32_t)0x00100000) /*!< COMP2 inverting input select bit 0 */ -#define COMP_CSR_COMP2INSEL_1 ((uint32_t)0x00200000) /*!< COMP2 inverting input select bit 1 */ -#define COMP_CSR_COMP2INSEL_2 ((uint32_t)0x00400000) /*!< COMP2 inverting input select bit 2 */ -#define COMP_CSR_WNDWEN ((uint32_t)0x00800000) /*!< Comparators window mode enable */ -#define COMP_CSR_COMP2OUTSEL ((uint32_t)0x07000000) /*!< COMP2 output select */ -#define COMP_CSR_COMP2OUTSEL_0 ((uint32_t)0x01000000) /*!< COMP2 output select bit 0 */ -#define COMP_CSR_COMP2OUTSEL_1 ((uint32_t)0x02000000) /*!< COMP2 output select bit 1 */ -#define COMP_CSR_COMP2OUTSEL_2 ((uint32_t)0x04000000) /*!< COMP2 output select bit 2 */ -#define COMP_CSR_COMP2POL ((uint32_t)0x08000000) /*!< COMP2 output polarity */ -#define COMP_CSR_COMP2HYST ((uint32_t)0x30000000) /*!< COMP2 hysteresis */ -#define COMP_CSR_COMP2HYST_0 ((uint32_t)0x10000000) /*!< COMP2 hysteresis bit 0 */ -#define COMP_CSR_COMP2HYST_1 ((uint32_t)0x20000000) /*!< COMP2 hysteresis bit 1 */ -#define COMP_CSR_COMP2OUT ((uint32_t)0x40000000) /*!< COMP2 output level */ -#define COMP_CSR_COMP2LOCK ((uint32_t)0x80000000) /*!< COMP2 lock */ - -/******************************************************************************/ -/* */ -/* CRC calculation unit (CRC) */ -/* */ -/******************************************************************************/ -/******************* Bit definition for CRC_DR register *********************/ -#define CRC_DR_DR ((uint32_t)0xFFFFFFFF) /*!< Data register bits */ - -/******************* Bit definition for CRC_IDR register ********************/ -#define CRC_IDR_IDR ((uint8_t)0xFF) /*!< General-purpose 8-bit data register bits */ - -/******************** Bit definition for CRC_CR register ********************/ -#define CRC_CR_RESET ((uint32_t)0x00000001) /*!< RESET the CRC computation unit bit */ -#define CRC_CR_POLSIZE ((uint32_t)0x00000018) /*!< Polynomial size bits (only for STM32F072 devices)*/ -#define CRC_CR_POLSIZE_0 ((uint32_t)0x00000008) /*!< Polynomial size bit 0 (only for STM32F072 devices) */ -#define CRC_CR_POLSIZE_1 ((uint32_t)0x00000010) /*!< Polynomial size bit 1 (only for STM32F072 devices) */ -#define CRC_CR_REV_IN ((uint32_t)0x00000060) /*!< REV_IN Reverse Input Data bits */ -#define CRC_CR_REV_IN_0 ((uint32_t)0x00000020) /*!< REV_IN Bit 0 */ -#define CRC_CR_REV_IN_1 ((uint32_t)0x00000040) /*!< REV_IN Bit 1 */ -#define CRC_CR_REV_OUT ((uint32_t)0x00000080) /*!< REV_OUT Reverse Output Data bits */ - -/******************* Bit definition for CRC_INIT register *******************/ -#define CRC_INIT_INIT ((uint32_t)0xFFFFFFFF) /*!< Initial CRC value bits */ - -/******************* Bit definition for CRC_POL register ********************/ -#define CRC_POL_POL ((uint32_t)0xFFFFFFFF) /*!< Coefficients of the polynomial (only for STM32F072 devices) */ - -/******************************************************************************/ -/* */ -/* CRS Clock Recovery System */ -/* (Available only for STM32F072 devices) */ -/******************************************************************************/ - -/******************* Bit definition for CRS_CR register *********************/ -#define CRS_CR_SYNCOKIE ((uint32_t)0x00000001) /* SYNC event OK interrupt enable */ -#define CRS_CR_SYNCWARNIE ((uint32_t)0x00000002) /* SYNC warning interrupt enable */ -#define CRS_CR_ERRIE ((uint32_t)0x00000004) /* SYNC error interrupt enable */ -#define CRS_CR_ESYNCIE ((uint32_t)0x00000008) /* Expected SYNC(ESYNCF) interrupt Enable*/ -#define CRS_CR_CEN ((uint32_t)0x00000020) /* Frequency error counter enable */ -#define CRS_CR_AUTOTRIMEN ((uint32_t)0x00000040) /* Automatic trimming enable */ -#define CRS_CR_SWSYNC ((uint32_t)0x00000080) /* A Software SYNC event is generated */ -#define CRS_CR_TRIM ((uint32_t)0x00003F00) /* HSI48 oscillator smooth trimming */ - -/******************* Bit definition for CRS_CFGR register *********************/ -#define CRS_CFGR_RELOAD ((uint32_t)0x0000FFFF) /* Counter reload value */ -#define CRS_CFGR_FELIM ((uint32_t)0x00FF0000) /* Frequency error limit */ -#define CRS_CFGR_SYNCDIV ((uint32_t)0x07000000) /* SYNC divider */ -#define CRS_CFGR_SYNCDIV_0 ((uint32_t)0x01000000) /* Bit 0 */ -#define CRS_CFGR_SYNCDIV_1 ((uint32_t)0x02000000) /* Bit 1 */ -#define CRS_CFGR_SYNCDIV_2 ((uint32_t)0x04000000) /* Bit 2 */ -#define CRS_CFGR_SYNCSRC ((uint32_t)0x30000000) /* SYNC signal source selection */ -#define CRS_CFGR_SYNCSRC_0 ((uint32_t)0x10000000) /* Bit 0 */ -#define CRS_CFGR_SYNCSRC_1 ((uint32_t)0x20000000) /* Bit 1 */ -#define CRS_CFGR_SYNCPOL ((uint32_t)0x80000000) /* SYNC polarity selection */ - -/******************* Bit definition for CRS_ISR register *********************/ -#define CRS_ISR_SYNCOKF ((uint32_t)0x00000001) /* SYNC event OK flag */ -#define CRS_ISR_SYNCWARNF ((uint32_t)0x00000002) /* SYNC warning */ -#define CRS_ISR_ERRF ((uint32_t)0x00000004) /* SYNC error flag */ -#define CRS_ISR_ESYNCF ((uint32_t)0x00000008) /* Expected SYNC flag */ -#define CRS_ISR_SYNCERR ((uint32_t)0x00000100) /* SYNC error */ -#define CRS_ISR_SYNCMISS ((uint32_t)0x00000200) /* SYNC missed */ -#define CRS_ISR_TRIMOVF ((uint32_t)0x00000400) /* Trimming overflow or underflow */ -#define CRS_ISR_FEDIR ((uint32_t)0x00008000) /* Frequency error direction */ -#define CRS_ISR_FECAP ((uint32_t)0xFFFF0000) /* Frequency error capture */ - -/******************* Bit definition for CRS_ICR register *********************/ -#define CRS_ICR_SYNCOKC ((uint32_t)0x00000001) /* SYNC event OK clear flag */ -#define CRS_ICR_SYNCWARNC ((uint32_t)0x00000002) /* SYNC warning clear flag */ -#define CRS_ICR_ERRC ((uint32_t)0x00000004) /* Error clear flag */ -#define CRS_ICR_ESYNCC ((uint32_t)0x00000008) /* Expected SYNC clear flag */ - -/******************************************************************************/ -/* */ -/* Digital to Analog Converter (DAC) */ -/* */ -/******************************************************************************/ -/******************** Bit definition for DAC_CR register ********************/ -#define DAC_CR_EN1 ((uint32_t)0x00000001) /*!< DAC channel1 enable */ -#define DAC_CR_BOFF1 ((uint32_t)0x00000002) /*!< DAC channel1 output buffer disable */ -#define DAC_CR_TEN1 ((uint32_t)0x00000004) /*!< DAC channel1 Trigger enable */ - -#define DAC_CR_TSEL1 ((uint32_t)0x00000038) /*!< TSEL1[2:0] (DAC channel1 Trigger selection) */ -#define DAC_CR_TSEL1_0 ((uint32_t)0x00000008) /*!< Bit 0 */ -#define DAC_CR_TSEL1_1 ((uint32_t)0x00000010) /*!< Bit 1 */ -#define DAC_CR_TSEL1_2 ((uint32_t)0x00000020) /*!< Bit 2 */ - -#define DAC_CR_WAVE1 ((uint32_t)0x000000C0) /*!< WAVE1[1:0] (DAC channel1 noise/triangle wave generation enable)(only for STM32F072 devices) */ -#define DAC_CR_WAVE1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define DAC_CR_WAVE1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ - -#define DAC_CR_MAMP1 ((uint32_t)0x00000F00) /*!< MAMP1[3:0] (DAC channel1 Mask/Amplitude selector) (only for STM32F072 devices) */ -#define DAC_CR_MAMP1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define DAC_CR_MAMP1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define DAC_CR_MAMP1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define DAC_CR_MAMP1_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - -#define DAC_CR_DMAEN1 ((uint32_t)0x00001000) /*!< DAC channel1 DMA enable */ -#define DAC_CR_DMAUDRIE1 ((uint32_t)0x00002000) /*!<DAC channel1 DMA Underrun Interrupt enable */ -#define DAC_CR_EN2 ((uint32_t)0x00010000) /*!< DAC channel2 enable */ -#define DAC_CR_BOFF2 ((uint32_t)0x00020000) /*!< DAC channel2 output buffer disable */ -#define DAC_CR_TEN2 ((uint32_t)0x00040000) /*!< DAC channel2 Trigger enable */ - -#define DAC_CR_TSEL2 ((uint32_t)0x00380000) /*!< TSEL2[2:0] (DAC channel2 Trigger selection) */ -#define DAC_CR_TSEL2_0 ((uint32_t)0x00080000) /*!< Bit 0 */ -#define DAC_CR_TSEL2_1 ((uint32_t)0x00100000) /*!< Bit 1 */ -#define DAC_CR_TSEL2_2 ((uint32_t)0x00200000) /*!< Bit 2 */ - -#define DAC_CR_WAVE2 ((uint32_t)0x00C00000) /*!< WAVE2[1:0] (DAC channel2 noise/triangle wave generation enable) */ -#define DAC_CR_WAVE2_0 ((uint32_t)0x00400000) /*!< Bit 0 */ -#define DAC_CR_WAVE2_1 ((uint32_t)0x00800000) /*!< Bit 1 */ - -#define DAC_CR_MAMP2 ((uint32_t)0x0F000000) /*!< MAMP2[3:0] (DAC channel2 Mask/Amplitude selector) */ -#define DAC_CR_MAMP2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define DAC_CR_MAMP2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define DAC_CR_MAMP2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define DAC_CR_MAMP2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - -#define DAC_CR_DMAEN2 ((uint32_t)0x10000000) /*!< DAC channel2 DMA enabled */ -#define DAC_CR_DMAUDRIE2 ((uint32_t)0x20000000) /*!<DAC channel2 DMA Underrun Interrupt enable */ - -/***************** Bit definition for DAC_SWTRIGR register ******************/ -#define DAC_SWTRIGR_SWTRIG1 ((uint32_t)0x00000001) /*!<DAC channel1 software trigger */ -#define DAC_SWTRIGR_SWTRIG2 ((uint32_t)0x00000002) /*!<DAC channel2 software trigger */ - -/***************** Bit definition for DAC_DHR12R1 register ******************/ -#define DAC_DHR12R1_DACC1DHR ((uint32_t)0x00000FFF) /*!<DAC channel1 12-bit Right aligned data */ - -/***************** Bit definition for DAC_DHR12L1 register ******************/ -#define DAC_DHR12L1_DACC1DHR ((uint32_t)0x0000FFF0) /*!<DAC channel1 12-bit Left aligned data */ - -/****************** Bit definition for DAC_DHR8R1 register ******************/ -#define DAC_DHR8R1_DACC1DHR ((uint32_t)0x000000FF) /*!<DAC channel1 8-bit Right aligned data */ - -/******************* Bit definition for DAC_DOR1 register *******************/ -#define DAC_DOR1_DACC1DOR ((uint32_t)0x00000FFF) /*!<DAC channel1 data output */ - -/******************** Bit definition for DAC_SR register ********************/ -#define DAC_SR_DMAUDR1 ((uint32_t)0x00002000) /*!< DAC channel1 DMA underrun flag */ -#define DAC_SR_DMAUDR2 ((uint32_t)0x20000000) /*!< DAC channel2 DMA underrun flag (only for STM32F072 and STM32F042 devices) */ - -/******************************************************************************/ -/* */ -/* Debug MCU (DBGMCU) */ -/* */ -/******************************************************************************/ - -/**************** Bit definition for DBGMCU_IDCODE register *****************/ -#define DBGMCU_IDCODE_DEV_ID ((uint32_t)0x00000FFF) /*!< Device Identifier */ - -#define DBGMCU_IDCODE_REV_ID ((uint32_t)0xFFFF0000) /*!< REV_ID[15:0] bits (Revision Identifier) */ -#define DBGMCU_IDCODE_REV_ID_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define DBGMCU_IDCODE_REV_ID_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define DBGMCU_IDCODE_REV_ID_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define DBGMCU_IDCODE_REV_ID_3 ((uint32_t)0x00080000) /*!< Bit 3 */ -#define DBGMCU_IDCODE_REV_ID_4 ((uint32_t)0x00100000) /*!< Bit 4 */ -#define DBGMCU_IDCODE_REV_ID_5 ((uint32_t)0x00200000) /*!< Bit 5 */ -#define DBGMCU_IDCODE_REV_ID_6 ((uint32_t)0x00400000) /*!< Bit 6 */ -#define DBGMCU_IDCODE_REV_ID_7 ((uint32_t)0x00800000) /*!< Bit 7 */ -#define DBGMCU_IDCODE_REV_ID_8 ((uint32_t)0x01000000) /*!< Bit 8 */ -#define DBGMCU_IDCODE_REV_ID_9 ((uint32_t)0x02000000) /*!< Bit 9 */ -#define DBGMCU_IDCODE_REV_ID_10 ((uint32_t)0x04000000) /*!< Bit 10 */ -#define DBGMCU_IDCODE_REV_ID_11 ((uint32_t)0x08000000) /*!< Bit 11 */ -#define DBGMCU_IDCODE_REV_ID_12 ((uint32_t)0x10000000) /*!< Bit 12 */ -#define DBGMCU_IDCODE_REV_ID_13 ((uint32_t)0x20000000) /*!< Bit 13 */ -#define DBGMCU_IDCODE_REV_ID_14 ((uint32_t)0x40000000) /*!< Bit 14 */ -#define DBGMCU_IDCODE_REV_ID_15 ((uint32_t)0x80000000) /*!< Bit 15 */ - -/****************** Bit definition for DBGMCU_CR register *******************/ -#define DBGMCU_CR_DBG_STOP ((uint32_t)0x00000002) /*!< Debug Stop Mode */ -#define DBGMCU_CR_DBG_STANDBY ((uint32_t)0x00000004) /*!< Debug Standby mode */ - -/****************** Bit definition for DBGMCU_APB1_FZ register **************/ -#define DBGMCU_APB1_FZ_DBG_TIM2_STOP ((uint32_t)0x00000001) /*!< TIM2 counter stopped when core is halted */ -#define DBGMCU_APB1_FZ_DBG_TIM3_STOP ((uint32_t)0x00000002) /*!< TIM3 counter stopped when core is halted */ -#define DBGMCU_APB1_FZ_DBG_TIM6_STOP ((uint32_t)0x00000010) /*!< TIM6 counter stopped when core is halted (not available on STM32F042 devices)*/ -#define DBGMCU_APB1_FZ_DBG_TIM7_STOP ((uint32_t)0x00000020) /*!< TIM7 counter stopped when core is halted (only for STM32F072 devices) */ -#define DBGMCU_APB1_FZ_DBG_TIM14_STOP ((uint32_t)0x00000100) /*!< TIM14 counter stopped when core is halted */ -#define DBGMCU_APB1_FZ_DBG_RTC_STOP ((uint32_t)0x00000400) /*!< RTC Calendar frozen when core is halted */ -#define DBGMCU_APB1_FZ_DBG_WWDG_STOP ((uint32_t)0x00000800) /*!< Debug Window Watchdog stopped when Core is halted */ -#define DBGMCU_APB1_FZ_DBG_IWDG_STOP ((uint32_t)0x00001000) /*!< Debug Independent Watchdog stopped when Core is halted */ -#define DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00200000) /*!< I2C1 SMBUS timeout mode stopped when Core is halted */ -#define DBGMCU_APB1_FZ_DBG_CAN_STOP ((uint32_t)0x02000000) /*!< CAN debug stopped when Core is halted (only for STM32F072 devices) */ - -/****************** Bit definition for DBGMCU_APB2_FZ register **************/ -#define DBGMCU_APB2_FZ_DBG_TIM1_STOP ((uint32_t)0x00000800) /*!< TIM1 counter stopped when core is halted */ -#define DBGMCU_APB2_FZ_DBG_TIM15_STOP ((uint32_t)0x00010000) /*!< TIM15 counter stopped when core is halted (not available on STM32F042 devices) */ -#define DBGMCU_APB2_FZ_DBG_TIM16_STOP ((uint32_t)0x00020000) /*!< TIM16 counter stopped when core is halted */ -#define DBGMCU_APB2_FZ_DBG_TIM17_STOP ((uint32_t)0x00040000) /*!< TIM17 counter stopped when core is halted */ - -/******************************************************************************/ -/* */ -/* DMA Controller (DMA) */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for DMA_ISR register ********************/ -#define DMA_ISR_GIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt flag */ -#define DMA_ISR_TCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete flag */ -#define DMA_ISR_HTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer flag */ -#define DMA_ISR_TEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error flag */ -#define DMA_ISR_GIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt flag */ -#define DMA_ISR_TCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete flag */ -#define DMA_ISR_HTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer flag */ -#define DMA_ISR_TEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error flag */ -#define DMA_ISR_GIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt flag */ -#define DMA_ISR_TCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete flag */ -#define DMA_ISR_HTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer flag */ -#define DMA_ISR_TEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error flag */ -#define DMA_ISR_GIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt flag */ -#define DMA_ISR_TCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete flag */ -#define DMA_ISR_HTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer flag */ -#define DMA_ISR_TEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error flag */ -#define DMA_ISR_GIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt flag */ -#define DMA_ISR_TCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete flag */ -#define DMA_ISR_HTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer flag */ -#define DMA_ISR_TEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error flag */ -#define DMA_ISR_GIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt flag (only for STM32F072 devices) */ -#define DMA_ISR_TCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete flag (only for STM32F072 devices) */ -#define DMA_ISR_HTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer flag (only for STM32F072 devices) */ -#define DMA_ISR_TEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error flag (only for STM32F072 devices) */ -#define DMA_ISR_GIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt flag (only for STM32F072 devices) */ -#define DMA_ISR_TCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete flag (only for STM32F072 devices) */ -#define DMA_ISR_HTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer flag (only for STM32F072 devices) */ -#define DMA_ISR_TEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error flag (only for STM32F072 devices) */ - -/******************* Bit definition for DMA_IFCR register *******************/ -#define DMA_IFCR_CGIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt clear */ -#define DMA_IFCR_CTCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete clear */ -#define DMA_IFCR_CHTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer clear */ -#define DMA_IFCR_CTEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error clear */ -#define DMA_IFCR_CGIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt clear */ -#define DMA_IFCR_CTCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete clear */ -#define DMA_IFCR_CHTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer clear */ -#define DMA_IFCR_CTEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error clear */ -#define DMA_IFCR_CGIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt clear */ -#define DMA_IFCR_CTCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete clear */ -#define DMA_IFCR_CHTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer clear */ -#define DMA_IFCR_CTEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error clear */ -#define DMA_IFCR_CGIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt clear */ -#define DMA_IFCR_CTCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete clear */ -#define DMA_IFCR_CHTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer clear */ -#define DMA_IFCR_CTEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error clear */ -#define DMA_IFCR_CGIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt clear */ -#define DMA_IFCR_CTCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete clear */ -#define DMA_IFCR_CHTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer clear */ -#define DMA_IFCR_CTEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error clear */ -#define DMA_IFCR_CGIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt clear (only for STM32F072 devices) */ -#define DMA_IFCR_CTCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete clear (only for STM32F072 devices) */ -#define DMA_IFCR_CHTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer clear (only for STM32F072 devices) */ -#define DMA_IFCR_CTEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error clear (only for STM32F072 devices) */ -#define DMA_IFCR_CGIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt clear (only for STM32F072 devices) */ -#define DMA_IFCR_CTCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete clear (only for STM32F072 devices) */ -#define DMA_IFCR_CHTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer clear (only for STM32F072 devices) */ -#define DMA_IFCR_CTEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error clear (only for STM32F072 devices) */ - -/******************* Bit definition for DMA_CCR register ********************/ -#define DMA_CCR_EN ((uint32_t)0x00000001) /*!< Channel enable */ -#define DMA_CCR_TCIE ((uint32_t)0x00000002) /*!< Transfer complete interrupt enable */ -#define DMA_CCR_HTIE ((uint32_t)0x00000004) /*!< Half Transfer interrupt enable */ -#define DMA_CCR_TEIE ((uint32_t)0x00000008) /*!< Transfer error interrupt enable */ -#define DMA_CCR_DIR ((uint32_t)0x00000010) /*!< Data transfer direction */ -#define DMA_CCR_CIRC ((uint32_t)0x00000020) /*!< Circular mode */ -#define DMA_CCR_PINC ((uint32_t)0x00000040) /*!< Peripheral increment mode */ -#define DMA_CCR_MINC ((uint32_t)0x00000080) /*!< Memory increment mode */ - -#define DMA_CCR_PSIZE ((uint32_t)0x00000300) /*!< PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CCR_PSIZE_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define DMA_CCR_PSIZE_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - -#define DMA_CCR_MSIZE ((uint32_t)0x00000C00) /*!< MSIZE[1:0] bits (Memory size) */ -#define DMA_CCR_MSIZE_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define DMA_CCR_MSIZE_1 ((uint32_t)0x00000800) /*!< Bit 1 */ - -#define DMA_CCR_PL ((uint32_t)0x00003000) /*!< PL[1:0] bits(Channel Priority level)*/ -#define DMA_CCR_PL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define DMA_CCR_PL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ - -#define DMA_CCR_MEM2MEM ((uint32_t)0x00004000) /*!< Memory to memory mode */ - -/****************** Bit definition for DMA_CNDTR register *******************/ -#define DMA_CNDTR_NDT ((uint32_t)0x0000FFFF) /*!< Number of data to Transfer */ - -/****************** Bit definition for DMA_CPAR register ********************/ -#define DMA_CPAR_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ - -/****************** Bit definition for DMA_CMAR register ********************/ -#define DMA_CMAR_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ - -/******************************************************************************/ -/* */ -/* External Interrupt/Event Controller (EXTI) */ -/* */ -/******************************************************************************/ -/******************* Bit definition for EXTI_IMR register *******************/ -#define EXTI_IMR_MR0 ((uint32_t)0x00000001) /*!< Interrupt Mask on line 0 */ -#define EXTI_IMR_MR1 ((uint32_t)0x00000002) /*!< Interrupt Mask on line 1 */ -#define EXTI_IMR_MR2 ((uint32_t)0x00000004) /*!< Interrupt Mask on line 2 */ -#define EXTI_IMR_MR3 ((uint32_t)0x00000008) /*!< Interrupt Mask on line 3 */ -#define EXTI_IMR_MR4 ((uint32_t)0x00000010) /*!< Interrupt Mask on line 4 */ -#define EXTI_IMR_MR5 ((uint32_t)0x00000020) /*!< Interrupt Mask on line 5 */ -#define EXTI_IMR_MR6 ((uint32_t)0x00000040) /*!< Interrupt Mask on line 6 */ -#define EXTI_IMR_MR7 ((uint32_t)0x00000080) /*!< Interrupt Mask on line 7 */ -#define EXTI_IMR_MR8 ((uint32_t)0x00000100) /*!< Interrupt Mask on line 8 */ -#define EXTI_IMR_MR9 ((uint32_t)0x00000200) /*!< Interrupt Mask on line 9 */ -#define EXTI_IMR_MR10 ((uint32_t)0x00000400) /*!< Interrupt Mask on line 10 */ -#define EXTI_IMR_MR11 ((uint32_t)0x00000800) /*!< Interrupt Mask on line 11 */ -#define EXTI_IMR_MR12 ((uint32_t)0x00001000) /*!< Interrupt Mask on line 12 */ -#define EXTI_IMR_MR13 ((uint32_t)0x00002000) /*!< Interrupt Mask on line 13 */ -#define EXTI_IMR_MR14 ((uint32_t)0x00004000) /*!< Interrupt Mask on line 14 */ -#define EXTI_IMR_MR15 ((uint32_t)0x00008000) /*!< Interrupt Mask on line 15 */ -#define EXTI_IMR_MR16 ((uint32_t)0x00010000) /*!< Interrupt Mask on line 16 */ -#define EXTI_IMR_MR17 ((uint32_t)0x00020000) /*!< Interrupt Mask on line 17 */ -#define EXTI_IMR_MR18 ((uint32_t)0x00040000) /*!< Interrupt Mask on line 18 */ -#define EXTI_IMR_MR19 ((uint32_t)0x00080000) /*!< Interrupt Mask on line 19 */ -#define EXTI_IMR_MR20 ((uint32_t)0x00100000) /*!< Interrupt Mask on line 20 */ -#define EXTI_IMR_MR21 ((uint32_t)0x00200000) /*!< Interrupt Mask on line 21 */ -#define EXTI_IMR_MR22 ((uint32_t)0x00400000) /*!< Interrupt Mask on line 22 */ -#define EXTI_IMR_MR23 ((uint32_t)0x00800000) /*!< Interrupt Mask on line 23 */ -#define EXTI_IMR_MR24 ((uint32_t)0x01000000) /*!< Interrupt Mask on line 24 */ -#define EXTI_IMR_MR25 ((uint32_t)0x02000000) /*!< Interrupt Mask on line 25 */ -#define EXTI_IMR_MR26 ((uint32_t)0x04000000) /*!< Interrupt Mask on line 26 */ -#define EXTI_IMR_MR27 ((uint32_t)0x08000000) /*!< Interrupt Mask on line 27 */ -#define EXTI_IMR_MR28 ((uint32_t)0x10000000) /*!< Interrupt Mask on line 28 */ -#define EXTI_IMR_MR29 ((uint32_t)0x20000000) /*!< Interrupt Mask on line 29 */ -#define EXTI_IMR_MR30 ((uint32_t)0x40000000) /*!< Interrupt Mask on line 30 */ -#define EXTI_IMR_MR31 ((uint32_t)0x80000000) /*!< Interrupt Mask on line 31 */ - -/****************** Bit definition for EXTI_EMR register ********************/ -#define EXTI_EMR_MR0 ((uint32_t)0x00000001) /*!< Event Mask on line 0 */ -#define EXTI_EMR_MR1 ((uint32_t)0x00000002) /*!< Event Mask on line 1 */ -#define EXTI_EMR_MR2 ((uint32_t)0x00000004) /*!< Event Mask on line 2 */ -#define EXTI_EMR_MR3 ((uint32_t)0x00000008) /*!< Event Mask on line 3 */ -#define EXTI_EMR_MR4 ((uint32_t)0x00000010) /*!< Event Mask on line 4 */ -#define EXTI_EMR_MR5 ((uint32_t)0x00000020) /*!< Event Mask on line 5 */ -#define EXTI_EMR_MR6 ((uint32_t)0x00000040) /*!< Event Mask on line 6 */ -#define EXTI_EMR_MR7 ((uint32_t)0x00000080) /*!< Event Mask on line 7 */ -#define EXTI_EMR_MR8 ((uint32_t)0x00000100) /*!< Event Mask on line 8 */ -#define EXTI_EMR_MR9 ((uint32_t)0x00000200) /*!< Event Mask on line 9 */ -#define EXTI_EMR_MR10 ((uint32_t)0x00000400) /*!< Event Mask on line 10 */ -#define EXTI_EMR_MR11 ((uint32_t)0x00000800) /*!< Event Mask on line 11 */ -#define EXTI_EMR_MR12 ((uint32_t)0x00001000) /*!< Event Mask on line 12 */ -#define EXTI_EMR_MR13 ((uint32_t)0x00002000) /*!< Event Mask on line 13 */ -#define EXTI_EMR_MR14 ((uint32_t)0x00004000) /*!< Event Mask on line 14 */ -#define EXTI_EMR_MR15 ((uint32_t)0x00008000) /*!< Event Mask on line 15 */ -#define EXTI_EMR_MR16 ((uint32_t)0x00010000) /*!< Event Mask on line 16 */ -#define EXTI_EMR_MR17 ((uint32_t)0x00020000) /*!< Event Mask on line 17 */ -#define EXTI_EMR_MR18 ((uint32_t)0x00040000) /*!< Event Mask on line 18 */ -#define EXTI_EMR_MR19 ((uint32_t)0x00080000) /*!< Event Mask on line 19 */ -#define EXTI_EMR_MR20 ((uint32_t)0x00100000) /*!< Event Mask on line 20 */ -#define EXTI_EMR_MR21 ((uint32_t)0x00200000) /*!< Event Mask on line 21 */ -#define EXTI_EMR_MR22 ((uint32_t)0x00400000) /*!< Event Mask on line 22 */ -#define EXTI_EMR_MR23 ((uint32_t)0x00800000) /*!< Event Mask on line 23 */ -#define EXTI_EMR_MR24 ((uint32_t)0x01000000) /*!< Event Mask on line 24 */ -#define EXTI_EMR_MR25 ((uint32_t)0x02000000) /*!< Event Mask on line 25 */ -#define EXTI_EMR_MR26 ((uint32_t)0x04000000) /*!< Event Mask on line 26 */ -#define EXTI_EMR_MR27 ((uint32_t)0x08000000) /*!< Event Mask on line 27 */ -#define EXTI_EMR_MR28 ((uint32_t)0x10000000) /*!< Event Mask on line 28 */ -#define EXTI_EMR_MR29 ((uint32_t)0x20000000) /*!< Event Mask on line 29 */ -#define EXTI_EMR_MR30 ((uint32_t)0x40000000) /*!< Event Mask on line 30 */ -#define EXTI_EMR_MR31 ((uint32_t)0x80000000) /*!< Event Mask on line 31 */ - -/******************* Bit definition for EXTI_RTSR register ******************/ -#define EXTI_RTSR_TR0 ((uint32_t)0x00000001) /*!< Rising trigger event configuration bit of line 0 */ -#define EXTI_RTSR_TR1 ((uint32_t)0x00000002) /*!< Rising trigger event configuration bit of line 1 */ -#define EXTI_RTSR_TR2 ((uint32_t)0x00000004) /*!< Rising trigger event configuration bit of line 2 */ -#define EXTI_RTSR_TR3 ((uint32_t)0x00000008) /*!< Rising trigger event configuration bit of line 3 */ -#define EXTI_RTSR_TR4 ((uint32_t)0x00000010) /*!< Rising trigger event configuration bit of line 4 */ -#define EXTI_RTSR_TR5 ((uint32_t)0x00000020) /*!< Rising trigger event configuration bit of line 5 */ -#define EXTI_RTSR_TR6 ((uint32_t)0x00000040) /*!< Rising trigger event configuration bit of line 6 */ -#define EXTI_RTSR_TR7 ((uint32_t)0x00000080) /*!< Rising trigger event configuration bit of line 7 */ -#define EXTI_RTSR_TR8 ((uint32_t)0x00000100) /*!< Rising trigger event configuration bit of line 8 */ -#define EXTI_RTSR_TR9 ((uint32_t)0x00000200) /*!< Rising trigger event configuration bit of line 9 */ -#define EXTI_RTSR_TR10 ((uint32_t)0x00000400) /*!< Rising trigger event configuration bit of line 10 */ -#define EXTI_RTSR_TR11 ((uint32_t)0x00000800) /*!< Rising trigger event configuration bit of line 11 */ -#define EXTI_RTSR_TR12 ((uint32_t)0x00001000) /*!< Rising trigger event configuration bit of line 12 */ -#define EXTI_RTSR_TR13 ((uint32_t)0x00002000) /*!< Rising trigger event configuration bit of line 13 */ -#define EXTI_RTSR_TR14 ((uint32_t)0x00004000) /*!< Rising trigger event configuration bit of line 14 */ -#define EXTI_RTSR_TR15 ((uint32_t)0x00008000) /*!< Rising trigger event configuration bit of line 15 */ -#define EXTI_RTSR_TR16 ((uint32_t)0x00010000) /*!< Rising trigger event configuration bit of line 16 */ -#define EXTI_RTSR_TR17 ((uint32_t)0x00020000) /*!< Rising trigger event configuration bit of line 17 */ -#define EXTI_RTSR_TR19 ((uint32_t)0x00080000) /*!< Rising trigger event configuration bit of line 19 */ -#define EXTI_RTSR_TR20 ((uint32_t)0x00100000) /*!< Rising trigger event configuration bit of line 20 */ -#define EXTI_RTSR_TR21 ((uint32_t)0x00200000) /*!< Rising trigger event configuration bit of line 21 */ -#define EXTI_RTSR_TR22 ((uint32_t)0x00400000) /*!< Rising trigger event configuration bit of line 22 */ - -/******************* Bit definition for EXTI_FTSR register *******************/ -#define EXTI_FTSR_TR0 ((uint32_t)0x00000001) /*!< Falling trigger event configuration bit of line 0 */ -#define EXTI_FTSR_TR1 ((uint32_t)0x00000002) /*!< Falling trigger event configuration bit of line 1 */ -#define EXTI_FTSR_TR2 ((uint32_t)0x00000004) /*!< Falling trigger event configuration bit of line 2 */ -#define EXTI_FTSR_TR3 ((uint32_t)0x00000008) /*!< Falling trigger event configuration bit of line 3 */ -#define EXTI_FTSR_TR4 ((uint32_t)0x00000010) /*!< Falling trigger event configuration bit of line 4 */ -#define EXTI_FTSR_TR5 ((uint32_t)0x00000020) /*!< Falling trigger event configuration bit of line 5 */ -#define EXTI_FTSR_TR6 ((uint32_t)0x00000040) /*!< Falling trigger event configuration bit of line 6 */ -#define EXTI_FTSR_TR7 ((uint32_t)0x00000080) /*!< Falling trigger event configuration bit of line 7 */ -#define EXTI_FTSR_TR8 ((uint32_t)0x00000100) /*!< Falling trigger event configuration bit of line 8 */ -#define EXTI_FTSR_TR9 ((uint32_t)0x00000200) /*!< Falling trigger event configuration bit of line 9 */ -#define EXTI_FTSR_TR10 ((uint32_t)0x00000400) /*!< Falling trigger event configuration bit of line 10 */ -#define EXTI_FTSR_TR11 ((uint32_t)0x00000800) /*!< Falling trigger event configuration bit of line 11 */ -#define EXTI_FTSR_TR12 ((uint32_t)0x00001000) /*!< Falling trigger event configuration bit of line 12 */ -#define EXTI_FTSR_TR13 ((uint32_t)0x00002000) /*!< Falling trigger event configuration bit of line 13 */ -#define EXTI_FTSR_TR14 ((uint32_t)0x00004000) /*!< Falling trigger event configuration bit of line 14 */ -#define EXTI_FTSR_TR15 ((uint32_t)0x00008000) /*!< Falling trigger event configuration bit of line 15 */ -#define EXTI_FTSR_TR16 ((uint32_t)0x00010000) /*!< Falling trigger event configuration bit of line 16 */ -#define EXTI_FTSR_TR17 ((uint32_t)0x00020000) /*!< Falling trigger event configuration bit of line 17 */ -#define EXTI_FTSR_TR19 ((uint32_t)0x00080000) /*!< Falling trigger event configuration bit of line 19 */ -#define EXTI_FTSR_TR20 ((uint32_t)0x00100000) /*!< Falling trigger event configuration bit of line 20 */ -#define EXTI_FTSR_TR21 ((uint32_t)0x00200000) /*!< Falling trigger event configuration bit of line 21 */ -#define EXTI_FTSR_TR22 ((uint32_t)0x00400000) /*!< Falling trigger event configuration bit of line 22 */ - -/******************* Bit definition for EXTI_SWIER register *******************/ -#define EXTI_SWIER_SWIER0 ((uint32_t)0x00000001) /*!< Software Interrupt on line 0 */ -#define EXTI_SWIER_SWIER1 ((uint32_t)0x00000002) /*!< Software Interrupt on line 1 */ -#define EXTI_SWIER_SWIER2 ((uint32_t)0x00000004) /*!< Software Interrupt on line 2 */ -#define EXTI_SWIER_SWIER3 ((uint32_t)0x00000008) /*!< Software Interrupt on line 3 */ -#define EXTI_SWIER_SWIER4 ((uint32_t)0x00000010) /*!< Software Interrupt on line 4 */ -#define EXTI_SWIER_SWIER5 ((uint32_t)0x00000020) /*!< Software Interrupt on line 5 */ -#define EXTI_SWIER_SWIER6 ((uint32_t)0x00000040) /*!< Software Interrupt on line 6 */ -#define EXTI_SWIER_SWIER7 ((uint32_t)0x00000080) /*!< Software Interrupt on line 7 */ -#define EXTI_SWIER_SWIER8 ((uint32_t)0x00000100) /*!< Software Interrupt on line 8 */ -#define EXTI_SWIER_SWIER9 ((uint32_t)0x00000200) /*!< Software Interrupt on line 9 */ -#define EXTI_SWIER_SWIER10 ((uint32_t)0x00000400) /*!< Software Interrupt on line 10 */ -#define EXTI_SWIER_SWIER11 ((uint32_t)0x00000800) /*!< Software Interrupt on line 11 */ -#define EXTI_SWIER_SWIER12 ((uint32_t)0x00001000) /*!< Software Interrupt on line 12 */ -#define EXTI_SWIER_SWIER13 ((uint32_t)0x00002000) /*!< Software Interrupt on line 13 */ -#define EXTI_SWIER_SWIER14 ((uint32_t)0x00004000) /*!< Software Interrupt on line 14 */ -#define EXTI_SWIER_SWIER15 ((uint32_t)0x00008000) /*!< Software Interrupt on line 15 */ -#define EXTI_SWIER_SWIER16 ((uint32_t)0x00010000) /*!< Software Interrupt on line 16 */ -#define EXTI_SWIER_SWIER17 ((uint32_t)0x00020000) /*!< Software Interrupt on line 17 */ -#define EXTI_SWIER_SWIER19 ((uint32_t)0x00080000) /*!< Software Interrupt on line 19 */ -#define EXTI_SWIER_SWIER20 ((uint32_t)0x00100000) /*!< Software Interrupt on line 20 */ -#define EXTI_SWIER_SWIER21 ((uint32_t)0x00200000) /*!< Software Interrupt on line 21 */ -#define EXTI_SWIER_SWIER22 ((uint32_t)0x00400000) /*!< Software Interrupt on line 22 */ - -/****************** Bit definition for EXTI_PR register *********************/ -#define EXTI_PR_PR0 ((uint32_t)0x00000001) /*!< Pending bit 0 */ -#define EXTI_PR_PR1 ((uint32_t)0x00000002) /*!< Pending bit 1 */ -#define EXTI_PR_PR2 ((uint32_t)0x00000004) /*!< Pending bit 2 */ -#define EXTI_PR_PR3 ((uint32_t)0x00000008) /*!< Pending bit 3 */ -#define EXTI_PR_PR4 ((uint32_t)0x00000010) /*!< Pending bit 4 */ -#define EXTI_PR_PR5 ((uint32_t)0x00000020) /*!< Pending bit 5 */ -#define EXTI_PR_PR6 ((uint32_t)0x00000040) /*!< Pending bit 6 */ -#define EXTI_PR_PR7 ((uint32_t)0x00000080) /*!< Pending bit 7 */ -#define EXTI_PR_PR8 ((uint32_t)0x00000100) /*!< Pending bit 8 */ -#define EXTI_PR_PR9 ((uint32_t)0x00000200) /*!< Pending bit 9 */ -#define EXTI_PR_PR10 ((uint32_t)0x00000400) /*!< Pending bit 10 */ -#define EXTI_PR_PR11 ((uint32_t)0x00000800) /*!< Pending bit 11 */ -#define EXTI_PR_PR12 ((uint32_t)0x00001000) /*!< Pending bit 12 */ -#define EXTI_PR_PR13 ((uint32_t)0x00002000) /*!< Pending bit 13 */ -#define EXTI_PR_PR14 ((uint32_t)0x00004000) /*!< Pending bit 14 */ -#define EXTI_PR_PR15 ((uint32_t)0x00008000) /*!< Pending bit 15 */ -#define EXTI_PR_PR16 ((uint32_t)0x00010000) /*!< Pending bit 16 */ -#define EXTI_PR_PR17 ((uint32_t)0x00020000) /*!< Pending bit 17 */ -#define EXTI_PR_PR19 ((uint32_t)0x00080000) /*!< Pending bit 19 */ -#define EXTI_PR_PR20 ((uint32_t)0x00100000) /*!< Pending bit 20 */ -#define EXTI_PR_PR21 ((uint32_t)0x00200000) /*!< Pending bit 21 */ -#define EXTI_PR_PR22 ((uint32_t)0x00400000) /*!< Pending bit 22 */ - -/******************************************************************************/ -/* */ -/* FLASH and Option Bytes Registers */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for FLASH_ACR register ******************/ -#define FLASH_ACR_LATENCY ((uint32_t)0x00000001) /*!< LATENCY bit (Latency) */ - -#define FLASH_ACR_PRFTBE ((uint32_t)0x00000010) /*!< Prefetch Buffer Enable */ -#define FLASH_ACR_PRFTBS ((uint32_t)0x00000020) /*!< Prefetch Buffer Status */ - -/****************** Bit definition for FLASH_KEYR register ******************/ -#define FLASH_KEYR_FKEYR ((uint32_t)0xFFFFFFFF) /*!< FPEC Key */ - -/***************** Bit definition for FLASH_OPTKEYR register ****************/ -#define FLASH_OPTKEYR_OPTKEYR ((uint32_t)0xFFFFFFFF) /*!< Option Byte Key */ - -/****************** FLASH Keys **********************************************/ -#define FLASH_FKEY1 ((uint32_t)0x45670123) /*!< Flash program erase key1 */ -#define FLASH_FKEY2 ((uint32_t)0xCDEF89AB) /*!< Flash program erase key2: used with FLASH_PEKEY1 - to unlock the write access to the FPEC. */ - -#define FLASH_OPTKEY1 ((uint32_t)0x45670123) /*!< Flash option key1 */ -#define FLASH_OPTKEY2 ((uint32_t)0xCDEF89AB) /*!< Flash option key2: used with FLASH_OPTKEY1 to - unlock the write access to the option byte block */ - -/****************** Bit definition for FLASH_SR register *******************/ -#define FLASH_SR_BSY ((uint32_t)0x00000001) /*!< Busy */ -#define FLASH_SR_PGERR ((uint32_t)0x00000004) /*!< Programming Error */ -#define FLASH_SR_WRPRTERR ((uint32_t)0x00000010) /*!< Write Protection Error */ -#define FLASH_SR_EOP ((uint32_t)0x00000020) /*!< End of operation */ -#define FLASH_SR_WRPERR FLASH_SR_WRPRTERR /*!< Legacy of Write Protection Error */ - -/******************* Bit definition for FLASH_CR register *******************/ -#define FLASH_CR_PG ((uint32_t)0x00000001) /*!< Programming */ -#define FLASH_CR_PER ((uint32_t)0x00000002) /*!< Page Erase */ -#define FLASH_CR_MER ((uint32_t)0x00000004) /*!< Mass Erase */ -#define FLASH_CR_OPTPG ((uint32_t)0x00000010) /*!< Option Byte Programming */ -#define FLASH_CR_OPTER ((uint32_t)0x00000020) /*!< Option Byte Erase */ -#define FLASH_CR_STRT ((uint32_t)0x00000040) /*!< Start */ -#define FLASH_CR_LOCK ((uint32_t)0x00000080) /*!< Lock */ -#define FLASH_CR_OPTWRE ((uint32_t)0x00000200) /*!< Option Bytes Write Enable */ -#define FLASH_CR_ERRIE ((uint32_t)0x00000400) /*!< Error Interrupt Enable */ -#define FLASH_CR_EOPIE ((uint32_t)0x00001000) /*!< End of operation interrupt enable */ -#define FLASH_CR_OBL_LAUNCH ((uint32_t)0x00002000) /*!< Option Bytes Loader Launch */ - -/******************* Bit definition for FLASH_AR register *******************/ -#define FLASH_AR_FAR ((uint32_t)0xFFFFFFFF) /*!< Flash Address */ - -/****************** Bit definition for FLASH_OBR register *******************/ -#define FLASH_OBR_OPTERR ((uint32_t)0x00000001) /*!< Option Byte Error */ -#define FLASH_OBR_RDPRT1 ((uint32_t)0x00000002) /*!< Read protection Level bit 1 */ -#define FLASH_OBR_RDPRT2 ((uint32_t)0x00000004) /*!< Read protection Level bit 2 */ - -#define FLASH_OBR_USER ((uint32_t)0x00003700) /*!< User Option Bytes */ -#define FLASH_OBR_IWDG_SW ((uint32_t)0x00000100) /*!< IWDG SW */ -#define FLASH_OBR_nRST_STOP ((uint32_t)0x00000200) /*!< nRST_STOP */ -#define FLASH_OBR_nRST_STDBY ((uint32_t)0x00000400) /*!< nRST_STDBY */ -#define FLASH_OBR_nBOOT0 ((uint32_t)0x00000800) /*!< nBOOT0 */ -#define FLASH_OBR_nBOOT1 ((uint32_t)0x00001000) /*!< nBOOT1 */ -#define FLASH_OBR_VDDA_MONITOR ((uint32_t)0x00002000) /*!< VDDA power supply supervisor */ -#define FLASH_OBR_RAM_PARITY_CHECK ((uint32_t)0x00004000) /*!< RAM Parity Check */ -#define FLASH_OBR_nBOOT0_SW ((uint32_t)0x00008000) /*!< nBOOT0 SW (available only in the STM32F042 devices)*/ -#define FLASH_OBR_DATA0 ((uint32_t)0x00FF0000) /*!< DATA0 */ -#define FLASH_OBR_DATA1 ((uint32_t)0xFF000000) /*!< DATA0 */ - -/* Old BOOT1 bit definition, maintained for legacy purpose */ -#define FLASH_OBR_BOOT1 FLASH_OBR_nBOOT1 - -/* Old OBR_VDDA bit definition, maintained for legacy purpose */ -#define FLASH_OBR_VDDA_ANALOG FLASH_OBR_VDDA_MONITOR - -/****************** Bit definition for FLASH_WRPR register ******************/ -#define FLASH_WRPR_WRP ((uint32_t)0xFFFFFFFF) /*!< Write Protect */ - -/*----------------------------------------------------------------------------*/ - -/****************** Bit definition for OB_RDP register **********************/ -#define OB_RDP_RDP ((uint32_t)0x000000FF) /*!< Read protection option byte */ -#define OB_RDP_nRDP ((uint32_t)0x0000FF00) /*!< Read protection complemented option byte */ - -/****************** Bit definition for OB_USER register *********************/ -#define OB_USER_USER ((uint32_t)0x00FF0000) /*!< User option byte */ -#define OB_USER_nUSER ((uint32_t)0xFF000000) /*!< User complemented option byte */ - -/****************** Bit definition for OB_WRP0 register *********************/ -#define OB_WRP0_WRP0 ((uint32_t)0x000000FF) /*!< Flash memory write protection option bytes */ -#define OB_WRP0_nWRP0 ((uint32_t)0x0000FF00) /*!< Flash memory write protection complemented option bytes */ - -/****************** Bit definition for OB_WRP1 register *********************/ -#define OB_WRP1_WRP1 ((uint32_t)0x00FF0000) /*!< Flash memory write protection option bytes */ -#define OB_WRP1_nWRP1 ((uint32_t)0xFF000000) /*!< Flash memory write protection complemented option bytes */ - -/****************** Bit definition for OB_WRP2 register *********************/ -#define OB_WRP2_WRP2 ((uint32_t)0x000000FF) /*!< Flash memory write protection option bytes (only for STM32F072 devices) */ -#define OB_WRP2_nWRP2 ((uint32_t)0x0000FF00) /*!< Flash memory write protection complemented option bytes (only for STM32F072 devices) */ - -/****************** Bit definition for OB_WRP3 register *********************/ -#define OB_WRP3_WRP3 ((uint32_t)0x00FF0000) /*!< Flash memory write protection option bytes (only for STM32F072 devices) */ -#define OB_WRP3_nWRP3 ((uint32_t)0xFF000000) /*!< Flash memory write protection complemented option bytes (only for STM32F072 devices) */ - -/******************************************************************************/ -/* */ -/* General Purpose IOs (GPIO) */ -/* */ -/******************************************************************************/ -/******************* Bit definition for GPIO_MODER register *****************/ -#define GPIO_MODER_MODER0 ((uint32_t)0x00000003) -#define GPIO_MODER_MODER0_0 ((uint32_t)0x00000001) -#define GPIO_MODER_MODER0_1 ((uint32_t)0x00000002) -#define GPIO_MODER_MODER1 ((uint32_t)0x0000000C) -#define GPIO_MODER_MODER1_0 ((uint32_t)0x00000004) -#define GPIO_MODER_MODER1_1 ((uint32_t)0x00000008) -#define GPIO_MODER_MODER2 ((uint32_t)0x00000030) -#define GPIO_MODER_MODER2_0 ((uint32_t)0x00000010) -#define GPIO_MODER_MODER2_1 ((uint32_t)0x00000020) -#define GPIO_MODER_MODER3 ((uint32_t)0x000000C0) -#define GPIO_MODER_MODER3_0 ((uint32_t)0x00000040) -#define GPIO_MODER_MODER3_1 ((uint32_t)0x00000080) -#define GPIO_MODER_MODER4 ((uint32_t)0x00000300) -#define GPIO_MODER_MODER4_0 ((uint32_t)0x00000100) -#define GPIO_MODER_MODER4_1 ((uint32_t)0x00000200) -#define GPIO_MODER_MODER5 ((uint32_t)0x00000C00) -#define GPIO_MODER_MODER5_0 ((uint32_t)0x00000400) -#define GPIO_MODER_MODER5_1 ((uint32_t)0x00000800) -#define GPIO_MODER_MODER6 ((uint32_t)0x00003000) -#define GPIO_MODER_MODER6_0 ((uint32_t)0x00001000) -#define GPIO_MODER_MODER6_1 ((uint32_t)0x00002000) -#define GPIO_MODER_MODER7 ((uint32_t)0x0000C000) -#define GPIO_MODER_MODER7_0 ((uint32_t)0x00004000) -#define GPIO_MODER_MODER7_1 ((uint32_t)0x00008000) -#define GPIO_MODER_MODER8 ((uint32_t)0x00030000) -#define GPIO_MODER_MODER8_0 ((uint32_t)0x00010000) -#define GPIO_MODER_MODER8_1 ((uint32_t)0x00020000) -#define GPIO_MODER_MODER9 ((uint32_t)0x000C0000) -#define GPIO_MODER_MODER9_0 ((uint32_t)0x00040000) -#define GPIO_MODER_MODER9_1 ((uint32_t)0x00080000) -#define GPIO_MODER_MODER10 ((uint32_t)0x00300000) -#define GPIO_MODER_MODER10_0 ((uint32_t)0x00100000) -#define GPIO_MODER_MODER10_1 ((uint32_t)0x00200000) -#define GPIO_MODER_MODER11 ((uint32_t)0x00C00000) -#define GPIO_MODER_MODER11_0 ((uint32_t)0x00400000) -#define GPIO_MODER_MODER11_1 ((uint32_t)0x00800000) -#define GPIO_MODER_MODER12 ((uint32_t)0x03000000) -#define GPIO_MODER_MODER12_0 ((uint32_t)0x01000000) -#define GPIO_MODER_MODER12_1 ((uint32_t)0x02000000) -#define GPIO_MODER_MODER13 ((uint32_t)0x0C000000) -#define GPIO_MODER_MODER13_0 ((uint32_t)0x04000000) -#define GPIO_MODER_MODER13_1 ((uint32_t)0x08000000) -#define GPIO_MODER_MODER14 ((uint32_t)0x30000000) -#define GPIO_MODER_MODER14_0 ((uint32_t)0x10000000) -#define GPIO_MODER_MODER14_1 ((uint32_t)0x20000000) -#define GPIO_MODER_MODER15 ((uint32_t)0xC0000000) -#define GPIO_MODER_MODER15_0 ((uint32_t)0x40000000) -#define GPIO_MODER_MODER15_1 ((uint32_t)0x80000000) - -/****************** Bit definition for GPIO_OTYPER register *****************/ -#define GPIO_OTYPER_OT_0 ((uint32_t)0x00000001) -#define GPIO_OTYPER_OT_1 ((uint32_t)0x00000002) -#define GPIO_OTYPER_OT_2 ((uint32_t)0x00000004) -#define GPIO_OTYPER_OT_3 ((uint32_t)0x00000008) -#define GPIO_OTYPER_OT_4 ((uint32_t)0x00000010) -#define GPIO_OTYPER_OT_5 ((uint32_t)0x00000020) -#define GPIO_OTYPER_OT_6 ((uint32_t)0x00000040) -#define GPIO_OTYPER_OT_7 ((uint32_t)0x00000080) -#define GPIO_OTYPER_OT_8 ((uint32_t)0x00000100) -#define GPIO_OTYPER_OT_9 ((uint32_t)0x00000200) -#define GPIO_OTYPER_OT_10 ((uint32_t)0x00000400) -#define GPIO_OTYPER_OT_11 ((uint32_t)0x00000800) -#define GPIO_OTYPER_OT_12 ((uint32_t)0x00001000) -#define GPIO_OTYPER_OT_13 ((uint32_t)0x00002000) -#define GPIO_OTYPER_OT_14 ((uint32_t)0x00004000) -#define GPIO_OTYPER_OT_15 ((uint32_t)0x00008000) - -/**************** Bit definition for GPIO_OSPEEDR register ******************/ -#define GPIO_OSPEEDR_OSPEEDR0 ((uint32_t)0x00000003) -#define GPIO_OSPEEDR_OSPEEDR0_0 ((uint32_t)0x00000001) -#define GPIO_OSPEEDR_OSPEEDR0_1 ((uint32_t)0x00000002) -#define GPIO_OSPEEDR_OSPEEDR1 ((uint32_t)0x0000000C) -#define GPIO_OSPEEDR_OSPEEDR1_0 ((uint32_t)0x00000004) -#define GPIO_OSPEEDR_OSPEEDR1_1 ((uint32_t)0x00000008) -#define GPIO_OSPEEDR_OSPEEDR2 ((uint32_t)0x00000030) -#define GPIO_OSPEEDR_OSPEEDR2_0 ((uint32_t)0x00000010) -#define GPIO_OSPEEDR_OSPEEDR2_1 ((uint32_t)0x00000020) -#define GPIO_OSPEEDR_OSPEEDR3 ((uint32_t)0x000000C0) -#define GPIO_OSPEEDR_OSPEEDR3_0 ((uint32_t)0x00000040) -#define GPIO_OSPEEDR_OSPEEDR3_1 ((uint32_t)0x00000080) -#define GPIO_OSPEEDR_OSPEEDR4 ((uint32_t)0x00000300) -#define GPIO_OSPEEDR_OSPEEDR4_0 ((uint32_t)0x00000100) -#define GPIO_OSPEEDR_OSPEEDR4_1 ((uint32_t)0x00000200) -#define GPIO_OSPEEDR_OSPEEDR5 ((uint32_t)0x00000C00) -#define GPIO_OSPEEDR_OSPEEDR5_0 ((uint32_t)0x00000400) -#define GPIO_OSPEEDR_OSPEEDR5_1 ((uint32_t)0x00000800) -#define GPIO_OSPEEDR_OSPEEDR6 ((uint32_t)0x00003000) -#define GPIO_OSPEEDR_OSPEEDR6_0 ((uint32_t)0x00001000) -#define GPIO_OSPEEDR_OSPEEDR6_1 ((uint32_t)0x00002000) -#define GPIO_OSPEEDR_OSPEEDR7 ((uint32_t)0x0000C000) -#define GPIO_OSPEEDR_OSPEEDR7_0 ((uint32_t)0x00004000) -#define GPIO_OSPEEDR_OSPEEDR7_1 ((uint32_t)0x00008000) -#define GPIO_OSPEEDR_OSPEEDR8 ((uint32_t)0x00030000) -#define GPIO_OSPEEDR_OSPEEDR8_0 ((uint32_t)0x00010000) -#define GPIO_OSPEEDR_OSPEEDR8_1 ((uint32_t)0x00020000) -#define GPIO_OSPEEDR_OSPEEDR9 ((uint32_t)0x000C0000) -#define GPIO_OSPEEDR_OSPEEDR9_0 ((uint32_t)0x00040000) -#define GPIO_OSPEEDR_OSPEEDR9_1 ((uint32_t)0x00080000) -#define GPIO_OSPEEDR_OSPEEDR10 ((uint32_t)0x00300000) -#define GPIO_OSPEEDR_OSPEEDR10_0 ((uint32_t)0x00100000) -#define GPIO_OSPEEDR_OSPEEDR10_1 ((uint32_t)0x00200000) -#define GPIO_OSPEEDR_OSPEEDR11 ((uint32_t)0x00C00000) -#define GPIO_OSPEEDR_OSPEEDR11_0 ((uint32_t)0x00400000) -#define GPIO_OSPEEDR_OSPEEDR11_1 ((uint32_t)0x00800000) -#define GPIO_OSPEEDR_OSPEEDR12 ((uint32_t)0x03000000) -#define GPIO_OSPEEDR_OSPEEDR12_0 ((uint32_t)0x01000000) -#define GPIO_OSPEEDR_OSPEEDR12_1 ((uint32_t)0x02000000) -#define GPIO_OSPEEDR_OSPEEDR13 ((uint32_t)0x0C000000) -#define GPIO_OSPEEDR_OSPEEDR13_0 ((uint32_t)0x04000000) -#define GPIO_OSPEEDR_OSPEEDR13_1 ((uint32_t)0x08000000) -#define GPIO_OSPEEDR_OSPEEDR14 ((uint32_t)0x30000000) -#define GPIO_OSPEEDR_OSPEEDR14_0 ((uint32_t)0x10000000) -#define GPIO_OSPEEDR_OSPEEDR14_1 ((uint32_t)0x20000000) -#define GPIO_OSPEEDR_OSPEEDR15 ((uint32_t)0xC0000000) -#define GPIO_OSPEEDR_OSPEEDR15_0 ((uint32_t)0x40000000) -#define GPIO_OSPEEDR_OSPEEDR15_1 ((uint32_t)0x80000000) - -/* Old Bit definition for GPIO_OSPEEDR register maintained for legacy purpose */ -#define GPIO_OSPEEDER_OSPEEDR0 GPIO_OSPEEDR_OSPEEDR0 -#define GPIO_OSPEEDER_OSPEEDR0_0 GPIO_OSPEEDR_OSPEEDR0_0 -#define GPIO_OSPEEDER_OSPEEDR0_1 GPIO_OSPEEDR_OSPEEDR0_1 -#define GPIO_OSPEEDER_OSPEEDR1 GPIO_OSPEEDR_OSPEEDR1 -#define GPIO_OSPEEDER_OSPEEDR1_0 GPIO_OSPEEDR_OSPEEDR1_0 -#define GPIO_OSPEEDER_OSPEEDR1_1 GPIO_OSPEEDR_OSPEEDR1_1 -#define GPIO_OSPEEDER_OSPEEDR2 GPIO_OSPEEDR_OSPEEDR2 -#define GPIO_OSPEEDER_OSPEEDR2_0 GPIO_OSPEEDR_OSPEEDR2_0 -#define GPIO_OSPEEDER_OSPEEDR2_1 GPIO_OSPEEDR_OSPEEDR2_1 -#define GPIO_OSPEEDER_OSPEEDR3 GPIO_OSPEEDR_OSPEEDR3 -#define GPIO_OSPEEDER_OSPEEDR3_0 GPIO_OSPEEDR_OSPEEDR3_0 -#define GPIO_OSPEEDER_OSPEEDR3_1 GPIO_OSPEEDR_OSPEEDR3_1 -#define GPIO_OSPEEDER_OSPEEDR4 GPIO_OSPEEDR_OSPEEDR4 -#define GPIO_OSPEEDER_OSPEEDR4_0 GPIO_OSPEEDR_OSPEEDR4_0 -#define GPIO_OSPEEDER_OSPEEDR4_1 GPIO_OSPEEDR_OSPEEDR4_1 -#define GPIO_OSPEEDER_OSPEEDR5 GPIO_OSPEEDR_OSPEEDR5 -#define GPIO_OSPEEDER_OSPEEDR5_0 GPIO_OSPEEDR_OSPEEDR5_0 -#define GPIO_OSPEEDER_OSPEEDR5_1 GPIO_OSPEEDR_OSPEEDR5_1 -#define GPIO_OSPEEDER_OSPEEDR6 GPIO_OSPEEDR_OSPEEDR6 -#define GPIO_OSPEEDER_OSPEEDR6_0 GPIO_OSPEEDR_OSPEEDR6_0 -#define GPIO_OSPEEDER_OSPEEDR6_1 GPIO_OSPEEDR_OSPEEDR6_1 -#define GPIO_OSPEEDER_OSPEEDR7 GPIO_OSPEEDR_OSPEEDR7 -#define GPIO_OSPEEDER_OSPEEDR7_0 GPIO_OSPEEDR_OSPEEDR7_0 -#define GPIO_OSPEEDER_OSPEEDR7_1 GPIO_OSPEEDR_OSPEEDR7_1 -#define GPIO_OSPEEDER_OSPEEDR8 GPIO_OSPEEDR_OSPEEDR8 -#define GPIO_OSPEEDER_OSPEEDR8_0 GPIO_OSPEEDR_OSPEEDR8_0 -#define GPIO_OSPEEDER_OSPEEDR8_1 GPIO_OSPEEDR_OSPEEDR8_1 -#define GPIO_OSPEEDER_OSPEEDR9 GPIO_OSPEEDR_OSPEEDR9 -#define GPIO_OSPEEDER_OSPEEDR9_0 GPIO_OSPEEDR_OSPEEDR9_0 -#define GPIO_OSPEEDER_OSPEEDR9_1 GPIO_OSPEEDR_OSPEEDR9_1 -#define GPIO_OSPEEDER_OSPEEDR10 GPIO_OSPEEDR_OSPEEDR10 -#define GPIO_OSPEEDER_OSPEEDR10_0 GPIO_OSPEEDR_OSPEEDR10_0 -#define GPIO_OSPEEDER_OSPEEDR10_1 GPIO_OSPEEDR_OSPEEDR10_1 -#define GPIO_OSPEEDER_OSPEEDR11 GPIO_OSPEEDR_OSPEEDR11 -#define GPIO_OSPEEDER_OSPEEDR11_0 GPIO_OSPEEDR_OSPEEDR11_0 -#define GPIO_OSPEEDER_OSPEEDR11_1 GPIO_OSPEEDR_OSPEEDR11_1 -#define GPIO_OSPEEDER_OSPEEDR12 GPIO_OSPEEDR_OSPEEDR12 -#define GPIO_OSPEEDER_OSPEEDR12_0 GPIO_OSPEEDR_OSPEEDR12_0 -#define GPIO_OSPEEDER_OSPEEDR12_1 GPIO_OSPEEDR_OSPEEDR12_1 -#define GPIO_OSPEEDER_OSPEEDR13 GPIO_OSPEEDR_OSPEEDR13 -#define GPIO_OSPEEDER_OSPEEDR13_0 GPIO_OSPEEDR_OSPEEDR13_0 -#define GPIO_OSPEEDER_OSPEEDR13_1 GPIO_OSPEEDR_OSPEEDR13_1 -#define GPIO_OSPEEDER_OSPEEDR14 GPIO_OSPEEDR_OSPEEDR14 -#define GPIO_OSPEEDER_OSPEEDR14_0 GPIO_OSPEEDR_OSPEEDR14_0 -#define GPIO_OSPEEDER_OSPEEDR14_1 GPIO_OSPEEDR_OSPEEDR14_1 -#define GPIO_OSPEEDER_OSPEEDR15 GPIO_OSPEEDR_OSPEEDR15 -#define GPIO_OSPEEDER_OSPEEDR15_0 GPIO_OSPEEDR_OSPEEDR15_0 -#define GPIO_OSPEEDER_OSPEEDR15_1 GPIO_OSPEEDR_OSPEEDR15_1 - -/******************* Bit definition for GPIO_PUPDR register ******************/ -#define GPIO_PUPDR_PUPDR0 ((uint32_t)0x00000003) -#define GPIO_PUPDR_PUPDR0_0 ((uint32_t)0x00000001) -#define GPIO_PUPDR_PUPDR0_1 ((uint32_t)0x00000002) -#define GPIO_PUPDR_PUPDR1 ((uint32_t)0x0000000C) -#define GPIO_PUPDR_PUPDR1_0 ((uint32_t)0x00000004) -#define GPIO_PUPDR_PUPDR1_1 ((uint32_t)0x00000008) -#define GPIO_PUPDR_PUPDR2 ((uint32_t)0x00000030) -#define GPIO_PUPDR_PUPDR2_0 ((uint32_t)0x00000010) -#define GPIO_PUPDR_PUPDR2_1 ((uint32_t)0x00000020) -#define GPIO_PUPDR_PUPDR3 ((uint32_t)0x000000C0) -#define GPIO_PUPDR_PUPDR3_0 ((uint32_t)0x00000040) -#define GPIO_PUPDR_PUPDR3_1 ((uint32_t)0x00000080) -#define GPIO_PUPDR_PUPDR4 ((uint32_t)0x00000300) -#define GPIO_PUPDR_PUPDR4_0 ((uint32_t)0x00000100) -#define GPIO_PUPDR_PUPDR4_1 ((uint32_t)0x00000200) -#define GPIO_PUPDR_PUPDR5 ((uint32_t)0x00000C00) -#define GPIO_PUPDR_PUPDR5_0 ((uint32_t)0x00000400) -#define GPIO_PUPDR_PUPDR5_1 ((uint32_t)0x00000800) -#define GPIO_PUPDR_PUPDR6 ((uint32_t)0x00003000) -#define GPIO_PUPDR_PUPDR6_0 ((uint32_t)0x00001000) -#define GPIO_PUPDR_PUPDR6_1 ((uint32_t)0x00002000) -#define GPIO_PUPDR_PUPDR7 ((uint32_t)0x0000C000) -#define GPIO_PUPDR_PUPDR7_0 ((uint32_t)0x00004000) -#define GPIO_PUPDR_PUPDR7_1 ((uint32_t)0x00008000) -#define GPIO_PUPDR_PUPDR8 ((uint32_t)0x00030000) -#define GPIO_PUPDR_PUPDR8_0 ((uint32_t)0x00010000) -#define GPIO_PUPDR_PUPDR8_1 ((uint32_t)0x00020000) -#define GPIO_PUPDR_PUPDR9 ((uint32_t)0x000C0000) -#define GPIO_PUPDR_PUPDR9_0 ((uint32_t)0x00040000) -#define GPIO_PUPDR_PUPDR9_1 ((uint32_t)0x00080000) -#define GPIO_PUPDR_PUPDR10 ((uint32_t)0x00300000) -#define GPIO_PUPDR_PUPDR10_0 ((uint32_t)0x00100000) -#define GPIO_PUPDR_PUPDR10_1 ((uint32_t)0x00200000) -#define GPIO_PUPDR_PUPDR11 ((uint32_t)0x00C00000) -#define GPIO_PUPDR_PUPDR11_0 ((uint32_t)0x00400000) -#define GPIO_PUPDR_PUPDR11_1 ((uint32_t)0x00800000) -#define GPIO_PUPDR_PUPDR12 ((uint32_t)0x03000000) -#define GPIO_PUPDR_PUPDR12_0 ((uint32_t)0x01000000) -#define GPIO_PUPDR_PUPDR12_1 ((uint32_t)0x02000000) -#define GPIO_PUPDR_PUPDR13 ((uint32_t)0x0C000000) -#define GPIO_PUPDR_PUPDR13_0 ((uint32_t)0x04000000) -#define GPIO_PUPDR_PUPDR13_1 ((uint32_t)0x08000000) -#define GPIO_PUPDR_PUPDR14 ((uint32_t)0x30000000) -#define GPIO_PUPDR_PUPDR14_0 ((uint32_t)0x10000000) -#define GPIO_PUPDR_PUPDR14_1 ((uint32_t)0x20000000) -#define GPIO_PUPDR_PUPDR15 ((uint32_t)0xC0000000) -#define GPIO_PUPDR_PUPDR15_0 ((uint32_t)0x40000000) -#define GPIO_PUPDR_PUPDR15_1 ((uint32_t)0x80000000) - -/******************* Bit definition for GPIO_IDR register *******************/ -#define GPIO_IDR_0 ((uint32_t)0x00000001) -#define GPIO_IDR_1 ((uint32_t)0x00000002) -#define GPIO_IDR_2 ((uint32_t)0x00000004) -#define GPIO_IDR_3 ((uint32_t)0x00000008) -#define GPIO_IDR_4 ((uint32_t)0x00000010) -#define GPIO_IDR_5 ((uint32_t)0x00000020) -#define GPIO_IDR_6 ((uint32_t)0x00000040) -#define GPIO_IDR_7 ((uint32_t)0x00000080) -#define GPIO_IDR_8 ((uint32_t)0x00000100) -#define GPIO_IDR_9 ((uint32_t)0x00000200) -#define GPIO_IDR_10 ((uint32_t)0x00000400) -#define GPIO_IDR_11 ((uint32_t)0x00000800) -#define GPIO_IDR_12 ((uint32_t)0x00001000) -#define GPIO_IDR_13 ((uint32_t)0x00002000) -#define GPIO_IDR_14 ((uint32_t)0x00004000) -#define GPIO_IDR_15 ((uint32_t)0x00008000) - -/****************** Bit definition for GPIO_ODR register ********************/ -#define GPIO_ODR_0 ((uint32_t)0x00000001) -#define GPIO_ODR_1 ((uint32_t)0x00000002) -#define GPIO_ODR_2 ((uint32_t)0x00000004) -#define GPIO_ODR_3 ((uint32_t)0x00000008) -#define GPIO_ODR_4 ((uint32_t)0x00000010) -#define GPIO_ODR_5 ((uint32_t)0x00000020) -#define GPIO_ODR_6 ((uint32_t)0x00000040) -#define GPIO_ODR_7 ((uint32_t)0x00000080) -#define GPIO_ODR_8 ((uint32_t)0x00000100) -#define GPIO_ODR_9 ((uint32_t)0x00000200) -#define GPIO_ODR_10 ((uint32_t)0x00000400) -#define GPIO_ODR_11 ((uint32_t)0x00000800) -#define GPIO_ODR_12 ((uint32_t)0x00001000) -#define GPIO_ODR_13 ((uint32_t)0x00002000) -#define GPIO_ODR_14 ((uint32_t)0x00004000) -#define GPIO_ODR_15 ((uint32_t)0x00008000) - -/****************** Bit definition for GPIO_BSRR register ********************/ -#define GPIO_BSRR_BS_0 ((uint32_t)0x00000001) -#define GPIO_BSRR_BS_1 ((uint32_t)0x00000002) -#define GPIO_BSRR_BS_2 ((uint32_t)0x00000004) -#define GPIO_BSRR_BS_3 ((uint32_t)0x00000008) -#define GPIO_BSRR_BS_4 ((uint32_t)0x00000010) -#define GPIO_BSRR_BS_5 ((uint32_t)0x00000020) -#define GPIO_BSRR_BS_6 ((uint32_t)0x00000040) -#define GPIO_BSRR_BS_7 ((uint32_t)0x00000080) -#define GPIO_BSRR_BS_8 ((uint32_t)0x00000100) -#define GPIO_BSRR_BS_9 ((uint32_t)0x00000200) -#define GPIO_BSRR_BS_10 ((uint32_t)0x00000400) -#define GPIO_BSRR_BS_11 ((uint32_t)0x00000800) -#define GPIO_BSRR_BS_12 ((uint32_t)0x00001000) -#define GPIO_BSRR_BS_13 ((uint32_t)0x00002000) -#define GPIO_BSRR_BS_14 ((uint32_t)0x00004000) -#define GPIO_BSRR_BS_15 ((uint32_t)0x00008000) -#define GPIO_BSRR_BR_0 ((uint32_t)0x00010000) -#define GPIO_BSRR_BR_1 ((uint32_t)0x00020000) -#define GPIO_BSRR_BR_2 ((uint32_t)0x00040000) -#define GPIO_BSRR_BR_3 ((uint32_t)0x00080000) -#define GPIO_BSRR_BR_4 ((uint32_t)0x00100000) -#define GPIO_BSRR_BR_5 ((uint32_t)0x00200000) -#define GPIO_BSRR_BR_6 ((uint32_t)0x00400000) -#define GPIO_BSRR_BR_7 ((uint32_t)0x00800000) -#define GPIO_BSRR_BR_8 ((uint32_t)0x01000000) -#define GPIO_BSRR_BR_9 ((uint32_t)0x02000000) -#define GPIO_BSRR_BR_10 ((uint32_t)0x04000000) -#define GPIO_BSRR_BR_11 ((uint32_t)0x08000000) -#define GPIO_BSRR_BR_12 ((uint32_t)0x10000000) -#define GPIO_BSRR_BR_13 ((uint32_t)0x20000000) -#define GPIO_BSRR_BR_14 ((uint32_t)0x40000000) -#define GPIO_BSRR_BR_15 ((uint32_t)0x80000000) - -/****************** Bit definition for GPIO_LCKR register ********************/ -#define GPIO_LCKR_LCK0 ((uint32_t)0x00000001) -#define GPIO_LCKR_LCK1 ((uint32_t)0x00000002) -#define GPIO_LCKR_LCK2 ((uint32_t)0x00000004) -#define GPIO_LCKR_LCK3 ((uint32_t)0x00000008) -#define GPIO_LCKR_LCK4 ((uint32_t)0x00000010) -#define GPIO_LCKR_LCK5 ((uint32_t)0x00000020) -#define GPIO_LCKR_LCK6 ((uint32_t)0x00000040) -#define GPIO_LCKR_LCK7 ((uint32_t)0x00000080) -#define GPIO_LCKR_LCK8 ((uint32_t)0x00000100) -#define GPIO_LCKR_LCK9 ((uint32_t)0x00000200) -#define GPIO_LCKR_LCK10 ((uint32_t)0x00000400) -#define GPIO_LCKR_LCK11 ((uint32_t)0x00000800) -#define GPIO_LCKR_LCK12 ((uint32_t)0x00001000) -#define GPIO_LCKR_LCK13 ((uint32_t)0x00002000) -#define GPIO_LCKR_LCK14 ((uint32_t)0x00004000) -#define GPIO_LCKR_LCK15 ((uint32_t)0x00008000) -#define GPIO_LCKR_LCKK ((uint32_t)0x00010000) - -/****************** Bit definition for GPIO_AFRL register ********************/ -#define GPIO_AFRL_AFR0 ((uint32_t)0x0000000F) -#define GPIO_AFRL_AFR1 ((uint32_t)0x000000F0) -#define GPIO_AFRL_AFR2 ((uint32_t)0x00000F00) -#define GPIO_AFRL_AFR3 ((uint32_t)0x0000F000) -#define GPIO_AFRL_AFR4 ((uint32_t)0x000F0000) -#define GPIO_AFRL_AFR5 ((uint32_t)0x00F00000) -#define GPIO_AFRL_AFR6 ((uint32_t)0x0F000000) -#define GPIO_AFRL_AFR7 ((uint32_t)0xF0000000) - -/****************** Bit definition for GPIO_AFRH register ********************/ -#define GPIO_AFRH_AFR8 ((uint32_t)0x0000000F) -#define GPIO_AFRH_AFR9 ((uint32_t)0x000000F0) -#define GPIO_AFRH_AFR10 ((uint32_t)0x00000F00) -#define GPIO_AFRH_AFR11 ((uint32_t)0x0000F000) -#define GPIO_AFRH_AFR12 ((uint32_t)0x000F0000) -#define GPIO_AFRH_AFR13 ((uint32_t)0x00F00000) -#define GPIO_AFRH_AFR14 ((uint32_t)0x0F000000) -#define GPIO_AFRH_AFR15 ((uint32_t)0xF0000000) - -/* Old Bit definition for GPIO_AFRL register maintained for legacy purpose ****/ -#define GPIO_AFRL_AFRL0 GPIO_AFRL_AFR0 -#define GPIO_AFRL_AFRL1 GPIO_AFRL_AFR1 -#define GPIO_AFRL_AFRL2 GPIO_AFRL_AFR2 -#define GPIO_AFRL_AFRL3 GPIO_AFRL_AFR3 -#define GPIO_AFRL_AFRL4 GPIO_AFRL_AFR4 -#define GPIO_AFRL_AFRL5 GPIO_AFRL_AFR5 -#define GPIO_AFRL_AFRL6 GPIO_AFRL_AFR6 -#define GPIO_AFRL_AFRL7 GPIO_AFRL_AFR7 - -/* Old Bit definition for GPIO_AFRH register maintained for legacy purpose ****/ -#define GPIO_AFRH_AFRH0 GPIO_AFRH_AFR8 -#define GPIO_AFRH_AFRH1 GPIO_AFRH_AFR9 -#define GPIO_AFRH_AFRH2 GPIO_AFRH_AFR10 -#define GPIO_AFRH_AFRH3 GPIO_AFRH_AFR11 -#define GPIO_AFRH_AFRH4 GPIO_AFRH_AFR12 -#define GPIO_AFRH_AFRH5 GPIO_AFRH_AFR13 -#define GPIO_AFRH_AFRH6 GPIO_AFRH_AFR14 -#define GPIO_AFRH_AFRH7 GPIO_AFRH_AFR15 - -/****************** Bit definition for GPIO_BRR register *********************/ -#define GPIO_BRR_BR_0 ((uint32_t)0x00000001) -#define GPIO_BRR_BR_1 ((uint32_t)0x00000002) -#define GPIO_BRR_BR_2 ((uint32_t)0x00000004) -#define GPIO_BRR_BR_3 ((uint32_t)0x00000008) -#define GPIO_BRR_BR_4 ((uint32_t)0x00000010) -#define GPIO_BRR_BR_5 ((uint32_t)0x00000020) -#define GPIO_BRR_BR_6 ((uint32_t)0x00000040) -#define GPIO_BRR_BR_7 ((uint32_t)0x00000080) -#define GPIO_BRR_BR_8 ((uint32_t)0x00000100) -#define GPIO_BRR_BR_9 ((uint32_t)0x00000200) -#define GPIO_BRR_BR_10 ((uint32_t)0x00000400) -#define GPIO_BRR_BR_11 ((uint32_t)0x00000800) -#define GPIO_BRR_BR_12 ((uint32_t)0x00001000) -#define GPIO_BRR_BR_13 ((uint32_t)0x00002000) -#define GPIO_BRR_BR_14 ((uint32_t)0x00004000) -#define GPIO_BRR_BR_15 ((uint32_t)0x00008000) - -/******************************************************************************/ -/* */ -/* Inter-integrated Circuit Interface (I2C) */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for I2C_CR1 register *******************/ -#define I2C_CR1_PE ((uint32_t)0x00000001) /*!< Peripheral enable */ -#define I2C_CR1_TXIE ((uint32_t)0x00000002) /*!< TX interrupt enable */ -#define I2C_CR1_RXIE ((uint32_t)0x00000004) /*!< RX interrupt enable */ -#define I2C_CR1_ADDRIE ((uint32_t)0x00000008) /*!< Address match interrupt enable */ -#define I2C_CR1_NACKIE ((uint32_t)0x00000010) /*!< NACK received interrupt enable */ -#define I2C_CR1_STOPIE ((uint32_t)0x00000020) /*!< STOP detection interrupt enable */ -#define I2C_CR1_TCIE ((uint32_t)0x00000040) /*!< Transfer complete interrupt enable */ -#define I2C_CR1_ERRIE ((uint32_t)0x00000080) /*!< Errors interrupt enable */ -#define I2C_CR1_DFN ((uint32_t)0x00000F00) /*!< Digital noise filter */ -#define I2C_CR1_ANFOFF ((uint32_t)0x00001000) /*!< Analog noise filter OFF */ -#define I2C_CR1_SWRST ((uint32_t)0x00002000) /*!< Software reset */ -#define I2C_CR1_TXDMAEN ((uint32_t)0x00004000) /*!< DMA transmission requests enable */ -#define I2C_CR1_RXDMAEN ((uint32_t)0x00008000) /*!< DMA reception requests enable */ -#define I2C_CR1_SBC ((uint32_t)0x00010000) /*!< Slave byte control */ -#define I2C_CR1_NOSTRETCH ((uint32_t)0x00020000) /*!< Clock stretching disable */ -#define I2C_CR1_WUPEN ((uint32_t)0x00040000) /*!< Wakeup from STOP enable */ -#define I2C_CR1_GCEN ((uint32_t)0x00080000) /*!< General call enable */ -#define I2C_CR1_SMBHEN ((uint32_t)0x00100000) /*!< SMBus host address enable */ -#define I2C_CR1_SMBDEN ((uint32_t)0x00200000) /*!< SMBus device default address enable */ -#define I2C_CR1_ALERTEN ((uint32_t)0x00400000) /*!< SMBus alert enable */ -#define I2C_CR1_PECEN ((uint32_t)0x00800000) /*!< PEC enable */ - -/****************** Bit definition for I2C_CR2 register ********************/ -#define I2C_CR2_SADD ((uint32_t)0x000003FF) /*!< Slave address (master mode) */ -#define I2C_CR2_RD_WRN ((uint32_t)0x00000400) /*!< Transfer direction (master mode) */ -#define I2C_CR2_ADD10 ((uint32_t)0x00000800) /*!< 10-bit addressing mode (master mode) */ -#define I2C_CR2_HEAD10R ((uint32_t)0x00001000) /*!< 10-bit address header only read direction (master mode) */ -#define I2C_CR2_START ((uint32_t)0x00002000) /*!< START generation */ -#define I2C_CR2_STOP ((uint32_t)0x00004000) /*!< STOP generation (master mode) */ -#define I2C_CR2_NACK ((uint32_t)0x00008000) /*!< NACK generation (slave mode) */ -#define I2C_CR2_NBYTES ((uint32_t)0x00FF0000) /*!< Number of bytes */ -#define I2C_CR2_RELOAD ((uint32_t)0x01000000) /*!< NBYTES reload mode */ -#define I2C_CR2_AUTOEND ((uint32_t)0x02000000) /*!< Automatic end mode (master mode) */ -#define I2C_CR2_PECBYTE ((uint32_t)0x04000000) /*!< Packet error checking byte */ - -/******************* Bit definition for I2C_OAR1 register ******************/ -#define I2C_OAR1_OA1 ((uint32_t)0x000003FF) /*!< Interface own address 1 */ -#define I2C_OAR1_OA1MODE ((uint32_t)0x00000400) /*!< Own address 1 10-bit mode */ -#define I2C_OAR1_OA1EN ((uint32_t)0x00008000) /*!< Own address 1 enable */ - -/******************* Bit definition for I2C_OAR2 register ******************/ -#define I2C_OAR2_OA2 ((uint32_t)0x000000FE) /*!< Interface own address 2 */ -#define I2C_OAR2_OA2MSK ((uint32_t)0x00000700) /*!< Own address 2 masks */ -#define I2C_OAR2_OA2EN ((uint32_t)0x00008000) /*!< Own address 2 enable */ - -/******************* Bit definition for I2C_TIMINGR register *******************/ -#define I2C_TIMINGR_SCLL ((uint32_t)0x000000FF) /*!< SCL low period (master mode) */ -#define I2C_TIMINGR_SCLH ((uint32_t)0x0000FF00) /*!< SCL high period (master mode) */ -#define I2C_TIMINGR_SDADEL ((uint32_t)0x000F0000) /*!< Data hold time */ -#define I2C_TIMINGR_SCLDEL ((uint32_t)0x00F00000) /*!< Data setup time */ -#define I2C_TIMINGR_PRESC ((uint32_t)0xF0000000) /*!< Timings prescaler */ - -/******************* Bit definition for I2C_TIMEOUTR register *******************/ -#define I2C_TIMEOUTR_TIMEOUTA ((uint32_t)0x00000FFF) /*!< Bus timeout A */ -#define I2C_TIMEOUTR_TIDLE ((uint32_t)0x00001000) /*!< Idle clock timeout detection */ -#define I2C_TIMEOUTR_TIMOUTEN ((uint32_t)0x00008000) /*!< Clock timeout enable */ -#define I2C_TIMEOUTR_TIMEOUTB ((uint32_t)0x0FFF0000) /*!< Bus timeout B*/ -#define I2C_TIMEOUTR_TEXTEN ((uint32_t)0x80000000) /*!< Extended clock timeout enable */ - -/****************** Bit definition for I2C_ISR register *********************/ -#define I2C_ISR_TXE ((uint32_t)0x00000001) /*!< Transmit data register empty */ -#define I2C_ISR_TXIS ((uint32_t)0x00000002) /*!< Transmit interrupt status */ -#define I2C_ISR_RXNE ((uint32_t)0x00000004) /*!< Receive data register not empty */ -#define I2C_ISR_ADDR ((uint32_t)0x00000008) /*!< Address matched (slave mode)*/ -#define I2C_ISR_NACKF ((uint32_t)0x00000010) /*!< NACK received flag */ -#define I2C_ISR_STOPF ((uint32_t)0x00000020) /*!< STOP detection flag */ -#define I2C_ISR_TC ((uint32_t)0x00000040) /*!< Transfer complete (master mode) */ -#define I2C_ISR_TCR ((uint32_t)0x00000080) /*!< Transfer complete reload */ -#define I2C_ISR_BERR ((uint32_t)0x00000100) /*!< Bus error */ -#define I2C_ISR_ARLO ((uint32_t)0x00000200) /*!< Arbitration lost */ -#define I2C_ISR_OVR ((uint32_t)0x00000400) /*!< Overrun/Underrun */ -#define I2C_ISR_PECERR ((uint32_t)0x00000800) /*!< PEC error in reception */ -#define I2C_ISR_TIMEOUT ((uint32_t)0x00001000) /*!< Timeout or Tlow detection flag */ -#define I2C_ISR_ALERT ((uint32_t)0x00002000) /*!< SMBus alert */ -#define I2C_ISR_BUSY ((uint32_t)0x00008000) /*!< Bus busy */ -#define I2C_ISR_DIR ((uint32_t)0x00010000) /*!< Transfer direction (slave mode) */ -#define I2C_ISR_ADDCODE ((uint32_t)0x00FE0000) /*!< Address match code (slave mode) */ - -/****************** Bit definition for I2C_ICR register *********************/ -#define I2C_ICR_ADDRCF ((uint32_t)0x00000008) /*!< Address matched clear flag */ -#define I2C_ICR_NACKCF ((uint32_t)0x00000010) /*!< NACK clear flag */ -#define I2C_ICR_STOPCF ((uint32_t)0x00000020) /*!< STOP detection clear flag */ -#define I2C_ICR_BERRCF ((uint32_t)0x00000100) /*!< Bus error clear flag */ -#define I2C_ICR_ARLOCF ((uint32_t)0x00000200) /*!< Arbitration lost clear flag */ -#define I2C_ICR_OVRCF ((uint32_t)0x00000400) /*!< Overrun/Underrun clear flag */ -#define I2C_ICR_PECCF ((uint32_t)0x00000800) /*!< PAC error clear flag */ -#define I2C_ICR_TIMOUTCF ((uint32_t)0x00001000) /*!< Timeout clear flag */ -#define I2C_ICR_ALERTCF ((uint32_t)0x00002000) /*!< Alert clear flag */ - -/****************** Bit definition for I2C_PECR register *********************/ -#define I2C_PECR_PEC ((uint32_t)0x000000FF) /*!< PEC register */ - -/****************** Bit definition for I2C_RXDR register *********************/ -#define I2C_RXDR_RXDATA ((uint32_t)0x000000FF) /*!< 8-bit receive data */ - -/****************** Bit definition for I2C_TXDR register *********************/ -#define I2C_TXDR_TXDATA ((uint32_t)0x000000FF) /*!< 8-bit transmit data */ - -/******************************************************************************/ -/* */ -/* Independent WATCHDOG (IWDG) */ -/* */ -/******************************************************************************/ -/******************* Bit definition for IWDG_KR register ********************/ -#define IWDG_KR_KEY ((uint16_t)0xFFFF) /*!< Key value (write only, read 0000h) */ - -/******************* Bit definition for IWDG_PR register ********************/ -#define IWDG_PR_PR ((uint8_t)0x07) /*!< PR[2:0] (Prescaler divider) */ -#define IWDG_PR_PR_0 ((uint8_t)0x01) /*!< Bit 0 */ -#define IWDG_PR_PR_1 ((uint8_t)0x02) /*!< Bit 1 */ -#define IWDG_PR_PR_2 ((uint8_t)0x04) /*!< Bit 2 */ - -/******************* Bit definition for IWDG_RLR register *******************/ -#define IWDG_RLR_RL ((uint16_t)0x0FFF) /*!< Watchdog counter reload value */ - -/******************* Bit definition for IWDG_SR register ********************/ -#define IWDG_SR_PVU ((uint8_t)0x01) /*!< Watchdog prescaler value update */ -#define IWDG_SR_RVU ((uint8_t)0x02) /*!< Watchdog counter reload value update */ -#define IWDG_SR_WVU ((uint8_t)0x04) /*!< Watchdog counter window value update */ - -/******************* Bit definition for IWDG_KR register ********************/ -#define IWDG_WINR_WIN ((uint16_t)0x0FFF) /*!< Watchdog counter window value */ - -/******************************************************************************/ -/* */ -/* Power Control (PWR) */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for PWR_CR register ********************/ -#define PWR_CR_LPDS ((uint16_t)0x0001) /*!< Low-power deepsleep/sleep */ -#define PWR_CR_PDDS ((uint16_t)0x0002) /*!< Power Down Deepsleep */ -#define PWR_CR_CWUF ((uint16_t)0x0004) /*!< Clear Wakeup Flag */ -#define PWR_CR_CSBF ((uint16_t)0x0008) /*!< Clear Standby Flag */ -#define PWR_CR_PVDE ((uint16_t)0x0010) /*!< Power Voltage Detector Enable */ - -#define PWR_CR_PLS ((uint16_t)0x00E0) /*!< PLS[2:0] bits (PVD Level Selection) */ -#define PWR_CR_PLS_0 ((uint16_t)0x0020) /*!< Bit 0 */ -#define PWR_CR_PLS_1 ((uint16_t)0x0040) /*!< Bit 1 */ -#define PWR_CR_PLS_2 ((uint16_t)0x0080) /*!< Bit 2 */ -/* PVD level configuration */ -#define PWR_CR_PLS_LEV0 ((uint16_t)0x0000) /*!< PVD level 0 */ -#define PWR_CR_PLS_LEV1 ((uint16_t)0x0020) /*!< PVD level 1 */ -#define PWR_CR_PLS_LEV2 ((uint16_t)0x0040) /*!< PVD level 2 */ -#define PWR_CR_PLS_LEV3 ((uint16_t)0x0060) /*!< PVD level 3 */ -#define PWR_CR_PLS_LEV4 ((uint16_t)0x0080) /*!< PVD level 4 */ -#define PWR_CR_PLS_LEV5 ((uint16_t)0x00A0) /*!< PVD level 5 */ -#define PWR_CR_PLS_LEV6 ((uint16_t)0x00C0) /*!< PVD level 6 */ -#define PWR_CR_PLS_LEV7 ((uint16_t)0x00E0) /*!< PVD level 7 */ - -#define PWR_CR_DBP ((uint16_t)0x0100) /*!< Disable Backup Domain write protection */ - -/* Old Bit definition maintained for legacy purpose ****/ -#define PWR_CR_LPSDSR PWR_CR_LPDS /*!< Low-power deepsleep */ - -/******************* Bit definition for PWR_CSR register ********************/ -#define PWR_CSR_WUF ((uint16_t)0x0001) /*!< Wakeup Flag */ -#define PWR_CSR_SBF ((uint16_t)0x0002) /*!< Standby Flag */ -#define PWR_CSR_PVDO ((uint16_t)0x0004) /*!< PVD Output */ -#define PWR_CSR_VREFINTRDY ((uint16_t)0x0008) /*!< Internal voltage reference (VREFINT) ready */ - -#define PWR_CSR_EWUP1 ((uint16_t)0x0100) /*!< Enable WKUP pin 1 */ -#define PWR_CSR_EWUP2 ((uint16_t)0x0200) /*!< Enable WKUP pin 2 */ -#define PWR_CSR_EWUP3 ((uint16_t)0x0400) /*!< Enable WKUP pin 3 */ -#define PWR_CSR_EWUP4 ((uint16_t)0x0800) /*!< Enable WKUP pin 4 */ -#define PWR_CSR_EWUP5 ((uint16_t)0x1000) /*!< Enable WKUP pin 5 */ -#define PWR_CSR_EWUP6 ((uint16_t)0x2000) /*!< Enable WKUP pin 6 */ -#define PWR_CSR_EWUP7 ((uint16_t)0x4000) /*!< Enable WKUP pin 7 */ -#define PWR_CSR_EWUP8 ((uint16_t)0x8000) /*!< Enable WKUP pin 8 */ - -/* Old Bit definition maintained for legacy purpose ****/ -#define PWR_CSR_VREFINTRDYF PWR_CSR_VREFINTRDY /*!< Internal voltage reference (VREFINT) ready flag */ -/******************************************************************************/ -/* */ -/* Reset and Clock Control */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for RCC_CR register ********************/ -#define RCC_CR_HSION ((uint32_t)0x00000001) /*!< Internal High Speed clock enable */ -#define RCC_CR_HSIRDY ((uint32_t)0x00000002) /*!< Internal High Speed clock ready flag */ -#define RCC_CR_HSITRIM ((uint32_t)0x000000F8) /*!< Internal High Speed clock trimming */ -#define RCC_CR_HSICAL ((uint32_t)0x0000FF00) /*!< Internal High Speed clock Calibration */ -#define RCC_CR_HSEON ((uint32_t)0x00010000) /*!< External High Speed clock enable */ -#define RCC_CR_HSERDY ((uint32_t)0x00020000) /*!< External High Speed clock ready flag */ -#define RCC_CR_HSEBYP ((uint32_t)0x00040000) /*!< External High Speed clock Bypass */ -#define RCC_CR_CSSON ((uint32_t)0x00080000) /*!< Clock Security System enable */ -#define RCC_CR_PLLON ((uint32_t)0x01000000) /*!< PLL enable */ -#define RCC_CR_PLLRDY ((uint32_t)0x02000000) /*!< PLL clock ready flag */ - -/******************* Bit definition for RCC_CFGR register *******************/ -#define RCC_CFGR_SW ((uint32_t)0x00000003) /*!< SW[1:0] bits (System clock Switch) */ -#define RCC_CFGR_SW_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define RCC_CFGR_SW_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -/* SW configuration */ -#define RCC_CFGR_SW_HSI ((uint32_t)0x00000000) /*!< HSI selected as system clock */ -#define RCC_CFGR_SW_HSE ((uint32_t)0x00000001) /*!< HSE selected as system clock */ -#define RCC_CFGR_SW_PLL ((uint32_t)0x00000002) /*!< PLL selected as system clock */ -#define RCC_CFGR_SW_HSI48 ((uint32_t)0x00000003) /*!< HSI48 selected as system clock */ - -#define RCC_CFGR_SWS ((uint32_t)0x0000000C) /*!< SWS[1:0] bits (System Clock Switch Status) */ -#define RCC_CFGR_SWS_0 ((uint32_t)0x00000004) /*!< Bit 0 */ -#define RCC_CFGR_SWS_1 ((uint32_t)0x00000008) /*!< Bit 1 */ -/* SWS configuration */ -#define RCC_CFGR_SWS_HSI ((uint32_t)0x00000000) /*!< HSI oscillator used as system clock */ -#define RCC_CFGR_SWS_HSE ((uint32_t)0x00000004) /*!< HSE oscillator used as system clock */ -#define RCC_CFGR_SWS_PLL ((uint32_t)0x00000008) /*!< PLL used as system clock */ -#define RCC_CFGR_SWS_HSI48 ((uint32_t)0x0000000C) /*!< HSI48 used as system clock */ - -#define RCC_CFGR_HPRE ((uint32_t)0x000000F0) /*!< HPRE[3:0] bits (AHB prescaler) */ -#define RCC_CFGR_HPRE_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define RCC_CFGR_HPRE_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define RCC_CFGR_HPRE_2 ((uint32_t)0x00000040) /*!< Bit 2 */ -#define RCC_CFGR_HPRE_3 ((uint32_t)0x00000080) /*!< Bit 3 */ -/* HPRE configuration */ -#define RCC_CFGR_HPRE_DIV1 ((uint32_t)0x00000000) /*!< SYSCLK not divided */ -#define RCC_CFGR_HPRE_DIV2 ((uint32_t)0x00000080) /*!< SYSCLK divided by 2 */ -#define RCC_CFGR_HPRE_DIV4 ((uint32_t)0x00000090) /*!< SYSCLK divided by 4 */ -#define RCC_CFGR_HPRE_DIV8 ((uint32_t)0x000000A0) /*!< SYSCLK divided by 8 */ -#define RCC_CFGR_HPRE_DIV16 ((uint32_t)0x000000B0) /*!< SYSCLK divided by 16 */ -#define RCC_CFGR_HPRE_DIV64 ((uint32_t)0x000000C0) /*!< SYSCLK divided by 64 */ -#define RCC_CFGR_HPRE_DIV128 ((uint32_t)0x000000D0) /*!< SYSCLK divided by 128 */ -#define RCC_CFGR_HPRE_DIV256 ((uint32_t)0x000000E0) /*!< SYSCLK divided by 256 */ -#define RCC_CFGR_HPRE_DIV512 ((uint32_t)0x000000F0) /*!< SYSCLK divided by 512 */ - -#define RCC_CFGR_PPRE ((uint32_t)0x00000700) /*!< PRE[2:0] bits (APB prescaler) */ -#define RCC_CFGR_PPRE_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define RCC_CFGR_PPRE_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define RCC_CFGR_PPRE_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -/* PPRE configuration */ -#define RCC_CFGR_PPRE_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ -#define RCC_CFGR_PPRE_DIV2 ((uint32_t)0x00000400) /*!< HCLK divided by 2 */ -#define RCC_CFGR_PPRE_DIV4 ((uint32_t)0x00000500) /*!< HCLK divided by 4 */ -#define RCC_CFGR_PPRE_DIV8 ((uint32_t)0x00000600) /*!< HCLK divided by 8 */ -#define RCC_CFGR_PPRE_DIV16 ((uint32_t)0x00000700) /*!< HCLK divided by 16 */ - -#define RCC_CFGR_ADCPRE ((uint32_t)0x00004000) /*!< ADC prescaler: Obsolete. Proper ADC clock selection is - done inside the ADC_CFGR2 */ - -#define RCC_CFGR_PLLSRC ((uint32_t)0x00018000) /*!< PLL entry clock source */ -#define RCC_CFGR_PLLSRC_0 ((uint32_t)0x00008000) /*!< Bit 0 (available only in the STM32F072 devices) */ -#define RCC_CFGR_PLLSRC_1 ((uint32_t)0x00010000) /*!< Bit 1 */ - -#define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source; - Old PREDIV1 bit definition, maintained for legacy purpose */ -#define RCC_CFGR_PLLSRC_HSI_DIV2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ -#define RCC_CFGR_PLLSRC_HSI_PREDIV ((uint32_t)0x00008000) /*!< HSI PREDIV clock selected as PLL entry clock source - (This bit and configuration is only available for STM32F072 devices)*/ -#define RCC_CFGR_PLLSRC_HSE_PREDIV ((uint32_t)0x00010000) /*!< HSE PREDIV clock selected as PLL entry clock source */ -#define RCC_CFGR_PLLSRC_HSI48_PREDIV ((uint32_t)0x00018000) /*!< HSI48 PREDIV clock selected as PLL entry clock source */ - -#define RCC_CFGR_PLLXTPRE ((uint32_t)0x00020000) /*!< HSE divider for PLL entry */ -#define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ -#define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ - -/*!< Old bit definition maintained for legacy purposes */ -#define RCC_CFGR_PLLSRC_HSI_Div2 RCC_CFGR_PLLSRC_HSI_DIV2 - -/* PLLMUL configuration */ -#define RCC_CFGR_PLLMUL ((uint32_t)0x003C0000) /*!< PLLMUL[3:0] bits (PLL multiplication factor) */ -#define RCC_CFGR_PLLMUL_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define RCC_CFGR_PLLMUL_1 ((uint32_t)0x00080000) /*!< Bit 1 */ -#define RCC_CFGR_PLLMUL_2 ((uint32_t)0x00100000) /*!< Bit 2 */ -#define RCC_CFGR_PLLMUL_3 ((uint32_t)0x00200000) /*!< Bit 3 */ - -#define RCC_CFGR_PLLMUL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ -#define RCC_CFGR_PLLMUL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ -#define RCC_CFGR_PLLMUL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ -#define RCC_CFGR_PLLMUL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ -#define RCC_CFGR_PLLMUL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ -#define RCC_CFGR_PLLMUL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ -#define RCC_CFGR_PLLMUL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ -#define RCC_CFGR_PLLMUL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ -#define RCC_CFGR_PLLMUL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ -#define RCC_CFGR_PLLMUL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ -#define RCC_CFGR_PLLMUL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ -#define RCC_CFGR_PLLMUL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ -#define RCC_CFGR_PLLMUL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ -#define RCC_CFGR_PLLMUL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ -#define RCC_CFGR_PLLMUL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ - -/* Old PLLMUL configuration bit definition maintained for legacy purposes */ -#define RCC_CFGR_PLLMULL RCC_CFGR_PLLMUL /*!< PLLMUL[3:0] bits (PLL multiplication factor) */ -#define RCC_CFGR_PLLMULL_0 RCC_CFGR_PLLMUL_0 /*!< Bit 0 */ -#define RCC_CFGR_PLLMULL_1 RCC_CFGR_PLLMUL_1 /*!< Bit 1 */ -#define RCC_CFGR_PLLMULL_2 RCC_CFGR_PLLMUL_2 /*!< Bit 2 */ -#define RCC_CFGR_PLLMULL_3 RCC_CFGR_PLLMUL_3 /*!< Bit 3 */ - -#define RCC_CFGR_PLLMULL2 RCC_CFGR_PLLMUL2 /*!< PLL input clock*2 */ -#define RCC_CFGR_PLLMULL3 RCC_CFGR_PLLMUL3 /*!< PLL input clock*3 */ -#define RCC_CFGR_PLLMULL4 RCC_CFGR_PLLMUL4 /*!< PLL input clock*4 */ -#define RCC_CFGR_PLLMULL5 RCC_CFGR_PLLMUL5 /*!< PLL input clock*5 */ -#define RCC_CFGR_PLLMULL6 RCC_CFGR_PLLMUL6 /*!< PLL input clock*6 */ -#define RCC_CFGR_PLLMULL7 RCC_CFGR_PLLMUL7 /*!< PLL input clock*7 */ -#define RCC_CFGR_PLLMULL8 RCC_CFGR_PLLMUL8 /*!< PLL input clock*8 */ -#define RCC_CFGR_PLLMULL9 RCC_CFGR_PLLMUL9 /*!< PLL input clock*9 */ -#define RCC_CFGR_PLLMULL10 RCC_CFGR_PLLMUL10 /*!< PLL input clock10 */ -#define RCC_CFGR_PLLMULL11 RCC_CFGR_PLLMUL11 /*!< PLL input clock*11 */ -#define RCC_CFGR_PLLMULL12 RCC_CFGR_PLLMUL12 /*!< PLL input clock*12 */ -#define RCC_CFGR_PLLMULL13 RCC_CFGR_PLLMUL13 /*!< PLL input clock*13 */ -#define RCC_CFGR_PLLMULL14 RCC_CFGR_PLLMUL14 /*!< PLL input clock*14 */ -#define RCC_CFGR_PLLMULL15 RCC_CFGR_PLLMUL15 /*!< PLL input clock*15 */ -#define RCC_CFGR_PLLMULL16 RCC_CFGR_PLLMUL16 /*!< PLL input clock*16 */ - -#define RCC_CFGR_MCO ((uint32_t)0x0F000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ -#define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define RCC_CFGR_MCO_3 ((uint32_t)0x08000000) /*!< Bit 3 */ -/* MCO configuration */ -#define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ -#define RCC_CFGR_MCO_HSI14 ((uint32_t)0x01000000) /*!< HSI14 clock selected as MCO source */ -#define RCC_CFGR_MCO_LSI ((uint32_t)0x02000000) /*!< LSI clock selected as MCO source */ -#define RCC_CFGR_MCO_LSE ((uint32_t)0x03000000) /*!< LSE clock selected as MCO source */ -#define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ -#define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ -#define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ -#define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock selected as MCO source */ -#define RCC_CFGR_MCO_HSI48 ((uint32_t)0x08000000) /*!< HSI48 clock selected as MCO source */ - -#define RCC_CFGR_MCO_PRE ((uint32_t)0x70000000) /*!< MCO prescaler (these bits are not available in the STM32F051 devices)*/ -#define RCC_CFGR_MCO_PRE_1 ((uint32_t)0x00000000) /*!< MCO is divided by 1 (this bit are not available in the STM32F051 devices)*/ -#define RCC_CFGR_MCO_PRE_2 ((uint32_t)0x10000000) /*!< MCO is divided by 2 (this bit are not available in the STM32F051 devices)*/ -#define RCC_CFGR_MCO_PRE_4 ((uint32_t)0x20000000) /*!< MCO is divided by 4 (this bit are not available in the STM32F051 devices)*/ -#define RCC_CFGR_MCO_PRE_8 ((uint32_t)0x30000000) /*!< MCO is divided by 8 (this bit are not available in the STM32F051 devices)*/ -#define RCC_CFGR_MCO_PRE_16 ((uint32_t)0x40000000) /*!< MCO is divided by 16 (this bit are not available in the STM32F051 devices)*/ -#define RCC_CFGR_MCO_PRE_32 ((uint32_t)0x50000000) /*!< MCO is divided by 32 (this bit are not available in the STM32F051 devices)*/ -#define RCC_CFGR_MCO_PRE_64 ((uint32_t)0x60000000) /*!< MCO is divided by 64 (this bit are not available in the STM32F051 devices)*/ -#define RCC_CFGR_MCO_PRE_128 ((uint32_t)0x70000000) /*!< MCO is divided by 128 (this bit are not available in the STM32F051 devices)*/ - -#define RCC_CFGR_PLLNODIV ((uint32_t)0x80000000) /*!< PLL is not divided to MCO (this bit are not available in the STM32F051 devices) */ - -/******************* Bit definition for RCC_CIR register ********************/ -#define RCC_CIR_LSIRDYF ((uint32_t)0x00000001) /*!< LSI Ready Interrupt flag */ -#define RCC_CIR_LSERDYF ((uint32_t)0x00000002) /*!< LSE Ready Interrupt flag */ -#define RCC_CIR_HSIRDYF ((uint32_t)0x00000004) /*!< HSI Ready Interrupt flag */ -#define RCC_CIR_HSERDYF ((uint32_t)0x00000008) /*!< HSE Ready Interrupt flag */ -#define RCC_CIR_PLLRDYF ((uint32_t)0x00000010) /*!< PLL Ready Interrupt flag */ -#define RCC_CIR_HSI14RDYF ((uint32_t)0x00000020) /*!< HSI14 Ready Interrupt flag */ -#define RCC_CIR_HSI48RDYF ((uint32_t)0x00000040) /*!< HSI48 Ready Interrupt flag */ -#define RCC_CIR_CSSF ((uint32_t)0x00000080) /*!< Clock Security System Interrupt flag */ -#define RCC_CIR_LSIRDYIE ((uint32_t)0x00000100) /*!< LSI Ready Interrupt Enable */ -#define RCC_CIR_LSERDYIE ((uint32_t)0x00000200) /*!< LSE Ready Interrupt Enable */ -#define RCC_CIR_HSIRDYIE ((uint32_t)0x00000400) /*!< HSI Ready Interrupt Enable */ -#define RCC_CIR_HSERDYIE ((uint32_t)0x00000800) /*!< HSE Ready Interrupt Enable */ -#define RCC_CIR_PLLRDYIE ((uint32_t)0x00001000) /*!< PLL Ready Interrupt Enable */ -#define RCC_CIR_HSI14RDYIE ((uint32_t)0x00002000) /*!< HSI14 Ready Interrupt Enable */ -#define RCC_CIR_HSI48RDYIE ((uint32_t)0x00004000) /*!< HSI48 Ready Interrupt Enable */ -#define RCC_CIR_LSIRDYC ((uint32_t)0x00010000) /*!< LSI Ready Interrupt Clear */ -#define RCC_CIR_LSERDYC ((uint32_t)0x00020000) /*!< LSE Ready Interrupt Clear */ -#define RCC_CIR_HSIRDYC ((uint32_t)0x00040000) /*!< HSI Ready Interrupt Clear */ -#define RCC_CIR_HSERDYC ((uint32_t)0x00080000) /*!< HSE Ready Interrupt Clear */ -#define RCC_CIR_PLLRDYC ((uint32_t)0x00100000) /*!< PLL Ready Interrupt Clear */ -#define RCC_CIR_HSI14RDYC ((uint32_t)0x00200000) /*!< HSI14 Ready Interrupt Clear */ -#define RCC_CIR_HSI48RDYC ((uint32_t)0x00400000) /*!< HSI48 Ready Interrupt Clear */ -#define RCC_CIR_CSSC ((uint32_t)0x00800000) /*!< Clock Security System Interrupt Clear */ - -/***************** Bit definition for RCC_APB2RSTR register *****************/ -#define RCC_APB2RSTR_SYSCFGRST ((uint32_t)0x00000001) /*!< SYSCFG clock reset */ -#define RCC_APB2RSTR_ADCRST ((uint32_t)0x00000200) /*!< ADC clock reset */ -#define RCC_APB2RSTR_TIM1RST ((uint32_t)0x00000800) /*!< TIM1 clock reset */ -#define RCC_APB2RSTR_SPI1RST ((uint32_t)0x00001000) /*!< SPI1 clock reset */ -#define RCC_APB2RSTR_USART1RST ((uint32_t)0x00004000) /*!< USART1 clock reset */ -#define RCC_APB2RSTR_TIM15RST ((uint32_t)0x00010000) /*!< TIM15 clock reset */ -#define RCC_APB2RSTR_TIM16RST ((uint32_t)0x00020000) /*!< TIM16 clock reset */ -#define RCC_APB2RSTR_TIM17RST ((uint32_t)0x00040000) /*!< TIM17 clock reset */ -#define RCC_APB2RSTR_DBGMCURST ((uint32_t)0x00400000) /*!< DBGMCU clock reset */ - -/* Old ADC1 clock reset bit definition maintained for legacy purpose */ -#define RCC_APB2RSTR_ADC1RST RCC_APB2RSTR_ADCRST - -/***************** Bit definition for RCC_APB1RSTR register *****************/ -#define RCC_APB1RSTR_TIM2RST ((uint32_t)0x00000001) /*!< Timer 2 clock reset */ -#define RCC_APB1RSTR_TIM3RST ((uint32_t)0x00000002) /*!< Timer 3 clock reset */ -#define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 clock reset */ -#define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 clock reset */ -#define RCC_APB1RSTR_TIM14RST ((uint32_t)0x00000100) /*!< Timer 14 clock reset */ -#define RCC_APB1RSTR_WWDGRST ((uint32_t)0x00000800) /*!< Window Watchdog clock reset */ -#define RCC_APB1RSTR_SPI2RST ((uint32_t)0x00004000) /*!< SPI2 clock reset */ -#define RCC_APB1RSTR_USART2RST ((uint32_t)0x00020000) /*!< USART 2 clock reset */ -#define RCC_APB1RSTR_USART3RST ((uint32_t)0x00040000) /*!< USART 3 clock reset */ -#define RCC_APB1RSTR_USART4RST ((uint32_t)0x00080000) /*!< USART 4 clock reset */ -#define RCC_APB1RSTR_I2C1RST ((uint32_t)0x00200000) /*!< I2C 1 clock reset */ -#define RCC_APB1RSTR_I2C2RST ((uint32_t)0x00400000) /*!< I2C 2 clock reset */ -#define RCC_APB1RSTR_USBRST ((uint32_t)0x00800000) /*!< USB clock reset */ -#define RCC_APB1RSTR_CANRST ((uint32_t)0x02000000) /*!< CAN clock reset */ -#define RCC_APB1RSTR_CRSRST ((uint32_t)0x08000000) /*!< CRS clock reset */ -#define RCC_APB1RSTR_PWRRST ((uint32_t)0x10000000) /*!< PWR clock reset */ -#define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC clock reset */ -#define RCC_APB1RSTR_CECRST ((uint32_t)0x40000000) /*!< CEC clock reset */ - -/****************** Bit definition for RCC_AHBENR register ******************/ -#define RCC_AHBENR_DMAEN ((uint32_t)0x00000001) /*!< DMA clock enable */ -#define RCC_AHBENR_SRAMEN ((uint32_t)0x00000004) /*!< SRAM interface clock enable */ -#define RCC_AHBENR_FLITFEN ((uint32_t)0x00000010) /*!< FLITF clock enable */ -#define RCC_AHBENR_CRCEN ((uint32_t)0x00000040) /*!< CRC clock enable */ -#define RCC_AHBENR_GPIOAEN ((uint32_t)0x00020000) /*!< GPIOA clock enable */ -#define RCC_AHBENR_GPIOBEN ((uint32_t)0x00040000) /*!< GPIOB clock enable */ -#define RCC_AHBENR_GPIOCEN ((uint32_t)0x00080000) /*!< GPIOC clock enable */ -#define RCC_AHBENR_GPIODEN ((uint32_t)0x00100000) /*!< GPIOD clock enable */ -#define RCC_AHBENR_GPIOEEN ((uint32_t)0x00200000) /*!< GPIOE clock enable */ -#define RCC_AHBENR_GPIOFEN ((uint32_t)0x00400000) /*!< GPIOF clock enable */ -#define RCC_AHBENR_TSCEN ((uint32_t)0x01000000) /*!< TS controller clock enable */ - -/* Old Bit definition maintained for legacy purpose */ -#define RCC_AHBENR_DMA1EN RCC_AHBENR_DMAEN /*!< DMA1 clock enable */ -#define RCC_AHBENR_TSEN RCC_AHBENR_TSCEN /*!< TS clock enable */ - -/***************** Bit definition for RCC_APB2ENR register ******************/ -#define RCC_APB2ENR_SYSCFGCOMPEN ((uint32_t)0x00000001) /*!< SYSCFG and comparator clock enable */ -#define RCC_APB2ENR_ADCEN ((uint32_t)0x00000200) /*!< ADC1 clock enable */ -#define RCC_APB2ENR_TIM1EN ((uint32_t)0x00000800) /*!< TIM1 clock enable */ -#define RCC_APB2ENR_SPI1EN ((uint32_t)0x00001000) /*!< SPI1 clock enable */ -#define RCC_APB2ENR_USART1EN ((uint32_t)0x00004000) /*!< USART1 clock enable */ -#define RCC_APB2ENR_TIM15EN ((uint32_t)0x00010000) /*!< TIM15 clock enable */ -#define RCC_APB2ENR_TIM16EN ((uint32_t)0x00020000) /*!< TIM16 clock enable */ -#define RCC_APB2ENR_TIM17EN ((uint32_t)0x00040000) /*!< TIM17 clock enable */ -#define RCC_APB2ENR_DBGMCUEN ((uint32_t)0x00400000) /*!< DBGMCU clock enable */ - -/* Old Bit definition maintained for legacy purpose */ -#define RCC_APB2ENR_SYSCFGEN RCC_APB2ENR_SYSCFGCOMPEN /*!< SYSCFG clock enable */ -#define RCC_APB2ENR_ADC1EN RCC_APB2ENR_ADCEN /*!< ADC1 clock enable */ - -/***************** Bit definition for RCC_APB1ENR register ******************/ -#define RCC_APB1ENR_TIM2EN ((uint32_t)0x00000001) /*!< Timer 2 clock enable */ -#define RCC_APB1ENR_TIM3EN ((uint32_t)0x00000002) /*!< Timer 3 clock enable */ -#define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ -#define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ -#define RCC_APB1ENR_TIM14EN ((uint32_t)0x00000100) /*!< Timer 14 clock enable */ -#define RCC_APB1ENR_WWDGEN ((uint32_t)0x00000800) /*!< Window Watchdog clock enable */ -#define RCC_APB1ENR_SPI2EN ((uint32_t)0x00004000) /*!< SPI2 clock enable */ -#define RCC_APB1ENR_USART2EN ((uint32_t)0x00020000) /*!< USART2 clock enable */ -#define RCC_APB1ENR_USART3EN ((uint32_t)0x00040000) /*!< USART3 clock enable */ -#define RCC_APB1ENR_USART4EN ((uint32_t)0x00080000) /*!< USART4 clock enable */ -#define RCC_APB1ENR_I2C1EN ((uint32_t)0x00200000) /*!< I2C1 clock enable */ -#define RCC_APB1ENR_I2C2EN ((uint32_t)0x00400000) /*!< I2C2 clock enable */ -#define RCC_APB1ENR_USBEN ((uint32_t)0x00800000) /*!< USB clock enable */ -#define RCC_APB1ENR_CANEN ((uint32_t)0x02000000) /*!< CAN clock enable */ -#define RCC_APB1ENR_CRSEN ((uint32_t)0x08000000) /*!< CRS clock enable */ -#define RCC_APB1ENR_PWREN ((uint32_t)0x10000000) /*!< PWR clock enable */ -#define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC clock enable */ -#define RCC_APB1ENR_CECEN ((uint32_t)0x40000000) /*!< CEC clock enable */ - -/******************* Bit definition for RCC_BDCR register *******************/ -#define RCC_BDCR_LSEON ((uint32_t)0x00000001) /*!< External Low Speed oscillator enable */ -#define RCC_BDCR_LSERDY ((uint32_t)0x00000002) /*!< External Low Speed oscillator Ready */ -#define RCC_BDCR_LSEBYP ((uint32_t)0x00000004) /*!< External Low Speed oscillator Bypass */ - -#define RCC_BDCR_LSEDRV ((uint32_t)0x00000018) /*!< LSEDRV[1:0] bits (LSE Osc. drive capability) */ -#define RCC_BDCR_LSEDRV_0 ((uint32_t)0x00000008) /*!< Bit 0 */ -#define RCC_BDCR_LSEDRV_1 ((uint32_t)0x00000010) /*!< Bit 1 */ - -#define RCC_BDCR_RTCSEL ((uint32_t)0x00000300) /*!< RTCSEL[1:0] bits (RTC clock source selection) */ -#define RCC_BDCR_RTCSEL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define RCC_BDCR_RTCSEL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - -/* RTC configuration */ -#define RCC_BDCR_RTCSEL_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ -#define RCC_BDCR_RTCSEL_LSE ((uint32_t)0x00000100) /*!< LSE oscillator clock used as RTC clock */ -#define RCC_BDCR_RTCSEL_LSI ((uint32_t)0x00000200) /*!< LSI oscillator clock used as RTC clock */ -#define RCC_BDCR_RTCSEL_HSE ((uint32_t)0x00000300) /*!< HSE oscillator clock divided by 32 used as RTC clock */ - -#define RCC_BDCR_RTCEN ((uint32_t)0x00008000) /*!< RTC clock enable */ -#define RCC_BDCR_BDRST ((uint32_t)0x00010000) /*!< Backup domain software reset */ - -/******************* Bit definition for RCC_CSR register ********************/ -#define RCC_CSR_LSION ((uint32_t)0x00000001) /*!< Internal Low Speed oscillator enable */ -#define RCC_CSR_LSIRDY ((uint32_t)0x00000002) /*!< Internal Low Speed oscillator Ready */ -#define RCC_CSR_V18PWRRSTF ((uint32_t)0x00800000) /*!< V1.8 power domain reset flag */ -#define RCC_CSR_RMVF ((uint32_t)0x01000000) /*!< Remove reset flag */ -#define RCC_CSR_OBLRSTF ((uint32_t)0x02000000) /*!< OBL reset flag */ -#define RCC_CSR_PINRSTF ((uint32_t)0x04000000) /*!< PIN reset flag */ -#define RCC_CSR_PORRSTF ((uint32_t)0x08000000) /*!< POR/PDR reset flag */ -#define RCC_CSR_SFTRSTF ((uint32_t)0x10000000) /*!< Software Reset flag */ -#define RCC_CSR_IWDGRSTF ((uint32_t)0x20000000) /*!< Independent Watchdog reset flag */ -#define RCC_CSR_WWDGRSTF ((uint32_t)0x40000000) /*!< Window watchdog reset flag */ -#define RCC_CSR_LPWRRSTF ((uint32_t)0x80000000) /*!< Low-Power reset flag */ - -/* Old Bit definition maintained for legacy purpose */ -#define RCC_CSR_OBL RCC_CSR_OBLRSTF /*!< OBL reset flag */ -/******************* Bit definition for RCC_AHBRSTR register ****************/ -#define RCC_AHBRSTR_GPIOARST ((uint32_t)0x00020000) /*!< GPIOA clock reset */ -#define RCC_AHBRSTR_GPIOBRST ((uint32_t)0x00040000) /*!< GPIOB clock reset */ -#define RCC_AHBRSTR_GPIOCRST ((uint32_t)0x00080000) /*!< GPIOC clock reset */ -#define RCC_AHBRSTR_GPIODRST ((uint32_t)0x00010000) /*!< GPIOD clock reset */ -#define RCC_AHBRSTR_GPIOERST ((uint32_t)0x00020000) /*!< GPIOE clock reset */ -#define RCC_AHBRSTR_GPIOFRST ((uint32_t)0x00040000) /*!< GPIOF clock reset */ -#define RCC_AHBRSTR_TSCRST ((uint32_t)0x00100000) /*!< TS clock reset */ - -/* Old Bit definition maintained for legacy purpose */ -#define RCC_AHBRSTR_TSRST RCC_AHBRSTR_TSCRST /*!< TS clock reset */ - -/******************* Bit definition for RCC_CFGR2 register ******************/ -/* PREDIV1 configuration */ -#define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ -#define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - -#define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ -#define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ -#define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ -#define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ -#define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ -#define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ -#define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ -#define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ -#define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ -#define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ -#define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ -#define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ -#define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ -#define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ -#define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ -#define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ - -/******************* Bit definition for RCC_CFGR3 register ******************/ -#define RCC_CFGR3_USART1SW ((uint32_t)0x00000003) /*!< USART1SW[1:0] bits */ -#define RCC_CFGR3_USART1SW_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define RCC_CFGR3_USART1SW_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define RCC_CFGR3_I2C1SW ((uint32_t)0x00000010) /*!< I2C1SW bits */ -#define RCC_CFGR3_CECSW ((uint32_t)0x00000040) /*!< CECSW bits */ -#define RCC_CFGR3_USBSW ((uint32_t)0x00000080) /*!< USBSW bits */ -#define RCC_CFGR3_ADCSW ((uint32_t)0x00000100) /*!< ADCSW bits */ -#define RCC_CFGR3_USART2SW ((uint32_t)0x00030000) /*!< USART2SW[1:0] bits */ -#define RCC_CFGR3_USART2SW_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define RCC_CFGR3_USART2SW_1 ((uint32_t)0x00020000) /*!< Bit 1 */ - -/******************* Bit definition for RCC_CR2 register ********************/ -#define RCC_CR2_HSI14ON ((uint32_t)0x00000001) /*!< Internal High Speed 14MHz clock enable */ -#define RCC_CR2_HSI14RDY ((uint32_t)0x00000002) /*!< Internal High Speed 14MHz clock ready flag */ -#define RCC_CR2_HSI14DIS ((uint32_t)0x00000004) /*!< Internal High Speed 14MHz clock disable */ -#define RCC_CR2_HSI14TRIM ((uint32_t)0x000000F8) /*!< Internal High Speed 14MHz clock trimming */ -#define RCC_CR2_HSI14CAL ((uint32_t)0x0000FF00) /*!< Internal High Speed 14MHz clock Calibration */ -#define RCC_CR2_HSI48ON ((uint32_t)0x00010000) /*!< Internal High Speed 48MHz clock enable */ -#define RCC_CR2_HSI48RDY ((uint32_t)0x00020000) /*!< Internal High Speed 48MHz clock ready flag */ -#define RCC_CR2_HSI48CAL ((uint32_t)0xFF000000) /*!< Internal High Speed 48MHz clock Calibration */ - -/******************************************************************************/ -/* */ -/* Real-Time Clock (RTC) */ -/* */ -/******************************************************************************/ -/******************** Bits definition for RTC_TR register *******************/ -#define RTC_TR_PM ((uint32_t)0x00400000) -#define RTC_TR_HT ((uint32_t)0x00300000) -#define RTC_TR_HT_0 ((uint32_t)0x00100000) -#define RTC_TR_HT_1 ((uint32_t)0x00200000) -#define RTC_TR_HU ((uint32_t)0x000F0000) -#define RTC_TR_HU_0 ((uint32_t)0x00010000) -#define RTC_TR_HU_1 ((uint32_t)0x00020000) -#define RTC_TR_HU_2 ((uint32_t)0x00040000) -#define RTC_TR_HU_3 ((uint32_t)0x00080000) -#define RTC_TR_MNT ((uint32_t)0x00007000) -#define RTC_TR_MNT_0 ((uint32_t)0x00001000) -#define RTC_TR_MNT_1 ((uint32_t)0x00002000) -#define RTC_TR_MNT_2 ((uint32_t)0x00004000) -#define RTC_TR_MNU ((uint32_t)0x00000F00) -#define RTC_TR_MNU_0 ((uint32_t)0x00000100) -#define RTC_TR_MNU_1 ((uint32_t)0x00000200) -#define RTC_TR_MNU_2 ((uint32_t)0x00000400) -#define RTC_TR_MNU_3 ((uint32_t)0x00000800) -#define RTC_TR_ST ((uint32_t)0x00000070) -#define RTC_TR_ST_0 ((uint32_t)0x00000010) -#define RTC_TR_ST_1 ((uint32_t)0x00000020) -#define RTC_TR_ST_2 ((uint32_t)0x00000040) -#define RTC_TR_SU ((uint32_t)0x0000000F) -#define RTC_TR_SU_0 ((uint32_t)0x00000001) -#define RTC_TR_SU_1 ((uint32_t)0x00000002) -#define RTC_TR_SU_2 ((uint32_t)0x00000004) -#define RTC_TR_SU_3 ((uint32_t)0x00000008) - -/******************** Bits definition for RTC_DR register *******************/ -#define RTC_DR_YT ((uint32_t)0x00F00000) -#define RTC_DR_YT_0 ((uint32_t)0x00100000) -#define RTC_DR_YT_1 ((uint32_t)0x00200000) -#define RTC_DR_YT_2 ((uint32_t)0x00400000) -#define RTC_DR_YT_3 ((uint32_t)0x00800000) -#define RTC_DR_YU ((uint32_t)0x000F0000) -#define RTC_DR_YU_0 ((uint32_t)0x00010000) -#define RTC_DR_YU_1 ((uint32_t)0x00020000) -#define RTC_DR_YU_2 ((uint32_t)0x00040000) -#define RTC_DR_YU_3 ((uint32_t)0x00080000) -#define RTC_DR_WDU ((uint32_t)0x0000E000) -#define RTC_DR_WDU_0 ((uint32_t)0x00002000) -#define RTC_DR_WDU_1 ((uint32_t)0x00004000) -#define RTC_DR_WDU_2 ((uint32_t)0x00008000) -#define RTC_DR_MT ((uint32_t)0x00001000) -#define RTC_DR_MU ((uint32_t)0x00000F00) -#define RTC_DR_MU_0 ((uint32_t)0x00000100) -#define RTC_DR_MU_1 ((uint32_t)0x00000200) -#define RTC_DR_MU_2 ((uint32_t)0x00000400) -#define RTC_DR_MU_3 ((uint32_t)0x00000800) -#define RTC_DR_DT ((uint32_t)0x00000030) -#define RTC_DR_DT_0 ((uint32_t)0x00000010) -#define RTC_DR_DT_1 ((uint32_t)0x00000020) -#define RTC_DR_DU ((uint32_t)0x0000000F) -#define RTC_DR_DU_0 ((uint32_t)0x00000001) -#define RTC_DR_DU_1 ((uint32_t)0x00000002) -#define RTC_DR_DU_2 ((uint32_t)0x00000004) -#define RTC_DR_DU_3 ((uint32_t)0x00000008) - -/******************** Bits definition for RTC_CR register *******************/ -#define RTC_CR_COE ((uint32_t)0x00800000) -#define RTC_CR_OSEL ((uint32_t)0x00600000) -#define RTC_CR_OSEL_0 ((uint32_t)0x00200000) -#define RTC_CR_OSEL_1 ((uint32_t)0x00400000) -#define RTC_CR_POL ((uint32_t)0x00100000) -#define RTC_CR_COSEL ((uint32_t)0x00080000) -#define RTC_CR_BKP ((uint32_t)0x00040000) -#define RTC_CR_SUB1H ((uint32_t)0x00020000) -#define RTC_CR_ADD1H ((uint32_t)0x00010000) -#define RTC_CR_TSIE ((uint32_t)0x00008000) -#define RTC_CR_WUTIE ((uint32_t)0x00004000) -#define RTC_CR_ALRAIE ((uint32_t)0x00001000) -#define RTC_CR_TSE ((uint32_t)0x00000800) -#define RTC_CR_WUTE ((uint32_t)0x00000400) -#define RTC_CR_ALRAE ((uint32_t)0x00000100) -#define RTC_CR_FMT ((uint32_t)0x00000040) -#define RTC_CR_BYPSHAD ((uint32_t)0x00000020) -#define RTC_CR_REFCKON ((uint32_t)0x00000010) -#define RTC_CR_TSEDGE ((uint32_t)0x00000008) -#define RTC_CR_WUCKSEL ((uint32_t)0x00000007) -#define RTC_CR_WUCKSEL_0 ((uint32_t)0x00000001) -#define RTC_CR_WUCKSEL_1 ((uint32_t)0x00000002) -#define RTC_CR_WUCKSEL_2 ((uint32_t)0x00000004) - -/* Old bit definition maintained for legacy purpose */ -#define RTC_CR_BCK RTC_CR_BKP -#define RTC_CR_CALSEL RTC_CR_COSEL - -/******************** Bits definition for RTC_ISR register ******************/ -#define RTC_ISR_RECALPF ((uint32_t)0x00010000) -#define RTC_ISR_TAMP3F ((uint32_t)0x00008000) -#define RTC_ISR_TAMP2F ((uint32_t)0x00004000) -#define RTC_ISR_TAMP1F ((uint32_t)0x00002000) -#define RTC_ISR_TSOVF ((uint32_t)0x00001000) -#define RTC_ISR_TSF ((uint32_t)0x00000800) -#define RTC_ISR_WUTF ((uint32_t)0x00000400) -#define RTC_ISR_ALRAF ((uint32_t)0x00000100) -#define RTC_ISR_INIT ((uint32_t)0x00000080) -#define RTC_ISR_INITF ((uint32_t)0x00000040) -#define RTC_ISR_RSF ((uint32_t)0x00000020) -#define RTC_ISR_INITS ((uint32_t)0x00000010) -#define RTC_ISR_SHPF ((uint32_t)0x00000008) -#define RTC_ISR_WUTWF ((uint32_t)0x00000004) -#define RTC_ISR_ALRAWF ((uint32_t)0x00000001) - -/******************** Bits definition for RTC_PRER register *****************/ -#define RTC_PRER_PREDIV_A ((uint32_t)0x007F0000) -#define RTC_PRER_PREDIV_S ((uint32_t)0x00007FFF) - -/******************** Bits definition for RTC_WUTR register *****************/ -#define RTC_WUTR_WUT ((uint32_t)0x0000FFFF) - -/******************** Bits definition for RTC_ALRMAR register ***************/ -#define RTC_ALRMAR_MSK4 ((uint32_t)0x80000000) -#define RTC_ALRMAR_WDSEL ((uint32_t)0x40000000) -#define RTC_ALRMAR_DT ((uint32_t)0x30000000) -#define RTC_ALRMAR_DT_0 ((uint32_t)0x10000000) -#define RTC_ALRMAR_DT_1 ((uint32_t)0x20000000) -#define RTC_ALRMAR_DU ((uint32_t)0x0F000000) -#define RTC_ALRMAR_DU_0 ((uint32_t)0x01000000) -#define RTC_ALRMAR_DU_1 ((uint32_t)0x02000000) -#define RTC_ALRMAR_DU_2 ((uint32_t)0x04000000) -#define RTC_ALRMAR_DU_3 ((uint32_t)0x08000000) -#define RTC_ALRMAR_MSK3 ((uint32_t)0x00800000) -#define RTC_ALRMAR_PM ((uint32_t)0x00400000) -#define RTC_ALRMAR_HT ((uint32_t)0x00300000) -#define RTC_ALRMAR_HT_0 ((uint32_t)0x00100000) -#define RTC_ALRMAR_HT_1 ((uint32_t)0x00200000) -#define RTC_ALRMAR_HU ((uint32_t)0x000F0000) -#define RTC_ALRMAR_HU_0 ((uint32_t)0x00010000) -#define RTC_ALRMAR_HU_1 ((uint32_t)0x00020000) -#define RTC_ALRMAR_HU_2 ((uint32_t)0x00040000) -#define RTC_ALRMAR_HU_3 ((uint32_t)0x00080000) -#define RTC_ALRMAR_MSK2 ((uint32_t)0x00008000) -#define RTC_ALRMAR_MNT ((uint32_t)0x00007000) -#define RTC_ALRMAR_MNT_0 ((uint32_t)0x00001000) -#define RTC_ALRMAR_MNT_1 ((uint32_t)0x00002000) -#define RTC_ALRMAR_MNT_2 ((uint32_t)0x00004000) -#define RTC_ALRMAR_MNU ((uint32_t)0x00000F00) -#define RTC_ALRMAR_MNU_0 ((uint32_t)0x00000100) -#define RTC_ALRMAR_MNU_1 ((uint32_t)0x00000200) -#define RTC_ALRMAR_MNU_2 ((uint32_t)0x00000400) -#define RTC_ALRMAR_MNU_3 ((uint32_t)0x00000800) -#define RTC_ALRMAR_MSK1 ((uint32_t)0x00000080) -#define RTC_ALRMAR_ST ((uint32_t)0x00000070) -#define RTC_ALRMAR_ST_0 ((uint32_t)0x00000010) -#define RTC_ALRMAR_ST_1 ((uint32_t)0x00000020) -#define RTC_ALRMAR_ST_2 ((uint32_t)0x00000040) -#define RTC_ALRMAR_SU ((uint32_t)0x0000000F) -#define RTC_ALRMAR_SU_0 ((uint32_t)0x00000001) -#define RTC_ALRMAR_SU_1 ((uint32_t)0x00000002) -#define RTC_ALRMAR_SU_2 ((uint32_t)0x00000004) -#define RTC_ALRMAR_SU_3 ((uint32_t)0x00000008) - -/******************** Bits definition for RTC_WPR register ******************/ -#define RTC_WPR_KEY ((uint32_t)0x000000FF) - -/******************** Bits definition for RTC_SSR register ******************/ -#define RTC_SSR_SS ((uint32_t)0x0003FFFF) - -/******************** Bits definition for RTC_SHIFTR register ***************/ -#define RTC_SHIFTR_SUBFS ((uint32_t)0x00007FFF) -#define RTC_SHIFTR_ADD1S ((uint32_t)0x80000000) - -/******************** Bits definition for RTC_TSTR register *****************/ -#define RTC_TSTR_PM ((uint32_t)0x00400000) -#define RTC_TSTR_HT ((uint32_t)0x00300000) -#define RTC_TSTR_HT_0 ((uint32_t)0x00100000) -#define RTC_TSTR_HT_1 ((uint32_t)0x00200000) -#define RTC_TSTR_HU ((uint32_t)0x000F0000) -#define RTC_TSTR_HU_0 ((uint32_t)0x00010000) -#define RTC_TSTR_HU_1 ((uint32_t)0x00020000) -#define RTC_TSTR_HU_2 ((uint32_t)0x00040000) -#define RTC_TSTR_HU_3 ((uint32_t)0x00080000) -#define RTC_TSTR_MNT ((uint32_t)0x00007000) -#define RTC_TSTR_MNT_0 ((uint32_t)0x00001000) -#define RTC_TSTR_MNT_1 ((uint32_t)0x00002000) -#define RTC_TSTR_MNT_2 ((uint32_t)0x00004000) -#define RTC_TSTR_MNU ((uint32_t)0x00000F00) -#define RTC_TSTR_MNU_0 ((uint32_t)0x00000100) -#define RTC_TSTR_MNU_1 ((uint32_t)0x00000200) -#define RTC_TSTR_MNU_2 ((uint32_t)0x00000400) -#define RTC_TSTR_MNU_3 ((uint32_t)0x00000800) -#define RTC_TSTR_ST ((uint32_t)0x00000070) -#define RTC_TSTR_ST_0 ((uint32_t)0x00000010) -#define RTC_TSTR_ST_1 ((uint32_t)0x00000020) -#define RTC_TSTR_ST_2 ((uint32_t)0x00000040) -#define RTC_TSTR_SU ((uint32_t)0x0000000F) -#define RTC_TSTR_SU_0 ((uint32_t)0x00000001) -#define RTC_TSTR_SU_1 ((uint32_t)0x00000002) -#define RTC_TSTR_SU_2 ((uint32_t)0x00000004) -#define RTC_TSTR_SU_3 ((uint32_t)0x00000008) - -/******************** Bits definition for RTC_TSDR register *****************/ -#define RTC_TSDR_WDU ((uint32_t)0x0000E000) -#define RTC_TSDR_WDU_0 ((uint32_t)0x00002000) -#define RTC_TSDR_WDU_1 ((uint32_t)0x00004000) -#define RTC_TSDR_WDU_2 ((uint32_t)0x00008000) -#define RTC_TSDR_MT ((uint32_t)0x00001000) -#define RTC_TSDR_MU ((uint32_t)0x00000F00) -#define RTC_TSDR_MU_0 ((uint32_t)0x00000100) -#define RTC_TSDR_MU_1 ((uint32_t)0x00000200) -#define RTC_TSDR_MU_2 ((uint32_t)0x00000400) -#define RTC_TSDR_MU_3 ((uint32_t)0x00000800) -#define RTC_TSDR_DT ((uint32_t)0x00000030) -#define RTC_TSDR_DT_0 ((uint32_t)0x00000010) -#define RTC_TSDR_DT_1 ((uint32_t)0x00000020) -#define RTC_TSDR_DU ((uint32_t)0x0000000F) -#define RTC_TSDR_DU_0 ((uint32_t)0x00000001) -#define RTC_TSDR_DU_1 ((uint32_t)0x00000002) -#define RTC_TSDR_DU_2 ((uint32_t)0x00000004) -#define RTC_TSDR_DU_3 ((uint32_t)0x00000008) - -/******************** Bits definition for RTC_TSSSR register ****************/ -#define RTC_TSSSR_SS ((uint32_t)0x0003FFFF) - -/******************** Bits definition for RTC_CALR register ******************/ -#define RTC_CALR_CALP ((uint32_t)0x00008000) -#define RTC_CALR_CALW8 ((uint32_t)0x00004000) -#define RTC_CALR_CALW16 ((uint32_t)0x00002000) -#define RTC_CALR_CALM ((uint32_t)0x000001FF) -#define RTC_CALR_CALM_0 ((uint32_t)0x00000001) -#define RTC_CALR_CALM_1 ((uint32_t)0x00000002) -#define RTC_CALR_CALM_2 ((uint32_t)0x00000004) -#define RTC_CALR_CALM_3 ((uint32_t)0x00000008) -#define RTC_CALR_CALM_4 ((uint32_t)0x00000010) -#define RTC_CALR_CALM_5 ((uint32_t)0x00000020) -#define RTC_CALR_CALM_6 ((uint32_t)0x00000040) -#define RTC_CALR_CALM_7 ((uint32_t)0x00000080) -#define RTC_CALR_CALM_8 ((uint32_t)0x00000100) - -/* Old Bits definition for RTC_CAL register maintained for legacy purpose */ -#define RTC_CAL_CALP RTC_CALR_CALP -#define RTC_CAL_CALW8 RTC_CALR_CALW8 -#define RTC_CAL_CALW16 RTC_CALR_CALW16 -#define RTC_CAL_CALM RTC_CALR_CALM -#define RTC_CAL_CALM_0 RTC_CALR_CALM_0 -#define RTC_CAL_CALM_1 RTC_CALR_CALM_1 -#define RTC_CAL_CALM_2 RTC_CALR_CALM_2 -#define RTC_CAL_CALM_3 RTC_CALR_CALM_3 -#define RTC_CAL_CALM_4 RTC_CALR_CALM_4 -#define RTC_CAL_CALM_5 RTC_CALR_CALM_5 -#define RTC_CAL_CALM_6 RTC_CALR_CALM_6 -#define RTC_CAL_CALM_7 RTC_CALR_CALM_7 -#define RTC_CAL_CALM_8 RTC_CALR_CALM_8 - -/******************** Bits definition for RTC_TAFCR register ****************/ -#define RTC_TAFCR_PC15MODE ((uint32_t)0x00800000) -#define RTC_TAFCR_PC15VALUE ((uint32_t)0x00400000) -#define RTC_TAFCR_PC14MODE ((uint32_t)0x00200000) -#define RTC_TAFCR_PC14VALUE ((uint32_t)0x00100000) -#define RTC_TAFCR_PC13MODE ((uint32_t)0x00080000) -#define RTC_TAFCR_PC13VALUE ((uint32_t)0x00040000) -#define RTC_TAFCR_TAMPPUDIS ((uint32_t)0x00008000) -#define RTC_TAFCR_TAMPPRCH ((uint32_t)0x00006000) -#define RTC_TAFCR_TAMPPRCH_0 ((uint32_t)0x00002000) -#define RTC_TAFCR_TAMPPRCH_1 ((uint32_t)0x00004000) -#define RTC_TAFCR_TAMPFLT ((uint32_t)0x00001800) -#define RTC_TAFCR_TAMPFLT_0 ((uint32_t)0x00000800) -#define RTC_TAFCR_TAMPFLT_1 ((uint32_t)0x00001000) -#define RTC_TAFCR_TAMPFREQ ((uint32_t)0x00000700) -#define RTC_TAFCR_TAMPFREQ_0 ((uint32_t)0x00000100) -#define RTC_TAFCR_TAMPFREQ_1 ((uint32_t)0x00000200) -#define RTC_TAFCR_TAMPFREQ_2 ((uint32_t)0x00000400) -#define RTC_TAFCR_TAMPTS ((uint32_t)0x00000080) -#define RTC_TAFCR_TAMP3EDGE ((uint32_t)0x00000040) -#define RTC_TAFCR_TAMP3E ((uint32_t)0x00000020) -#define RTC_TAFCR_TAMP2EDGE ((uint32_t)0x00000010) -#define RTC_TAFCR_TAMP2E ((uint32_t)0x00000008) -#define RTC_TAFCR_TAMPIE ((uint32_t)0x00000004) -#define RTC_TAFCR_TAMP1TRG ((uint32_t)0x00000002) -#define RTC_TAFCR_TAMP1E ((uint32_t)0x00000001) - -/* Old bit definition maintained for legacy purpose */ -#define RTC_TAFCR_ALARMOUTTYPE RTC_TAFCR_PC13VALUE - -/******************** Bits definition for RTC_ALRMASSR register *************/ -#define RTC_ALRMASSR_MASKSS ((uint32_t)0x0F000000) -#define RTC_ALRMASSR_MASKSS_0 ((uint32_t)0x01000000) -#define RTC_ALRMASSR_MASKSS_1 ((uint32_t)0x02000000) -#define RTC_ALRMASSR_MASKSS_2 ((uint32_t)0x04000000) -#define RTC_ALRMASSR_MASKSS_3 ((uint32_t)0x08000000) -#define RTC_ALRMASSR_SS ((uint32_t)0x00007FFF) - -/******************** Bits definition for RTC_BKP0R register ****************/ -#define RTC_BKP0R ((uint32_t)0xFFFFFFFF) - -/******************** Bits definition for RTC_BKP1R register ****************/ -#define RTC_BKP1R ((uint32_t)0xFFFFFFFF) - -/******************** Bits definition for RTC_BKP2R register ****************/ -#define RTC_BKP2R ((uint32_t)0xFFFFFFFF) - -/******************** Bits definition for RTC_BKP3R register ****************/ -#define RTC_BKP3R ((uint32_t)0xFFFFFFFF) - -/******************** Bits definition for RTC_BKP4R register ****************/ -#define RTC_BKP4R ((uint32_t)0xFFFFFFFF) - -/******************************************************************************/ -/* */ -/* Serial Peripheral Interface (SPI) */ -/* */ -/******************************************************************************/ -/******************* Bit definition for SPI_CR1 register ********************/ -#define SPI_CR1_CPHA ((uint16_t)0x0001) /*!< Clock Phase */ -#define SPI_CR1_CPOL ((uint16_t)0x0002) /*!< Clock Polarity */ -#define SPI_CR1_MSTR ((uint16_t)0x0004) /*!< Master Selection */ -#define SPI_CR1_BR ((uint16_t)0x0038) /*!< BR[2:0] bits (Baud Rate Control) */ -#define SPI_CR1_BR_0 ((uint16_t)0x0008) /*!< Bit 0 */ -#define SPI_CR1_BR_1 ((uint16_t)0x0010) /*!< Bit 1 */ -#define SPI_CR1_BR_2 ((uint16_t)0x0020) /*!< Bit 2 */ -#define SPI_CR1_SPE ((uint16_t)0x0040) /*!< SPI Enable */ -#define SPI_CR1_LSBFIRST ((uint16_t)0x0080) /*!< Frame Format */ -#define SPI_CR1_SSI ((uint16_t)0x0100) /*!< Internal slave select */ -#define SPI_CR1_SSM ((uint16_t)0x0200) /*!< Software slave management */ -#define SPI_CR1_RXONLY ((uint16_t)0x0400) /*!< Receive only */ -#define SPI_CR1_CRCL ((uint16_t)0x0800) /*!< CRC Length */ -#define SPI_CR1_CRCNEXT ((uint16_t)0x1000) /*!< Transmit CRC next */ -#define SPI_CR1_CRCEN ((uint16_t)0x2000) /*!< Hardware CRC calculation enable */ -#define SPI_CR1_BIDIOE ((uint16_t)0x4000) /*!< Output enable in bidirectional mode */ -#define SPI_CR1_BIDIMODE ((uint16_t)0x8000) /*!< Bidirectional data mode enable */ - -/******************* Bit definition for SPI_CR2 register ********************/ -#define SPI_CR2_RXDMAEN ((uint16_t)0x0001) /*!< Rx Buffer DMA Enable */ -#define SPI_CR2_TXDMAEN ((uint16_t)0x0002) /*!< Tx Buffer DMA Enable */ -#define SPI_CR2_SSOE ((uint16_t)0x0004) /*!< SS Output Enable */ -#define SPI_CR2_NSSP ((uint16_t)0x0008) /*!< NSS pulse management Enable */ -#define SPI_CR2_FRF ((uint16_t)0x0010) /*!< Frame Format Enable */ -#define SPI_CR2_ERRIE ((uint16_t)0x0020) /*!< Error Interrupt Enable */ -#define SPI_CR2_RXNEIE ((uint16_t)0x0040) /*!< RX buffer Not Empty Interrupt Enable */ -#define SPI_CR2_TXEIE ((uint16_t)0x0080) /*!< Tx buffer Empty Interrupt Enable */ -#define SPI_CR2_DS ((uint16_t)0x0F00) /*!< DS[3:0] Data Size */ -#define SPI_CR2_DS_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define SPI_CR2_DS_1 ((uint16_t)0x0200) /*!< Bit 1 */ -#define SPI_CR2_DS_2 ((uint16_t)0x0400) /*!< Bit 2 */ -#define SPI_CR2_DS_3 ((uint16_t)0x0800) /*!< Bit 3 */ -#define SPI_CR2_FRXTH ((uint16_t)0x1000) /*!< FIFO reception Threshold */ -#define SPI_CR2_LDMARX ((uint16_t)0x2000) /*!< Last DMA transfer for reception */ -#define SPI_CR2_LDMATX ((uint16_t)0x4000) /*!< Last DMA transfer for transmission */ - -/******************** Bit definition for SPI_SR register ********************/ -#define SPI_SR_RXNE ((uint16_t)0x0001) /*!< Receive buffer Not Empty */ -#define SPI_SR_TXE ((uint16_t)0x0002) /*!< Transmit buffer Empty */ -#define SPI_SR_CHSIDE ((uint16_t)0x0004) /*!< Channel side */ -#define SPI_SR_UDR ((uint16_t)0x0008) /*!< Underrun flag */ -#define SPI_SR_CRCERR ((uint16_t)0x0010) /*!< CRC Error flag */ -#define SPI_SR_MODF ((uint16_t)0x0020) /*!< Mode fault */ -#define SPI_SR_OVR ((uint16_t)0x0040) /*!< Overrun flag */ -#define SPI_SR_BSY ((uint16_t)0x0080) /*!< Busy flag */ -#define SPI_SR_FRE ((uint16_t)0x0100) /*!< TI frame format error */ -#define SPI_SR_FRLVL ((uint16_t)0x0600) /*!< FIFO Reception Level */ -#define SPI_SR_FRLVL_0 ((uint16_t)0x0200) /*!< Bit 0 */ -#define SPI_SR_FRLVL_1 ((uint16_t)0x0400) /*!< Bit 1 */ -#define SPI_SR_FTLVL ((uint16_t)0x1800) /*!< FIFO Transmission Level */ -#define SPI_SR_FTLVL_0 ((uint16_t)0x0800) /*!< Bit 0 */ -#define SPI_SR_FTLVL_1 ((uint16_t)0x1000) /*!< Bit 1 */ - -/******************** Bit definition for SPI_DR register ********************/ -#define SPI_DR_DR ((uint16_t)0xFFFF) /*!< Data Register */ - -/******************* Bit definition for SPI_CRCPR register ******************/ -#define SPI_CRCPR_CRCPOLY ((uint16_t)0xFFFF) /*!< CRC polynomial register */ - -/****************** Bit definition for SPI_RXCRCR register ******************/ -#define SPI_RXCRCR_RXCRC ((uint16_t)0xFFFF) /*!< Rx CRC Register */ - -/****************** Bit definition for SPI_TXCRCR register ******************/ -#define SPI_TXCRCR_TXCRC ((uint16_t)0xFFFF) /*!< Tx CRC Register */ - -/****************** Bit definition for SPI_I2SCFGR register *****************/ -#define SPI_I2SCFGR_CHLEN ((uint16_t)0x0001) /*!<Channel length (number of bits per audio channel) */ -#define SPI_I2SCFGR_DATLEN ((uint16_t)0x0006) /*!<DATLEN[1:0] bits (Data length to be transferred) */ -#define SPI_I2SCFGR_DATLEN_0 ((uint16_t)0x0002) /*!<Bit 0 */ -#define SPI_I2SCFGR_DATLEN_1 ((uint16_t)0x0004) /*!<Bit 1 */ -#define SPI_I2SCFGR_CKPOL ((uint16_t)0x0008) /*!<steady state clock polarity */ -#define SPI_I2SCFGR_I2SSTD ((uint16_t)0x0030) /*!<I2SSTD[1:0] bits (I2S standard selection) */ -#define SPI_I2SCFGR_I2SSTD_0 ((uint16_t)0x0010) /*!<Bit 0 */ -#define SPI_I2SCFGR_I2SSTD_1 ((uint16_t)0x0020) /*!<Bit 1 */ -#define SPI_I2SCFGR_PCMSYNC ((uint16_t)0x0080) /*!<PCM frame synchronization */ -#define SPI_I2SCFGR_I2SCFG ((uint16_t)0x0300) /*!<I2SCFG[1:0] bits (I2S configuration mode) */ -#define SPI_I2SCFGR_I2SCFG_0 ((uint16_t)0x0100) /*!<Bit 0 */ -#define SPI_I2SCFGR_I2SCFG_1 ((uint16_t)0x0200) /*!<Bit 1 */ -#define SPI_I2SCFGR_I2SE ((uint16_t)0x0400) /*!<I2S Enable */ -#define SPI_I2SCFGR_I2SMOD ((uint16_t)0x0800) /*!<I2S mode selection */ - -/****************** Bit definition for SPI_I2SPR register *******************/ -#define SPI_I2SPR_I2SDIV ((uint16_t)0x00FF) /*!<I2S Linear prescaler */ -#define SPI_I2SPR_ODD ((uint16_t)0x0100) /*!<Odd factor for the prescaler */ -#define SPI_I2SPR_MCKOE ((uint16_t)0x0200) /*!<Master Clock Output Enable */ - -/******************************************************************************/ -/* */ -/* System Configuration (SYSCFG) */ -/* */ -/******************************************************************************/ -/***************** Bit definition for SYSCFG_CFGR1 register ****************/ -#define SYSCFG_CFGR1_MEM_MODE ((uint32_t)0x00000003) /*!< SYSCFG_Memory Remap Config */ -#define SYSCFG_CFGR1_MEM_MODE_0 ((uint32_t)0x00000001) /*!< SYSCFG_Memory Remap Config Bit 0 */ -#define SYSCFG_CFGR1_MEM_MODE_1 ((uint32_t)0x00000002) /*!< SYSCFG_Memory Remap Config Bit 1 */ -#define SYSCFG_CFGR1_PA11_PA12_RMP ((uint32_t)0x00000010) /*!< PA11 and PA12 remap on QFN28 and TSSOP20 packages (only for STM32F042 devices)*/ -#define SYSCFG_CFGR1_ADC_DMA_RMP ((uint32_t)0x00000100) /*!< ADC DMA remap */ -#define SYSCFG_CFGR1_USART1TX_DMA_RMP ((uint32_t)0x00000200) /*!< USART1 TX DMA remap */ -#define SYSCFG_CFGR1_USART1RX_DMA_RMP ((uint32_t)0x00000400) /*!< USART1 RX DMA remap */ -#define SYSCFG_CFGR1_TIM16_DMA_RMP ((uint32_t)0x00000800) /*!< Timer 16 DMA remap */ -#define SYSCFG_CFGR1_TIM17_DMA_RMP ((uint32_t)0x00001000) /*!< Timer 17 DMA remap */ -#define SYSCFG_CFGR1_TIM16_DMA_RMP2 ((uint32_t)0x00002000) /*!< Timer 16 DMA remap 2 (only for STM32F072) */ -#define SYSCFG_CFGR1_TIM17_DMA_RMP2 ((uint32_t)0x00004000) /*!< Timer 17 DMA remap 2 (only for STM32F072) */ -#define SYSCFG_CFGR1_I2C_FMP_PB6 ((uint32_t)0x00010000) /*!< I2C PB6 Fast mode plus */ -#define SYSCFG_CFGR1_I2C_FMP_PB7 ((uint32_t)0x00020000) /*!< I2C PB7 Fast mode plus */ -#define SYSCFG_CFGR1_I2C_FMP_PB8 ((uint32_t)0x00040000) /*!< I2C PB8 Fast mode plus */ -#define SYSCFG_CFGR1_I2C_FMP_PB9 ((uint32_t)0x00080000) /*!< I2C PB9 Fast mode plus */ -#define SYSCFG_CFGR1_I2C_FMP_I2C1 ((uint32_t)0x00100000) /*!< Enable Fast Mode Plus on PB10, PB11, PF6 and PF7(only for STM32F030, STM32F031 and STM32F072 devices) */ -#define SYSCFG_CFGR1_I2C_FMP_I2C2 ((uint32_t)0x00200000) /*!< Enable I2C2 Fast mode plus (only for STM32F072) */ -#define SYSCFG_CFGR1_I2C_FMP_PA9 ((uint32_t)0x00400000) /*!< Enable Fast Mode Plus on PA9 (only for STM32F030, STM32F031, STM32F042 and STM32F072 devices) */ -#define SYSCFG_CFGR1_I2C_FMP_PA10 ((uint32_t)0x00800000) /*!< Enable Fast Mode Plus on PA10(only for STM32F030, STM32F031, STM32F042 and STM32F072 devices) */ -#define SYSCFG_CFGR1_SPI2_DMA_RMP ((uint32_t)0x01000000) /*!< SPI2 DMA remap (only for STM32F072) */ -#define SYSCFG_CFGR1_USART2_DMA_RMP ((uint32_t)0x02000000) /*!< USART2 DMA remap (only for STM32F072) */ -#define SYSCFG_CFGR1_USART3_DMA_RMP ((uint32_t)0x04000000) /*!< USART3 DMA remap (only for STM32F072) */ -#define SYSCFG_CFGR1_I2C1_DMA_RMP ((uint32_t)0x08000000) /*!< I2C1 DMA remap (only for STM32F072) */ -#define SYSCFG_CFGR1_TIM1_DMA_RMP ((uint32_t)0x10000000) /*!< TIM1 DMA remap (only for STM32F072) */ -#define SYSCFG_CFGR1_TIM2_DMA_RMP ((uint32_t)0x20000000) /*!< TIM2 DMA remap (only for STM32F072) */ -#define SYSCFG_CFGR1_TIM3_DMA_RMP ((uint32_t)0x40000000) /*!< TIM3 DMA remap (only for STM32F072) */ - -/***************** Bit definition for SYSCFG_EXTICR1 register ***************/ -#define SYSCFG_EXTICR1_EXTI0 ((uint16_t)0x000F) /*!< EXTI 0 configuration */ -#define SYSCFG_EXTICR1_EXTI1 ((uint16_t)0x00F0) /*!< EXTI 1 configuration */ -#define SYSCFG_EXTICR1_EXTI2 ((uint16_t)0x0F00) /*!< EXTI 2 configuration */ -#define SYSCFG_EXTICR1_EXTI3 ((uint16_t)0xF000) /*!< EXTI 3 configuration */ - -/** - * @brief EXTI0 configuration - */ -#define SYSCFG_EXTICR1_EXTI0_PA ((uint16_t)0x0000) /*!< PA[0] pin */ -#define SYSCFG_EXTICR1_EXTI0_PB ((uint16_t)0x0001) /*!< PB[0] pin */ -#define SYSCFG_EXTICR1_EXTI0_PC ((uint16_t)0x0002) /*!< PC[0] pin */ -#define SYSCFG_EXTICR1_EXTI0_PD ((uint16_t)0x0003) /*!< PD[0] pin */ -#define SYSCFG_EXTICR1_EXTI0_PE ((uint16_t)0x0004) /*!< PE[0] pin */ -#define SYSCFG_EXTICR1_EXTI0_PF ((uint16_t)0x0005) /*!< PF[0] pin */ - -/** - * @brief EXTI1 configuration - */ -#define SYSCFG_EXTICR1_EXTI1_PA ((uint16_t)0x0000) /*!< PA[1] pin */ -#define SYSCFG_EXTICR1_EXTI1_PB ((uint16_t)0x0010) /*!< PB[1] pin */ -#define SYSCFG_EXTICR1_EXTI1_PC ((uint16_t)0x0020) /*!< PC[1] pin */ -#define SYSCFG_EXTICR1_EXTI1_PD ((uint16_t)0x0030) /*!< PD[1] pin */ -#define SYSCFG_EXTICR1_EXTI1_PE ((uint16_t)0x0040) /*!< PE[1] pin */ -#define SYSCFG_EXTICR1_EXTI1_PF ((uint16_t)0x0050) /*!< PF[1] pin */ - -/** - * @brief EXTI2 configuration - */ -#define SYSCFG_EXTICR1_EXTI2_PA ((uint16_t)0x0000) /*!< PA[2] pin */ -#define SYSCFG_EXTICR1_EXTI2_PB ((uint16_t)0x0100) /*!< PB[2] pin */ -#define SYSCFG_EXTICR1_EXTI2_PC ((uint16_t)0x0200) /*!< PC[2] pin */ -#define SYSCFG_EXTICR1_EXTI2_PD ((uint16_t)0x0300) /*!< PD[2] pin */ -#define SYSCFG_EXTICR1_EXTI2_PE ((uint16_t)0x0400) /*!< PE[2] pin */ -#define SYSCFG_EXTICR1_EXTI2_PF ((uint16_t)0x0500) /*!< PF[2] pin */ - -/** - * @brief EXTI3 configuration - */ -#define SYSCFG_EXTICR1_EXTI3_PA ((uint16_t)0x0000) /*!< PA[3] pin */ -#define SYSCFG_EXTICR1_EXTI3_PB ((uint16_t)0x1000) /*!< PB[3] pin */ -#define SYSCFG_EXTICR1_EXTI3_PC ((uint16_t)0x2000) /*!< PC[3] pin */ -#define SYSCFG_EXTICR1_EXTI3_PD ((uint16_t)0x3000) /*!< PD[3] pin */ -#define SYSCFG_EXTICR1_EXTI3_PE ((uint16_t)0x4000) /*!< PE[3] pin */ -#define SYSCFG_EXTICR1_EXTI3_PF ((uint16_t)0x5000) /*!< PF[3] pin */ - -/***************** Bit definition for SYSCFG_EXTICR2 register *****************/ -#define SYSCFG_EXTICR2_EXTI4 ((uint16_t)0x000F) /*!< EXTI 4 configuration */ -#define SYSCFG_EXTICR2_EXTI5 ((uint16_t)0x00F0) /*!< EXTI 5 configuration */ -#define SYSCFG_EXTICR2_EXTI6 ((uint16_t)0x0F00) /*!< EXTI 6 configuration */ -#define SYSCFG_EXTICR2_EXTI7 ((uint16_t)0xF000) /*!< EXTI 7 configuration */ - -/** - * @brief EXTI4 configuration - */ -#define SYSCFG_EXTICR2_EXTI4_PA ((uint16_t)0x0000) /*!< PA[4] pin */ -#define SYSCFG_EXTICR2_EXTI4_PB ((uint16_t)0x0001) /*!< PB[4] pin */ -#define SYSCFG_EXTICR2_EXTI4_PC ((uint16_t)0x0002) /*!< PC[4] pin */ -#define SYSCFG_EXTICR2_EXTI4_PD ((uint16_t)0x0003) /*!< PD[4] pin */ -#define SYSCFG_EXTICR2_EXTI4_PE ((uint16_t)0x0004) /*!< PE[4] pin */ -#define SYSCFG_EXTICR2_EXTI4_PF ((uint16_t)0x0005) /*!< PF[4] pin */ - -/** - * @brief EXTI5 configuration - */ -#define SYSCFG_EXTICR2_EXTI5_PA ((uint16_t)0x0000) /*!< PA[5] pin */ -#define SYSCFG_EXTICR2_EXTI5_PB ((uint16_t)0x0010) /*!< PB[5] pin */ -#define SYSCFG_EXTICR2_EXTI5_PC ((uint16_t)0x0020) /*!< PC[5] pin */ -#define SYSCFG_EXTICR2_EXTI5_PD ((uint16_t)0x0030) /*!< PD[5] pin */ -#define SYSCFG_EXTICR2_EXTI5_PE ((uint16_t)0x0040) /*!< PE[5] pin */ -#define SYSCFG_EXTICR2_EXTI5_PF ((uint16_t)0x0050) /*!< PF[5] pin */ - -/** - * @brief EXTI6 configuration - */ -#define SYSCFG_EXTICR2_EXTI6_PA ((uint16_t)0x0000) /*!< PA[6] pin */ -#define SYSCFG_EXTICR2_EXTI6_PB ((uint16_t)0x0100) /*!< PB[6] pin */ -#define SYSCFG_EXTICR2_EXTI6_PC ((uint16_t)0x0200) /*!< PC[6] pin */ -#define SYSCFG_EXTICR2_EXTI6_PD ((uint16_t)0x0300) /*!< PD[6] pin */ -#define SYSCFG_EXTICR2_EXTI6_PE ((uint16_t)0x0400) /*!< PE[6] pin */ -#define SYSCFG_EXTICR2_EXTI6_PF ((uint16_t)0x0500) /*!< PF[6] pin */ - -/** - * @brief EXTI7 configuration - */ -#define SYSCFG_EXTICR2_EXTI7_PA ((uint16_t)0x0000) /*!< PA[7] pin */ -#define SYSCFG_EXTICR2_EXTI7_PB ((uint16_t)0x1000) /*!< PB[7] pin */ -#define SYSCFG_EXTICR2_EXTI7_PC ((uint16_t)0x2000) /*!< PC[7] pin */ -#define SYSCFG_EXTICR2_EXTI7_PD ((uint16_t)0x3000) /*!< PD[7] pin */ -#define SYSCFG_EXTICR2_EXTI7_PE ((uint16_t)0x4000) /*!< PE[7] pin */ -#define SYSCFG_EXTICR2_EXTI7_PF ((uint16_t)0x5000) /*!< PF[7] pin */ - -/***************** Bit definition for SYSCFG_EXTICR3 register *****************/ -#define SYSCFG_EXTICR3_EXTI8 ((uint16_t)0x000F) /*!< EXTI 8 configuration */ -#define SYSCFG_EXTICR3_EXTI9 ((uint16_t)0x00F0) /*!< EXTI 9 configuration */ -#define SYSCFG_EXTICR3_EXTI10 ((uint16_t)0x0F00) /*!< EXTI 10 configuration */ -#define SYSCFG_EXTICR3_EXTI11 ((uint16_t)0xF000) /*!< EXTI 11 configuration */ - -/** - * @brief EXTI8 configuration - */ -#define SYSCFG_EXTICR3_EXTI8_PA ((uint16_t)0x0000) /*!< PA[8] pin */ -#define SYSCFG_EXTICR3_EXTI8_PB ((uint16_t)0x0001) /*!< PB[8] pin */ -#define SYSCFG_EXTICR3_EXTI8_PC ((uint16_t)0x0002) /*!< PC[8] pin */ -#define SYSCFG_EXTICR3_EXTI8_PD ((uint16_t)0x0003) /*!< PD[8] pin */ -#define SYSCFG_EXTICR3_EXTI8_PE ((uint16_t)0x0004) /*!< PE[8] pin */ - -/** - * @brief EXTI9 configuration - */ -#define SYSCFG_EXTICR3_EXTI9_PA ((uint16_t)0x0000) /*!< PA[9] pin */ -#define SYSCFG_EXTICR3_EXTI9_PB ((uint16_t)0x0010) /*!< PB[9] pin */ -#define SYSCFG_EXTICR3_EXTI9_PC ((uint16_t)0x0020) /*!< PC[9] pin */ -#define SYSCFG_EXTICR3_EXTI9_PD ((uint16_t)0x0030) /*!< PD[9] pin */ -#define SYSCFG_EXTICR3_EXTI9_PE ((uint16_t)0x0040) /*!< PE[9] pin */ -#define SYSCFG_EXTICR3_EXTI9_PF ((uint16_t)0x0050) /*!< PF[9] pin */ - -/** - * @brief EXTI10 configuration - */ -#define SYSCFG_EXTICR3_EXTI10_PA ((uint16_t)0x0000) /*!< PA[10] pin */ -#define SYSCFG_EXTICR3_EXTI10_PB ((uint16_t)0x0100) /*!< PB[10] pin */ -#define SYSCFG_EXTICR3_EXTI10_PC ((uint16_t)0x0200) /*!< PC[10] pin */ -#define SYSCFG_EXTICR3_EXTI10_PD ((uint16_t)0x0300) /*!< PE[10] pin */ -#define SYSCFG_EXTICR3_EXTI10_PE ((uint16_t)0x0400) /*!< PD[10] pin */ -#define SYSCFG_EXTICR3_EXTI10_PF ((uint16_t)0x0500) /*!< PF[10] pin */ - -/** - * @brief EXTI11 configuration - */ -#define SYSCFG_EXTICR3_EXTI11_PA ((uint16_t)0x0000) /*!< PA[11] pin */ -#define SYSCFG_EXTICR3_EXTI11_PB ((uint16_t)0x1000) /*!< PB[11] pin */ -#define SYSCFG_EXTICR3_EXTI11_PC ((uint16_t)0x2000) /*!< PC[11] pin */ -#define SYSCFG_EXTICR3_EXTI11_PD ((uint16_t)0x3000) /*!< PD[11] pin */ -#define SYSCFG_EXTICR3_EXTI11_PE ((uint16_t)0x4000) /*!< PE[11] pin */ - -/***************** Bit definition for SYSCFG_EXTICR4 register *****************/ -#define SYSCFG_EXTICR4_EXTI12 ((uint16_t)0x000F) /*!< EXTI 12 configuration */ -#define SYSCFG_EXTICR4_EXTI13 ((uint16_t)0x00F0) /*!< EXTI 13 configuration */ -#define SYSCFG_EXTICR4_EXTI14 ((uint16_t)0x0F00) /*!< EXTI 14 configuration */ -#define SYSCFG_EXTICR4_EXTI15 ((uint16_t)0xF000) /*!< EXTI 15 configuration */ - -/** - * @brief EXTI12 configuration - */ -#define SYSCFG_EXTICR4_EXTI12_PA ((uint16_t)0x0000) /*!< PA[12] pin */ -#define SYSCFG_EXTICR4_EXTI12_PB ((uint16_t)0x0001) /*!< PB[12] pin */ -#define SYSCFG_EXTICR4_EXTI12_PC ((uint16_t)0x0002) /*!< PC[12] pin */ -#define SYSCFG_EXTICR4_EXTI12_PD ((uint16_t)0x0003) /*!< PD[12] pin */ -#define SYSCFG_EXTICR4_EXTI12_PE ((uint16_t)0x0004) /*!< PE[12] pin */ - -/** - * @brief EXTI13 configuration - */ -#define SYSCFG_EXTICR4_EXTI13_PA ((uint16_t)0x0000) /*!< PA[13] pin */ -#define SYSCFG_EXTICR4_EXTI13_PB ((uint16_t)0x0010) /*!< PB[13] pin */ -#define SYSCFG_EXTICR4_EXTI13_PC ((uint16_t)0x0020) /*!< PC[13] pin */ -#define SYSCFG_EXTICR4_EXTI13_PD ((uint16_t)0x0030) /*!< PD[13] pin */ -#define SYSCFG_EXTICR4_EXTI13_PE ((uint16_t)0x0040) /*!< PE[13] pin */ - -/** - * @brief EXTI14 configuration - */ -#define SYSCFG_EXTICR4_EXTI14_PA ((uint16_t)0x0000) /*!< PA[14] pin */ -#define SYSCFG_EXTICR4_EXTI14_PB ((uint16_t)0x0100) /*!< PB[14] pin */ -#define SYSCFG_EXTICR4_EXTI14_PC ((uint16_t)0x0200) /*!< PC[14] pin */ -#define SYSCFG_EXTICR4_EXTI14_PD ((uint16_t)0x0300) /*!< PD[14] pin */ -#define SYSCFG_EXTICR4_EXTI14_PE ((uint16_t)0x0400) /*!< PE[14] pin */ - -/** - * @brief EXTI15 configuration - */ -#define SYSCFG_EXTICR4_EXTI15_PA ((uint16_t)0x0000) /*!< PA[15] pin */ -#define SYSCFG_EXTICR4_EXTI15_PB ((uint16_t)0x1000) /*!< PB[15] pin */ -#define SYSCFG_EXTICR4_EXTI15_PC ((uint16_t)0x2000) /*!< PC[15] pin */ -#define SYSCFG_EXTICR4_EXTI15_PD ((uint16_t)0x3000) /*!< PD[15] pin */ -#define SYSCFG_EXTICR4_EXTI15_PE ((uint16_t)0x4000) /*!< PE[15] pin */ - -/***************** Bit definition for SYSCFG_CFGR2 register ****************/ -#define SYSCFG_CFGR2_LOCKUP_LOCK ((uint32_t)0x00000001) /*!< Enables and locks the PVD connection with Timer1 Break Input and also the PVD_EN and PVDSEL[2:0] bits of the Power Control Interface */ -#define SYSCFG_CFGR2_SRAM_PARITY_LOCK ((uint32_t)0x00000002) /*!< Enables and locks the SRAM_PARITY error signal with Break Input of TIMER1 */ -#define SYSCFG_CFGR2_PVD_LOCK ((uint32_t)0x00000004) /*!< Enables and locks the LOCKUP (Hardfault) output of CortexM0 with Break Input of TIMER1 */ -#define SYSCFG_CFGR2_SRAM_PEF ((uint32_t)0x00000100) /*!< SRAM Parity error flag */ - -/* Old Bit definition maintained for legacy purpose */ -#define SYSCFG_CFGR2_SRAM_PE SYSCFG_CFGR2_SRAM_PEF -/******************************************************************************/ -/* */ -/* Timers (TIM) */ -/* */ -/******************************************************************************/ -/******************* Bit definition for TIM_CR1 register ********************/ -#define TIM_CR1_CEN ((uint16_t)0x0001) /*!<Counter enable */ -#define TIM_CR1_UDIS ((uint16_t)0x0002) /*!<Update disable */ -#define TIM_CR1_URS ((uint16_t)0x0004) /*!<Update request source */ -#define TIM_CR1_OPM ((uint16_t)0x0008) /*!<One pulse mode */ -#define TIM_CR1_DIR ((uint16_t)0x0010) /*!<Direction */ - -#define TIM_CR1_CMS ((uint16_t)0x0060) /*!<CMS[1:0] bits (Center-aligned mode selection) */ -#define TIM_CR1_CMS_0 ((uint16_t)0x0020) /*!<Bit 0 */ -#define TIM_CR1_CMS_1 ((uint16_t)0x0040) /*!<Bit 1 */ - -#define TIM_CR1_ARPE ((uint16_t)0x0080) /*!<Auto-reload preload enable */ - -#define TIM_CR1_CKD ((uint16_t)0x0300) /*!<CKD[1:0] bits (clock division) */ -#define TIM_CR1_CKD_0 ((uint16_t)0x0100) /*!<Bit 0 */ -#define TIM_CR1_CKD_1 ((uint16_t)0x0200) /*!<Bit 1 */ - -/******************* Bit definition for TIM_CR2 register ********************/ -#define TIM_CR2_CCPC ((uint16_t)0x0001) /*!<Capture/Compare Preloaded Control */ -#define TIM_CR2_CCUS ((uint16_t)0x0004) /*!<Capture/Compare Control Update Selection */ -#define TIM_CR2_CCDS ((uint16_t)0x0008) /*!<Capture/Compare DMA Selection */ - -#define TIM_CR2_MMS ((uint16_t)0x0070) /*!<MMS[2:0] bits (Master Mode Selection) */ -#define TIM_CR2_MMS_0 ((uint16_t)0x0010) /*!<Bit 0 */ -#define TIM_CR2_MMS_1 ((uint16_t)0x0020) /*!<Bit 1 */ -#define TIM_CR2_MMS_2 ((uint16_t)0x0040) /*!<Bit 2 */ - -#define TIM_CR2_TI1S ((uint16_t)0x0080) /*!<TI1 Selection */ -#define TIM_CR2_OIS1 ((uint16_t)0x0100) /*!<Output Idle state 1 (OC1 output) */ -#define TIM_CR2_OIS1N ((uint16_t)0x0200) /*!<Output Idle state 1 (OC1N output) */ -#define TIM_CR2_OIS2 ((uint16_t)0x0400) /*!<Output Idle state 2 (OC2 output) */ -#define TIM_CR2_OIS2N ((uint16_t)0x0800) /*!<Output Idle state 2 (OC2N output) */ -#define TIM_CR2_OIS3 ((uint16_t)0x1000) /*!<Output Idle state 3 (OC3 output) */ -#define TIM_CR2_OIS3N ((uint16_t)0x2000) /*!<Output Idle state 3 (OC3N output) */ -#define TIM_CR2_OIS4 ((uint16_t)0x4000) /*!<Output Idle state 4 (OC4 output) */ - -/******************* Bit definition for TIM_SMCR register *******************/ -#define TIM_SMCR_SMS ((uint16_t)0x0007) /*!<SMS[2:0] bits (Slave mode selection) */ -#define TIM_SMCR_SMS_0 ((uint16_t)0x0001) /*!<Bit 0 */ -#define TIM_SMCR_SMS_1 ((uint16_t)0x0002) /*!<Bit 1 */ -#define TIM_SMCR_SMS_2 ((uint16_t)0x0004) /*!<Bit 2 */ - -#define TIM_SMCR_OCCS ((uint16_t)0x0008) /*!< OCREF clear selection */ - -#define TIM_SMCR_TS ((uint16_t)0x0070) /*!<TS[2:0] bits (Trigger selection) */ -#define TIM_SMCR_TS_0 ((uint16_t)0x0010) /*!<Bit 0 */ -#define TIM_SMCR_TS_1 ((uint16_t)0x0020) /*!<Bit 1 */ -#define TIM_SMCR_TS_2 ((uint16_t)0x0040) /*!<Bit 2 */ - -#define TIM_SMCR_MSM ((uint16_t)0x0080) /*!<Master/slave mode */ - -#define TIM_SMCR_ETF ((uint16_t)0x0F00) /*!<ETF[3:0] bits (External trigger filter) */ -#define TIM_SMCR_ETF_0 ((uint16_t)0x0100) /*!<Bit 0 */ -#define TIM_SMCR_ETF_1 ((uint16_t)0x0200) /*!<Bit 1 */ -#define TIM_SMCR_ETF_2 ((uint16_t)0x0400) /*!<Bit 2 */ -#define TIM_SMCR_ETF_3 ((uint16_t)0x0800) /*!<Bit 3 */ - -#define TIM_SMCR_ETPS ((uint16_t)0x3000) /*!<ETPS[1:0] bits (External trigger prescaler) */ -#define TIM_SMCR_ETPS_0 ((uint16_t)0x1000) /*!<Bit 0 */ -#define TIM_SMCR_ETPS_1 ((uint16_t)0x2000) /*!<Bit 1 */ - -#define TIM_SMCR_ECE ((uint16_t)0x4000) /*!<External clock enable */ -#define TIM_SMCR_ETP ((uint16_t)0x8000) /*!<External trigger polarity */ - -/******************* Bit definition for TIM_DIER register *******************/ -#define TIM_DIER_UIE ((uint16_t)0x0001) /*!<Update interrupt enable */ -#define TIM_DIER_CC1IE ((uint16_t)0x0002) /*!<Capture/Compare 1 interrupt enable */ -#define TIM_DIER_CC2IE ((uint16_t)0x0004) /*!<Capture/Compare 2 interrupt enable */ -#define TIM_DIER_CC3IE ((uint16_t)0x0008) /*!<Capture/Compare 3 interrupt enable */ -#define TIM_DIER_CC4IE ((uint16_t)0x0010) /*!<Capture/Compare 4 interrupt enable */ -#define TIM_DIER_COMIE ((uint16_t)0x0020) /*!<COM interrupt enable */ -#define TIM_DIER_TIE ((uint16_t)0x0040) /*!<Trigger interrupt enable */ -#define TIM_DIER_BIE ((uint16_t)0x0080) /*!<Break interrupt enable */ -#define TIM_DIER_UDE ((uint16_t)0x0100) /*!<Update DMA request enable */ -#define TIM_DIER_CC1DE ((uint16_t)0x0200) /*!<Capture/Compare 1 DMA request enable */ -#define TIM_DIER_CC2DE ((uint16_t)0x0400) /*!<Capture/Compare 2 DMA request enable */ -#define TIM_DIER_CC3DE ((uint16_t)0x0800) /*!<Capture/Compare 3 DMA request enable */ -#define TIM_DIER_CC4DE ((uint16_t)0x1000) /*!<Capture/Compare 4 DMA request enable */ -#define TIM_DIER_COMDE ((uint16_t)0x2000) /*!<COM DMA request enable */ -#define TIM_DIER_TDE ((uint16_t)0x4000) /*!<Trigger DMA request enable */ - -/******************** Bit definition for TIM_SR register ********************/ -#define TIM_SR_UIF ((uint16_t)0x0001) /*!<Update interrupt Flag */ -#define TIM_SR_CC1IF ((uint16_t)0x0002) /*!<Capture/Compare 1 interrupt Flag */ -#define TIM_SR_CC2IF ((uint16_t)0x0004) /*!<Capture/Compare 2 interrupt Flag */ -#define TIM_SR_CC3IF ((uint16_t)0x0008) /*!<Capture/Compare 3 interrupt Flag */ -#define TIM_SR_CC4IF ((uint16_t)0x0010) /*!<Capture/Compare 4 interrupt Flag */ -#define TIM_SR_COMIF ((uint16_t)0x0020) /*!<COM interrupt Flag */ -#define TIM_SR_TIF ((uint16_t)0x0040) /*!<Trigger interrupt Flag */ -#define TIM_SR_BIF ((uint16_t)0x0080) /*!<Break interrupt Flag */ -#define TIM_SR_CC1OF ((uint16_t)0x0200) /*!<Capture/Compare 1 Overcapture Flag */ -#define TIM_SR_CC2OF ((uint16_t)0x0400) /*!<Capture/Compare 2 Overcapture Flag */ -#define TIM_SR_CC3OF ((uint16_t)0x0800) /*!<Capture/Compare 3 Overcapture Flag */ -#define TIM_SR_CC4OF ((uint16_t)0x1000) /*!<Capture/Compare 4 Overcapture Flag */ - -/******************* Bit definition for TIM_EGR register ********************/ -#define TIM_EGR_UG ((uint8_t)0x01) /*!<Update Generation */ -#define TIM_EGR_CC1G ((uint8_t)0x02) /*!<Capture/Compare 1 Generation */ -#define TIM_EGR_CC2G ((uint8_t)0x04) /*!<Capture/Compare 2 Generation */ -#define TIM_EGR_CC3G ((uint8_t)0x08) /*!<Capture/Compare 3 Generation */ -#define TIM_EGR_CC4G ((uint8_t)0x10) /*!<Capture/Compare 4 Generation */ -#define TIM_EGR_COMG ((uint8_t)0x20) /*!<Capture/Compare Control Update Generation */ -#define TIM_EGR_TG ((uint8_t)0x40) /*!<Trigger Generation */ -#define TIM_EGR_BG ((uint8_t)0x80) /*!<Break Generation */ - -/****************** Bit definition for TIM_CCMR1 register *******************/ -#define TIM_CCMR1_CC1S ((uint16_t)0x0003) /*!<CC1S[1:0] bits (Capture/Compare 1 Selection) */ -#define TIM_CCMR1_CC1S_0 ((uint16_t)0x0001) /*!<Bit 0 */ -#define TIM_CCMR1_CC1S_1 ((uint16_t)0x0002) /*!<Bit 1 */ - -#define TIM_CCMR1_OC1FE ((uint16_t)0x0004) /*!<Output Compare 1 Fast enable */ -#define TIM_CCMR1_OC1PE ((uint16_t)0x0008) /*!<Output Compare 1 Preload enable */ - -#define TIM_CCMR1_OC1M ((uint16_t)0x0070) /*!<OC1M[2:0] bits (Output Compare 1 Mode) */ -#define TIM_CCMR1_OC1M_0 ((uint16_t)0x0010) /*!<Bit 0 */ -#define TIM_CCMR1_OC1M_1 ((uint16_t)0x0020) /*!<Bit 1 */ -#define TIM_CCMR1_OC1M_2 ((uint16_t)0x0040) /*!<Bit 2 */ - -#define TIM_CCMR1_OC1CE ((uint16_t)0x0080) /*!<Output Compare 1Clear Enable */ - -#define TIM_CCMR1_CC2S ((uint16_t)0x0300) /*!<CC2S[1:0] bits (Capture/Compare 2 Selection) */ -#define TIM_CCMR1_CC2S_0 ((uint16_t)0x0100) /*!<Bit 0 */ -#define TIM_CCMR1_CC2S_1 ((uint16_t)0x0200) /*!<Bit 1 */ - -#define TIM_CCMR1_OC2FE ((uint16_t)0x0400) /*!<Output Compare 2 Fast enable */ -#define TIM_CCMR1_OC2PE ((uint16_t)0x0800) /*!<Output Compare 2 Preload enable */ - -#define TIM_CCMR1_OC2M ((uint16_t)0x7000) /*!<OC2M[2:0] bits (Output Compare 2 Mode) */ -#define TIM_CCMR1_OC2M_0 ((uint16_t)0x1000) /*!<Bit 0 */ -#define TIM_CCMR1_OC2M_1 ((uint16_t)0x2000) /*!<Bit 1 */ -#define TIM_CCMR1_OC2M_2 ((uint16_t)0x4000) /*!<Bit 2 */ - -#define TIM_CCMR1_OC2CE ((uint16_t)0x8000) /*!<Output Compare 2 Clear Enable */ - -/*----------------------------------------------------------------------------*/ - -#define TIM_CCMR1_IC1PSC ((uint16_t)0x000C) /*!<IC1PSC[1:0] bits (Input Capture 1 Prescaler) */ -#define TIM_CCMR1_IC1PSC_0 ((uint16_t)0x0004) /*!<Bit 0 */ -#define TIM_CCMR1_IC1PSC_1 ((uint16_t)0x0008) /*!<Bit 1 */ - -#define TIM_CCMR1_IC1F ((uint16_t)0x00F0) /*!<IC1F[3:0] bits (Input Capture 1 Filter) */ -#define TIM_CCMR1_IC1F_0 ((uint16_t)0x0010) /*!<Bit 0 */ -#define TIM_CCMR1_IC1F_1 ((uint16_t)0x0020) /*!<Bit 1 */ -#define TIM_CCMR1_IC1F_2 ((uint16_t)0x0040) /*!<Bit 2 */ -#define TIM_CCMR1_IC1F_3 ((uint16_t)0x0080) /*!<Bit 3 */ - -#define TIM_CCMR1_IC2PSC ((uint16_t)0x0C00) /*!<IC2PSC[1:0] bits (Input Capture 2 Prescaler) */ -#define TIM_CCMR1_IC2PSC_0 ((uint16_t)0x0400) /*!<Bit 0 */ -#define TIM_CCMR1_IC2PSC_1 ((uint16_t)0x0800) /*!<Bit 1 */ - -#define TIM_CCMR1_IC2F ((uint16_t)0xF000) /*!<IC2F[3:0] bits (Input Capture 2 Filter) */ -#define TIM_CCMR1_IC2F_0 ((uint16_t)0x1000) /*!<Bit 0 */ -#define TIM_CCMR1_IC2F_1 ((uint16_t)0x2000) /*!<Bit 1 */ -#define TIM_CCMR1_IC2F_2 ((uint16_t)0x4000) /*!<Bit 2 */ -#define TIM_CCMR1_IC2F_3 ((uint16_t)0x8000) /*!<Bit 3 */ - -/****************** Bit definition for TIM_CCMR2 register *******************/ -#define TIM_CCMR2_CC3S ((uint16_t)0x0003) /*!<CC3S[1:0] bits (Capture/Compare 3 Selection) */ -#define TIM_CCMR2_CC3S_0 ((uint16_t)0x0001) /*!<Bit 0 */ -#define TIM_CCMR2_CC3S_1 ((uint16_t)0x0002) /*!<Bit 1 */ - -#define TIM_CCMR2_OC3FE ((uint16_t)0x0004) /*!<Output Compare 3 Fast enable */ -#define TIM_CCMR2_OC3PE ((uint16_t)0x0008) /*!<Output Compare 3 Preload enable */ - -#define TIM_CCMR2_OC3M ((uint16_t)0x0070) /*!<OC3M[2:0] bits (Output Compare 3 Mode) */ -#define TIM_CCMR2_OC3M_0 ((uint16_t)0x0010) /*!<Bit 0 */ -#define TIM_CCMR2_OC3M_1 ((uint16_t)0x0020) /*!<Bit 1 */ -#define TIM_CCMR2_OC3M_2 ((uint16_t)0x0040) /*!<Bit 2 */ - -#define TIM_CCMR2_OC3CE ((uint16_t)0x0080) /*!<Output Compare 3 Clear Enable */ - -#define TIM_CCMR2_CC4S ((uint16_t)0x0300) /*!<CC4S[1:0] bits (Capture/Compare 4 Selection) */ -#define TIM_CCMR2_CC4S_0 ((uint16_t)0x0100) /*!<Bit 0 */ -#define TIM_CCMR2_CC4S_1 ((uint16_t)0x0200) /*!<Bit 1 */ - -#define TIM_CCMR2_OC4FE ((uint16_t)0x0400) /*!<Output Compare 4 Fast enable */ -#define TIM_CCMR2_OC4PE ((uint16_t)0x0800) /*!<Output Compare 4 Preload enable */ - -#define TIM_CCMR2_OC4M ((uint16_t)0x7000) /*!<OC4M[2:0] bits (Output Compare 4 Mode) */ -#define TIM_CCMR2_OC4M_0 ((uint16_t)0x1000) /*!<Bit 0 */ -#define TIM_CCMR2_OC4M_1 ((uint16_t)0x2000) /*!<Bit 1 */ -#define TIM_CCMR2_OC4M_2 ((uint16_t)0x4000) /*!<Bit 2 */ - -#define TIM_CCMR2_OC4CE ((uint16_t)0x8000) /*!<Output Compare 4 Clear Enable */ - -/*----------------------------------------------------------------------------*/ - -#define TIM_CCMR2_IC3PSC ((uint16_t)0x000C) /*!<IC3PSC[1:0] bits (Input Capture 3 Prescaler) */ -#define TIM_CCMR2_IC3PSC_0 ((uint16_t)0x0004) /*!<Bit 0 */ -#define TIM_CCMR2_IC3PSC_1 ((uint16_t)0x0008) /*!<Bit 1 */ - -#define TIM_CCMR2_IC3F ((uint16_t)0x00F0) /*!<IC3F[3:0] bits (Input Capture 3 Filter) */ -#define TIM_CCMR2_IC3F_0 ((uint16_t)0x0010) /*!<Bit 0 */ -#define TIM_CCMR2_IC3F_1 ((uint16_t)0x0020) /*!<Bit 1 */ -#define TIM_CCMR2_IC3F_2 ((uint16_t)0x0040) /*!<Bit 2 */ -#define TIM_CCMR2_IC3F_3 ((uint16_t)0x0080) /*!<Bit 3 */ - -#define TIM_CCMR2_IC4PSC ((uint16_t)0x0C00) /*!<IC4PSC[1:0] bits (Input Capture 4 Prescaler) */ -#define TIM_CCMR2_IC4PSC_0 ((uint16_t)0x0400) /*!<Bit 0 */ -#define TIM_CCMR2_IC4PSC_1 ((uint16_t)0x0800) /*!<Bit 1 */ - -#define TIM_CCMR2_IC4F ((uint16_t)0xF000) /*!<IC4F[3:0] bits (Input Capture 4 Filter) */ -#define TIM_CCMR2_IC4F_0 ((uint16_t)0x1000) /*!<Bit 0 */ -#define TIM_CCMR2_IC4F_1 ((uint16_t)0x2000) /*!<Bit 1 */ -#define TIM_CCMR2_IC4F_2 ((uint16_t)0x4000) /*!<Bit 2 */ -#define TIM_CCMR2_IC4F_3 ((uint16_t)0x8000) /*!<Bit 3 */ - -/******************* Bit definition for TIM_CCER register *******************/ -#define TIM_CCER_CC1E ((uint16_t)0x0001) /*!<Capture/Compare 1 output enable */ -#define TIM_CCER_CC1P ((uint16_t)0x0002) /*!<Capture/Compare 1 output Polarity */ -#define TIM_CCER_CC1NE ((uint16_t)0x0004) /*!<Capture/Compare 1 Complementary output enable */ -#define TIM_CCER_CC1NP ((uint16_t)0x0008) /*!<Capture/Compare 1 Complementary output Polarity */ -#define TIM_CCER_CC2E ((uint16_t)0x0010) /*!<Capture/Compare 2 output enable */ -#define TIM_CCER_CC2P ((uint16_t)0x0020) /*!<Capture/Compare 2 output Polarity */ -#define TIM_CCER_CC2NE ((uint16_t)0x0040) /*!<Capture/Compare 2 Complementary output enable */ -#define TIM_CCER_CC2NP ((uint16_t)0x0080) /*!<Capture/Compare 2 Complementary output Polarity */ -#define TIM_CCER_CC3E ((uint16_t)0x0100) /*!<Capture/Compare 3 output enable */ -#define TIM_CCER_CC3P ((uint16_t)0x0200) /*!<Capture/Compare 3 output Polarity */ -#define TIM_CCER_CC3NE ((uint16_t)0x0400) /*!<Capture/Compare 3 Complementary output enable */ -#define TIM_CCER_CC3NP ((uint16_t)0x0800) /*!<Capture/Compare 3 Complementary output Polarity */ -#define TIM_CCER_CC4E ((uint16_t)0x1000) /*!<Capture/Compare 4 output enable */ -#define TIM_CCER_CC4P ((uint16_t)0x2000) /*!<Capture/Compare 4 output Polarity */ -#define TIM_CCER_CC4NP ((uint16_t)0x8000) /*!<Capture/Compare 4 Complementary output Polarity */ - -/******************* Bit definition for TIM_CNT register ********************/ -#define TIM_CNT_CNT ((uint16_t)0xFFFF) /*!<Counter Value */ - -/******************* Bit definition for TIM_PSC register ********************/ -#define TIM_PSC_PSC ((uint16_t)0xFFFF) /*!<Prescaler Value */ - -/******************* Bit definition for TIM_ARR register ********************/ -#define TIM_ARR_ARR ((uint16_t)0xFFFF) /*!<actual auto-reload Value */ - -/******************* Bit definition for TIM_RCR register ********************/ -#define TIM_RCR_REP ((uint8_t)0xFF) /*!<Repetition Counter Value */ - -/******************* Bit definition for TIM_CCR1 register *******************/ -#define TIM_CCR1_CCR1 ((uint16_t)0xFFFF) /*!<Capture/Compare 1 Value */ - -/******************* Bit definition for TIM_CCR2 register *******************/ -#define TIM_CCR2_CCR2 ((uint16_t)0xFFFF) /*!<Capture/Compare 2 Value */ - -/******************* Bit definition for TIM_CCR3 register *******************/ -#define TIM_CCR3_CCR3 ((uint16_t)0xFFFF) /*!<Capture/Compare 3 Value */ - -/******************* Bit definition for TIM_CCR4 register *******************/ -#define TIM_CCR4_CCR4 ((uint16_t)0xFFFF) /*!<Capture/Compare 4 Value */ - -/******************* Bit definition for TIM_BDTR register *******************/ -#define TIM_BDTR_DTG ((uint16_t)0x00FF) /*!<DTG[0:7] bits (Dead-Time Generator set-up) */ -#define TIM_BDTR_DTG_0 ((uint16_t)0x0001) /*!<Bit 0 */ -#define TIM_BDTR_DTG_1 ((uint16_t)0x0002) /*!<Bit 1 */ -#define TIM_BDTR_DTG_2 ((uint16_t)0x0004) /*!<Bit 2 */ -#define TIM_BDTR_DTG_3 ((uint16_t)0x0008) /*!<Bit 3 */ -#define TIM_BDTR_DTG_4 ((uint16_t)0x0010) /*!<Bit 4 */ -#define TIM_BDTR_DTG_5 ((uint16_t)0x0020) /*!<Bit 5 */ -#define TIM_BDTR_DTG_6 ((uint16_t)0x0040) /*!<Bit 6 */ -#define TIM_BDTR_DTG_7 ((uint16_t)0x0080) /*!<Bit 7 */ - -#define TIM_BDTR_LOCK ((uint16_t)0x0300) /*!<LOCK[1:0] bits (Lock Configuration) */ -#define TIM_BDTR_LOCK_0 ((uint16_t)0x0100) /*!<Bit 0 */ -#define TIM_BDTR_LOCK_1 ((uint16_t)0x0200) /*!<Bit 1 */ - -#define TIM_BDTR_OSSI ((uint16_t)0x0400) /*!<Off-State Selection for Idle mode */ -#define TIM_BDTR_OSSR ((uint16_t)0x0800) /*!<Off-State Selection for Run mode */ -#define TIM_BDTR_BKE ((uint16_t)0x1000) /*!<Break enable */ -#define TIM_BDTR_BKP ((uint16_t)0x2000) /*!<Break Polarity */ -#define TIM_BDTR_AOE ((uint16_t)0x4000) /*!<Automatic Output enable */ -#define TIM_BDTR_MOE ((uint16_t)0x8000) /*!<Main Output enable */ - -/******************* Bit definition for TIM_DCR register ********************/ -#define TIM_DCR_DBA ((uint16_t)0x001F) /*!<DBA[4:0] bits (DMA Base Address) */ -#define TIM_DCR_DBA_0 ((uint16_t)0x0001) /*!<Bit 0 */ -#define TIM_DCR_DBA_1 ((uint16_t)0x0002) /*!<Bit 1 */ -#define TIM_DCR_DBA_2 ((uint16_t)0x0004) /*!<Bit 2 */ -#define TIM_DCR_DBA_3 ((uint16_t)0x0008) /*!<Bit 3 */ -#define TIM_DCR_DBA_4 ((uint16_t)0x0010) /*!<Bit 4 */ - -#define TIM_DCR_DBL ((uint16_t)0x1F00) /*!<DBL[4:0] bits (DMA Burst Length) */ -#define TIM_DCR_DBL_0 ((uint16_t)0x0100) /*!<Bit 0 */ -#define TIM_DCR_DBL_1 ((uint16_t)0x0200) /*!<Bit 1 */ -#define TIM_DCR_DBL_2 ((uint16_t)0x0400) /*!<Bit 2 */ -#define TIM_DCR_DBL_3 ((uint16_t)0x0800) /*!<Bit 3 */ -#define TIM_DCR_DBL_4 ((uint16_t)0x1000) /*!<Bit 4 */ - -/******************* Bit definition for TIM_DMAR register *******************/ -#define TIM_DMAR_DMAB ((uint16_t)0xFFFF) /*!<DMA register for burst accesses */ - -/******************* Bit definition for TIM_OR register *********************/ -#define TIM14_OR_TI1_RMP ((uint16_t)0x0003) /*!<TI1_RMP[1:0] bits (TIM14 Input 4 remap) */ -#define TIM14_OR_TI1_RMP_0 ((uint16_t)0x0001) /*!<Bit 0 */ -#define TIM14_OR_TI1_RMP_1 ((uint16_t)0x0002) /*!<Bit 1 */ - - -/******************************************************************************/ -/* */ -/* Universal Synchronous Asynchronous Receiver Transmitter (USART) */ -/* */ -/******************************************************************************/ -/****************** Bit definition for USART_CR1 register *******************/ -#define USART_CR1_UE ((uint32_t)0x00000001) /*!< USART Enable */ -#define USART_CR1_UESM ((uint32_t)0x00000002) /*!< USART Enable in STOP Mode */ -#define USART_CR1_RE ((uint32_t)0x00000004) /*!< Receiver Enable */ -#define USART_CR1_TE ((uint32_t)0x00000008) /*!< Transmitter Enable */ -#define USART_CR1_IDLEIE ((uint32_t)0x00000010) /*!< IDLE Interrupt Enable */ -#define USART_CR1_RXNEIE ((uint32_t)0x00000020) /*!< RXNE Interrupt Enable */ -#define USART_CR1_TCIE ((uint32_t)0x00000040) /*!< Transmission Complete Interrupt Enable */ -#define USART_CR1_TXEIE ((uint32_t)0x00000080) /*!< TXE Interrupt Enable */ -#define USART_CR1_PEIE ((uint32_t)0x00000100) /*!< PE Interrupt Enable */ -#define USART_CR1_PS ((uint32_t)0x00000200) /*!< Parity Selection */ -#define USART_CR1_PCE ((uint32_t)0x00000400) /*!< Parity Control Enable */ -#define USART_CR1_WAKE ((uint32_t)0x00000800) /*!< Receiver Wakeup method */ -#define USART_CR1_M ((uint32_t)0x00001000) /*!< Word length */ -#define USART_CR1_MME ((uint32_t)0x00002000) /*!< Mute Mode Enable */ -#define USART_CR1_CMIE ((uint32_t)0x00004000) /*!< Character match interrupt enable */ -#define USART_CR1_OVER8 ((uint32_t)0x00008000) /*!< Oversampling by 8-bit or 16-bit mode */ -#define USART_CR1_DEDT ((uint32_t)0x001F0000) /*!< DEDT[4:0] bits (Driver Enable Deassertion Time) */ -#define USART_CR1_DEDT_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define USART_CR1_DEDT_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define USART_CR1_DEDT_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define USART_CR1_DEDT_3 ((uint32_t)0x00080000) /*!< Bit 3 */ -#define USART_CR1_DEDT_4 ((uint32_t)0x00100000) /*!< Bit 4 */ -#define USART_CR1_DEAT ((uint32_t)0x03E00000) /*!< DEAT[4:0] bits (Driver Enable Assertion Time) */ -#define USART_CR1_DEAT_0 ((uint32_t)0x00200000) /*!< Bit 0 */ -#define USART_CR1_DEAT_1 ((uint32_t)0x00400000) /*!< Bit 1 */ -#define USART_CR1_DEAT_2 ((uint32_t)0x00800000) /*!< Bit 2 */ -#define USART_CR1_DEAT_3 ((uint32_t)0x01000000) /*!< Bit 3 */ -#define USART_CR1_DEAT_4 ((uint32_t)0x02000000) /*!< Bit 4 */ -#define USART_CR1_RTOIE ((uint32_t)0x04000000) /*!< Receive Time Out interrupt enable */ -#define USART_CR1_EOBIE ((uint32_t)0x08000000) /*!< End of Block interrupt enable */ - -/****************** Bit definition for USART_CR2 register *******************/ -#define USART_CR2_ADDM7 ((uint32_t)0x00000010) /*!< 7-bit or 4-bit Address Detection */ -#define USART_CR2_LBDL ((uint32_t)0x00000020) /*!< LIN Break Detection Length */ -#define USART_CR2_LBDIE ((uint32_t)0x00000040) /*!< LIN Break Detection Interrupt Enable */ -#define USART_CR2_LBCL ((uint32_t)0x00000100) /*!< Last Bit Clock pulse */ -#define USART_CR2_CPHA ((uint32_t)0x00000200) /*!< Clock Phase */ -#define USART_CR2_CPOL ((uint32_t)0x00000400) /*!< Clock Polarity */ -#define USART_CR2_CLKEN ((uint32_t)0x00000800) /*!< Clock Enable */ -#define USART_CR2_STOP ((uint32_t)0x00003000) /*!< STOP[1:0] bits (STOP bits) */ -#define USART_CR2_STOP_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define USART_CR2_STOP_1 ((uint32_t)0x00002000) /*!< Bit 1 */ -#define USART_CR2_LINEN ((uint32_t)0x00004000) /*!< LIN mode enable */ -#define USART_CR2_SWAP ((uint32_t)0x00008000) /*!< SWAP TX/RX pins */ -#define USART_CR2_RXINV ((uint32_t)0x00010000) /*!< RX pin active level inversion */ -#define USART_CR2_TXINV ((uint32_t)0x00020000) /*!< TX pin active level inversion */ -#define USART_CR2_DATAINV ((uint32_t)0x00040000) /*!< Binary data inversion */ -#define USART_CR2_MSBFIRST ((uint32_t)0x00080000) /*!< Most Significant Bit First */ -#define USART_CR2_ABREN ((uint32_t)0x00100000) /*!< Auto Baud-Rate Enable*/ -#define USART_CR2_ABRMODE ((uint32_t)0x00600000) /*!< ABRMOD[1:0] bits (Auto Baud-Rate Mode) */ -#define USART_CR2_ABRMODE_0 ((uint32_t)0x00200000) /*!< Bit 0 */ -#define USART_CR2_ABRMODE_1 ((uint32_t)0x00400000) /*!< Bit 1 */ -#define USART_CR2_RTOEN ((uint32_t)0x00800000) /*!< Receiver Time-Out enable */ -#define USART_CR2_ADD ((uint32_t)0xFF000000) /*!< Address of the USART node */ - -/****************** Bit definition for USART_CR3 register *******************/ -#define USART_CR3_EIE ((uint32_t)0x00000001) /*!< Error Interrupt Enable */ -#define USART_CR3_IREN ((uint32_t)0x00000002) /*!< IrDA mode Enable */ -#define USART_CR3_IRLP ((uint32_t)0x00000004) /*!< IrDA Low-Power */ -#define USART_CR3_HDSEL ((uint32_t)0x00000008) /*!< Half-Duplex Selection */ -#define USART_CR3_NACK ((uint32_t)0x00000010) /*!< SmartCard NACK enable */ -#define USART_CR3_SCEN ((uint32_t)0x00000020) /*!< SmartCard mode enable */ -#define USART_CR3_DMAR ((uint32_t)0x00000040) /*!< DMA Enable Receiver */ -#define USART_CR3_DMAT ((uint32_t)0x00000080) /*!< DMA Enable Transmitter */ -#define USART_CR3_RTSE ((uint32_t)0x00000100) /*!< RTS Enable */ -#define USART_CR3_CTSE ((uint32_t)0x00000200) /*!< CTS Enable */ -#define USART_CR3_CTSIE ((uint32_t)0x00000400) /*!< CTS Interrupt Enable */ -#define USART_CR3_ONEBIT ((uint32_t)0x00000800) /*!< One sample bit method enable */ -#define USART_CR3_OVRDIS ((uint32_t)0x00001000) /*!< Overrun Disable */ -#define USART_CR3_DDRE ((uint32_t)0x00002000) /*!< DMA Disable on Reception Error */ -#define USART_CR3_DEM ((uint32_t)0x00004000) /*!< Driver Enable Mode */ -#define USART_CR3_DEP ((uint32_t)0x00008000) /*!< Driver Enable Polarity Selection */ -#define USART_CR3_SCARCNT ((uint32_t)0x000E0000) /*!< SCARCNT[2:0] bits (SmartCard Auto-Retry Count) */ -#define USART_CR3_SCARCNT_0 ((uint32_t)0x00020000) /*!< Bit 0 */ -#define USART_CR3_SCARCNT_1 ((uint32_t)0x00040000) /*!< Bit 1 */ -#define USART_CR3_SCARCNT_2 ((uint32_t)0x00080000) /*!< Bit 2 */ -#define USART_CR3_WUS ((uint32_t)0x00300000) /*!< WUS[1:0] bits (Wake UP Interrupt Flag Selection) */ -#define USART_CR3_WUS_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define USART_CR3_WUS_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define USART_CR3_WUFIE ((uint32_t)0x00400000) /*!< Wake Up Interrupt Enable */ - -/****************** Bit definition for USART_BRR register *******************/ -#define USART_BRR_DIV_FRACTION ((uint16_t)0x000F) /*!< Fraction of USARTDIV */ -#define USART_BRR_DIV_MANTISSA ((uint16_t)0xFFF0) /*!< Mantissa of USARTDIV */ - -/****************** Bit definition for USART_GTPR register ******************/ -#define USART_GTPR_PSC ((uint16_t)0x00FF) /*!< PSC[7:0] bits (Prescaler value) */ -#define USART_GTPR_GT ((uint16_t)0xFF00) /*!< GT[7:0] bits (Guard time value) */ - - -/******************* Bit definition for USART_RTOR register *****************/ -#define USART_RTOR_RTO ((uint32_t)0x00FFFFFF) /*!< Receiver Time Out Value */ -#define USART_RTOR_BLEN ((uint32_t)0xFF000000) /*!< Block Length */ - -/******************* Bit definition for USART_RQR register ******************/ -#define USART_RQR_ABRRQ ((uint16_t)0x0001) /*!< Auto-Baud Rate Request */ -#define USART_RQR_SBKRQ ((uint16_t)0x0002) /*!< Send Break Request */ -#define USART_RQR_MMRQ ((uint16_t)0x0004) /*!< Mute Mode Request */ -#define USART_RQR_RXFRQ ((uint16_t)0x0008) /*!< Receive Data flush Request */ -#define USART_RQR_TXFRQ ((uint16_t)0x0010) /*!< Transmit data flush Request */ - -/******************* Bit definition for USART_ISR register ******************/ -#define USART_ISR_PE ((uint32_t)0x00000001) /*!< Parity Error */ -#define USART_ISR_FE ((uint32_t)0x00000002) /*!< Framing Error */ -#define USART_ISR_NE ((uint32_t)0x00000004) /*!< Noise detected Flag */ -#define USART_ISR_ORE ((uint32_t)0x00000008) /*!< OverRun Error */ -#define USART_ISR_IDLE ((uint32_t)0x00000010) /*!< IDLE line detected */ -#define USART_ISR_RXNE ((uint32_t)0x00000020) /*!< Read Data Register Not Empty */ -#define USART_ISR_TC ((uint32_t)0x00000040) /*!< Transmission Complete */ -#define USART_ISR_TXE ((uint32_t)0x00000080) /*!< Transmit Data Register Empty */ -#define USART_ISR_LBD ((uint32_t)0x00000100) /*!< LIN Break Detection Flag */ -#define USART_ISR_CTSIF ((uint32_t)0x00000200) /*!< CTS interrupt flag */ -#define USART_ISR_CTS ((uint32_t)0x00000400) /*!< CTS flag */ -#define USART_ISR_RTOF ((uint32_t)0x00000800) /*!< Receiver Time Out */ -#define USART_ISR_EOBF ((uint32_t)0x00001000) /*!< End Of Block Flag */ -#define USART_ISR_ABRE ((uint32_t)0x00004000) /*!< Auto-Baud Rate Error */ -#define USART_ISR_ABRF ((uint32_t)0x00008000) /*!< Auto-Baud Rate Flag */ -#define USART_ISR_BUSY ((uint32_t)0x00010000) /*!< Busy Flag */ -#define USART_ISR_CMF ((uint32_t)0x00020000) /*!< Character Match Flag */ -#define USART_ISR_SBKF ((uint32_t)0x00040000) /*!< Send Break Flag */ -#define USART_ISR_RWU ((uint32_t)0x00080000) /*!< Receive Wake Up from mute mode Flag */ -#define USART_ISR_WUF ((uint32_t)0x00100000) /*!< Wake Up from stop mode Flag */ -#define USART_ISR_TEACK ((uint32_t)0x00200000) /*!< Transmit Enable Acknowledge Flag */ -#define USART_ISR_REACK ((uint32_t)0x00400000) /*!< Receive Enable Acknowledge Flag */ - -/******************* Bit definition for USART_ICR register ******************/ -#define USART_ICR_PECF ((uint32_t)0x00000001) /*!< Parity Error Clear Flag */ -#define USART_ICR_FECF ((uint32_t)0x00000002) /*!< Framing Error Clear Flag */ -#define USART_ICR_NCF ((uint32_t)0x00000004) /*!< Noise detected Clear Flag */ -#define USART_ICR_ORECF ((uint32_t)0x00000008) /*!< OverRun Error Clear Flag */ -#define USART_ICR_IDLECF ((uint32_t)0x00000010) /*!< IDLE line detected Clear Flag */ -#define USART_ICR_TCCF ((uint32_t)0x00000040) /*!< Transmission Complete Clear Flag */ -#define USART_ICR_LBDCF ((uint32_t)0x00000100) /*!< LIN Break Detection Clear Flag */ -#define USART_ICR_CTSCF ((uint32_t)0x00000200) /*!< CTS Interrupt Clear Flag */ -#define USART_ICR_RTOCF ((uint32_t)0x00000800) /*!< Receiver Time Out Clear Flag */ -#define USART_ICR_EOBCF ((uint32_t)0x00001000) /*!< End Of Block Clear Flag */ -#define USART_ICR_CMCF ((uint32_t)0x00020000) /*!< Character Match Clear Flag */ -#define USART_ICR_WUCF ((uint32_t)0x00100000) /*!< Wake Up from stop mode Clear Flag */ - -/******************* Bit definition for USART_RDR register ******************/ -#define USART_RDR_RDR ((uint16_t)0x01FF) /*!< RDR[8:0] bits (Receive Data value) */ - -/******************* Bit definition for USART_TDR register ******************/ -#define USART_TDR_TDR ((uint16_t)0x01FF) /*!< TDR[8:0] bits (Transmit Data value) */ - -/******************************************************************************/ -/* */ -/* Window WATCHDOG (WWDG) */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for WWDG_CR register ********************/ -#define WWDG_CR_T ((uint8_t)0x7F) /*!< T[6:0] bits (7-Bit counter (MSB to LSB)) */ -#define WWDG_CR_T0 ((uint8_t)0x01) /*!< Bit 0 */ -#define WWDG_CR_T1 ((uint8_t)0x02) /*!< Bit 1 */ -#define WWDG_CR_T2 ((uint8_t)0x04) /*!< Bit 2 */ -#define WWDG_CR_T3 ((uint8_t)0x08) /*!< Bit 3 */ -#define WWDG_CR_T4 ((uint8_t)0x10) /*!< Bit 4 */ -#define WWDG_CR_T5 ((uint8_t)0x20) /*!< Bit 5 */ -#define WWDG_CR_T6 ((uint8_t)0x40) /*!< Bit 6 */ - -#define WWDG_CR_WDGA ((uint8_t)0x80) /*!< Activation bit */ - -/******************* Bit definition for WWDG_CFR register *******************/ -#define WWDG_CFR_W ((uint16_t)0x007F) /*!< W[6:0] bits (7-bit window value) */ -#define WWDG_CFR_W0 ((uint16_t)0x0001) /*!< Bit 0 */ -#define WWDG_CFR_W1 ((uint16_t)0x0002) /*!< Bit 1 */ -#define WWDG_CFR_W2 ((uint16_t)0x0004) /*!< Bit 2 */ -#define WWDG_CFR_W3 ((uint16_t)0x0008) /*!< Bit 3 */ -#define WWDG_CFR_W4 ((uint16_t)0x0010) /*!< Bit 4 */ -#define WWDG_CFR_W5 ((uint16_t)0x0020) /*!< Bit 5 */ -#define WWDG_CFR_W6 ((uint16_t)0x0040) /*!< Bit 6 */ - -#define WWDG_CFR_WDGTB ((uint16_t)0x0180) /*!< WDGTB[1:0] bits (Timer Base) */ -#define WWDG_CFR_WDGTB0 ((uint16_t)0x0080) /*!< Bit 0 */ -#define WWDG_CFR_WDGTB1 ((uint16_t)0x0100) /*!< Bit 1 */ - -#define WWDG_CFR_EWI ((uint16_t)0x0200) /*!< Early Wakeup Interrupt */ - -/******************* Bit definition for WWDG_SR register ********************/ -#define WWDG_SR_EWIF ((uint8_t)0x01) /*!< Early Wakeup Interrupt Flag */ - -/** - * @} - */ - - /** - * @} - */ - -#ifdef USE_STDPERIPH_DRIVER - #include "stm32f0xx_conf.h" -#endif - -/** @addtogroup Exported_macro - * @{ - */ -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_H */ - -/** - * @} - */ - - /** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Include/system_stm32f0xx.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Include/system_stm32f0xx.h deleted file mode 100644 index ab76a00..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Include/system_stm32f0xx.h +++ /dev/null @@ -1,104 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32f0xx.h - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief CMSIS Cortex-M0 Device Peripheral Access Layer System Header File. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f0xx_system - * @{ - */ - -/** - * @brief Define to prevent recursive inclusion - */ -#ifndef __SYSTEM_STM32F0XX_H -#define __SYSTEM_STM32F0XX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup STM32F0xx_System_Includes - * @{ - */ - -/** - * @} - */ - - -/** @addtogroup STM32F0xx_System_Exported_types - * @{ - */ - -extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Exported_Constants - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Exported_Functions - * @{ - */ - -extern void SystemInit(void); -extern void SystemCoreClockUpdate(void); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__SYSTEM_STM32F0XX_H */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Release_Notes.html b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Release_Notes.html deleted file mode 100644 index 47f59da..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Release_Notes.html +++ /dev/null @@ -1,228 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head> - - - - - - - - - -<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> -<link rel="File-List" href="Library_files/filelist.xml"> -<link rel="Edit-Time-Data" href="Library_files/editdata.mso"><!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><title>Release Notes for STM32F0xx CMSIS</title><!--[if gte mso 9]><xml> <o:DocumentProperties> <o:Author>STMicroelectronics</o:Author> <o:LastAuthor>STMicroelectronics</o:LastAuthor> <o:Revision>37</o:Revision> <o:TotalTime>136</o:TotalTime> <o:Created>2009-02-27T19:26:00Z</o:Created> <o:LastSaved>2009-03-01T17:56:00Z</o:LastSaved> <o:Pages>1</o:Pages> <o:Words>522</o:Words> <o:Characters>2977</o:Characters> <o:Company>STMicroelectronics</o:Company> <o:Lines>24</o:Lines> <o:Paragraphs>6</o:Paragraphs> <o:CharactersWithSpaces>3493</o:CharactersWithSpaces> <o:Version>11.6568</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:Zoom>110</w:Zoom> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--> - - - -<style> -<!-- -/* Style Definitions */ -p.MsoNormal, li.MsoNormal, div.MsoNormal -{mso-style-parent:""; -margin:0in; -margin-bottom:.0001pt; -mso-pagination:widow-orphan; -font-size:12.0pt; -font-family:"Times New Roman"; -mso-fareast-font-family:"Times New Roman";} -h2 -{mso-style-next:Normal; -margin-top:12.0pt; -margin-right:0in; -margin-bottom:3.0pt; -margin-left:0in; -mso-pagination:widow-orphan; -page-break-after:avoid; -mso-outline-level:2; -font-size:14.0pt; -font-family:Arial; -font-weight:bold; -font-style:italic;} -a:link, span.MsoHyperlink -{color:blue; -text-decoration:underline; -text-underline:single;} -a:visited, span.MsoHyperlinkFollowed -{color:blue; -text-decoration:underline; -text-underline:single;} -p -{mso-margin-top-alt:auto; -margin-right:0in; -mso-margin-bottom-alt:auto; -margin-left:0in; -mso-pagination:widow-orphan; -font-size:12.0pt; -font-family:"Times New Roman"; -mso-fareast-font-family:"Times New Roman";} -@page Section1 -{size:8.5in 11.0in; -margin:1.0in 1.25in 1.0in 1.25in; -mso-header-margin:.5in; -mso-footer-margin:.5in; -mso-paper-source:0;} -div.Section1 -{page:Section1;} ---> -</style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]--><!--[if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="5122"/> </xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1"/> </o:shapelayout></xml><![endif]--><meta content="MCD Application Team" name="author"></head> -<body link="blue" vlink="blue"> -<div class="Section1"> -<p class="MsoNormal"><span style="font-family: Arial;"><o:p><br> -</o:p></span></p> -<div align="center"> -<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900"> -<tbody> -<tr style=""> -<td style="padding: 0cm;" valign="top"> -<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900"> -<tbody> - <tr> - <td style="vertical-align: top;"><span style="font-size: 8pt; font-family: Arial; color: blue;"><a href="../../../../../Release_Notes.html">Back to Release page</a></span></td> - </tr> -<tr style=""> -<td style="padding: 1.5pt;"> -<h1 style="margin-bottom: 18pt; text-align: center;" align="center"><span style="font-size: 20pt; font-family: Verdana; color: rgb(51, 102, 255);">Release -Notes for STM32F0xx CMSIS</span><span style="font-size: 20pt; font-family: Verdana;"><o:p></o:p></span></h1> -<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;">Copyright 2014 STMicroelectronics</span><span style="color: black;"><u1:p></u1:p><o:p></o:p></span></p> -<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;"><img alt="" id="_x0000_i1025" src="../../../../../_htmresc/st_logo.png" style="border: 0px solid ; width: 86px; height: 65px;"></span><span style="font-size: 10pt;"><o:p></o:p></span></p> -</td> -</tr> -</tbody> -</table> - -<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" width="900"> -<tbody> -<tr> -<td style="padding: 0cm;" valign="top"> - -<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"><span style="font-size: 12pt; color: white;">Update History</span></h2><h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V1.3.1 / 17-January-2014</span></h3> - - - <p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main -Changes<o:p></o:p></span></u></b></p> - - - - <ul style="margin-top: 0cm;" type="square"><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">TrueSTUDIO and gcc_ride7 startup files update for STM32F042 and STM32F072 devices.</span></li></ul><h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V1.3.0 / 16-January-2014</span></h3> - - - <p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main -Changes<o:p></o:p></span></u></b></p> - - - - <ul style="margin-top: 0cm;" type="square"><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-family: Verdana;"></span><span style="font-family: Verdana;"></span><small><span style="font-family: Verdana;">Add the support of the<span style="font-weight: bold;"> STM32F072 </span>and <span style="font-weight: bold;">STM32F042</span> devices.</span></small></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><small><span style="font-family: Verdana;">Update devices names definition to be in line with the new </span></small><span style="color: rgb(0, 0, 0); font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; display: inline ! important; float: none;">new STM32F0xx family devices names.</span></li><ul><li class="MsoNormal" style="margin: 4.5pt 0cm; font-size: 12pt; font-family: 'Times New Roman'; color: black;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-weight: bold;">STM32F0XX_MD</span><span class="Apple-converted-space"> </span> replaced by<span class="Apple-converted-space"> </span><span style="font-weight: bold;">STM32F051.</span></span></li><li class="MsoNormal" style="margin: 4.5pt 0cm; font-size: 12pt; font-family: 'Times New Roman'; color: black;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-weight: bold;">STM32F0XX_LD</span><span class="Apple-converted-space"> </span> replaced by<span class="Apple-converted-space"> </span><span style="font-weight: bold;">STM32F031.</span></span></li><li class="MsoNormal" style="margin: 4.5pt 0cm; font-size: 12pt; font-family: 'Times New Roman'; color: black; font-weight: bold;"><span style="font-size: 10pt; font-family: Verdana;">STM32F030x8 </span><span style="font-size: 10pt; font-family: Verdana; font-weight: normal;">and<span class="Apple-converted-space"> </span><span style="font-weight: bold;">STM32F030x6</span><span class="Apple-converted-space"> </span>replaced by<span class="Apple-converted-space"> </span><span style="font-weight: bold;">STM32F030.</span></span></li></ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f0xx.h</span></li><ul><li class="MsoNormal" style="margin: 4.5pt 0cm; font-size: 12pt; font-family: 'Times New Roman'; color: black;"><span style="font-size: 10pt; font-family: Verdana;">Upddate to support the new STM32F0xx family devices names.</span></li><ul style="margin-bottom: 0cm;"><li class="MsoNormal" style="margin: 4.5pt 0cm; font-size: 12pt; font-family: 'Times New Roman'; color: black;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-weight: bold;">STM32F0XX_MD</span><span class="Apple-converted-space"> </span> replaced by<span class="Apple-converted-space"> </span><span style="font-weight: bold;">STM32F051</span></span></li><li class="MsoNormal" style="margin: 4.5pt 0cm; font-size: 12pt; font-family: 'Times New Roman'; color: black;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-weight: bold;">STM32F0XX_LD</span><span class="Apple-converted-space"> </span> replaced by<span class="Apple-converted-space"> </span><span style="font-weight: bold;">STM32F031</span></span></li></ul></ul><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update <span style="font-style: italic;">IRQn</span> enum to support the </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">STM32F042 and STM32F072</span></span><span style="font-size: 10pt; font-family: Verdana;"> devices.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add define for HSI48_VALUE.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add CAN peripheral registers declaration and bits definition.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add CRS peripheral registers declaration and bits definition.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update CRC_TypeDef structure definition to add POL register.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update DAC_TypeDef structure to add DAC Channel 2 configuration registers.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update OB_TypeDef structure by adding DATA0, DATA1, WRP2 and WRP3 option bytes registers.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Rename CAL registers to CALR in the RTC_TypeDef structure.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add the definition of the TIM7, USART3, USART4, CAN, CRS, DMA1_Channel6, DMA1_Channel7 and GPIOE.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add bit definition for FLASH_OBR_nBOOT0, FLASH_OBR_RAM_PARITY_CHECK, FLASH_OBR_nBOOT0_SW, FLASH_OBR_DATA0 and FLASH_OBR_DATA1.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add bit definition for OB_WRP2_WRP2, OB_WRP2_nWRP2, OB_WRP3_WRP3 and OB_WRP3_nWRP3.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update almost bits definition to be in line with RM0091 reference manual.<br></span></li></ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">system_stm32f0xx.c</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">SystemInit()</span>: update to support <span style="font-style: italic;">STM32F042 and STM32F072</span> devices</span><span style="font-size: 10pt; font-family: Verdana;"></span></li></ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add new startup files for the STM32F042 and STM32F072 devices for the </span><span style="font-size: 10pt; font-family: Verdana;">supported compilers</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Replace <span style="font-style: italic;">startup_stm32f0xx_ld.s</span> and </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">startup_stm32f0xx.s </span>by respectively <span style="font-style: italic;">startup_stm32f030.s</span> and </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">startup_stm32f051.s </span>files.</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">startup_stm32f0xx_ld.s</span> and </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">startup_stm32f0xx.s </span>files are maintained for legacy purpose.</span></li></ul></ul> - <h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V1.2.1 / 22-November-2013</span></h3> - - - <p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main -Changes<o:p></o:p></span></u></b></p> - - - - <ul style="margin-top: 0cm;" type="square"><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f0xx.h</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update STM32F030 devices definition: <br> - </span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Remove the <span style="font-style: italic;">STM32F030X8 and STM32FO30X6</span> defines and replace them with the </span><span style="font-size: 10pt; font-family: Verdana;">S<span style="font-style: italic;">TM32F030 define</span></span></li></ul></ul><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update <span style="font-style: italic;">IRQn</span> enum for </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">STM32F030</span></span><span style="font-size: 10pt; font-family: Verdana;"> devices</span></li></ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">system_stm32f0xx.c</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">SystemInit()</span>: update to support <span style="font-style: italic;">STM32F030</span> devices</span><span style="font-size: 10pt; font-family: Verdana;"></span></li></ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Remove the startup files </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">startup_stm32f030x8.s and startup_stm32f030x6.s</span> and replace them by </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">startup_stm32f030.s</span></span><span style="font-size: 10pt; font-family: Verdana;">, for EWARM, MDK-ARM and Truestudio supported compilers</span></li></ul> - <h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V1.2.0 / 01-August-2013</span></h3> - - - <p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main -Changes<o:p></o:p></span></u></b></p> - - - - <ul style="margin-top: 0cm;" type="square"><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add support of <span style="font-weight: bold; font-style: italic;">STM32F030 devices</span> (STM32F030x8 and STM32F030x6 microcontrollers where the Flash memory ranges between 16 and 32 Kbytes)</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f0xx.h</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update STM32F0xx devices definition: <br> - </span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add new definition <span style="font-style: italic;">STM32F030X8 and STM32FO30X6</span> for </span><span style="font-size: 10pt; font-family: Verdana;">S<span style="font-style: italic;">TM32F030 devices</span></span></li></ul></ul><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update <span style="font-style: italic;">IRQn</span> enum for </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">STM32F030</span></span><span style="font-size: 10pt; font-family: Verdana;"> devices</span></li></ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">system_stm32f0xx.c</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">SystemInit()</span>: update to support <span style="font-style: italic;">STM32F030</span> devices</span><span style="font-size: 10pt; font-family: Verdana;"></span></li></ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add new startup files, </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">startup_stm32f030x8.s and startup_stm32f030x6.s</span>, for EWARM, MDK-ARM and Truestudio supported compilers</span></li></ul> - - - <h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V1.1.1 / 31-July-2013</span></h3> - - - <p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main -Changes<o:p></o:p></span></u></b></p> - - - - <ul style="margin-top: 0cm;" type="square"> -<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f0xx.h</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Extend <span style="font-style: italic;">HSE_STARTUP_TIMEOUT</span> and <span style="font-style: italic;">HSI_STARTUP_TIMEOUT</span> values to 0x5000</span></li></ul> - </ul> - - <h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V1.1.0 / 10-May-2013</span></h3> - <p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main -Changes<o:p></o:p></span></u></b></p> - - <ul style="margin-top: 0cm;" type="square"> -<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add support of <span style="font-weight: bold; font-style: italic;">STM32F0xx Low-density devices</span> (STM32F050xx and STM32F060xx microcontrollers where the Flash memory ranges between 16 and 32 Kbytes)</span></li> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f0xx.h</span></li> - <ul> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update STM32F0xx devices definition: <br> - </span></li> - <ul> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Define for <span style="font-style: italic;">STM32F0xx Medium-density devices</span> changed from <span style="font-style: italic;">STM32F0XX</span> to <span style="font-style: italic;">STM32F0XX_MD</span><br> - </span></li> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add new definition <span style="font-style: italic;">STM32F0XX_LD</span> for </span><span style="font-size: 10pt; font-family: Verdana;">S<span style="font-style: italic;">TM32F0xx Low-density devices</span></span></li> - </ul> - </ul> - <ul> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update <span style="font-style: italic;">IRQn</span> enum for </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">STM32F0XX_LD</span></span><span style="font-size: 10pt; font-family: Verdana;"> devices</span></li> - </ul> - <ul> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add new bits definition</span></li> - <ul> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">RCC_CFGR</span></span><span style="font-size: 10pt; font-family: Verdana;"> register</span><span style="font-size: 10pt; font-family: Verdana;">: <span style="font-style: italic;">MCOPRE[0:2]</span> and <span style="font-style: italic;">PLLNODIV</span></span></li> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">SYSCFG_CFGR1</span> register: <span style="font-style: italic;">FMP_I2C1</span>, <span style="font-style: italic;">FMP_PA9</span> and <span style="font-style: italic;">FMP_PA10</span><br> - </span></li> - </ul> - </ul> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">system_stm32f0xx.c</span></li> - <ul> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">SystemInit()</span>: update to reset new bits added in </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">RCC_CFGR</span></span><span style="font-size: 10pt; font-family: Verdana;"> register</span></li> - </ul> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add new startup files, </span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">startup_stm32f0xx_ld.s</span>, for the supported compilers</span></li> - </ul> -<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.2 / 13-July-2012</span></h3><p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main -Changes<o:p></o:p></span></u></b></p> -<ul style="margin-top: 0cm;" type="square"><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f0xx.h</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Fix issue with gcc_ride7 startup file </span><span style="font-size: 10pt; font-family: Verdana;"></span></li></ul></ul><h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.1 / 20-April-2012</span></h3><p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main -Changes<o:p></o:p></span></u></b></p> -<ul style="margin-top: 0cm;" type="square"><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f0xx.h</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add reference to STM32F050xx (Flash memory up to 32 Kbytes) and STM32F051xx (</span><span style="font-size: 10pt; font-family: Verdana;">Flash memory up to 64 Kbytes</span><span style="font-size: 10pt; font-family: Verdana;">) devices</span></li></ul><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">RTC register bits definition: remove reference to Tamper3</span></li></ul></ul><h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.0 / 23-March-2012</span></h3><p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main -Changes<o:p></o:p></span></u></b></p> -<ul style="margin-top: 0cm;" type="square"><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">First official release for <span style="font-weight: bold; font-style: italic;">STM32F0xx devices</span></span><span style="font-size: 10pt; font-family: Verdana;"></span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">All source files: license disclaimer text update and add link to the License file on ST Internet</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f0xx.h</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">change MCO bits value:</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">change <span style="font-style: italic;">RCC_CFGR_MCO_HSI14</span> value from 0x03000000 to 0x01000000</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add <span style="font-style: italic;">RCC_CFGR_MCO_LSI</span> having value 0x02000000</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add <span style="font-style: italic;">RCC_CFGR_MCO_LSE</span> having value 0x03000000</span></li></ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add new bit <span style="font-style: italic;">RCC_CSR_V18PWRRSTF</span> having value 0x00800000</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">TIM_OR</span> bits definition values corrected</span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Rename <span style="font-style: italic;">ADC_ISR_EOS</span> to <span style="font-style: italic;">ADC_ISR_EOSEQ</span></span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Rename <span style="font-style: italic;">ADC_IER_EOSIE</span> to <span style="font-style: italic;">ADC_IER_EOSEQIE</span></span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Rename <span style="font-style: italic;">ADC_CFGR1_AUTDLY</span> to <span style="font-style: italic;">ADC_CFGR1_WAIT</span></span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Rename option bit <span style="font-style: italic;">FLASH_OBR_BOOT1</span> to <span style="font-style: italic;">FLASH_OBR_nBOOT1</span></span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Rename <span style="font-style: italic;">FLASH_OBR_VDDA_ANALOG</span> to <span style="font-style: italic;">FLASH_OBR_VDDA_MONITOR</span></span></li><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add Flash and OB keys (removed from Flash driver)</span></li></ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">system_stm32f0xx.c</span></li><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">SetSysClock()</span> function: code optimized </span></li></ul><ul><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Miscellaneous formatting<br></span></li></ul></ul> - <h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.0RC1 / 27-January-2012<o:p></o:p></span></h3> - <p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main -Changes<o:p></o:p></span></u></b></p> - - <ul style="margin-top: 0cm;" type="square"> -<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Official version (V1.0.0) Release Candidate 1</span><span style="font-size: 10pt; font-family: Verdana;"></span></li> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-family: Verdana; font-size: 10pt;">All source -files: update disclaimer to add reference to the new license agreement</span></li> - <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Update all peripherals bits definitions<br> -</span></li> - </ul><span style="font-size: 10pt; font-family: Verdana;"><span style="font-weight: bold;"></span><span style="font-weight: bold; font-style: italic;"></span></span> - -<ul style="margin-top: 0in;" type="disc"> -</ul> -<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"><a name="License"></a><span style="font-size: 12pt; color: white;">License<o:p></o:p></span></h2><p class="MsoNormal"><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;">Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); You may not use this </span><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;">package</span><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;"> except in compliance with the License. You may obtain a copy of the License at:<br><br></span></p><div style="text-align: center;"><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;"> <a target="_blank" href="http://www.st.com/software_license_agreement_liberty_v2">http://www.st.com/software_license_agreement_liberty_v2</a></span><br><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;"></span></div><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;"><br>Unless -required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, <br>WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See -the License for the specific language governing permissions and -limitations under the License.</span> - -<div class="MsoNormal" style="text-align: center;" align="center"><span style="color: black;"> -<hr align="center" size="2" width="100%"></span></div> -<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt; text-align: center;" align="center"><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;">For - complete documentation on </span><span style="font-size: 10pt; font-family: "Verdana","sans-serif";">STM32<span style="color: black;"> - Microcontrollers visit </span><u><span style="color: blue;"><a href="http://www.st.com/internet/mcu/family/141.jsp" target="_blank">www.st.com/STM32</a></span></u></span><span style="font-size: 10pt; font-family: Verdana;"><u><span style="color: blue;"><a href="http://www.st.com/internet/mcu/family/141.jsp" target="_blank"></a></span></u></span><span style="color: black;"><o:p></o:p></span></p> -</td> -</tr> -</tbody> -</table> -<p class="MsoNormal"><span style="font-size: 10pt;"><o:p></o:p></span></p> -</td> -</tr> -</tbody> -</table> -</div> -<p class="MsoNormal"><o:p> </o:p></p> -</div> -</body></html> \ No newline at end of file diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f030.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f030.s deleted file mode 100644 index 9bef368..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f030.s +++ /dev/null @@ -1,280 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f030.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F030 Devices vector table for Atollic toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call static constructors */ - bl __libc_init_array -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - -g_pfnVectors: - .word _estack - .word Reset_Handler - - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - - .word WWDG_IRQHandler - .word 0 - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word 0 - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_IRQHandler - .word ADC1_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word 0 - .word TIM3_IRQHandler - .word 0 - .word 0 - .word TIM14_IRQHandler - .word TIM15_IRQHandler - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word I2C2_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word 0 - .word 0 - .word 0 - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_IRQHandler - .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler - - .weak ADC1_IRQHandler - .thumb_set ADC1_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM15_IRQHandler - .thumb_set TIM15_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak I2C2_IRQHandler - .thumb_set I2C2_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f031.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f031.s deleted file mode 100644 index f4454d0..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f031.s +++ /dev/null @@ -1,275 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f031.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F031 Devices vector table for Atollic toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call static constructors */ - bl __libc_init_array -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - -g_pfnVectors: - .word _estack - .word Reset_Handler - - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word 0 - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_IRQHandler - .word ADC1_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word 0 - .word 0 - .word TIM14_IRQHandler - .word 0 - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word 0 - .word SPI1_IRQHandler - .word 0 - .word USART1_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_IRQHandler - .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler - - .weak ADC1_IRQHandler - .thumb_set ADC1_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - \ No newline at end of file diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f042.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f042.s deleted file mode 100644 index 0255c25..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f042.s +++ /dev/null @@ -1,289 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f042.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F042 Devices vector table for Atollic toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call static constructors */ - bl __libc_init_array -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - -g_pfnVectors: - .word _estack - .word Reset_Handler - - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - - .word WWDG_IRQHandler - .word PVD_VDDIO2_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_CRS_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word TSC_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_IRQHandler - .word ADC1_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word 0 - .word 0 - .word TIM14_IRQHandler - .word 0 - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word 0 - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word 0 - .word CEC_CAN_IRQHandler - .word USB_IRQHandler - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_VDDIO2_IRQHandler - .thumb_set PVD_VDDIO2_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_CRS_IRQHandler - .thumb_set RCC_CRS_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak TSC_IRQHandler - .thumb_set TSC_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_IRQHandler - .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler - - .weak ADC1_IRQHandler - .thumb_set ADC1_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak CEC_CAN_IRQHandler - .thumb_set CEC_CAN_IRQHandler,Default_Handler - - - .weak USB_IRQHandler - .thumb_set USB_IRQHandler,Default_Handler -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f051.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f051.s deleted file mode 100644 index d44725a..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f051.s +++ /dev/null @@ -1,295 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f051.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F051 Devices vector table for Atollic toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call static constructors */ - bl __libc_init_array -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - -g_pfnVectors: - .word _estack - .word Reset_Handler - - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word TS_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_IRQHandler - .word ADC1_COMP_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word TIM6_DAC_IRQHandler - .word 0 - .word TIM14_IRQHandler - .word TIM15_IRQHandler - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word I2C2_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word 0 - .word CEC_IRQHandler - .word 0 - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak TS_IRQHandler - .thumb_set TS_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_IRQHandler - .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler - - .weak ADC1_COMP_IRQHandler - .thumb_set ADC1_COMP_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM15_IRQHandler - .thumb_set TIM15_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak I2C2_IRQHandler - .thumb_set I2C2_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak CEC_IRQHandler - .thumb_set CEC_IRQHandler,Default_Handler - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f072.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f072.s deleted file mode 100644 index 2a270e5..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f072.s +++ /dev/null @@ -1,304 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f072.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F072 Devices vector table for Atollic toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call static constructors */ - bl __libc_init_array -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - -g_pfnVectors: - .word _estack - .word Reset_Handler - - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - - .word WWDG_IRQHandler - .word PVD_VDDIO2_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_CRS_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word TSC_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_6_7_IRQHandler - .word ADC1_COMP_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word TIM6_DAC_IRQHandler - .word TIM7_IRQHandler - .word TIM14_IRQHandler - .word TIM15_IRQHandler - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word I2C2_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word USART3_4_IRQHandler - .word CEC_CAN_IRQHandler - .word USB_IRQHandler - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_VDDIO2_IRQHandler - .thumb_set PVD_VDDIO2_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_CRS_IRQHandler - .thumb_set RCC_CRS_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak TSC_IRQHandler - .thumb_set TSC_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_6_7_IRQHandler - .thumb_set DMA1_Channel4_5_6_7_IRQHandler,Default_Handler - - .weak ADC1_COMP_IRQHandler - .thumb_set ADC1_COMP_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM15_IRQHandler - .thumb_set TIM15_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak I2C2_IRQHandler - .thumb_set I2C2_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_4_IRQHandler - .thumb_set USART3_4_IRQHandler,Default_Handler - - .weak CEC_CAN_IRQHandler - .thumb_set CEC_CAN_IRQHandler,Default_Handler - - .weak USB_IRQHandler - .thumb_set USB_IRQHandler,Default_Handler - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f0xx.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f0xx.s deleted file mode 100644 index 36b18c7..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f0xx.s +++ /dev/null @@ -1,293 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f0xx.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F0xx Devices vector table for Atollic toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call static constructors */ - bl __libc_init_array -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word TS_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_IRQHandler - .word ADC1_COMP_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word TIM6_DAC_IRQHandler - .word 0 - .word TIM14_IRQHandler - .word TIM15_IRQHandler - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word I2C2_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word 0 - .word CEC_IRQHandler - .word 0 - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak TS_IRQHandler - .thumb_set TS_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_IRQHandler - .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler - - .weak ADC1_COMP_IRQHandler - .thumb_set ADC1_COMP_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM15_IRQHandler - .thumb_set TIM15_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak I2C2_IRQHandler - .thumb_set I2C2_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak CEC_IRQHandler - .thumb_set CEC_IRQHandler,Default_Handler - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f0xx_ld.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f0xx_ld.s deleted file mode 100644 index aa59dab..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/TrueSTUDIO/startup_stm32f0xx_ld.s +++ /dev/null @@ -1,273 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f0xx_ld.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F031 devices vector table for Atollic toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call static constructors */ - bl __libc_init_array -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word 0 - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_IRQHandler - .word ADC1_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word 0 - .word 0 - .word TIM14_IRQHandler - .word 0 - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word 0 - .word SPI1_IRQHandler - .word 0 - .word USART1_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_IRQHandler - .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler - - .weak ADC1_IRQHandler - .thumb_set ADC1_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f030.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f030.s deleted file mode 100644 index 187f5d7..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f030.s +++ /dev/null @@ -1,244 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f030.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F030 devices vector table for MDK-ARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the system clock -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; <h> Stack Configuration -; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; <h> Heap Configuration -; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD 0 ; Reserved - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD 0 ; Reserved - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5 - DCD ADC1_IRQHandler ; ADC1 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD 0 ; Reserved - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD TIM15_IRQHandler ; TIM15 - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD I2C2_IRQHandler ; I2C2 - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler routine -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_1_IRQHandler [WEAK] - EXPORT EXTI2_3_IRQHandler [WEAK] - EXPORT EXTI4_15_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_5_IRQHandler [WEAK] - EXPORT ADC1_IRQHandler [WEAK] - EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM14_IRQHandler [WEAK] - EXPORT TIM15_IRQHandler [WEAK] - EXPORT TIM16_IRQHandler [WEAK] - EXPORT TIM17_IRQHandler [WEAK] - EXPORT I2C1_IRQHandler [WEAK] - EXPORT I2C2_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - - -WWDG_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_1_IRQHandler -EXTI2_3_IRQHandler -EXTI4_15_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_3_IRQHandler -DMA1_Channel4_5_IRQHandler -ADC1_IRQHandler -TIM1_BRK_UP_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM3_IRQHandler -TIM14_IRQHandler -TIM15_IRQHandler -TIM16_IRQHandler -TIM17_IRQHandler -I2C1_IRQHandler -I2C2_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f031.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f031.s deleted file mode 100644 index d6b1e6c..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f031.s +++ /dev/null @@ -1,239 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f031.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F031 devices vector table for MDK-ARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the system clock -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; <h> Stack Configuration -; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; <h> Heap Configuration -; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD 0 ; Reserved - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5 - DCD ADC1_IRQHandler ; ADC1 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD 0 ; Reserved - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD 0 ; Reserved - DCD SPI1_IRQHandler ; SPI1 - DCD 0 ; Reserved - DCD USART1_IRQHandler ; USART1 - -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler routine -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_1_IRQHandler [WEAK] - EXPORT EXTI2_3_IRQHandler [WEAK] - EXPORT EXTI4_15_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_5_IRQHandler [WEAK] - EXPORT ADC1_IRQHandler [WEAK] - EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM14_IRQHandler [WEAK] - EXPORT TIM16_IRQHandler [WEAK] - EXPORT TIM17_IRQHandler [WEAK] - EXPORT I2C1_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - - -WWDG_IRQHandler -PVD_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_1_IRQHandler -EXTI2_3_IRQHandler -EXTI4_15_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_3_IRQHandler -DMA1_Channel4_5_IRQHandler -ADC1_IRQHandler -TIM1_BRK_UP_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM14_IRQHandler -TIM16_IRQHandler -TIM17_IRQHandler -I2C1_IRQHandler -SPI1_IRQHandler -USART1_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f042.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f042.s deleted file mode 100644 index ebf6eef..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f042.s +++ /dev/null @@ -1,254 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f042.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F042 Devices vector table for -;* for MDK-ARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the system clock -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; <h> Stack Configuration -; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; <h> Heap Configuration -; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_VDDIO2_IRQHandler ; PVD and VDDIO2 through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_CRS_IRQHandler ; RCC and CRS - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD TSC_IRQHandler ; TS - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4, Channel 5 - DCD ADC1_IRQHandler ; ADC1 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD 0 ; Reserved - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD 0 ; Reserved - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD CEC_CAN_IRQHandler ; CEC and CAN - DCD USB_IRQHandler ; USB - -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler routine -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_VDDIO2_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_CRS_IRQHandler [WEAK] - EXPORT EXTI0_1_IRQHandler [WEAK] - EXPORT EXTI2_3_IRQHandler [WEAK] - EXPORT EXTI4_15_IRQHandler [WEAK] - EXPORT TSC_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_5_IRQHandler [WEAK] - EXPORT ADC1_IRQHandler [WEAK] - EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM14_IRQHandler [WEAK] - EXPORT TIM16_IRQHandler [WEAK] - EXPORT TIM17_IRQHandler [WEAK] - EXPORT I2C1_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT CEC_CAN_IRQHandler [WEAK] - EXPORT USB_IRQHandler [WEAK] - - -WWDG_IRQHandler -PVD_VDDIO2_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_CRS_IRQHandler -EXTI0_1_IRQHandler -EXTI2_3_IRQHandler -EXTI4_15_IRQHandler -TSC_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_3_IRQHandler -DMA1_Channel4_5_IRQHandler -ADC1_IRQHandler -TIM1_BRK_UP_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM14_IRQHandler -TIM16_IRQHandler -TIM17_IRQHandler -I2C1_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -CEC_CAN_IRQHandler -USB_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f051.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f051.s deleted file mode 100644 index 1e194f5..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f051.s +++ /dev/null @@ -1,257 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f051.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F051 devices vector table for MDK-ARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the system clock -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; <h> Stack Configuration -; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; <h> Heap Configuration -; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD TS_IRQHandler ; TS - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5 - DCD ADC1_COMP_IRQHandler ; ADC1, COMP1 and COMP2 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM6_DAC_IRQHandler ; TIM6 and DAC - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD TIM15_IRQHandler ; TIM15 - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD I2C2_IRQHandler ; I2C2 - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD CEC_IRQHandler ; CEC - DCD 0 ; Reserved - -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler routine -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_1_IRQHandler [WEAK] - EXPORT EXTI2_3_IRQHandler [WEAK] - EXPORT EXTI4_15_IRQHandler [WEAK] - EXPORT TS_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_5_IRQHandler [WEAK] - EXPORT ADC1_COMP_IRQHandler [WEAK] - EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM6_DAC_IRQHandler [WEAK] - EXPORT TIM14_IRQHandler [WEAK] - EXPORT TIM15_IRQHandler [WEAK] - EXPORT TIM16_IRQHandler [WEAK] - EXPORT TIM17_IRQHandler [WEAK] - EXPORT I2C1_IRQHandler [WEAK] - EXPORT I2C2_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT CEC_IRQHandler [WEAK] - - -WWDG_IRQHandler -PVD_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_1_IRQHandler -EXTI2_3_IRQHandler -EXTI4_15_IRQHandler -TS_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_3_IRQHandler -DMA1_Channel4_5_IRQHandler -ADC1_COMP_IRQHandler -TIM1_BRK_UP_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM6_DAC_IRQHandler -TIM14_IRQHandler -TIM15_IRQHandler -TIM16_IRQHandler -TIM17_IRQHandler -I2C1_IRQHandler -I2C2_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -CEC_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f072.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f072.s deleted file mode 100644 index f1a85a3..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f072.s +++ /dev/null @@ -1,264 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f072.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F072 Devices vector table for -;* for MDK-ARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the system clock -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; <h> Stack Configuration -; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; <h> Heap Configuration -; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_VDDIO2_IRQHandler ; PVD and VDDIO2 through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_CRS_IRQHandler ; RCC and CRS - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD TSC_IRQHandler ; TS - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_6_7_IRQHandler ; DMA1 Channel 4, Channel 5, Channel 6 and Channel 7 - DCD ADC1_COMP_IRQHandler ; ADC1, COMP1 and COMP2 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM6_DAC_IRQHandler ; TIM6 and DAC - DCD TIM7_IRQHandler ; TIM7 - DCD TIM14_IRQHandler ; TIM14 - DCD TIM15_IRQHandler ; TIM15 - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD I2C2_IRQHandler ; I2C2 - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_4_IRQHandler ; USART3 and USART4 - DCD CEC_CAN_IRQHandler ; CEC and CAN - DCD USB_IRQHandler ; USB - -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler routine -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_VDDIO2_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_CRS_IRQHandler [WEAK] - EXPORT EXTI0_1_IRQHandler [WEAK] - EXPORT EXTI2_3_IRQHandler [WEAK] - EXPORT EXTI4_15_IRQHandler [WEAK] - EXPORT TSC_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_5_6_7_IRQHandler [WEAK] - EXPORT ADC1_COMP_IRQHandler [WEAK] - EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM6_DAC_IRQHandler [WEAK] - EXPORT TIM7_IRQHandler [WEAK] - EXPORT TIM14_IRQHandler [WEAK] - EXPORT TIM15_IRQHandler [WEAK] - EXPORT TIM16_IRQHandler [WEAK] - EXPORT TIM17_IRQHandler [WEAK] - EXPORT I2C1_IRQHandler [WEAK] - EXPORT I2C2_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT USART3_4_IRQHandler [WEAK] - EXPORT CEC_CAN_IRQHandler [WEAK] - EXPORT USB_IRQHandler [WEAK] - - -WWDG_IRQHandler -PVD_VDDIO2_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_CRS_IRQHandler -EXTI0_1_IRQHandler -EXTI2_3_IRQHandler -EXTI4_15_IRQHandler -TSC_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_3_IRQHandler -DMA1_Channel4_5_6_7_IRQHandler -ADC1_COMP_IRQHandler -TIM1_BRK_UP_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM6_DAC_IRQHandler -TIM7_IRQHandler -TIM14_IRQHandler -TIM15_IRQHandler -TIM16_IRQHandler -TIM17_IRQHandler -I2C1_IRQHandler -I2C2_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -USART3_4_IRQHandler -CEC_CAN_IRQHandler -USB_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f0xx.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f0xx.s deleted file mode 100644 index 7e2bb2b..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f0xx.s +++ /dev/null @@ -1,257 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f0xx.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F051 devices vector table for MDK-ARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the system clock -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; <h> Stack Configuration -; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; <h> Heap Configuration -; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD TS_IRQHandler ; TS - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5 - DCD ADC1_COMP_IRQHandler ; ADC1, COMP1 and COMP2 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM6_DAC_IRQHandler ; TIM6 and DAC - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD TIM15_IRQHandler ; TIM15 - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD I2C2_IRQHandler ; I2C2 - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD CEC_IRQHandler ; CEC - DCD 0 ; Reserved - -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler routine -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_1_IRQHandler [WEAK] - EXPORT EXTI2_3_IRQHandler [WEAK] - EXPORT EXTI4_15_IRQHandler [WEAK] - EXPORT TS_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_5_IRQHandler [WEAK] - EXPORT ADC1_COMP_IRQHandler [WEAK] - EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM6_DAC_IRQHandler [WEAK] - EXPORT TIM14_IRQHandler [WEAK] - EXPORT TIM15_IRQHandler [WEAK] - EXPORT TIM16_IRQHandler [WEAK] - EXPORT TIM17_IRQHandler [WEAK] - EXPORT I2C1_IRQHandler [WEAK] - EXPORT I2C2_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT CEC_IRQHandler [WEAK] - - -WWDG_IRQHandler -PVD_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_1_IRQHandler -EXTI2_3_IRQHandler -EXTI4_15_IRQHandler -TS_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_3_IRQHandler -DMA1_Channel4_5_IRQHandler -ADC1_COMP_IRQHandler -TIM1_BRK_UP_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM6_DAC_IRQHandler -TIM14_IRQHandler -TIM15_IRQHandler -TIM16_IRQHandler -TIM17_IRQHandler -I2C1_IRQHandler -I2C2_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -CEC_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f0xx_ld.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f0xx_ld.s deleted file mode 100644 index 22a9807..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f0xx_ld.s +++ /dev/null @@ -1,239 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f0xx_ld.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F0031 devices vector table for MDK-ARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the system clock -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; <h> Stack Configuration -; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; <h> Heap Configuration -; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; </h> - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD 0 ; Reserved - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5 - DCD ADC1_IRQHandler ; ADC1 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD 0 ; Reserved - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD 0 ; Reserved - DCD SPI1_IRQHandler ; SPI1 - DCD 0 ; Reserved - DCD USART1_IRQHandler ; USART1 - -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler routine -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_1_IRQHandler [WEAK] - EXPORT EXTI2_3_IRQHandler [WEAK] - EXPORT EXTI4_15_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_5_IRQHandler [WEAK] - EXPORT ADC1_IRQHandler [WEAK] - EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM14_IRQHandler [WEAK] - EXPORT TIM16_IRQHandler [WEAK] - EXPORT TIM17_IRQHandler [WEAK] - EXPORT I2C1_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - - -WWDG_IRQHandler -PVD_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_1_IRQHandler -EXTI2_3_IRQHandler -EXTI4_15_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_3_IRQHandler -DMA1_Channel4_5_IRQHandler -ADC1_IRQHandler -TIM1_BRK_UP_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM14_IRQHandler -TIM16_IRQHandler -TIM17_IRQHandler -I2C1_IRQHandler -SPI1_IRQHandler -USART1_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f030.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f030.s deleted file mode 100644 index f157834..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f030.s +++ /dev/null @@ -1,294 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f0xx.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F030 Devices vector table for RIDE7 toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - -.equ BootRAM, 0xF108F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit - -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - - .word WWDG_IRQHandler - .word 0 - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word 0 - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_IRQHandler - .word ADC1_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word 0 - .word TIM3_IRQHandler - .word 0 - .word 0 - .word TIM14_IRQHandler - .word TIM15_IRQHandler - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word I2C2_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word 0 - .word 0 - .word 0 - .word BootRAM /* @0x108. This is for boot in RAM mode for - STM32F0xx devices. */ - - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_IRQHandler - .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler - - .weak ADC1_IRQHandler - .thumb_set ADC1_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM15_IRQHandler - .thumb_set TIM15_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak I2C2_IRQHandler - .thumb_set I2C2_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f031.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f031.s deleted file mode 100644 index 7cca763..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f031.s +++ /dev/null @@ -1,287 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f0xx.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F031 Devices vector table for RIDE7 toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - -.equ BootRAM, 0xF108F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit - -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - - -g_pfnVectors: - .word _estack - .word Reset_Handler - - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word 0 - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_IRQHandler - .word ADC1_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word 0 - .word 0 - .word TIM14_IRQHandler - .word 0 - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word 0 - .word SPI1_IRQHandler - .word 0 - .word USART1_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word BootRAM /* @0x108. This is for boot in RAM mode for - STM32F0xx devices. */ - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_IRQHandler - .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler - - .weak ADC1_IRQHandler - .thumb_set ADC1_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f042.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f042.s deleted file mode 100644 index 598290c..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f042.s +++ /dev/null @@ -1,302 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f042.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F042 Devices vector table for Atollic toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - -.equ BootRAM, 0xF108F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call static constructors */ - bl __libc_init_array -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - -g_pfnVectors: - .word _estack - .word Reset_Handler - - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - - .word WWDG_IRQHandler - .word PVD_VDDIO2_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_CRS_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word TSC_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_IRQHandler - .word ADC1_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word 0 - .word 0 - .word TIM14_IRQHandler - .word 0 - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word 0 - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word 0 - .word CEC_CAN_IRQHandler - .word USB_IRQHandler - .word BootRAM /* @0x108. This is for boot in RAM mode for - STM32F0xx devices. */ - - - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_VDDIO2_IRQHandler - .thumb_set PVD_VDDIO2_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_CRS_IRQHandler - .thumb_set RCC_CRS_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak TSC_IRQHandler - .thumb_set TSC_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_IRQHandler - .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler - - .weak ADC1_IRQHandler - .thumb_set ADC1_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak CEC_CAN_IRQHandler - .thumb_set CEC_CAN_IRQHandler,Default_Handler - - - .weak USB_IRQHandler - .thumb_set USB_IRQHandler,Default_Handler -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f051.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f051.s deleted file mode 100644 index b0bb312..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f051.s +++ /dev/null @@ -1,307 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f0xx.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F051 Devices vector table for RIDE7 toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - -.equ BootRAM, 0xF108F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit - -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word TS_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_IRQHandler - .word ADC1_COMP_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word TIM6_DAC_IRQHandler - .word 0 - .word TIM14_IRQHandler - .word TIM15_IRQHandler - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word I2C2_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word 0 - .word CEC_IRQHandler - .word 0 - .word BootRAM /* @0x108. This is for boot in RAM mode for - STM32F0xx devices. */ - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak TS_IRQHandler - .thumb_set TS_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_IRQHandler - .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler - - .weak ADC1_COMP_IRQHandler - .thumb_set ADC1_COMP_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM15_IRQHandler - .thumb_set TIM15_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak I2C2_IRQHandler - .thumb_set I2C2_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak CEC_IRQHandler - .thumb_set CEC_IRQHandler,Default_Handler - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f072.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f072.s deleted file mode 100644 index 21bb90c..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f072.s +++ /dev/null @@ -1,316 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f0xx.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F072 Devices vector table for RIDE7 toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - -.equ BootRAM, 0xF108F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit - -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - - .word WWDG_IRQHandler - .word PVD_VDDIO2_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_CRS_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word TSC_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_6_7_IRQHandler - .word ADC1_COMP_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word TIM6_DAC_IRQHandler - .word TIM7_IRQHandler - .word TIM14_IRQHandler - .word TIM15_IRQHandler - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word I2C2_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word USART3_4_IRQHandler - .word CEC_CAN_IRQHandler - .word USB_IRQHandler - .word BootRAM /* @0x108. This is for boot in RAM mode for - STM32F0xx devices. */ - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_VDDIO2_IRQHandler - .thumb_set PVD_VDDIO2_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_CRS_IRQHandler - .thumb_set RCC_CRS_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak TSC_IRQHandler - .thumb_set TSC_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_6_7_IRQHandler - .thumb_set DMA1_Channel4_5_6_7_IRQHandler,Default_Handler - - .weak ADC1_COMP_IRQHandler - .thumb_set ADC1_COMP_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM15_IRQHandler - .thumb_set TIM15_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak I2C2_IRQHandler - .thumb_set I2C2_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_4_IRQHandler - .thumb_set USART3_4_IRQHandler,Default_Handler - - .weak CEC_CAN_IRQHandler - .thumb_set CEC_CAN_IRQHandler,Default_Handler - - .weak USB_IRQHandler - .thumb_set USB_IRQHandler,Default_Handler - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f0xx.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f0xx.s deleted file mode 100644 index 3ed8d9d..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f0xx.s +++ /dev/null @@ -1,304 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f0xx.s - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief STM32F0xx Devices vector table for RIDE7 toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the system clock - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M0 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m0 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - -.equ BootRAM, 0xF108F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr r0, =_estack - mov sp, r0 /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2] - adds r2, r2, #4 - - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit - -/* Call the application's entry point.*/ - bl main - -LoopForever: - b LoopForever - - -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * - * @param None - * @retval : None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M0. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word 0 - .word 0 - .word PendSV_Handler - .word SysTick_Handler - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_1_IRQHandler - .word EXTI2_3_IRQHandler - .word EXTI4_15_IRQHandler - .word TS_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_3_IRQHandler - .word DMA1_Channel4_5_IRQHandler - .word ADC1_COMP_IRQHandler - .word TIM1_BRK_UP_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word TIM6_DAC_IRQHandler - .word 0 - .word TIM14_IRQHandler - .word TIM15_IRQHandler - .word TIM16_IRQHandler - .word TIM17_IRQHandler - .word I2C1_IRQHandler - .word I2C2_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word 0 - .word CEC_IRQHandler - .word 0 - .word BootRAM /* @0x108. This is for boot in RAM mode for - STM32F0xx devices. */ - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_1_IRQHandler - .thumb_set EXTI0_1_IRQHandler,Default_Handler - - .weak EXTI2_3_IRQHandler - .thumb_set EXTI2_3_IRQHandler,Default_Handler - - .weak EXTI4_15_IRQHandler - .thumb_set EXTI4_15_IRQHandler,Default_Handler - - .weak TS_IRQHandler - .thumb_set TS_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_3_IRQHandler - .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_5_IRQHandler - .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler - - .weak ADC1_COMP_IRQHandler - .thumb_set ADC1_COMP_IRQHandler,Default_Handler - - .weak TIM1_BRK_UP_TRG_COM_IRQHandler - .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM14_IRQHandler - .thumb_set TIM14_IRQHandler,Default_Handler - - .weak TIM15_IRQHandler - .thumb_set TIM15_IRQHandler,Default_Handler - - .weak TIM16_IRQHandler - .thumb_set TIM16_IRQHandler,Default_Handler - - .weak TIM17_IRQHandler - .thumb_set TIM17_IRQHandler,Default_Handler - - .weak I2C1_IRQHandler - .thumb_set I2C1_IRQHandler,Default_Handler - - .weak I2C2_IRQHandler - .thumb_set I2C2_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak CEC_IRQHandler - .thumb_set CEC_IRQHandler,Default_Handler - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f030.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f030.s deleted file mode 100644 index f2e5603..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f030.s +++ /dev/null @@ -1,300 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f030.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F030 devices vector table for EWARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address -;* - Configure the system clock -;* - Branches to main in the C library (which eventually -;* calls main()). -;* After Reset the Cortex-M0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD 0 ; Reserved - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD 0 ; Reserved - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5 - DCD ADC1_IRQHandler ; ADC1 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD 0 ; Reserved - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD TIM15_IRQHandler ; TIM15 - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD I2C2_IRQHandler ; I2C2 - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -NMI_Handler - B NMI_Handler - - - PUBWEAK HardFault_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -HardFault_Handler - B HardFault_Handler - - - PUBWEAK SVC_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SVC_Handler - B SVC_Handler - - - PUBWEAK PendSV_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -PendSV_Handler - B PendSV_Handler - - - PUBWEAK SysTick_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SysTick_Handler - B SysTick_Handler - - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - - PUBWEAK RCC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RCC_IRQHandler - B RCC_IRQHandler - - - PUBWEAK EXTI0_1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI0_1_IRQHandler - B EXTI0_1_IRQHandler - - - PUBWEAK EXTI2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI2_3_IRQHandler - B EXTI2_3_IRQHandler - - - PUBWEAK EXTI4_15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI4_15_IRQHandler - B EXTI4_15_IRQHandler - - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - - PUBWEAK DMA1_Channel2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel2_3_IRQHandler - B DMA1_Channel2_3_IRQHandler - - - PUBWEAK DMA1_Channel4_5_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel4_5_IRQHandler - B DMA1_Channel4_5_IRQHandler - - - PUBWEAK ADC1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -ADC1_IRQHandler - B ADC1_IRQHandler - - - PUBWEAK TIM1_BRK_UP_TRG_COM_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_BRK_UP_TRG_COM_IRQHandler - B TIM1_BRK_UP_TRG_COM_IRQHandler - - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - - PUBWEAK TIM14_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM14_IRQHandler - B TIM14_IRQHandler - - - PUBWEAK TIM15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM15_IRQHandler - B TIM15_IRQHandler - - - PUBWEAK TIM16_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM16_IRQHandler - B TIM16_IRQHandler - - - PUBWEAK TIM17_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM17_IRQHandler - B TIM17_IRQHandler - - - PUBWEAK I2C1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C1_IRQHandler - B I2C1_IRQHandler - - - PUBWEAK I2C2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C2_IRQHandler - B I2C2_IRQHandler - - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - - PUBWEAK SPI2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI2_IRQHandler - B SPI2_IRQHandler - - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - END -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f031.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f031.s deleted file mode 100644 index a8718ca..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f031.s +++ /dev/null @@ -1,288 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f031.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F031 devices vector table for EWARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address -;* - Configure the system clock -;* - Branches to main in the C library (which eventually -;* calls main()). -;* After Reset the Cortex-M0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD 0 ; Reserved - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5 - DCD ADC1_IRQHandler ; ADC1 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD 0 ; Reserved - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD 0 ; Reserved - DCD SPI1_IRQHandler ; SPI1 - DCD 0 ; Reserved - DCD USART1_IRQHandler ; USART1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -NMI_Handler - B NMI_Handler - - - PUBWEAK HardFault_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -HardFault_Handler - B HardFault_Handler - - - PUBWEAK SVC_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SVC_Handler - B SVC_Handler - - - PUBWEAK PendSV_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -PendSV_Handler - B PendSV_Handler - - - PUBWEAK SysTick_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SysTick_Handler - B SysTick_Handler - - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - - PUBWEAK PVD_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -PVD_IRQHandler - B PVD_IRQHandler - - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - - PUBWEAK RCC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RCC_IRQHandler - B RCC_IRQHandler - - - PUBWEAK EXTI0_1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI0_1_IRQHandler - B EXTI0_1_IRQHandler - - - PUBWEAK EXTI2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI2_3_IRQHandler - B EXTI2_3_IRQHandler - - - PUBWEAK EXTI4_15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI4_15_IRQHandler - B EXTI4_15_IRQHandler - - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - - PUBWEAK DMA1_Channel2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel2_3_IRQHandler - B DMA1_Channel2_3_IRQHandler - - - PUBWEAK DMA1_Channel4_5_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel4_5_IRQHandler - B DMA1_Channel4_5_IRQHandler - - - PUBWEAK ADC1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -ADC1_IRQHandler - B ADC1_IRQHandler - - - PUBWEAK TIM1_BRK_UP_TRG_COM_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_BRK_UP_TRG_COM_IRQHandler - B TIM1_BRK_UP_TRG_COM_IRQHandler - - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - - PUBWEAK TIM14_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM14_IRQHandler - B TIM14_IRQHandler - - - PUBWEAK TIM16_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM16_IRQHandler - B TIM16_IRQHandler - - - PUBWEAK TIM17_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM17_IRQHandler - B TIM17_IRQHandler - - - PUBWEAK I2C1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C1_IRQHandler - B I2C1_IRQHandler - - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - - END -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f042.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f042.s deleted file mode 100644 index 1ebe046..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f042.s +++ /dev/null @@ -1,318 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f042.s -;* Author : MCD Appl&ication Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F042 Devices Devices vector table for -;* EWARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address. -;* After Reset the Cortex-M0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_VDDIO2_IRQHandler ; PVD and VDDIO2 through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_CRS_IRQHandler ; RCC and CRS - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD TSC_IRQHandler ; TS - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4, Channel 5, Channel 6 and Channel 7 - DCD ADC1_IRQHandler ; ADC1 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD 0 ; Reserved - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD 0 ; Reserved - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD CEC_CAN_IRQHandler ; CEC and CAN - DCD USB_IRQHandler ; USB - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -NMI_Handler - B NMI_Handler - - - PUBWEAK HardFault_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -HardFault_Handler - B HardFault_Handler - - - PUBWEAK SVC_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SVC_Handler - B SVC_Handler - - - PUBWEAK PendSV_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -PendSV_Handler - B PendSV_Handler - - - PUBWEAK SysTick_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SysTick_Handler - B SysTick_Handler - - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - - PUBWEAK PVD_VDDIO2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -PVD_VDDIO2_IRQHandler - B PVD_VDDIO2_IRQHandler - - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - - PUBWEAK RCC_CRS_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RCC_CRS_IRQHandler - B RCC_CRS_IRQHandler - - - PUBWEAK EXTI0_1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI0_1_IRQHandler - B EXTI0_1_IRQHandler - - - PUBWEAK EXTI2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI2_3_IRQHandler - B EXTI2_3_IRQHandler - - - PUBWEAK EXTI4_15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI4_15_IRQHandler - B EXTI4_15_IRQHandler - - - PUBWEAK TSC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TSC_IRQHandler - B TSC_IRQHandler - - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - - PUBWEAK DMA1_Channel2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel2_3_IRQHandler - B DMA1_Channel2_3_IRQHandler - - - PUBWEAK DMA1_Channel4_5_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel4_5_IRQHandler - B DMA1_Channel4_5_IRQHandler - - - PUBWEAK ADC1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -ADC1_IRQHandler - B ADC1_IRQHandler - - - PUBWEAK TIM1_BRK_UP_TRG_COM_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_BRK_UP_TRG_COM_IRQHandler - B TIM1_BRK_UP_TRG_COM_IRQHandler - - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - - PUBWEAK TIM14_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM14_IRQHandler - B TIM14_IRQHandler - - - PUBWEAK TIM16_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM16_IRQHandler - B TIM16_IRQHandler - - - PUBWEAK TIM17_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM17_IRQHandler - B TIM17_IRQHandler - - - PUBWEAK I2C1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C1_IRQHandler - B I2C1_IRQHandler - - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - - PUBWEAK SPI2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI2_IRQHandler - B SPI2_IRQHandler - - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - - PUBWEAK CEC_CAN_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CEC_CAN_IRQHandler - B CEC_CAN_IRQHandler - - PUBWEAK USB_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USB_IRQHandler - B USB_IRQHandler - - END -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f051.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f051.s deleted file mode 100644 index 29c1e7a..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f051.s +++ /dev/null @@ -1,333 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f051.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F051 devices vector table for EWARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address -;* - Configure the system clock -;* - Branches to main in the C library (which eventually -;* calls main()). -;* After Reset the Cortex-M0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD TS_IRQHandler ; TS - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5 - DCD ADC1_COMP_IRQHandler ; ADC1, COMP1 and COMP2 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM6_DAC_IRQHandler ; TIM6 and DAC - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD TIM15_IRQHandler ; TIM15 - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD I2C2_IRQHandler ; I2C2 - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD CEC_IRQHandler ; CEC - DCD 0 ; Reserved - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -NMI_Handler - B NMI_Handler - - - PUBWEAK HardFault_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -HardFault_Handler - B HardFault_Handler - - - PUBWEAK SVC_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SVC_Handler - B SVC_Handler - - - PUBWEAK PendSV_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -PendSV_Handler - B PendSV_Handler - - - PUBWEAK SysTick_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SysTick_Handler - B SysTick_Handler - - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - - PUBWEAK PVD_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -PVD_IRQHandler - B PVD_IRQHandler - - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - - PUBWEAK RCC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RCC_IRQHandler - B RCC_IRQHandler - - - PUBWEAK EXTI0_1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI0_1_IRQHandler - B EXTI0_1_IRQHandler - - - PUBWEAK EXTI2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI2_3_IRQHandler - B EXTI2_3_IRQHandler - - - PUBWEAK EXTI4_15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI4_15_IRQHandler - B EXTI4_15_IRQHandler - - - PUBWEAK TS_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TS_IRQHandler - B TS_IRQHandler - - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - - PUBWEAK DMA1_Channel2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel2_3_IRQHandler - B DMA1_Channel2_3_IRQHandler - - - PUBWEAK DMA1_Channel4_5_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel4_5_IRQHandler - B DMA1_Channel4_5_IRQHandler - - - PUBWEAK ADC1_COMP_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -ADC1_COMP_IRQHandler - B ADC1_COMP_IRQHandler - - - PUBWEAK TIM1_BRK_UP_TRG_COM_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_BRK_UP_TRG_COM_IRQHandler - B TIM1_BRK_UP_TRG_COM_IRQHandler - - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - - PUBWEAK TIM6_DAC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM6_DAC_IRQHandler - B TIM6_DAC_IRQHandler - - - PUBWEAK TIM14_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM14_IRQHandler - B TIM14_IRQHandler - - - PUBWEAK TIM15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM15_IRQHandler - B TIM15_IRQHandler - - - PUBWEAK TIM16_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM16_IRQHandler - B TIM16_IRQHandler - - - PUBWEAK TIM17_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM17_IRQHandler - B TIM17_IRQHandler - - - PUBWEAK I2C1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C1_IRQHandler - B I2C1_IRQHandler - - - PUBWEAK I2C2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C2_IRQHandler - B I2C2_IRQHandler - - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - - PUBWEAK SPI2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI2_IRQHandler - B SPI2_IRQHandler - - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - - PUBWEAK CEC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CEC_IRQHandler - B CEC_IRQHandler - - END -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f072.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f072.s deleted file mode 100644 index c01281d..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f072.s +++ /dev/null @@ -1,346 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f072.s -;* Author : MCD Appl&ication Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F072 Devices Devices vector table for -;* EWARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address. -;* After Reset the Cortex-M0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_VDDIO2_IRQHandler ; PVD and VDDIO2 through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_CRS_IRQHandler ; RCC and CRS - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD TSC_IRQHandler ; TS - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_6_7_IRQHandler ; DMA1 Channel 4, Channel 5, Channel 6 and Channel 7 - DCD ADC1_COMP_IRQHandler ; ADC1, COMP1 and COMP2 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM6_DAC_IRQHandler ; TIM6 and DAC - DCD TIM7_IRQHandler ; TIM7 - DCD TIM14_IRQHandler ; TIM14 - DCD TIM15_IRQHandler ; TIM15 - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD I2C2_IRQHandler ; I2C2 - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_4_IRQHandler ; USART3 and USART4 - DCD CEC_CAN_IRQHandler ; CEC and CAN - DCD USB_IRQHandler ; USB - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -NMI_Handler - B NMI_Handler - - - PUBWEAK HardFault_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -HardFault_Handler - B HardFault_Handler - - - PUBWEAK SVC_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SVC_Handler - B SVC_Handler - - - PUBWEAK PendSV_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -PendSV_Handler - B PendSV_Handler - - - PUBWEAK SysTick_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SysTick_Handler - B SysTick_Handler - - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - - PUBWEAK PVD_VDDIO2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -PVD_VDDIO2_IRQHandler - B PVD_VDDIO2_IRQHandler - - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - - PUBWEAK RCC_CRS_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RCC_CRS_IRQHandler - B RCC_CRS_IRQHandler - - - PUBWEAK EXTI0_1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI0_1_IRQHandler - B EXTI0_1_IRQHandler - - - PUBWEAK EXTI2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI2_3_IRQHandler - B EXTI2_3_IRQHandler - - - PUBWEAK EXTI4_15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI4_15_IRQHandler - B EXTI4_15_IRQHandler - - - PUBWEAK TSC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TSC_IRQHandler - B TSC_IRQHandler - - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - - PUBWEAK DMA1_Channel2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel2_3_IRQHandler - B DMA1_Channel2_3_IRQHandler - - - PUBWEAK DMA1_Channel4_5_6_7_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel4_5_6_7_IRQHandler - B DMA1_Channel4_5_6_7_IRQHandler - - - PUBWEAK ADC1_COMP_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -ADC1_COMP_IRQHandler - B ADC1_COMP_IRQHandler - - - PUBWEAK TIM1_BRK_UP_TRG_COM_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_BRK_UP_TRG_COM_IRQHandler - B TIM1_BRK_UP_TRG_COM_IRQHandler - - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - - PUBWEAK TIM6_DAC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM6_DAC_IRQHandler - B TIM6_DAC_IRQHandler - - PUBWEAK TIM7_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM7_IRQHandler - B TIM7_IRQHandler - - PUBWEAK TIM14_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM14_IRQHandler - B TIM14_IRQHandler - - - PUBWEAK TIM15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM15_IRQHandler - B TIM15_IRQHandler - - - PUBWEAK TIM16_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM16_IRQHandler - B TIM16_IRQHandler - - - PUBWEAK TIM17_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM17_IRQHandler - B TIM17_IRQHandler - - - PUBWEAK I2C1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C1_IRQHandler - B I2C1_IRQHandler - - - PUBWEAK I2C2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C2_IRQHandler - B I2C2_IRQHandler - - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - - PUBWEAK SPI2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI2_IRQHandler - B SPI2_IRQHandler - - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - - PUBWEAK USART3_4_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART3_4_IRQHandler - B USART3_4_IRQHandler - - - PUBWEAK CEC_CAN_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CEC_CAN_IRQHandler - B CEC_CAN_IRQHandler - - PUBWEAK USB_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USB_IRQHandler - B USB_IRQHandler - - END -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f0xx.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f0xx.s deleted file mode 100644 index 27d799f..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f0xx.s +++ /dev/null @@ -1,333 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f0xx.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F051 devices vector table for EWARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address -;* - Configure the system clock -;* - Branches to main in the C library (which eventually -;* calls main()). -;* After Reset the Cortex-M0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD TS_IRQHandler ; TS - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5 - DCD ADC1_COMP_IRQHandler ; ADC1, COMP1 and COMP2 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM6_DAC_IRQHandler ; TIM6 and DAC - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD TIM15_IRQHandler ; TIM15 - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD I2C2_IRQHandler ; I2C2 - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD CEC_IRQHandler ; CEC - DCD 0 ; Reserved - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -NMI_Handler - B NMI_Handler - - - PUBWEAK HardFault_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -HardFault_Handler - B HardFault_Handler - - - PUBWEAK SVC_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SVC_Handler - B SVC_Handler - - - PUBWEAK PendSV_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -PendSV_Handler - B PendSV_Handler - - - PUBWEAK SysTick_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SysTick_Handler - B SysTick_Handler - - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - - PUBWEAK PVD_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -PVD_IRQHandler - B PVD_IRQHandler - - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - - PUBWEAK RCC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RCC_IRQHandler - B RCC_IRQHandler - - - PUBWEAK EXTI0_1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI0_1_IRQHandler - B EXTI0_1_IRQHandler - - - PUBWEAK EXTI2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI2_3_IRQHandler - B EXTI2_3_IRQHandler - - - PUBWEAK EXTI4_15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI4_15_IRQHandler - B EXTI4_15_IRQHandler - - - PUBWEAK TS_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TS_IRQHandler - B TS_IRQHandler - - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - - PUBWEAK DMA1_Channel2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel2_3_IRQHandler - B DMA1_Channel2_3_IRQHandler - - - PUBWEAK DMA1_Channel4_5_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel4_5_IRQHandler - B DMA1_Channel4_5_IRQHandler - - - PUBWEAK ADC1_COMP_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -ADC1_COMP_IRQHandler - B ADC1_COMP_IRQHandler - - - PUBWEAK TIM1_BRK_UP_TRG_COM_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_BRK_UP_TRG_COM_IRQHandler - B TIM1_BRK_UP_TRG_COM_IRQHandler - - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - - PUBWEAK TIM6_DAC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM6_DAC_IRQHandler - B TIM6_DAC_IRQHandler - - - PUBWEAK TIM14_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM14_IRQHandler - B TIM14_IRQHandler - - - PUBWEAK TIM15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM15_IRQHandler - B TIM15_IRQHandler - - - PUBWEAK TIM16_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM16_IRQHandler - B TIM16_IRQHandler - - - PUBWEAK TIM17_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM17_IRQHandler - B TIM17_IRQHandler - - - PUBWEAK I2C1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C1_IRQHandler - B I2C1_IRQHandler - - - PUBWEAK I2C2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C2_IRQHandler - B I2C2_IRQHandler - - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - - PUBWEAK SPI2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI2_IRQHandler - B SPI2_IRQHandler - - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - - PUBWEAK CEC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -CEC_IRQHandler - B CEC_IRQHandler - - END -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f0xx_ld.s b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f0xx_ld.s deleted file mode 100644 index 595fa8d..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f0xx_ld.s +++ /dev/null @@ -1,288 +0,0 @@ -;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** -;* File Name : startup_stm32f0xx_ld.s -;* Author : MCD Application Team -;* Version : V1.3.1 -;* Date : 17-January-2014 -;* Description : STM32F031 devices vector table for EWARM toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address -;* - Configure the system clock -;* - Branches to main in the C library (which eventually -;* calls main()). -;* After Reset the Cortex-M0 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************* -; @attention -; -; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); -; You may not use this file except in compliance with the License. -; You may obtain a copy of the License at: -; -; http://www.st.com/software_license_agreement_liberty_v2 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. -; -;******************************************************************************* -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD RTC_IRQHandler ; RTC through EXTI Line - DCD FLASH_IRQHandler ; FLASH - DCD RCC_IRQHandler ; RCC - DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 - DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 - DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 - DCD 0 ; Reserved - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 - DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5 - DCD ADC1_IRQHandler ; ADC1 - DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM14_IRQHandler ; TIM14 - DCD 0 ; Reserved - DCD TIM16_IRQHandler ; TIM16 - DCD TIM17_IRQHandler ; TIM17 - DCD I2C1_IRQHandler ; I2C1 - DCD 0 ; Reserved - DCD SPI1_IRQHandler ; SPI1 - DCD 0 ; Reserved - DCD USART1_IRQHandler ; USART1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -NMI_Handler - B NMI_Handler - - - PUBWEAK HardFault_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -HardFault_Handler - B HardFault_Handler - - - PUBWEAK SVC_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SVC_Handler - B SVC_Handler - - - PUBWEAK PendSV_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -PendSV_Handler - B PendSV_Handler - - - PUBWEAK SysTick_Handler - SECTION .text:CODE:NOROOT:REORDER(1) -SysTick_Handler - B SysTick_Handler - - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - - PUBWEAK PVD_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -PVD_IRQHandler - B PVD_IRQHandler - - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - - PUBWEAK RCC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -RCC_IRQHandler - B RCC_IRQHandler - - - PUBWEAK EXTI0_1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI0_1_IRQHandler - B EXTI0_1_IRQHandler - - - PUBWEAK EXTI2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI2_3_IRQHandler - B EXTI2_3_IRQHandler - - - PUBWEAK EXTI4_15_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -EXTI4_15_IRQHandler - B EXTI4_15_IRQHandler - - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - - PUBWEAK DMA1_Channel2_3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel2_3_IRQHandler - B DMA1_Channel2_3_IRQHandler - - - PUBWEAK DMA1_Channel4_5_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -DMA1_Channel4_5_IRQHandler - B DMA1_Channel4_5_IRQHandler - - - PUBWEAK ADC1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -ADC1_IRQHandler - B ADC1_IRQHandler - - - PUBWEAK TIM1_BRK_UP_TRG_COM_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_BRK_UP_TRG_COM_IRQHandler - B TIM1_BRK_UP_TRG_COM_IRQHandler - - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - - PUBWEAK TIM14_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM14_IRQHandler - B TIM14_IRQHandler - - - PUBWEAK TIM16_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM16_IRQHandler - B TIM16_IRQHandler - - - PUBWEAK TIM17_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -TIM17_IRQHandler - B TIM17_IRQHandler - - - PUBWEAK I2C1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -I2C1_IRQHandler - B I2C1_IRQHandler - - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:NOROOT:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - - END -;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/system_stm32f0xx.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/system_stm32f0xx.c deleted file mode 100644 index e05ebe2..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/system_stm32f0xx.c +++ /dev/null @@ -1,358 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32f0xx.c - * @author MCD Application Team - * @version V1.3.1 - * @date 17-January-2014 - * @brief CMSIS Cortex-M0 Device Peripheral Access Layer System Source File. - * This file contains the system clock configuration for STM32F0xx devices, - * and is generated by the clock configuration tool - * STM32F0xx_Clock_Configuration_V1.0.0.xls - * - * 1. This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier - * and Divider factors, AHB/APBx prescalers and Flash settings), - * depending on the configuration made in the clock xls tool. - * This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f0xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * 2. After each device reset the HSI (8 MHz Range) is used as system clock source. - * Then SystemInit() function is called, in "startup_stm32f0xx.s" file, to - * configure the system clock before to branch to main program. - * - * 3. If the system clock source selected by user fails to startup, the SystemInit() - * function will do nothing and HSI still used as system clock source. User can - * add some code to deal with this issue inside the SetSysClock() function. - * - * 4. The default value of HSE crystal is set to 8MHz, refer to "HSE_VALUE" define - * in "stm32f0xx.h" file. When HSE is used as system clock source, directly or - * through PLL, and you are using different crystal you have to adapt the HSE - * value to your own configuration. - * - * 5. This file configures the system clock as follows: - *============================================================================= - * System Clock Configuration - *============================================================================= - * System Clock source | PLL(HSE) - *----------------------------------------------------------------------------- - * SYSCLK | 48000000 Hz - *----------------------------------------------------------------------------- - * HCLK | 48000000 Hz - *----------------------------------------------------------------------------- - * AHB Prescaler | 1 - *----------------------------------------------------------------------------- - * APB1 Prescaler | 1 - *----------------------------------------------------------------------------- - * APB2 Prescaler | 1 - *----------------------------------------------------------------------------- - * HSE Frequency | 8000000 Hz - *----------------------------------------------------------------------------- - * PLL MUL | 6 - *----------------------------------------------------------------------------- - * VDD | 3.3 V - *----------------------------------------------------------------------------- - * Flash Latency | 1 WS - *----------------------------------------------------------------------------- - *============================================================================= - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f0xx_system - * @{ - */ - -/** @addtogroup STM32F0xx_System_Private_Includes - * @{ - */ - -#include "stm32f0xx.h" - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Defines - * @{ - */ -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Variables - * @{ - */ -uint32_t SystemCoreClock = 48000000; -__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_FunctionPrototypes - * @{ - */ - -static void SetSysClock(void); - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system. - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemCoreClock variable. - * @param None - * @retval None - */ -void SystemInit (void) -{ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - -#if defined (STM32F031) || defined (STM32F072) || defined (STM32F042) - /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */ - RCC->CFGR &= (uint32_t)0xF8FFB80C; -#else - /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits */ - RCC->CFGR &= (uint32_t)0x08FFB80C; -#endif /* STM32F031*/ - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */ - RCC->CFGR &= (uint32_t)0xFFC0FFFF; - - /* Reset PREDIV1[3:0] bits */ - RCC->CFGR2 &= (uint32_t)0xFFFFFFF0; - - /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */ - RCC->CFGR3 &= (uint32_t)0xFFFFFEAC; - - /* Reset HSI14 bit */ - RCC->CR2 &= (uint32_t)0xFFFFFFFE; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - - /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */ - SetSysClock(); -} - -/** - * @brief Update SystemCoreClock according to Clock Register Values - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f0xx.h file (default value - * 8 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f0xx.h file (default value - * 8 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * @param None - * @retval None - */ -void SystemCoreClockUpdate (void) -{ - uint32_t tmp = 0, pllmull = 0, pllsource = 0, prediv1factor = 0; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock */ - /* Get PLL clock source and multiplication factor ----------------------*/ - pllmull = RCC->CFGR & RCC_CFGR_PLLMULL; - pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; - pllmull = ( pllmull >> 18) + 2; - - if (pllsource == 0x00) - { - /* HSI oscillator clock divided by 2 selected as PLL clock entry */ - SystemCoreClock = (HSI_VALUE >> 1) * pllmull; - } - else - { - prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1; - /* HSE oscillator clock selected as PREDIV1 clock entry */ - SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; - } - break; - default: /* HSI used as system clock */ - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK clock frequency ----------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK clock frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @brief Configures the System clock frequency, AHB/APBx prescalers and Flash - * settings. - * @note This function should be called only once the RCC clock configuration - * is reset to the default reset state (done in SystemInit() function). - * @param None - * @retval None - */ -static void SetSysClock(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Enable Prefetch Buffer and set Flash Latency */ - FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY; - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1; - - /* PLL configuration = HSE * 6 = 48 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6); - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_common_tables.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_common_tables.h deleted file mode 100644 index 7a59b59..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_common_tables.h +++ /dev/null @@ -1,93 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2013 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.1 -* -* Project: CMSIS DSP Library -* Title: arm_common_tables.h -* -* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#ifndef _ARM_COMMON_TABLES_H -#define _ARM_COMMON_TABLES_H - -#include "arm_math.h" - -extern const uint16_t armBitRevTable[1024]; -extern const q15_t armRecipTableQ15[64]; -extern const q31_t armRecipTableQ31[64]; -extern const q31_t realCoefAQ31[1024]; -extern const q31_t realCoefBQ31[1024]; -extern const float32_t twiddleCoef_16[32]; -extern const float32_t twiddleCoef_32[64]; -extern const float32_t twiddleCoef_64[128]; -extern const float32_t twiddleCoef_128[256]; -extern const float32_t twiddleCoef_256[512]; -extern const float32_t twiddleCoef_512[1024]; -extern const float32_t twiddleCoef_1024[2048]; -extern const float32_t twiddleCoef_2048[4096]; -extern const float32_t twiddleCoef_4096[8192]; -#define twiddleCoef twiddleCoef_4096 -extern const q31_t twiddleCoefQ31[6144]; -extern const q15_t twiddleCoefQ15[6144]; -extern const float32_t twiddleCoef_rfft_32[32]; -extern const float32_t twiddleCoef_rfft_64[64]; -extern const float32_t twiddleCoef_rfft_128[128]; -extern const float32_t twiddleCoef_rfft_256[256]; -extern const float32_t twiddleCoef_rfft_512[512]; -extern const float32_t twiddleCoef_rfft_1024[1024]; -extern const float32_t twiddleCoef_rfft_2048[2048]; -extern const float32_t twiddleCoef_rfft_4096[4096]; - - -#define ARMBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20 ) -#define ARMBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48 ) -#define ARMBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56 ) -#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208 ) -#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440 ) -#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448 ) -#define ARMBITREVINDEXTABLE1024_TABLE_LENGTH ((uint16_t)1800) -#define ARMBITREVINDEXTABLE2048_TABLE_LENGTH ((uint16_t)3808) -#define ARMBITREVINDEXTABLE4096_TABLE_LENGTH ((uint16_t)4032) - -extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE__16_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE__32_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE__64_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE1024_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE2048_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE4096_TABLE_LENGTH]; - -#endif /* ARM_COMMON_TABLES_H */ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_const_structs.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_const_structs.h deleted file mode 100644 index 8d7fac0..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_const_structs.h +++ /dev/null @@ -1,85 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2013 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.1 -* -* Project: CMSIS DSP Library -* Title: arm_const_structs.h -* -* Description: This file has constant structs that are initialized for -* user convenience. For example, some can be given as -* arguments to the arm_cfft_f32() function. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#ifndef _ARM_CONST_STRUCTS_H -#define _ARM_CONST_STRUCTS_H - -#include "arm_math.h" -#include "arm_common_tables.h" - - const arm_cfft_instance_f32 arm_cfft_sR_f32_len16 = { - 16, twiddleCoef_16, armBitRevIndexTable16, ARMBITREVINDEXTABLE__16_TABLE_LENGTH - }; - - const arm_cfft_instance_f32 arm_cfft_sR_f32_len32 = { - 32, twiddleCoef_32, armBitRevIndexTable32, ARMBITREVINDEXTABLE__32_TABLE_LENGTH - }; - - const arm_cfft_instance_f32 arm_cfft_sR_f32_len64 = { - 64, twiddleCoef_64, armBitRevIndexTable64, ARMBITREVINDEXTABLE__64_TABLE_LENGTH - }; - - const arm_cfft_instance_f32 arm_cfft_sR_f32_len128 = { - 128, twiddleCoef_128, armBitRevIndexTable128, ARMBITREVINDEXTABLE_128_TABLE_LENGTH - }; - - const arm_cfft_instance_f32 arm_cfft_sR_f32_len256 = { - 256, twiddleCoef_256, armBitRevIndexTable256, ARMBITREVINDEXTABLE_256_TABLE_LENGTH - }; - - const arm_cfft_instance_f32 arm_cfft_sR_f32_len512 = { - 512, twiddleCoef_512, armBitRevIndexTable512, ARMBITREVINDEXTABLE_512_TABLE_LENGTH - }; - - const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024 = { - 1024, twiddleCoef_1024, armBitRevIndexTable1024, ARMBITREVINDEXTABLE1024_TABLE_LENGTH - }; - - const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048 = { - 2048, twiddleCoef_2048, armBitRevIndexTable2048, ARMBITREVINDEXTABLE2048_TABLE_LENGTH - }; - - const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096 = { - 4096, twiddleCoef_4096, armBitRevIndexTable4096, ARMBITREVINDEXTABLE4096_TABLE_LENGTH - }; - -#endif diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_math.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_math.h deleted file mode 100644 index 65304c1..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/arm_math.h +++ /dev/null @@ -1,7306 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2013 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.1 -* -* Project: CMSIS DSP Library -* Title: arm_math.h -* -* Description: Public header file for CMSIS DSP Library -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -/** - \mainpage CMSIS DSP Software Library - * - * <b>Introduction</b> - * - * This user manual describes the CMSIS DSP software library, - * a suite of common signal processing functions for use on Cortex-M processor based devices. - * - * The library is divided into a number of functions each covering a specific category: - * - Basic math functions - * - Fast math functions - * - Complex math functions - * - Filters - * - Matrix functions - * - Transforms - * - Motor control functions - * - Statistical functions - * - Support functions - * - Interpolation functions - * - * The library has separate functions for operating on 8-bit integers, 16-bit integers, - * 32-bit integer and 32-bit floating-point values. - * - * <b>Using the Library</b> - * - * The library installer contains prebuilt versions of the libraries in the <code>Lib</code> folder. - * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4) - * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4) - * - arm_cortexM4l_math.lib (Little endian on Cortex-M4) - * - arm_cortexM4b_math.lib (Big endian on Cortex-M4) - * - arm_cortexM3l_math.lib (Little endian on Cortex-M3) - * - arm_cortexM3b_math.lib (Big endian on Cortex-M3) - * - arm_cortexM0l_math.lib (Little endian on Cortex-M0) - * - arm_cortexM0b_math.lib (Big endian on Cortex-M3) - * - * The library functions are declared in the public file <code>arm_math.h</code> which is placed in the <code>Include</code> folder. - * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single - * public header file <code> arm_math.h</code> for Cortex-M4/M3/M0 with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. - * Define the appropriate pre processor MACRO ARM_MATH_CM4 or ARM_MATH_CM3 or - * ARM_MATH_CM0 or ARM_MATH_CM0PLUS depending on the target processor in the application. - * - * <b>Examples</b> - * - * The library ships with a number of examples which demonstrate how to use the library functions. - * - * <b>Toolchain Support</b> - * - * The library has been developed and tested with MDK-ARM version 4.60. - * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. - * - * <b>Building the Library</b> - * - * The library installer contains project files to re build libraries on MDK Tool chain in the <code>CMSIS\\DSP_Lib\\Source\\ARM</code> folder. - * - arm_cortexM0b_math.uvproj - * - arm_cortexM0l_math.uvproj - * - arm_cortexM3b_math.uvproj - * - arm_cortexM3l_math.uvproj - * - arm_cortexM4b_math.uvproj - * - arm_cortexM4l_math.uvproj - * - arm_cortexM4bf_math.uvproj - * - arm_cortexM4lf_math.uvproj - * - * - * The project can be built by opening the appropriate project in MDK-ARM 4.60 chain and defining the optional pre processor MACROs detailed above. - * - * <b>Pre-processor Macros</b> - * - * Each library project have differant pre-processor macros. - * - * - UNALIGNED_SUPPORT_DISABLE: - * - * Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access - * - * - ARM_MATH_BIG_ENDIAN: - * - * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. - * - * - ARM_MATH_MATRIX_CHECK: - * - * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices - * - * - ARM_MATH_ROUNDING: - * - * Define macro ARM_MATH_ROUNDING for rounding on support functions - * - * - ARM_MATH_CMx: - * - * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target - * and ARM_MATH_CM0 for building library on cortex-M0 target, ARM_MATH_CM0PLUS for building library on cortex-M0+ target. - * - * - __FPU_PRESENT: - * - * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries - * - * <b>Copyright Notice</b> - * - * Copyright (C) 2010-2013 ARM Limited. All rights reserved. - */ - - -/** - * @defgroup groupMath Basic Math Functions - */ - -/** - * @defgroup groupFastMath Fast Math Functions - * This set of functions provides a fast approximation to sine, cosine, and square root. - * As compared to most of the other functions in the CMSIS math library, the fast math functions - * operate on individual values and not arrays. - * There are separate functions for Q15, Q31, and floating-point data. - * - */ - -/** - * @defgroup groupCmplxMath Complex Math Functions - * This set of functions operates on complex data vectors. - * The data in the complex arrays is stored in an interleaved fashion - * (real, imag, real, imag, ...). - * In the API functions, the number of samples in a complex array refers - * to the number of complex values; the array contains twice this number of - * real values. - */ - -/** - * @defgroup groupFilters Filtering Functions - */ - -/** - * @defgroup groupMatrix Matrix Functions - * - * This set of functions provides basic matrix math operations. - * The functions operate on matrix data structures. For example, - * the type - * definition for the floating-point matrix structure is shown - * below: - * <pre> - * typedef struct - * { - * uint16_t numRows; // number of rows of the matrix. - * uint16_t numCols; // number of columns of the matrix. - * float32_t *pData; // points to the data of the matrix. - * } arm_matrix_instance_f32; - * </pre> - * There are similar definitions for Q15 and Q31 data types. - * - * The structure specifies the size of the matrix and then points to - * an array of data. The array is of size <code>numRows X numCols</code> - * and the values are arranged in row order. That is, the - * matrix element (i, j) is stored at: - * <pre> - * pData[i*numCols + j] - * </pre> - * - * \par Init Functions - * There is an associated initialization function for each type of matrix - * data structure. - * The initialization function sets the values of the internal structure fields. - * Refer to the function <code>arm_mat_init_f32()</code>, <code>arm_mat_init_q31()</code> - * and <code>arm_mat_init_q15()</code> for floating-point, Q31 and Q15 types, respectively. - * - * \par - * Use of the initialization function is optional. However, if initialization function is used - * then the instance structure cannot be placed into a const data section. - * To place the instance structure in a const data - * section, manually initialize the data structure. For example: - * <pre> - * <code>arm_matrix_instance_f32 S = {nRows, nColumns, pData};</code> - * <code>arm_matrix_instance_q31 S = {nRows, nColumns, pData};</code> - * <code>arm_matrix_instance_q15 S = {nRows, nColumns, pData};</code> - * </pre> - * where <code>nRows</code> specifies the number of rows, <code>nColumns</code> - * specifies the number of columns, and <code>pData</code> points to the - * data array. - * - * \par Size Checking - * By default all of the matrix functions perform size checking on the input and - * output matrices. For example, the matrix addition function verifies that the - * two input matrices and the output matrix all have the same number of rows and - * columns. If the size check fails the functions return: - * <pre> - * ARM_MATH_SIZE_MISMATCH - * </pre> - * Otherwise the functions return - * <pre> - * ARM_MATH_SUCCESS - * </pre> - * There is some overhead associated with this matrix size checking. - * The matrix size checking is enabled via the \#define - * <pre> - * ARM_MATH_MATRIX_CHECK - * </pre> - * within the library project settings. By default this macro is defined - * and size checking is enabled. By changing the project settings and - * undefining this macro size checking is eliminated and the functions - * run a bit faster. With size checking disabled the functions always - * return <code>ARM_MATH_SUCCESS</code>. - */ - -/** - * @defgroup groupTransforms Transform Functions - */ - -/** - * @defgroup groupController Controller Functions - */ - -/** - * @defgroup groupStats Statistics Functions - */ -/** - * @defgroup groupSupport Support Functions - */ - -/** - * @defgroup groupInterpolation Interpolation Functions - * These functions perform 1- and 2-dimensional interpolation of data. - * Linear interpolation is used for 1-dimensional data and - * bilinear interpolation is used for 2-dimensional data. - */ - -/** - * @defgroup groupExamples Examples - */ -#ifndef _ARM_MATH_H -#define _ARM_MATH_H - -#define __CMSIS_GENERIC /* disable NVIC and Systick functions */ - -#if defined (ARM_MATH_CM4) -#include "core_cm4.h" -#elif defined (ARM_MATH_CM3) -#include "core_cm3.h" -#elif defined (ARM_MATH_CM0) -#include "core_cm0.h" -#define ARM_MATH_CM0_FAMILY -#elif defined (ARM_MATH_CM0PLUS) -#include "core_cm0plus.h" -#define ARM_MATH_CM0_FAMILY -#else -#include "ARMCM4.h" -#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....." -#endif - -#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */ -#include "string.h" -#include "math.h" -#ifdef __cplusplus -extern "C" -{ -#endif - - - /** - * @brief Macros required for reciprocal calculation in Normalized LMS - */ - -#define DELTA_Q31 (0x100) -#define DELTA_Q15 0x5 -#define INDEX_MASK 0x0000003F -#ifndef PI -#define PI 3.14159265358979f -#endif - - /** - * @brief Macros required for SINE and COSINE Fast math approximations - */ - -#define TABLE_SIZE 256 -#define TABLE_SPACING_Q31 0x800000 -#define TABLE_SPACING_Q15 0x80 - - /** - * @brief Macros required for SINE and COSINE Controller functions - */ - /* 1.31(q31) Fixed value of 2/360 */ - /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ -#define INPUT_SPACING 0xB60B61 - - /** - * @brief Macro for Unaligned Support - */ -#ifndef UNALIGNED_SUPPORT_DISABLE - #define ALIGN4 -#else - #if defined (__GNUC__) - #define ALIGN4 __attribute__((aligned(4))) - #else - #define ALIGN4 __align(4) - #endif -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /** - * @brief Error status returned by some functions in the library. - */ - - typedef enum - { - ARM_MATH_SUCCESS = 0, /**< No error */ - ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ - ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ - ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ - ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ - ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ - ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ - } arm_status; - - /** - * @brief 8-bit fractional data type in 1.7 format. - */ - typedef int8_t q7_t; - - /** - * @brief 16-bit fractional data type in 1.15 format. - */ - typedef int16_t q15_t; - - /** - * @brief 32-bit fractional data type in 1.31 format. - */ - typedef int32_t q31_t; - - /** - * @brief 64-bit fractional data type in 1.63 format. - */ - typedef int64_t q63_t; - - /** - * @brief 32-bit floating-point type definition. - */ - typedef float float32_t; - - /** - * @brief 64-bit floating-point type definition. - */ - typedef double float64_t; - - /** - * @brief definition to read/write two 16 bit values. - */ -#if defined __CC_ARM -#define __SIMD32_TYPE int32_t __packed -#define CMSIS_UNUSED __attribute__((unused)) -#elif defined __ICCARM__ -#define CMSIS_UNUSED -#define __SIMD32_TYPE int32_t __packed -#elif defined __GNUC__ -#define __SIMD32_TYPE int32_t -#define CMSIS_UNUSED __attribute__((unused)) -#else -#error Unknown compiler -#endif - -#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) -#define __SIMD32_CONST(addr) ((__SIMD32_TYPE *)(addr)) - -#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE *) (addr)) - -#define __SIMD64(addr) (*(int64_t **) & (addr)) - -#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) - /** - * @brief definition to pack two 16 bit values. - */ -#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ - (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) -#define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ - (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) - -#endif - - - /** - * @brief definition to pack four 8 bit values. - */ -#ifndef ARM_MATH_BIG_ENDIAN - -#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) -#else - -#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) - -#endif - - - /** - * @brief Clips Q63 to Q31 values. - */ - static __INLINE q31_t clip_q63_to_q31( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; - } - - /** - * @brief Clips Q63 to Q15 values. - */ - static __INLINE q15_t clip_q63_to_q15( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); - } - - /** - * @brief Clips Q31 to Q7 values. - */ - static __INLINE q7_t clip_q31_to_q7( - q31_t x) - { - return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? - ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; - } - - /** - * @brief Clips Q31 to Q15 values. - */ - static __INLINE q15_t clip_q31_to_q15( - q31_t x) - { - return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? - ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; - } - - /** - * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. - */ - - static __INLINE q63_t mult32x64( - q63_t x, - q31_t y) - { - return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + - (((q63_t) (x >> 32) * y))); - } - - -#if defined (ARM_MATH_CM0_FAMILY) && defined ( __CC_ARM ) -#define __CLZ __clz -#endif - -#if defined (ARM_MATH_CM0_FAMILY) && ((defined (__ICCARM__)) ||(defined (__GNUC__)) || defined (__TASKING__) ) - - static __INLINE uint32_t __CLZ( - q31_t data); - - - static __INLINE uint32_t __CLZ( - q31_t data) - { - uint32_t count = 0; - uint32_t mask = 0x80000000; - - while((data & mask) == 0) - { - count += 1u; - mask = mask >> 1u; - } - - return (count); - - } - -#endif - - /** - * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type. - */ - - static __INLINE uint32_t arm_recip_q31( - q31_t in, - q31_t * dst, - q31_t * pRecipTable) - { - - uint32_t out, tempVal; - uint32_t index, i; - uint32_t signBits; - - if(in > 0) - { - signBits = __CLZ(in) - 1; - } - else - { - signBits = __CLZ(-in) - 1; - } - - /* Convert input sample to 1.31 format */ - in = in << signBits; - - /* calculation of index for initial approximated Val */ - index = (uint32_t) (in >> 24u); - index = (index & INDEX_MASK); - - /* 1.31 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0u; i < 2u; i++) - { - tempVal = (q31_t) (((q63_t) in * out) >> 31u); - tempVal = 0x7FFFFFFF - tempVal; - /* 1.31 with exp 1 */ - //out = (q31_t) (((q63_t) out * tempVal) >> 30u); - out = (q31_t) clip_q63_to_q31(((q63_t) out * tempVal) >> 30u); - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1u); - - } - - /** - * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. - */ - static __INLINE uint32_t arm_recip_q15( - q15_t in, - q15_t * dst, - q15_t * pRecipTable) - { - - uint32_t out = 0, tempVal = 0; - uint32_t index = 0, i = 0; - uint32_t signBits = 0; - - if(in > 0) - { - signBits = __CLZ(in) - 17; - } - else - { - signBits = __CLZ(-in) - 17; - } - - /* Convert input sample to 1.15 format */ - in = in << signBits; - - /* calculation of index for initial approximated Val */ - index = in >> 8; - index = (index & INDEX_MASK); - - /* 1.15 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0; i < 2; i++) - { - tempVal = (q15_t) (((q31_t) in * out) >> 15); - tempVal = 0x7FFF - tempVal; - /* 1.15 with exp 1 */ - out = (q15_t) (((q31_t) out * tempVal) >> 14); - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1); - - } - - - /* - * @brief C custom defined intrinisic function for only M0 processors - */ -#if defined(ARM_MATH_CM0_FAMILY) - - static __INLINE q31_t __SSAT( - q31_t x, - uint32_t y) - { - int32_t posMax, negMin; - uint32_t i; - - posMax = 1; - for (i = 0; i < (y - 1); i++) - { - posMax = posMax * 2; - } - - if(x > 0) - { - posMax = (posMax - 1); - - if(x > posMax) - { - x = posMax; - } - } - else - { - negMin = -posMax; - - if(x < negMin) - { - x = negMin; - } - } - return (x); - - - } - -#endif /* end of ARM_MATH_CM0_FAMILY */ - - - - /* - * @brief C custom defined intrinsic function for M3 and M0 processors - */ -#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) - - /* - * @brief C custom defined QADD8 for M3 and M0 processors - */ - static __INLINE q31_t __QADD8( - q31_t x, - q31_t y) - { - - q31_t sum; - q7_t r, s, t, u; - - r = (q7_t) x; - s = (q7_t) y; - - r = __SSAT((q31_t) (r + s), 8); - s = __SSAT(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8); - t = __SSAT(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8); - u = __SSAT(((q31_t) ((x >> 24) + (y >> 24))), 8); - - sum = - (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) | - (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF); - - return sum; - - } - - /* - * @brief C custom defined QSUB8 for M3 and M0 processors - */ - static __INLINE q31_t __QSUB8( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s, t, u; - - r = (q7_t) x; - s = (q7_t) y; - - r = __SSAT((r - s), 8); - s = __SSAT(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8; - t = __SSAT(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16; - u = __SSAT(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24; - - sum = - (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & - 0x000000FF); - - return sum; - } - - /* - * @brief C custom defined QADD16 for M3 and M0 processors - */ - - /* - * @brief C custom defined QADD16 for M3 and M0 processors - */ - static __INLINE q31_t __QADD16( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = __SSAT(r + s, 16); - s = __SSAT(((q31_t) ((x >> 16) + (y >> 16))), 16) << 16; - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - - } - - /* - * @brief C custom defined SHADD16 for M3 and M0 processors - */ - static __INLINE q31_t __SHADD16( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) + (s >> 1)); - s = ((q31_t) ((x >> 17) + (y >> 17))) << 16; - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - - } - - /* - * @brief C custom defined QSUB16 for M3 and M0 processors - */ - static __INLINE q31_t __QSUB16( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = __SSAT(r - s, 16); - s = __SSAT(((q31_t) ((x >> 16) - (y >> 16))), 16) << 16; - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - } - - /* - * @brief C custom defined SHSUB16 for M3 and M0 processors - */ - static __INLINE q31_t __SHSUB16( - q31_t x, - q31_t y) - { - - q31_t diff; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) - (s >> 1)); - s = (((x >> 17) - (y >> 17)) << 16); - - diff = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return diff; - } - - /* - * @brief C custom defined QASX for M3 and M0 processors - */ - static __INLINE q31_t __QASX( - q31_t x, - q31_t y) - { - - q31_t sum = 0; - - sum = - ((sum + - clip_q31_to_q15((q31_t) ((short) (x >> 16) + (short) y))) << 16) + - clip_q31_to_q15((q31_t) ((short) x - (short) (y >> 16))); - - return sum; - } - - /* - * @brief C custom defined SHASX for M3 and M0 processors - */ - static __INLINE q31_t __SHASX( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) - (y >> 17)); - s = (((x >> 17) + (s >> 1)) << 16); - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - } - - - /* - * @brief C custom defined QSAX for M3 and M0 processors - */ - static __INLINE q31_t __QSAX( - q31_t x, - q31_t y) - { - - q31_t sum = 0; - - sum = - ((sum + - clip_q31_to_q15((q31_t) ((short) (x >> 16) - (short) y))) << 16) + - clip_q31_to_q15((q31_t) ((short) x + (short) (y >> 16))); - - return sum; - } - - /* - * @brief C custom defined SHSAX for M3 and M0 processors - */ - static __INLINE q31_t __SHSAX( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) + (y >> 17)); - s = (((x >> 17) - (s >> 1)) << 16); - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - } - - /* - * @brief C custom defined SMUSDX for M3 and M0 processors - */ - static __INLINE q31_t __SMUSDX( - q31_t x, - q31_t y) - { - - return ((q31_t) (((short) x * (short) (y >> 16)) - - ((short) (x >> 16) * (short) y))); - } - - /* - * @brief C custom defined SMUADX for M3 and M0 processors - */ - static __INLINE q31_t __SMUADX( - q31_t x, - q31_t y) - { - - return ((q31_t) (((short) x * (short) (y >> 16)) + - ((short) (x >> 16) * (short) y))); - } - - /* - * @brief C custom defined QADD for M3 and M0 processors - */ - static __INLINE q31_t __QADD( - q31_t x, - q31_t y) - { - return clip_q63_to_q31((q63_t) x + y); - } - - /* - * @brief C custom defined QSUB for M3 and M0 processors - */ - static __INLINE q31_t __QSUB( - q31_t x, - q31_t y) - { - return clip_q63_to_q31((q63_t) x - y); - } - - /* - * @brief C custom defined SMLAD for M3 and M0 processors - */ - static __INLINE q31_t __SMLAD( - q31_t x, - q31_t y, - q31_t sum) - { - - return (sum + ((short) (x >> 16) * (short) (y >> 16)) + - ((short) x * (short) y)); - } - - /* - * @brief C custom defined SMLADX for M3 and M0 processors - */ - static __INLINE q31_t __SMLADX( - q31_t x, - q31_t y, - q31_t sum) - { - - return (sum + ((short) (x >> 16) * (short) (y)) + - ((short) x * (short) (y >> 16))); - } - - /* - * @brief C custom defined SMLSDX for M3 and M0 processors - */ - static __INLINE q31_t __SMLSDX( - q31_t x, - q31_t y, - q31_t sum) - { - - return (sum - ((short) (x >> 16) * (short) (y)) + - ((short) x * (short) (y >> 16))); - } - - /* - * @brief C custom defined SMLALD for M3 and M0 processors - */ - static __INLINE q63_t __SMLALD( - q31_t x, - q31_t y, - q63_t sum) - { - - return (sum + ((short) (x >> 16) * (short) (y >> 16)) + - ((short) x * (short) y)); - } - - /* - * @brief C custom defined SMLALDX for M3 and M0 processors - */ - static __INLINE q63_t __SMLALDX( - q31_t x, - q31_t y, - q63_t sum) - { - - return (sum + ((short) (x >> 16) * (short) y)) + - ((short) x * (short) (y >> 16)); - } - - /* - * @brief C custom defined SMUAD for M3 and M0 processors - */ - static __INLINE q31_t __SMUAD( - q31_t x, - q31_t y) - { - - return (((x >> 16) * (y >> 16)) + - (((x << 16) >> 16) * ((y << 16) >> 16))); - } - - /* - * @brief C custom defined SMUSD for M3 and M0 processors - */ - static __INLINE q31_t __SMUSD( - q31_t x, - q31_t y) - { - - return (-((x >> 16) * (y >> 16)) + - (((x << 16) >> 16) * ((y << 16) >> 16))); - } - - - /* - * @brief C custom defined SXTB16 for M3 and M0 processors - */ - static __INLINE q31_t __SXTB16( - q31_t x) - { - - return ((((x << 24) >> 24) & 0x0000FFFF) | - (((x << 8) >> 8) & 0xFFFF0000)); - } - - -#endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */ - - - /** - * @brief Instance structure for the Q7 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q7; - - /** - * @brief Instance structure for the Q15 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_f32; - - - /** - * @brief Processing function for the Q7 FIR filter. - * @param[in] *S points to an instance of the Q7 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_q7( - const arm_fir_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q7 FIR filter. - * @param[in,out] *S points to an instance of the Q7 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed. - * @return none - */ - void arm_fir_init_q7( - arm_fir_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 FIR filter. - * @param[in] *S points to an instance of the Q15 FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q15 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_fast_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q15 FIR filter. - * @param[in,out] *S points to an instance of the Q15 FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if - * <code>numTaps</code> is not a supported value. - */ - - arm_status arm_fir_init_q15( - arm_fir_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR filter. - * @param[in] *S points to an instance of the Q31 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_q31( - const arm_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q31 FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_fast_q31( - const arm_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 FIR filter. - * @param[in,out] *S points to an instance of the Q31 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return none. - */ - void arm_fir_init_q31( - arm_fir_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the floating-point FIR filter. - * @param[in] *S points to an instance of the floating-point FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_f32( - const arm_fir_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point FIR filter. - * @param[in,out] *S points to an instance of the floating-point FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return none. - */ - void arm_fir_init_f32( - arm_fir_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 Biquad cascade filter. - */ - typedef struct - { - int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - - } arm_biquad_casd_df1_inst_q15; - - - /** - * @brief Instance structure for the Q31 Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - - } arm_biquad_casd_df1_inst_q31; - - /** - * @brief Instance structure for the floating-point Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - - - } arm_biquad_casd_df1_inst_f32; - - - - /** - * @brief Processing function for the Q15 Biquad cascade filter. - * @param[in] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_q15( - const arm_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q15 Biquad cascade filter. - * @param[in,out] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - * @return none - */ - - void arm_biquad_cascade_df1_init_q15( - arm_biquad_casd_df1_inst_q15 * S, - uint8_t numStages, - q15_t * pCoeffs, - q15_t * pState, - int8_t postShift); - - - /** - * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_fast_q15( - const arm_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 Biquad cascade filter - * @param[in] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_q31( - const arm_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_fast_q31( - const arm_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 Biquad cascade filter. - * @param[in,out] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - * @return none - */ - - void arm_biquad_cascade_df1_init_q31( - arm_biquad_casd_df1_inst_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q31_t * pState, - int8_t postShift); - - /** - * @brief Processing function for the floating-point Biquad cascade filter. - * @param[in] *S points to an instance of the floating-point Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_f32( - const arm_biquad_casd_df1_inst_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point Biquad cascade filter. - * @param[in,out] *S points to an instance of the floating-point Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @return none - */ - - void arm_biquad_cascade_df1_init_f32( - arm_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float32_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f32; - - /** - * @brief Instance structure for the Q15 matrix structure. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q15_t *pData; /**< points to the data of the matrix. */ - - } arm_matrix_instance_q15; - - /** - * @brief Instance structure for the Q31 matrix structure. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q31_t *pData; /**< points to the data of the matrix. */ - - } arm_matrix_instance_q31; - - - - /** - * @brief Floating-point matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_add_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_add_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_add_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code> - * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_trans_f32( - const arm_matrix_instance_f32 * pSrc, - arm_matrix_instance_f32 * pDst); - - - /** - * @brief Q15 matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code> - * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_trans_q15( - const arm_matrix_instance_q15 * pSrc, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code> - * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_trans_q31( - const arm_matrix_instance_q31 * pSrc, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix multiplication - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix multiplication - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @param[in] *pState points to the array for storing intermediate results - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - /** - * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @param[in] *pState points to the array for storing intermediate results - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_mult_fast_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - /** - * @brief Q31 matrix multiplication - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_mult_fast_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix subtraction - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_sub_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix subtraction - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_sub_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix subtraction - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_sub_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point matrix scaling. - * @param[in] *pSrc points to the input matrix - * @param[in] scale scale factor - * @param[out] *pDst points to the output matrix - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_scale_f32( - const arm_matrix_instance_f32 * pSrc, - float32_t scale, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix scaling. - * @param[in] *pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to output matrix - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_scale_q15( - const arm_matrix_instance_q15 * pSrc, - q15_t scaleFract, - int32_t shift, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix scaling. - * @param[in] *pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. - */ - - arm_status arm_mat_scale_q31( - const arm_matrix_instance_q31 * pSrc, - q31_t scaleFract, - int32_t shift, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Q31 matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - - void arm_mat_init_q31( - arm_matrix_instance_q31 * S, - uint16_t nRows, - uint16_t nColumns, - q31_t * pData); - - /** - * @brief Q15 matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - - void arm_mat_init_q15( - arm_matrix_instance_q15 * S, - uint16_t nRows, - uint16_t nColumns, - q15_t * pData); - - /** - * @brief Floating-point matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - - void arm_mat_init_f32( - arm_matrix_instance_f32 * S, - uint16_t nRows, - uint16_t nColumns, - float32_t * pData); - - - - /** - * @brief Instance structure for the Q15 PID Control. - */ - typedef struct - { - q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ -#ifdef ARM_MATH_CM0_FAMILY - q15_t A1; - q15_t A2; -#else - q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ -#endif - q15_t state[3]; /**< The state array of length 3. */ - q15_t Kp; /**< The proportional gain. */ - q15_t Ki; /**< The integral gain. */ - q15_t Kd; /**< The derivative gain. */ - } arm_pid_instance_q15; - - /** - * @brief Instance structure for the Q31 PID Control. - */ - typedef struct - { - q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - q31_t A2; /**< The derived gain, A2 = Kd . */ - q31_t state[3]; /**< The state array of length 3. */ - q31_t Kp; /**< The proportional gain. */ - q31_t Ki; /**< The integral gain. */ - q31_t Kd; /**< The derivative gain. */ - - } arm_pid_instance_q31; - - /** - * @brief Instance structure for the floating-point PID Control. - */ - typedef struct - { - float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - float32_t A2; /**< The derived gain, A2 = Kd . */ - float32_t state[3]; /**< The state array of length 3. */ - float32_t Kp; /**< The proportional gain. */ - float32_t Ki; /**< The integral gain. */ - float32_t Kd; /**< The derivative gain. */ - } arm_pid_instance_f32; - - - - /** - * @brief Initialization function for the floating-point PID Control. - * @param[in,out] *S points to an instance of the PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - * @return none. - */ - void arm_pid_init_f32( - arm_pid_instance_f32 * S, - int32_t resetStateFlag); - - /** - * @brief Reset function for the floating-point PID Control. - * @param[in,out] *S is an instance of the floating-point PID Control structure - * @return none - */ - void arm_pid_reset_f32( - arm_pid_instance_f32 * S); - - - /** - * @brief Initialization function for the Q31 PID Control. - * @param[in,out] *S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - * @return none. - */ - void arm_pid_init_q31( - arm_pid_instance_q31 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the Q31 PID Control. - * @param[in,out] *S points to an instance of the Q31 PID Control structure - * @return none - */ - - void arm_pid_reset_q31( - arm_pid_instance_q31 * S); - - /** - * @brief Initialization function for the Q15 PID Control. - * @param[in,out] *S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - * @return none. - */ - void arm_pid_init_q15( - arm_pid_instance_q15 * S, - int32_t resetStateFlag); - - /** - * @brief Reset function for the Q15 PID Control. - * @param[in,out] *S points to an instance of the q15 PID Control structure - * @return none - */ - void arm_pid_reset_q15( - arm_pid_instance_q15 * S); - - - /** - * @brief Instance structure for the floating-point Linear Interpolate function. - */ - typedef struct - { - uint32_t nValues; /**< nValues */ - float32_t x1; /**< x1 */ - float32_t xSpacing; /**< xSpacing */ - float32_t *pYData; /**< pointer to the table of Y values */ - } arm_linear_interp_instance_f32; - - /** - * @brief Instance structure for the floating-point bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - float32_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_f32; - - /** - * @brief Instance structure for the Q31 bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q31_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q31; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q15_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q15; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q7_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q7; - - - /** - * @brief Q7 vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Floating-point vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - - - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q15; - - arm_status arm_cfft_radix2_init_q15( - arm_cfft_radix2_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - void arm_cfft_radix2_q15( - const arm_cfft_radix2_instance_q15 * S, - q15_t * pSrc); - - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q15; - - arm_status arm_cfft_radix4_init_q15( - arm_cfft_radix4_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - void arm_cfft_radix4_q15( - const arm_cfft_radix4_instance_q15 * S, - q15_t * pSrc); - - /** - * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q31; - - arm_status arm_cfft_radix2_init_q31( - arm_cfft_radix2_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - void arm_cfft_radix2_q31( - const arm_cfft_radix2_instance_q31 * S, - q31_t * pSrc); - - /** - * @brief Instance structure for the Q31 CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q31; - - - void arm_cfft_radix4_q31( - const arm_cfft_radix4_instance_q31 * S, - q31_t * pSrc); - - arm_status arm_cfft_radix4_init_q31( - arm_cfft_radix4_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix2_instance_f32; - -/* Deprecated */ - arm_status arm_cfft_radix2_init_f32( - arm_cfft_radix2_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix2_f32( - const arm_cfft_radix2_instance_f32 * S, - float32_t * pSrc); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix4_instance_f32; - -/* Deprecated */ - arm_status arm_cfft_radix4_init_f32( - arm_cfft_radix4_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix4_f32( - const arm_cfft_radix4_instance_f32 * S, - float32_t * pSrc); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } arm_cfft_instance_f32; - - void arm_cfft_f32( - const arm_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the Q15 RFFT/RIFFT function. - */ - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint32_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_q15; - - arm_status arm_rfft_init_q15( - arm_rfft_instance_q15 * S, - arm_cfft_radix4_instance_q15 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_q15( - const arm_rfft_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - - /** - * @brief Instance structure for the Q31 RFFT/RIFFT function. - */ - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint32_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_q31; - - arm_status arm_rfft_init_q31( - arm_rfft_instance_q31 * S, - arm_cfft_radix4_instance_q31 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_q31( - const arm_rfft_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint16_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_f32; - - arm_status arm_rfft_init_f32( - arm_rfft_instance_f32 * S, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_f32( - const arm_rfft_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst); - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ - -typedef struct - { - arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ - } arm_rfft_fast_instance_f32 ; - -arm_status arm_rfft_fast_init_f32 ( - arm_rfft_fast_instance_f32 * S, - uint16_t fftLen); - -void arm_rfft_fast_f32( - arm_rfft_fast_instance_f32 * S, - float32_t * p, float32_t * pOut, - uint8_t ifftFlag); - - /** - * @brief Instance structure for the floating-point DCT4/IDCT4 function. - */ - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - float32_t normalize; /**< normalizing factor. */ - float32_t *pTwiddle; /**< points to the twiddle factor table. */ - float32_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_f32; - - /** - * @brief Initialization function for the floating-point DCT4/IDCT4. - * @param[in,out] *S points to an instance of floating-point DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of floating-point RFFT/RIFFT structure. - * @param[in] *S_CFFT points to an instance of floating-point CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported transform length. - */ - - arm_status arm_dct4_init_f32( - arm_dct4_instance_f32 * S, - arm_rfft_instance_f32 * S_RFFT, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint16_t N, - uint16_t Nby2, - float32_t normalize); - - /** - * @brief Processing function for the floating-point DCT4/IDCT4. - * @param[in] *S points to an instance of the floating-point DCT4/IDCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - */ - - void arm_dct4_f32( - const arm_dct4_instance_f32 * S, - float32_t * pState, - float32_t * pInlineBuffer); - - /** - * @brief Instance structure for the Q31 DCT4/IDCT4 function. - */ - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - q31_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q31; - - /** - * @brief Initialization function for the Q31 DCT4/IDCT4. - * @param[in,out] *S points to an instance of Q31 DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of Q31 RFFT/RIFFT structure - * @param[in] *S_CFFT points to an instance of Q31 CFFT/CIFFT structure - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length. - */ - - arm_status arm_dct4_init_q31( - arm_dct4_instance_q31 * S, - arm_rfft_instance_q31 * S_RFFT, - arm_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize); - - /** - * @brief Processing function for the Q31 DCT4/IDCT4. - * @param[in] *S points to an instance of the Q31 DCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - */ - - void arm_dct4_q31( - const arm_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - /** - * @brief Instance structure for the Q15 DCT4/IDCT4 function. - */ - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - q15_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q15; - - /** - * @brief Initialization function for the Q15 DCT4/IDCT4. - * @param[in,out] *S points to an instance of Q15 DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of Q15 RFFT/RIFFT structure. - * @param[in] *S_CFFT points to an instance of Q15 CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length. - */ - - arm_status arm_dct4_init_q15( - arm_dct4_instance_q15 * S, - arm_rfft_instance_q15 * S_RFFT, - arm_cfft_radix4_instance_q15 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q15_t normalize); - - /** - * @brief Processing function for the Q15 DCT4/IDCT4. - * @param[in] *S points to an instance of the Q15 DCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - */ - - void arm_dct4_q15( - const arm_dct4_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); - - /** - * @brief Floating-point vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Q7 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Floating-point vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Q7 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a floating-point vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scale scale factor to be applied - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_f32( - float32_t * pSrc, - float32_t scale, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a Q7 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_q7( - q7_t * pSrc, - q7_t scaleFract, - int8_t shift, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a Q15 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_q15( - q15_t * pSrc, - q15_t scaleFract, - int8_t shift, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a Q31 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_q31( - q31_t * pSrc, - q31_t scaleFract, - int8_t shift, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Q7 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Floating-point vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Dot product of floating-point vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t blockSize, - float32_t * result); - - /** - * @brief Dot product of Q7 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_q7( - q7_t * pSrcA, - q7_t * pSrcB, - uint32_t blockSize, - q31_t * result); - - /** - * @brief Dot product of Q15 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - /** - * @brief Dot product of Q31 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - /** - * @brief Shifts the elements of a Q7 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_shift_q7( - q7_t * pSrc, - int8_t shiftBits, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Shifts the elements of a Q15 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_shift_q15( - q15_t * pSrc, - int8_t shiftBits, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Shifts the elements of a Q31 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_shift_q31( - q31_t * pSrc, - int8_t shiftBits, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_f32( - float32_t * pSrc, - float32_t offset, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_q7( - q7_t * pSrc, - q7_t offset, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_q15( - q15_t * pSrc, - q15_t offset, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_q31( - q31_t * pSrc, - q31_t offset, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - /** - * @brief Copies the elements of a floating-point vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Copies the elements of a Q7 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Copies the elements of a Q15 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Copies the elements of a Q31 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - /** - * @brief Fills a constant value into a floating-point vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_f32( - float32_t value, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Fills a constant value into a Q7 vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_q7( - q7_t value, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Fills a constant value into a Q15 vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_q15( - q15_t value, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Fills a constant value into a Q31 vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_q31( - q31_t value, - q31_t * pDst, - uint32_t blockSize); - -/** - * @brief Convolution of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - - /** - * @brief Convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return none. - */ - - - void arm_conv_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - /** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - /** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return none. - */ - - void arm_conv_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - - /** - * @brief Convolution of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - /** - * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return none. - */ - - void arm_conv_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - - /** - * @brief Convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Partial convolution of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - /** - * @brief Partial convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Partial convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - /** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Partial convolution of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q7 sequences - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Partial convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - - /** - * @brief Instance structure for the Q15 FIR decimator. - */ - - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR decimator. - */ - - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - - } arm_fir_decimate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR decimator. - */ - - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - - } arm_fir_decimate_instance_f32; - - - - /** - * @brief Processing function for the floating-point FIR decimator. - * @param[in] *S points to an instance of the floating-point FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_f32( - const arm_fir_decimate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point FIR decimator. - * @param[in,out] *S points to an instance of the floating-point FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * <code>blockSize</code> is not a multiple of <code>M</code>. - */ - - arm_status arm_fir_decimate_init_f32( - arm_fir_decimate_instance_f32 * S, - uint16_t numTaps, - uint8_t M, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q15 FIR decimator. - * @param[in] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_fast_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - - /** - * @brief Initialization function for the Q15 FIR decimator. - * @param[in,out] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * <code>blockSize</code> is not a multiple of <code>M</code>. - */ - - arm_status arm_fir_decimate_init_q15( - arm_fir_decimate_instance_q15 * S, - uint16_t numTaps, - uint8_t M, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR decimator. - * @param[in] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_q31( - const arm_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_fast_q31( - arm_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR decimator. - * @param[in,out] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * <code>blockSize</code> is not a multiple of <code>M</code>. - */ - - arm_status arm_fir_decimate_init_q31( - arm_fir_decimate_instance_q31 * S, - uint16_t numTaps, - uint8_t M, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - - /** - * @brief Instance structure for the Q15 FIR interpolator. - */ - - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR interpolator. - */ - - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR interpolator. - */ - - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ - } arm_fir_interpolate_instance_f32; - - - /** - * @brief Processing function for the Q15 FIR interpolator. - * @param[in] *S points to an instance of the Q15 FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_interpolate_q15( - const arm_fir_interpolate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 FIR interpolator. - * @param[in,out] *S points to an instance of the Q15 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>. - */ - - arm_status arm_fir_interpolate_init_q15( - arm_fir_interpolate_instance_q15 * S, - uint8_t L, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR interpolator. - * @param[in] *S points to an instance of the Q15 FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_interpolate_q31( - const arm_fir_interpolate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 FIR interpolator. - * @param[in,out] *S points to an instance of the Q31 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>. - */ - - arm_status arm_fir_interpolate_init_q31( - arm_fir_interpolate_instance_q31 * S, - uint8_t L, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point FIR interpolator. - * @param[in] *S points to an instance of the floating-point FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_interpolate_f32( - const arm_fir_interpolate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point FIR interpolator. - * @param[in,out] *S points to an instance of the floating-point FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>. - */ - - arm_status arm_fir_interpolate_init_f32( - arm_fir_interpolate_instance_f32 * S, - uint8_t L, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - /** - * @brief Instance structure for the high precision Q31 Biquad cascade filter. - */ - - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ - - } arm_biquad_cas_df1_32x64_ins_q31; - - - /** - * @param[in] *S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cas_df1_32x64_q31( - const arm_biquad_cas_df1_32x64_ins_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @param[in,out] *S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format - * @return none - */ - - void arm_biquad_cas_df1_32x64_init_q31( - arm_biquad_cas_df1_32x64_ins_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q63_t * pState, - uint8_t postShift); - - - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f32; - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in] *S points to an instance of the filter data structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df2T_f32( - const arm_biquad_cascade_df2T_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] *S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @return none - */ - - void arm_biquad_cascade_df2T_init_f32( - arm_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - - /** - * @brief Instance structure for the Q15 FIR lattice filter. - */ - - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR lattice filter. - */ - - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR lattice filter. - */ - - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_f32; - - /** - * @brief Initialization function for the Q15 FIR lattice filter. - * @param[in] *S points to an instance of the Q15 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - - void arm_fir_lattice_init_q15( - arm_fir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pCoeffs, - q15_t * pState); - - - /** - * @brief Processing function for the Q15 FIR lattice filter. - * @param[in] *S points to an instance of the Q15 FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_lattice_q15( - const arm_fir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 FIR lattice filter. - * @param[in] *S points to an instance of the Q31 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - - void arm_fir_lattice_init_q31( - arm_fir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pCoeffs, - q31_t * pState); - - - /** - * @brief Processing function for the Q31 FIR lattice filter. - * @param[in] *S points to an instance of the Q31 FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_fir_lattice_q31( - const arm_fir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - -/** - * @brief Initialization function for the floating-point FIR lattice filter. - * @param[in] *S points to an instance of the floating-point FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - - void arm_fir_lattice_init_f32( - arm_fir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - /** - * @brief Processing function for the floating-point FIR lattice filter. - * @param[in] *S points to an instance of the floating-point FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_fir_lattice_f32( - const arm_fir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Instance structure for the Q15 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_f32; - - /** - * @brief Processing function for the floating-point IIR lattice filter. - * @param[in] *S points to an instance of the floating-point IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_f32( - const arm_iir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point IIR lattice filter. - * @param[in] *S points to an instance of the floating-point IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize-1. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_init_f32( - arm_iir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pkCoeffs, - float32_t * pvCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 IIR lattice filter. - * @param[in] *S points to an instance of the Q31 IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_q31( - const arm_iir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 IIR lattice filter. - * @param[in] *S points to an instance of the Q31 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_init_q31( - arm_iir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pkCoeffs, - q31_t * pvCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 IIR lattice filter. - * @param[in] *S points to an instance of the Q15 IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_q15( - const arm_iir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q15 IIR lattice filter. - * @param[in] *S points to an instance of the fixed-point Q15 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process per call. - * @return none. - */ - - void arm_iir_lattice_init_q15( - arm_iir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pkCoeffs, - q15_t * pvCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Instance structure for the floating-point LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that controls filter coefficient updates. */ - } arm_lms_instance_f32; - - /** - * @brief Processing function for floating-point LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_f32( - const arm_lms_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for floating-point LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to the coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_init_f32( - arm_lms_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - /** - * @brief Instance structure for the Q15 LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } arm_lms_instance_q15; - - - /** - * @brief Initialization function for the Q15 LMS filter. - * @param[in] *S points to an instance of the Q15 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to the coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_init_q15( - arm_lms_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint32_t postShift); - - /** - * @brief Processing function for Q15 LMS filter. - * @param[in] *S points to an instance of the Q15 LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_q15( - const arm_lms_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - - } arm_lms_instance_q31; - - /** - * @brief Processing function for Q31 LMS filter. - * @param[in] *S points to an instance of the Q15 LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_q31( - const arm_lms_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for Q31 LMS filter. - * @param[in] *S points to an instance of the Q31 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_init_q31( - arm_lms_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint32_t postShift); - - /** - * @brief Instance structure for the floating-point normalized LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that control filter coefficient updates. */ - float32_t energy; /**< saves previous frame energy. */ - float32_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_f32; - - /** - * @brief Processing function for floating-point normalized LMS filter. - * @param[in] *S points to an instance of the floating-point normalized LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_f32( - arm_lms_norm_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for floating-point normalized LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_init_f32( - arm_lms_norm_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q31_t *recipTable; /**< points to the reciprocal initial value table. */ - q31_t energy; /**< saves previous frame energy. */ - q31_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q31; - - /** - * @brief Processing function for Q31 normalized LMS filter. - * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_q31( - arm_lms_norm_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for Q31 normalized LMS filter. - * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_norm_init_q31( - arm_lms_norm_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint8_t postShift); - - /** - * @brief Instance structure for the Q15 normalized LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< Number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q15_t *recipTable; /**< Points to the reciprocal initial value table. */ - q15_t energy; /**< saves previous frame energy. */ - q15_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q15; - - /** - * @brief Processing function for Q15 normalized LMS filter. - * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_q15( - arm_lms_norm_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q15 normalized LMS filter. - * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_norm_init_q15( - arm_lms_norm_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint8_t postShift); - - /** - * @brief Correlation of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - - /** - * @brief Correlation of Q15 sequences - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @return none. - */ - void arm_correlate_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - - /** - * @brief Correlation of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - /** - * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - - - /** - * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @return none. - */ - - void arm_correlate_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - /** - * @brief Correlation of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - /** - * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - - /** - * @brief Correlation of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return none. - */ - - void arm_correlate_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Correlation of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Instance structure for the floating-point sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_f32; - - /** - * @brief Instance structure for the Q31 sparse FIR filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q31; - - /** - * @brief Instance structure for the Q15 sparse FIR filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q15; - - /** - * @brief Instance structure for the Q7 sparse FIR filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q7; - - /** - * @brief Processing function for the floating-point sparse FIR filter. - * @param[in] *S points to an instance of the floating-point sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_f32( - arm_fir_sparse_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - float32_t * pScratchIn, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point sparse FIR filter. - * @param[in,out] *S points to an instance of the floating-point sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_f32( - arm_fir_sparse_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 sparse FIR filter. - * @param[in] *S points to an instance of the Q31 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_q31( - arm_fir_sparse_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - q31_t * pScratchIn, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q31 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_q31( - arm_fir_sparse_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - /** - * @brief Processing function for the Q15 sparse FIR filter. - * @param[in] *S points to an instance of the Q15 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] *pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_q15( - arm_fir_sparse_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - q15_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q15 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_q15( - arm_fir_sparse_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - /** - * @brief Processing function for the Q7 sparse FIR filter. - * @param[in] *S points to an instance of the Q7 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] *pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_q7( - arm_fir_sparse_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - q7_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q7 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q7 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_q7( - arm_fir_sparse_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /* - * @brief Floating-point sin_cos function. - * @param[in] theta input value in degrees - * @param[out] *pSinVal points to the processed sine output. - * @param[out] *pCosVal points to the processed cos output. - * @return none. - */ - - void arm_sin_cos_f32( - float32_t theta, - float32_t * pSinVal, - float32_t * pCcosVal); - - /* - * @brief Q31 sin_cos function. - * @param[in] theta scaled input value in degrees - * @param[out] *pSinVal points to the processed sine output. - * @param[out] *pCosVal points to the processed cosine output. - * @return none. - */ - - void arm_sin_cos_q31( - q31_t theta, - q31_t * pSinVal, - q31_t * pCosVal); - - - /** - * @brief Floating-point complex conjugate. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_conj_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex conjugate. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_conj_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex conjugate. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_conj_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - - /** - * @brief Floating-point complex magnitude squared - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_squared_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex magnitude squared - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_squared_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex magnitude squared - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_squared_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @ingroup groupController - */ - - /** - * @defgroup PID PID Motor Control - * - * A Proportional Integral Derivative (PID) controller is a generic feedback control - * loop mechanism widely used in industrial control systems. - * A PID controller is the most commonly used type of feedback controller. - * - * This set of functions implements (PID) controllers - * for Q15, Q31, and floating-point data types. The functions operate on a single sample - * of data and each call to the function returns a single processed value. - * <code>S</code> points to an instance of the PID control data structure. <code>in</code> - * is the input sample value. The functions return the output value. - * - * \par Algorithm: - * <pre> - * y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] - * A0 = Kp + Ki + Kd - * A1 = (-Kp ) - (2 * Kd ) - * A2 = Kd </pre> - * - * \par - * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant - * - * \par - * \image html PID.gif "Proportional Integral Derivative Controller" - * - * \par - * The PID controller calculates an "error" value as the difference between - * the measured output and the reference input. - * The controller attempts to minimize the error by adjusting the process control inputs. - * The proportional value determines the reaction to the current error, - * the integral value determines the reaction based on the sum of recent errors, - * and the derivative value determines the reaction based on the rate at which the error has been changing. - * - * \par Instance Structure - * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. - * A separate instance structure must be defined for each PID Controller. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Reset Functions - * There is also an associated reset function for each data type which clears the state array. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. - * - Zeros out the values in the state buffer. - * - * \par - * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the PID Controller functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup PID - * @{ - */ - - /** - * @brief Process function for the floating-point PID Control. - * @param[in,out] *S is an instance of the floating-point PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - */ - - - static __INLINE float32_t arm_pid_f32( - arm_pid_instance_f32 * S, - float32_t in) - { - float32_t out; - - /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ - out = (S->A0 * in) + - (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - - /** - * @brief Process function for the Q31 PID Control. - * @param[in,out] *S points to an instance of the Q31 PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clip. - * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. - * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. - */ - - static __INLINE q31_t arm_pid_q31( - arm_pid_instance_q31 * S, - q31_t in) - { - q63_t acc; - q31_t out; - - /* acc = A0 * x[n] */ - acc = (q63_t) S->A0 * in; - - /* acc += A1 * x[n-1] */ - acc += (q63_t) S->A1 * S->state[0]; - - /* acc += A2 * x[n-2] */ - acc += (q63_t) S->A2 * S->state[1]; - - /* convert output to 1.31 format to add y[n-1] */ - out = (q31_t) (acc >> 31u); - - /* out += y[n-1] */ - out += S->state[2]; - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - - /** - * @brief Process function for the Q15 PID Control. - * @param[in,out] *S points to an instance of the Q15 PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - * Lastly, the accumulator is saturated to yield a result in 1.15 format. - */ - - static __INLINE q15_t arm_pid_q15( - arm_pid_instance_q15 * S, - q15_t in) - { - q63_t acc; - q15_t out; - -#ifndef ARM_MATH_CM0_FAMILY - __SIMD32_TYPE *vstate; - - /* Implementation of PID controller */ - - /* acc = A0 * x[n] */ - acc = (q31_t) __SMUAD(S->A0, in); - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - vstate = __SIMD32_CONST(S->state); - acc = __SMLALD(S->A1, (q31_t) *vstate, acc); - -#else - /* acc = A0 * x[n] */ - acc = ((q31_t) S->A0) * in; - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc += (q31_t) S->A1 * S->state[0]; - acc += (q31_t) S->A2 * S->state[1]; - -#endif - - /* acc += y[n-1] */ - acc += (q31_t) S->state[2] << 15; - - /* saturate the output */ - out = (q15_t) (__SSAT((acc >> 15), 16)); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - - /** - * @} end of PID group - */ - - - /** - * @brief Floating-point matrix inverse. - * @param[in] *src points to the instance of the input floating-point matrix structure. - * @param[out] *dst points to the instance of the output floating-point matrix structure. - * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. - * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. - */ - - arm_status arm_mat_inverse_f32( - const arm_matrix_instance_f32 * src, - arm_matrix_instance_f32 * dst); - - - - /** - * @ingroup groupController - */ - - - /** - * @defgroup clarke Vector Clarke Transform - * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. - * Generally the Clarke transform uses three-phase currents <code>Ia, Ib and Ic</code> to calculate currents - * in the two-phase orthogonal stator axis <code>Ialpha</code> and <code>Ibeta</code>. - * When <code>Ialpha</code> is superposed with <code>Ia</code> as shown in the figure below - * \image html clarke.gif Stator current space vector and its components in (a,b). - * and <code>Ia + Ib + Ic = 0</code>, in this condition <code>Ialpha</code> and <code>Ibeta</code> - * can be calculated using only <code>Ia</code> and <code>Ib</code>. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeFormula.gif - * where <code>Ia</code> and <code>Ib</code> are the instantaneous stator phases and - * <code>pIalpha</code> and <code>pIbeta</code> are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup clarke - * @{ - */ - - /** - * - * @brief Floating-point Clarke transform - * @param[in] Ia input three-phase coordinate <code>a</code> - * @param[in] Ib input three-phase coordinate <code>b</code> - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @return none. - */ - - static __INLINE void arm_clarke_f32( - float32_t Ia, - float32_t Ib, - float32_t * pIalpha, - float32_t * pIbeta) - { - /* Calculate pIalpha using the equation, pIalpha = Ia */ - *pIalpha = Ia; - - /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ - *pIbeta = - ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); - - } - - /** - * @brief Clarke transform for Q31 version - * @param[in] Ia input three-phase coordinate <code>a</code> - * @param[in] Ib input three-phase coordinate <code>b</code> - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @return none. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition, hence there is no risk of overflow. - */ - - static __INLINE void arm_clarke_q31( - q31_t Ia, - q31_t Ib, - q31_t * pIalpha, - q31_t * pIbeta) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIalpha from Ia by equation pIalpha = Ia */ - *pIalpha = Ia; - - /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); - - /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ - product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); - - /* pIbeta is calculated by adding the intermediate products */ - *pIbeta = __QADD(product1, product2); - } - - /** - * @} end of clarke group - */ - - /** - * @brief Converts the elements of the Q7 vector to Q31 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_q7_to_q31( - q7_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_clarke Vector Inverse Clarke Transform - * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeInvFormula.gif - * where <code>pIa</code> and <code>pIb</code> are the instantaneous stator phases and - * <code>Ialpha</code> and <code>Ibeta</code> are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_clarke - * @{ - */ - - /** - * @brief Floating-point Inverse Clarke transform - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] *pIa points to output three-phase coordinate <code>a</code> - * @param[out] *pIb points to output three-phase coordinate <code>b</code> - * @return none. - */ - - - static __INLINE void arm_inv_clarke_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pIa, - float32_t * pIb) - { - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ - *pIb = -0.5 * Ialpha + (float32_t) 0.8660254039 *Ibeta; - - } - - /** - * @brief Inverse Clarke transform for Q31 version - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] *pIa points to output three-phase coordinate <code>a</code> - * @param[out] *pIb points to output three-phase coordinate <code>b</code> - * @return none. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the subtraction, hence there is no risk of overflow. - */ - - static __INLINE void arm_inv_clarke_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pIa, - q31_t * pIb) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); - - /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); - - /* pIb is calculated by subtracting the products */ - *pIb = __QSUB(product2, product1); - - } - - /** - * @} end of inv_clarke group - */ - - /** - * @brief Converts the elements of the Q7 vector to Q15 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_q7_to_q15( - q7_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup park Vector Park Transform - * - * Forward Park transform converts the input two-coordinate vector to flux and torque components. - * The Park transform can be used to realize the transformation of the <code>Ialpha</code> and the <code>Ibeta</code> currents - * from the stationary to the moving reference frame and control the spatial relationship between - * the stator vector current and rotor flux vector. - * If we consider the d axis aligned with the rotor flux, the diagram below shows the - * current vector and the relationship from the two reference frames: - * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkFormula.gif - * where <code>Ialpha</code> and <code>Ibeta</code> are the stator vector components, - * <code>pId</code> and <code>pIq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup park - * @{ - */ - - /** - * @brief Floating-point Park transform - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] *pId points to output rotor reference frame d - * @param[out] *pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - * - * The function implements the forward Park transform. - * - */ - - static __INLINE void arm_park_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pId, - float32_t * pIq, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ - *pId = Ialpha * cosVal + Ibeta * sinVal; - - /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ - *pIq = -Ialpha * sinVal + Ibeta * cosVal; - - } - - /** - * @brief Park transform for Q31 version - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] *pId points to output rotor reference frame d - * @param[out] *pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition and subtraction, hence there is no risk of overflow. - */ - - - static __INLINE void arm_park_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pId, - q31_t * pIq, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Ialpha * cosVal) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * sinVal) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Ialpha * sinVal) */ - product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * cosVal) */ - product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); - - /* Calculate pId by adding the two intermediate products 1 and 2 */ - *pId = __QADD(product1, product2); - - /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ - *pIq = __QSUB(product4, product3); - } - - /** - * @} end of park group - */ - - /** - * @brief Converts the elements of the Q7 vector to floating-point vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q7_to_float( - q7_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_park Vector Inverse Park transform - * Inverse Park transform converts the input flux and torque components to two-coordinate vector. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkInvFormula.gif - * where <code>pIalpha</code> and <code>pIbeta</code> are the stator vector components, - * <code>Id</code> and <code>Iq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_park - * @{ - */ - - /** - * @brief Floating-point Inverse Park transform - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - */ - - static __INLINE void arm_inv_park_f32( - float32_t Id, - float32_t Iq, - float32_t * pIalpha, - float32_t * pIbeta, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ - *pIalpha = Id * cosVal - Iq * sinVal; - - /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ - *pIbeta = Id * sinVal + Iq * cosVal; - - } - - - /** - * @brief Inverse Park transform for Q31 version - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition, hence there is no risk of overflow. - */ - - - static __INLINE void arm_inv_park_q31( - q31_t Id, - q31_t Iq, - q31_t * pIalpha, - q31_t * pIbeta, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Id * cosVal) */ - product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Iq * sinVal) */ - product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Id * sinVal) */ - product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Iq * cosVal) */ - product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); - - /* Calculate pIalpha by using the two intermediate products 1 and 2 */ - *pIalpha = __QSUB(product1, product2); - - /* Calculate pIbeta by using the two intermediate products 3 and 4 */ - *pIbeta = __QADD(product4, product3); - - } - - /** - * @} end of Inverse park group - */ - - - /** - * @brief Converts the elements of the Q31 vector to floating-point vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q31_to_float( - q31_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup LinearInterpolate Linear Interpolation - * - * Linear interpolation is a method of curve fitting using linear polynomials. - * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line - * - * \par - * \image html LinearInterp.gif "Linear interpolation" - * - * \par - * A Linear Interpolate function calculates an output value(y), for the input(x) - * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) - * - * \par Algorithm: - * <pre> - * y = y0 + (x - x0) * ((y1 - y0)/(x1-x0)) - * where x0, x1 are nearest values of input x - * y0, y1 are nearest values to output y - * </pre> - * - * \par - * This set of functions implements Linear interpolation process - * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single - * sample of data and each call to the function returns a single processed value. - * <code>S</code> points to an instance of the Linear Interpolate function data structure. - * <code>x</code> is the input sample value. The functions returns the output value. - * - * \par - * if x is outside of the table boundary, Linear interpolation returns first value of the table - * if x is below input range and returns last value of table if x is above range. - */ - - /** - * @addtogroup LinearInterpolate - * @{ - */ - - /** - * @brief Process function for the floating-point Linear Interpolation Function. - * @param[in,out] *S is an instance of the floating-point Linear Interpolation structure - * @param[in] x input sample to process - * @return y processed output sample. - * - */ - - static __INLINE float32_t arm_linear_interp_f32( - arm_linear_interp_instance_f32 * S, - float32_t x) - { - - float32_t y; - float32_t x0, x1; /* Nearest input values */ - float32_t y0, y1; /* Nearest output values */ - float32_t xSpacing = S->xSpacing; /* spacing between input values */ - int32_t i; /* Index variable */ - float32_t *pYData = S->pYData; /* pointer to output table */ - - /* Calculation of index */ - i = (int32_t) ((x - S->x1) / xSpacing); - - if(i < 0) - { - /* Iniatilize output for below specified range as least output value of table */ - y = pYData[0]; - } - else if((uint32_t)i >= S->nValues) - { - /* Iniatilize output for above specified range as last output value of table */ - y = pYData[S->nValues - 1]; - } - else - { - /* Calculation of nearest input values */ - x0 = S->x1 + i * xSpacing; - x1 = S->x1 + (i + 1) * xSpacing; - - /* Read of nearest output values */ - y0 = pYData[i]; - y1 = pYData[i + 1]; - - /* Calculation of output */ - y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); - - } - - /* returns output value */ - return (y); - } - - /** - * - * @brief Process function for the Q31 Linear Interpolation Function. - * @param[in] *pYData pointer to Q31 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - - - static __INLINE q31_t arm_linear_interp_q31( - q31_t * pYData, - q31_t x, - uint32_t nValues) - { - q31_t y; /* output */ - q31_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & 0xFFF00000) >> 20); - - if(index >= (int32_t)(nValues - 1)) - { - return (pYData[nValues - 1]); - } - else if(index < 0) - { - return (pYData[0]); - } - else - { - - /* 20 bits for the fractional part */ - /* shift left by 11 to keep fract in 1.31 format */ - fract = (x & 0x000FFFFF) << 11; - - /* Read two nearest output values from the index in 1.31(q31) format */ - y0 = pYData[index]; - y1 = pYData[index + 1u]; - - /* Calculation of y0 * (1-fract) and y is in 2.30 format */ - y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); - - /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ - y += ((q31_t) (((q63_t) y1 * fract) >> 32)); - - /* Convert y to 1.31 format */ - return (y << 1u); - - } - - } - - /** - * - * @brief Process function for the Q15 Linear Interpolation Function. - * @param[in] *pYData pointer to Q15 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - - - static __INLINE q15_t arm_linear_interp_q15( - q15_t * pYData, - q31_t x, - uint32_t nValues) - { - q63_t y; /* output */ - q15_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & 0xFFF00000) >> 20u); - - if(index >= (int32_t)(nValues - 1)) - { - return (pYData[nValues - 1]); - } - else if(index < 0) - { - return (pYData[0]); - } - else - { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y0 = pYData[index]; - y1 = pYData[index + 1u]; - - /* Calculation of y0 * (1-fract) and y is in 13.35 format */ - y = ((q63_t) y0 * (0xFFFFF - fract)); - - /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ - y += ((q63_t) y1 * (fract)); - - /* convert y to 1.15 format */ - return (y >> 20); - } - - - } - - /** - * - * @brief Process function for the Q7 Linear Interpolation Function. - * @param[in] *pYData pointer to Q7 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - */ - - - static __INLINE q7_t arm_linear_interp_q7( - q7_t * pYData, - q31_t x, - uint32_t nValues) - { - q31_t y; /* output */ - q7_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - uint32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - if (x < 0) - { - return (pYData[0]); - } - index = (x >> 20) & 0xfff; - - - if(index >= (nValues - 1)) - { - return (pYData[nValues - 1]); - } - else - { - - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index and are in 1.7(q7) format */ - y0 = pYData[index]; - y1 = pYData[index + 1u]; - - /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ - y = ((y0 * (0xFFFFF - fract))); - - /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ - y += (y1 * fract); - - /* convert y to 1.7(q7) format */ - return (y >> 20u); - - } - - } - /** - * @} end of LinearInterpolate group - */ - - /** - * @brief Fast approximation to the trigonometric sine function for floating-point data. - * @param[in] x input value in radians. - * @return sin(x). - */ - - float32_t arm_sin_f32( - float32_t x); - - /** - * @brief Fast approximation to the trigonometric sine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - - q31_t arm_sin_q31( - q31_t x); - - /** - * @brief Fast approximation to the trigonometric sine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - - q15_t arm_sin_q15( - q15_t x); - - /** - * @brief Fast approximation to the trigonometric cosine function for floating-point data. - * @param[in] x input value in radians. - * @return cos(x). - */ - - float32_t arm_cos_f32( - float32_t x); - - /** - * @brief Fast approximation to the trigonometric cosine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - - q31_t arm_cos_q31( - q31_t x); - - /** - * @brief Fast approximation to the trigonometric cosine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - - q15_t arm_cos_q15( - q15_t x); - - - /** - * @ingroup groupFastMath - */ - - - /** - * @defgroup SQRT Square Root - * - * Computes the square root of a number. - * There are separate functions for Q15, Q31, and floating-point data types. - * The square root function is computed using the Newton-Raphson algorithm. - * This is an iterative algorithm of the form: - * <pre> - * x1 = x0 - f(x0)/f'(x0) - * </pre> - * where <code>x1</code> is the current estimate, - * <code>x0</code> is the previous estimate, and - * <code>f'(x0)</code> is the derivative of <code>f()</code> evaluated at <code>x0</code>. - * For the square root function, the algorithm reduces to: - * <pre> - * x0 = in/2 [initial guess] - * x1 = 1/2 * ( x0 + in / x0) [each iteration] - * </pre> - */ - - - /** - * @addtogroup SQRT - * @{ - */ - - /** - * @brief Floating-point square root function. - * @param[in] in input value. - * @param[out] *pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * <code>in</code> is negative value and returns zero output for negative values. - */ - - static __INLINE arm_status arm_sqrt_f32( - float32_t in, - float32_t * pOut) - { - if(in > 0) - { - -// #if __FPU_USED -#if (__FPU_USED == 1) && defined ( __CC_ARM ) - *pOut = __sqrtf(in); -#else - *pOut = sqrtf(in); -#endif - - return (ARM_MATH_SUCCESS); - } - else - { - *pOut = 0.0f; - return (ARM_MATH_ARGUMENT_ERROR); - } - - } - - - /** - * @brief Q31 square root function. - * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. - * @param[out] *pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * <code>in</code> is negative value and returns zero output for negative values. - */ - arm_status arm_sqrt_q31( - q31_t in, - q31_t * pOut); - - /** - * @brief Q15 square root function. - * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF. - * @param[out] *pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * <code>in</code> is negative value and returns zero output for negative values. - */ - arm_status arm_sqrt_q15( - q15_t in, - q15_t * pOut); - - /** - * @} end of SQRT group - */ - - - - - - - /** - * @brief floating-point Circular write function. - */ - - static __INLINE void arm_circularWrite_f32( - int32_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const int32_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = wOffset; - } - - - - /** - * @brief floating-point Circular Read function. - */ - static __INLINE void arm_circularRead_f32( - int32_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - int32_t * dst, - int32_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (int32_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - /** - * @brief Q15 Circular write function. - */ - - static __INLINE void arm_circularWrite_q15( - q15_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q15_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = wOffset; - } - - - - /** - * @brief Q15 Circular Read function. - */ - static __INLINE void arm_circularRead_q15( - q15_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q15_t * dst, - q15_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (q15_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update wOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Q7 Circular write function. - */ - - static __INLINE void arm_circularWrite_q7( - q7_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q7_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = wOffset; - } - - - - /** - * @brief Q7 Circular Read function. - */ - static __INLINE void arm_circularRead_q7( - q7_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q7_t * dst, - q7_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (q7_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Sum of the squares of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_q31( - q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - /** - * @brief Sum of the squares of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Sum of the squares of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_q15( - q15_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - /** - * @brief Sum of the squares of the elements of a Q7 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_q7( - q7_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Mean value of a Q7 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_mean_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); - - /** - * @brief Mean value of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - void arm_mean_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - /** - * @brief Mean value of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - void arm_mean_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Mean value of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - void arm_mean_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Variance of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_var_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Variance of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_var_q31( - q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - /** - * @brief Variance of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_var_q15( - q15_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Root Mean Square of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_rms_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Root Mean Square of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_rms_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Root Mean Square of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_rms_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - /** - * @brief Standard deviation of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_std_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Standard deviation of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_std_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Standard deviation of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_std_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - /** - * @brief Floating-point complex magnitude - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex magnitude - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex magnitude - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex dot product - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] *realResult real part of the result returned here - * @param[out] *imagResult imaginary part of the result returned here - * @return none. - */ - - void arm_cmplx_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t numSamples, - q31_t * realResult, - q31_t * imagResult); - - /** - * @brief Q31 complex dot product - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] *realResult real part of the result returned here - * @param[out] *imagResult imaginary part of the result returned here - * @return none. - */ - - void arm_cmplx_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t numSamples, - q63_t * realResult, - q63_t * imagResult); - - /** - * @brief Floating-point complex dot product - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] *realResult real part of the result returned here - * @param[out] *imagResult imaginary part of the result returned here - * @return none. - */ - - void arm_cmplx_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t numSamples, - float32_t * realResult, - float32_t * imagResult); - - /** - * @brief Q15 complex-by-real multiplication - * @param[in] *pSrcCmplx points to the complex input vector - * @param[in] *pSrcReal points to the real input vector - * @param[out] *pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - * @return none. - */ - - void arm_cmplx_mult_real_q15( - q15_t * pSrcCmplx, - q15_t * pSrcReal, - q15_t * pCmplxDst, - uint32_t numSamples); - - /** - * @brief Q31 complex-by-real multiplication - * @param[in] *pSrcCmplx points to the complex input vector - * @param[in] *pSrcReal points to the real input vector - * @param[out] *pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - * @return none. - */ - - void arm_cmplx_mult_real_q31( - q31_t * pSrcCmplx, - q31_t * pSrcReal, - q31_t * pCmplxDst, - uint32_t numSamples); - - /** - * @brief Floating-point complex-by-real multiplication - * @param[in] *pSrcCmplx points to the complex input vector - * @param[in] *pSrcReal points to the real input vector - * @param[out] *pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - * @return none. - */ - - void arm_cmplx_mult_real_f32( - float32_t * pSrcCmplx, - float32_t * pSrcReal, - float32_t * pCmplxDst, - uint32_t numSamples); - - /** - * @brief Minimum value of a Q7 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *result is output pointer - * @param[in] index is the array index of the minimum value in the input buffer. - * @return none. - */ - - void arm_min_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * result, - uint32_t * index); - - /** - * @brief Minimum value of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output pointer - * @param[in] *pIndex is the array index of the minimum value in the input buffer. - * @return none. - */ - - void arm_min_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - /** - * @brief Minimum value of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output pointer - * @param[out] *pIndex is the array index of the minimum value in the input buffer. - * @return none. - */ - void arm_min_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - /** - * @brief Minimum value of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output pointer - * @param[out] *pIndex is the array index of the minimum value in the input buffer. - * @return none. - */ - - void arm_min_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a Q7 vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a Q15 vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a Q31 vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a floating-point vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - /** - * @brief Q15 complex-by-complex multiplication - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_mult_cmplx_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex-by-complex multiplication - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_mult_cmplx_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Floating-point complex-by-complex multiplication - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_mult_cmplx_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Converts the elements of the floating-point vector to Q31 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q31 output vector - * @param[in] blockSize length of the input vector - * @return none. - */ - void arm_float_to_q31( - float32_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the floating-point vector to Q15 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - * @return none - */ - void arm_float_to_q15( - float32_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the floating-point vector to Q7 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q7 output vector - * @param[in] blockSize length of the input vector - * @return none - */ - void arm_float_to_q7( - float32_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q31 vector to Q15 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q31_to_q15( - q31_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the Q31 vector to Q7 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q31_to_q7( - q31_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the Q15 vector to floating-point vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q15_to_float( - q15_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q31 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q15_to_q31( - q15_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q7 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q15_to_q7( - q15_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup BilinearInterpolate Bilinear Interpolation - * - * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. - * The underlying function <code>f(x, y)</code> is sampled on a regular grid and the interpolation process - * determines values between the grid points. - * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. - * Bilinear interpolation is often used in image processing to rescale images. - * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. - * - * <b>Algorithm</b> - * \par - * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. - * For floating-point, the instance structure is defined as: - * <pre> - * typedef struct - * { - * uint16_t numRows; - * uint16_t numCols; - * float32_t *pData; - * } arm_bilinear_interp_instance_f32; - * </pre> - * - * \par - * where <code>numRows</code> specifies the number of rows in the table; - * <code>numCols</code> specifies the number of columns in the table; - * and <code>pData</code> points to an array of size <code>numRows*numCols</code> values. - * The data table <code>pTable</code> is organized in row order and the supplied data values fall on integer indexes. - * That is, table element (x,y) is located at <code>pTable[x + y*numCols]</code> where x and y are integers. - * - * \par - * Let <code>(x, y)</code> specify the desired interpolation point. Then define: - * <pre> - * XF = floor(x) - * YF = floor(y) - * </pre> - * \par - * The interpolated output point is computed as: - * <pre> - * f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF)) - * + f(XF+1, YF) * (x-XF)*(1-(y-YF)) - * + f(XF, YF+1) * (1-(x-XF))*(y-YF) - * + f(XF+1, YF+1) * (x-XF)*(y-YF) - * </pre> - * Note that the coordinates (x, y) contain integer and fractional components. - * The integer components specify which portion of the table to use while the - * fractional components control the interpolation processor. - * - * \par - * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. - */ - - /** - * @addtogroup BilinearInterpolate - * @{ - */ - - /** - * - * @brief Floating-point bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate. - * @param[in] Y interpolation coordinate. - * @return out interpolated value. - */ - - - static __INLINE float32_t arm_bilinear_interp_f32( - const arm_bilinear_interp_instance_f32 * S, - float32_t X, - float32_t Y) - { - float32_t out; - float32_t f00, f01, f10, f11; - float32_t *pData = S->pData; - int32_t xIndex, yIndex, index; - float32_t xdiff, ydiff; - float32_t b1, b2, b3, b4; - - xIndex = (int32_t) X; - yIndex = (int32_t) Y; - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 - || yIndex > (S->numCols - 1)) - { - return (0); - } - - /* Calculation of index for two nearest points in X-direction */ - index = (xIndex - 1) + (yIndex - 1) * S->numCols; - - - /* Read two nearest points in X-direction */ - f00 = pData[index]; - f01 = pData[index + 1]; - - /* Calculation of index for two nearest points in Y-direction */ - index = (xIndex - 1) + (yIndex) * S->numCols; - - - /* Read two nearest points in Y-direction */ - f10 = pData[index]; - f11 = pData[index + 1]; - - /* Calculation of intermediate values */ - b1 = f00; - b2 = f01 - f00; - b3 = f10 - f00; - b4 = f00 - f01 - f10 + f11; - - /* Calculation of fractional part in X */ - xdiff = X - xIndex; - - /* Calculation of fractional part in Y */ - ydiff = Y - yIndex; - - /* Calculation of bi-linear interpolated output */ - out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; - - /* return to application */ - return (out); - - } - - /** - * - * @brief Q31 bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - - static __INLINE q31_t arm_bilinear_interp_q31( - arm_bilinear_interp_instance_q31 * S, - q31_t X, - q31_t Y) - { - q31_t out; /* Temporary output */ - q31_t acc = 0; /* output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q31_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q31_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & 0xFFF00000) >> 20u); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & 0xFFF00000) >> 20u); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* shift left xfract by 11 to keep 1.31 format */ - xfract = (X & 0x000FFFFF) << 11u; - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + nCols * (cI)]; - x2 = pYData[(rI) + nCols * (cI) + 1u]; - - /* 20 bits for the fractional part */ - /* shift left yfract by 11 to keep 1.31 format */ - yfract = (Y & 0x000FFFFF) << 11u; - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + nCols * (cI + 1)]; - y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ - out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); - acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); - - /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); - - /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* Convert acc to 1.31(q31) format */ - return (acc << 2u); - - } - - /** - * @brief Q15 bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - - static __INLINE q15_t arm_bilinear_interp_q15( - arm_bilinear_interp_instance_q15 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q15_t x1, x2, y1, y2; /* Nearest output values */ - q31_t xfract, yfract; /* X, Y fractional parts */ - int32_t rI, cI; /* Row and column indices */ - q15_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & 0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & 0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & 0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + nCols * (cI)]; - x2 = pYData[(rI) + nCols * (cI) + 1u]; - - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + nCols * (cI + 1)]; - y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ - - /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ - /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ - out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u); - acc = ((q63_t) out * (0xFFFFF - yfract)); - - /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u); - acc += ((q63_t) out * (xfract)); - - /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u); - acc += ((q63_t) out * (yfract)); - - /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u); - acc += ((q63_t) out * (yfract)); - - /* acc is in 13.51 format and down shift acc by 36 times */ - /* Convert out to 1.15 format */ - return (acc >> 36); - - } - - /** - * @brief Q7 bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - - static __INLINE q7_t arm_bilinear_interp_q7( - arm_bilinear_interp_instance_q7 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q7_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q7_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & 0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & 0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & 0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + nCols * (cI)]; - x2 = pYData[(rI) + nCols * (cI) + 1u]; - - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + nCols * (cI + 1)]; - y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ - out = ((x1 * (0xFFFFF - xfract))); - acc = (((q63_t) out * (0xFFFFF - yfract))); - - /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ - out = ((x2 * (0xFFFFF - yfract))); - acc += (((q63_t) out * (xfract))); - - /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y1 * (0xFFFFF - xfract))); - acc += (((q63_t) out * (yfract))); - - /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y2 * (yfract))); - acc += (((q63_t) out * (xfract))); - - /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ - return (acc >> 40); - - } - - /** - * @} end of BilinearInterpolate group - */ - - -#if defined ( __CC_ARM ) //Keil -//SMMLAR - #define multAcc_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) - -//SMMLSR - #define multSub_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) - -//SMMULR - #define mult_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) - -//Enter low optimization region - place directly above function definition - #define LOW_OPTIMIZATION_ENTER \ - _Pragma ("push") \ - _Pragma ("O1") - -//Exit low optimization region - place directly after end of function definition - #define LOW_OPTIMIZATION_EXIT \ - _Pragma ("pop") - -//Enter low optimization region - place directly above function definition - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - -//Exit low optimization region - place directly after end of function definition - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined(__ICCARM__) //IAR - //SMMLA - #define multAcc_32x32_keep32_R(a, x, y) \ - a += (q31_t) (((q63_t) x * y) >> 32) - - //SMMLS - #define multSub_32x32_keep32_R(a, x, y) \ - a -= (q31_t) (((q63_t) x * y) >> 32) - -//SMMUL - #define mult_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((q63_t) x * y ) >> 32) - -//Enter low optimization region - place directly above function definition - #define LOW_OPTIMIZATION_ENTER \ - _Pragma ("optimize=low") - -//Exit low optimization region - place directly after end of function definition - #define LOW_OPTIMIZATION_EXIT - -//Enter low optimization region - place directly above function definition - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ - _Pragma ("optimize=low") - -//Exit low optimization region - place directly after end of function definition - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined(__GNUC__) - //SMMLA - #define multAcc_32x32_keep32_R(a, x, y) \ - a += (q31_t) (((q63_t) x * y) >> 32) - - //SMMLS - #define multSub_32x32_keep32_R(a, x, y) \ - a -= (q31_t) (((q63_t) x * y) >> 32) - -//SMMUL - #define mult_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((q63_t) x * y ) >> 32) - - #define LOW_OPTIMIZATION_ENTER __attribute__(( optimize("-O1") )) - - #define LOW_OPTIMIZATION_EXIT - - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#endif - - - - - -#ifdef __cplusplus -} -#endif - - -#endif /* _ARM_MATH_H */ - - -/** - * - * End of file. - */ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm0.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm0.h deleted file mode 100644 index ab31de0..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm0.h +++ /dev/null @@ -1,682 +0,0 @@ -/**************************************************************************//** - * @file core_cm0.h - * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File - * @version V3.20 - * @date 25. February 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM0_H_GENERIC -#define __CORE_CM0_H_GENERIC - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.<br> - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.<br> - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup Cortex_M0 - @{ - */ - -/* CMSIS CM0 definitions */ -#define __CM0_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ -#define __CM0_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ -#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | \ - __CM0_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x00) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#endif - -#include <stdint.h> /* standard types definitions */ -#include <core_cmInstr.h> /* Core Instruction Access */ -#include <core_cmFunc.h> /* Core Function Access */ - -#endif /* __CORE_CM0_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0_H_DEPENDANT -#define __CORE_CM0_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0_REV - #define __CM0_REV 0x0000 - #warning "__CM0_REV not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - <strong>IO Type Qualifiers</strong> are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group Cortex_M0 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31]; - __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31]; - __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31]; - __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31]; - uint32_t RESERVED4[64]; - __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - uint32_t RESERVED0; - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) - are only accessible over DAP and not via processor. Therefore - they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M0 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) -#define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) ) -#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } - else { - NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */ - else { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the - function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = ticks - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#endif /* __CORE_CM0_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm0plus.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm0plus.h deleted file mode 100644 index 5cea74e..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm0plus.h +++ /dev/null @@ -1,793 +0,0 @@ -/**************************************************************************//** - * @file core_cm0plus.h - * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File - * @version V3.20 - * @date 25. February 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM0PLUS_H_GENERIC -#define __CORE_CM0PLUS_H_GENERIC - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.<br> - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.<br> - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup Cortex-M0+ - @{ - */ - -/* CMSIS CM0P definitions */ -#define __CM0PLUS_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ -#define __CM0PLUS_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ -#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16) | \ - __CM0PLUS_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x00) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#endif - -#include <stdint.h> /* standard types definitions */ -#include <core_cmInstr.h> /* Core Instruction Access */ -#include <core_cmFunc.h> /* Core Function Access */ - -#endif /* __CORE_CM0PLUS_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0PLUS_H_DEPENDANT -#define __CORE_CM0PLUS_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0PLUS_REV - #define __CM0PLUS_REV 0x0000 - #warning "__CM0PLUS_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0 - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - <strong>IO Type Qualifiers</strong> are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group Cortex-M0+ */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31]; - __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31]; - __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31]; - __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31]; - uint32_t RESERVED4[64]; - __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if (__VTOR_PRESENT == 1) - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if (__VTOR_PRESENT == 1) -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 8 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 8 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) - are only accessible over DAP and not via processor. Therefore - they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M0+ Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) -#define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) ) -#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } - else { - NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */ - else { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the - function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = ticks - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#endif /* __CORE_CM0PLUS_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm3.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm3.h deleted file mode 100644 index 122c9aa..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm3.h +++ /dev/null @@ -1,1627 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V3.20 - * @date 25. February 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM3_H_GENERIC -#define __CORE_CM3_H_GENERIC - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.<br> - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.<br> - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup Cortex_M3 - @{ - */ - -/* CMSIS CM3 definitions */ -#define __CM3_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | \ - __CM3_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x03) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI__VFP_SUPPORT____ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#endif - -#include <stdint.h> /* standard types definitions */ -#include <core_cmInstr.h> /* Core Instruction Access */ -#include <core_cmFunc.h> /* Core Function Access */ - -#endif /* __CORE_CM3_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM3_H_DEPENDANT -#define __CORE_CM3_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM3_REV - #define __CM3_REV 0x0200 - #warning "__CM3_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - <strong>IO Type Qualifiers</strong> are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group Cortex_M3 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#if (__CM3_REV < 0x0201) /* core r2p1 */ -#define SCB_VTOR_TBLBASE_Pos 29 /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#else -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ -#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -#else - uint32_t RESERVED1[1]; -#endif -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __O union - { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29]; - __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43]; - __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6]; - __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1]; - __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1]; - __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1]; - __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL << DWT_CTRL_CYCCNTENA_Pos) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL << DWT_CPICNT_CPICNT_Pos) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL << DWT_EXCCNT_EXCCNT_Pos) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL << DWT_SLEEPCNT_SLEEPCNT_Pos) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL << DWT_LSUCNT_LSUCNT_Pos) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL << DWT_FOLDCNT_FOLDCNT_Pos) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL << DWT_MASK_MASK_Pos) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL << DWT_FUNCTION_FUNCTION_Pos) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2]; - __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55]; - __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131]; - __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759]; - __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1]; - __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39]; - __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8]; - __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL << TPI_ACPR_PRESCALER_Pos) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL << TPI_SPPR_TXMODE_Pos) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL << TPI_FFSR_FlInProg_Pos) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL << TPI_TRIGGER_TRIGGER_Pos) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL << TPI_FIFO0_ETM0_Pos) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL << TPI_ITATBCTR2_ATREADY_Pos) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL << TPI_FIFO1_ITM0_Pos) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL << TPI_ITATBCTR0_ATREADY_Pos) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL << TPI_ITCTRL_Mode_Pos) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL << TPI_DEVID_NrTraceInput_Pos) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL << TPI_DEVTYPE_SubType_Pos) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M3 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/** \brief Set Priority Grouping - - The function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** \brief Get Priority Grouping - - The function reads the priority grouping field from the NVIC Interrupt Controller. - - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ -} - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Get Active Interrupt - - The function reads the active register in NVIC and returns the active bit. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ - else { - NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ - else { - return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief Encode Priority - - The function encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the samllest possible priority group is set. - - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - return ( - ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | - ((SubPriority & ((1 << (SubPriorityBits )) - 1))) - ); -} - - -/** \brief Decode Priority - - The function decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); - *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the - function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = ticks - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** \brief ITM Send Character - - The function transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - - \param [in] ch Character to transmit. - - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if ((ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ - (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0].u32 == 0); - ITM->PORT[0].u8 = (uint8_t) ch; - } - return (ch); -} - - -/** \brief ITM Receive Character - - The function inputs a character via the external variable \ref ITM_RxBuffer. - - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) { - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** \brief ITM Check Character - - The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) { - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - -#endif /* __CORE_CM3_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm4.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm4.h deleted file mode 100644 index d65016c..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm4.h +++ /dev/null @@ -1,1772 +0,0 @@ -/**************************************************************************//** - * @file core_cm4.h - * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File - * @version V3.20 - * @date 25. February 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM4_H_GENERIC -#define __CORE_CM4_H_GENERIC - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.<br> - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.<br> - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup Cortex_M4 - @{ - */ - -/* CMSIS CM4 definitions */ -#define __CM4_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ -#define __CM4_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ -#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16) | \ - __CM4_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x04) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI_VFP_SUPPORT__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif -#endif - -#include <stdint.h> /* standard types definitions */ -#include <core_cmInstr.h> /* Core Instruction Access */ -#include <core_cmFunc.h> /* Core Function Access */ -#include <core_cm4_simd.h> /* Compiler specific SIMD Intrinsics */ - -#endif /* __CORE_CM4_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM4_H_DEPENDANT -#define __CORE_CM4_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM4_REV - #define __CM4_REV 0x0000 - #warning "__CM4_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0 - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - <strong>IO Type Qualifiers</strong> are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group Cortex_M4 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISOOFP_Pos 9 /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8 /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __O union - { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29]; - __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43]; - __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6]; - __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1]; - __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1]; - __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1]; - __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL << DWT_CTRL_CYCCNTENA_Pos) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL << DWT_CPICNT_CPICNT_Pos) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL << DWT_EXCCNT_EXCCNT_Pos) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL << DWT_SLEEPCNT_SLEEPCNT_Pos) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL << DWT_LSUCNT_LSUCNT_Pos) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL << DWT_FOLDCNT_FOLDCNT_Pos) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL << DWT_MASK_MASK_Pos) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL << DWT_FUNCTION_FUNCTION_Pos) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2]; - __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55]; - __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131]; - __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759]; - __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1]; - __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39]; - __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8]; - __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL << TPI_ACPR_PRESCALER_Pos) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL << TPI_SPPR_TXMODE_Pos) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL << TPI_FFSR_FlInProg_Pos) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL << TPI_TRIGGER_TRIGGER_Pos) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL << TPI_FIFO0_ETM0_Pos) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL << TPI_ITATBCTR2_ATREADY_Pos) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL << TPI_FIFO1_ITM0_Pos) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL << TPI_ITATBCTR0_ATREADY_Pos) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL << TPI_ITCTRL_Mode_Pos) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL << TPI_DEVID_NrTraceInput_Pos) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL << TPI_DEVTYPE_SubType_Pos) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if (__FPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __IO uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IO uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IO uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __I uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __I uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ -} FPU_Type; - -/* Floating-Point Context Control Register */ -#define FPU_FPCCR_ASPEN_Pos 31 /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30 /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8 /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6 /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5 /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4 /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3 /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1 /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0 /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL << FPU_FPCCR_LSPACT_Pos) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register */ -#define FPU_FPCAR_ADDRESS_Pos 3 /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register */ -#define FPU_FPDSCR_AHP_Pos 26 /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25 /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24 /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22 /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28 /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24 /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20 /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16 /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12 /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8 /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4 /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0 /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL << FPU_MVFR0_A_SIMD_registers_Pos) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28 /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24 /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4 /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0 /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL << FPU_MVFR1_FtZ_mode_Pos) /*!< MVFR1: FtZ mode bits Mask */ - -/*@} end of group CMSIS_FPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M4 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#if (__FPU_PRESENT == 1) - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/** \brief Set Priority Grouping - - The function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** \brief Get Priority Grouping - - The function reads the priority grouping field from the NVIC Interrupt Controller. - - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ -} - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ -/* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */ - NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */ -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Get Active Interrupt - - The function reads the active register in NVIC and returns the active bit. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ - else { - NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ - else { - return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief Encode Priority - - The function encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the samllest possible priority group is set. - - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - return ( - ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | - ((SubPriority & ((1 << (SubPriorityBits )) - 1))) - ); -} - - -/** \brief Decode Priority - - The function decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); - *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the - function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = ticks - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** \brief ITM Send Character - - The function transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - - \param [in] ch Character to transmit. - - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if ((ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ - (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0].u32 == 0); - ITM->PORT[0].u8 = (uint8_t) ch; - } - return (ch); -} - - -/** \brief ITM Receive Character - - The function inputs a character via the external variable \ref ITM_RxBuffer. - - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) { - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** \brief ITM Check Character - - The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) { - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - -#endif /* __CORE_CM4_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm4_simd.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm4_simd.h deleted file mode 100644 index 83db95b..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cm4_simd.h +++ /dev/null @@ -1,673 +0,0 @@ -/**************************************************************************//** - * @file core_cm4_simd.h - * @brief CMSIS Cortex-M4 SIMD Header File - * @version V3.20 - * @date 25. February 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM4_SIMD_H -#define __CORE_CM4_SIMD_H - - -/******************************************************************************* - * Hardware Abstraction Layer - ******************************************************************************/ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -#define __SADD8 __sadd8 -#define __QADD8 __qadd8 -#define __SHADD8 __shadd8 -#define __UADD8 __uadd8 -#define __UQADD8 __uqadd8 -#define __UHADD8 __uhadd8 -#define __SSUB8 __ssub8 -#define __QSUB8 __qsub8 -#define __SHSUB8 __shsub8 -#define __USUB8 __usub8 -#define __UQSUB8 __uqsub8 -#define __UHSUB8 __uhsub8 -#define __SADD16 __sadd16 -#define __QADD16 __qadd16 -#define __SHADD16 __shadd16 -#define __UADD16 __uadd16 -#define __UQADD16 __uqadd16 -#define __UHADD16 __uhadd16 -#define __SSUB16 __ssub16 -#define __QSUB16 __qsub16 -#define __SHSUB16 __shsub16 -#define __USUB16 __usub16 -#define __UQSUB16 __uqsub16 -#define __UHSUB16 __uhsub16 -#define __SASX __sasx -#define __QASX __qasx -#define __SHASX __shasx -#define __UASX __uasx -#define __UQASX __uqasx -#define __UHASX __uhasx -#define __SSAX __ssax -#define __QSAX __qsax -#define __SHSAX __shsax -#define __USAX __usax -#define __UQSAX __uqsax -#define __UHSAX __uhsax -#define __USAD8 __usad8 -#define __USADA8 __usada8 -#define __SSAT16 __ssat16 -#define __USAT16 __usat16 -#define __UXTB16 __uxtb16 -#define __UXTAB16 __uxtab16 -#define __SXTB16 __sxtb16 -#define __SXTAB16 __sxtab16 -#define __SMUAD __smuad -#define __SMUADX __smuadx -#define __SMLAD __smlad -#define __SMLADX __smladx -#define __SMLALD __smlald -#define __SMLALDX __smlaldx -#define __SMUSD __smusd -#define __SMUSDX __smusdx -#define __SMLSD __smlsd -#define __SMLSDX __smlsdx -#define __SMLSLD __smlsld -#define __SMLSLDX __smlsldx -#define __SEL __sel -#define __QADD __qadd -#define __QSUB __qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ - ((int64_t)(ARG3) << 32) ) >> 32)) - -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - - -#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -#include <cmsis_iar.h> - -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - - -#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ -/* TI CCS specific functions */ - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -#include <cmsis_ccs.h> - -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - - -#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -#define __USAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SMLALD(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -#define __SMLALDX(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SMLSLD(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -#define __SMLSLDX(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -#define __PKHBT(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -#define __PKHTB(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - if (ARG3 == 0) \ - __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ - else \ - __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - - -#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ -/* TASKING carm specific functions */ - - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -/* not yet supported */ -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - -#endif - -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CORE_CM4_SIMD_H */ - -#ifdef __cplusplus -} -#endif diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cmFunc.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cmFunc.h deleted file mode 100644 index 0a18faf..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cmFunc.h +++ /dev/null @@ -1,636 +0,0 @@ -/**************************************************************************//** - * @file core_cmFunc.h - * @brief CMSIS Cortex-M Core Function Access Header File - * @version V3.20 - * @date 25. February 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#ifndef __CORE_CMFUNC_H -#define __CORE_CMFUNC_H - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -#if (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - -/* intrinsic void __enable_irq(); */ -/* intrinsic void __disable_irq(); */ - -/** \brief Get Control Register - - This function returns the content of the Control Register. - - \return Control Register value - */ -__STATIC_INLINE uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __ASM("control"); - return(__regControl); -} - - -/** \brief Set Control Register - - This function writes the given value to the Control Register. - - \param [in] control Control Register value to set - */ -__STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __ASM("control"); - __regControl = control; -} - - -/** \brief Get IPSR Register - - This function returns the content of the IPSR Register. - - \return IPSR Register value - */ -__STATIC_INLINE uint32_t __get_IPSR(void) -{ - register uint32_t __regIPSR __ASM("ipsr"); - return(__regIPSR); -} - - -/** \brief Get APSR Register - - This function returns the content of the APSR Register. - - \return APSR Register value - */ -__STATIC_INLINE uint32_t __get_APSR(void) -{ - register uint32_t __regAPSR __ASM("apsr"); - return(__regAPSR); -} - - -/** \brief Get xPSR Register - - This function returns the content of the xPSR Register. - - \return xPSR Register value - */ -__STATIC_INLINE uint32_t __get_xPSR(void) -{ - register uint32_t __regXPSR __ASM("xpsr"); - return(__regXPSR); -} - - -/** \brief Get Process Stack Pointer - - This function returns the current value of the Process Stack Pointer (PSP). - - \return PSP Register value - */ -__STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - return(__regProcessStackPointer); -} - - -/** \brief Set Process Stack Pointer - - This function assigns the given value to the Process Stack Pointer (PSP). - - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - __regProcessStackPointer = topOfProcStack; -} - - -/** \brief Get Main Stack Pointer - - This function returns the current value of the Main Stack Pointer (MSP). - - \return MSP Register value - */ -__STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - return(__regMainStackPointer); -} - - -/** \brief Set Main Stack Pointer - - This function assigns the given value to the Main Stack Pointer (MSP). - - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - __regMainStackPointer = topOfMainStack; -} - - -/** \brief Get Priority Mask - - This function returns the current state of the priority mask bit from the Priority Mask Register. - - \return Priority Mask value - */ -__STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); -} - - -/** \brief Set Priority Mask - - This function assigns the given value to the Priority Mask Register. - - \param [in] priMask Priority Mask - */ -__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Enable FIQ - - This function enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** \brief Disable FIQ - - This function disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq - - -/** \brief Get Base Priority - - This function returns the current value of the Base Priority register. - - \return Base Priority register value - */ -__STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); -} - - -/** \brief Set Base Priority - - This function assigns the given value to the Base Priority register. - - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xff); -} - - -/** \brief Get Fault Mask - - This function returns the current value of the Fault Mask register. - - \return Fault Mask register value - */ -__STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); -} - - -/** \brief Set Fault Mask - - This function assigns the given value to the Fault Mask register. - - \param [in] faultMask Fault Mask value to set - */ -__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - -#if (__CORTEX_M == 0x04) - -/** \brief Get FPSCR - - This function returns the current value of the Floating Point Status/Control register. - - \return Floating Point Status/Control register value - */ -__STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - register uint32_t __regfpscr __ASM("fpscr"); - return(__regfpscr); -#else - return(0); -#endif -} - - -/** \brief Set FPSCR - - This function assigns the given value to the Floating Point Status/Control register. - - \param [in] fpscr Floating Point Status/Control value to set - */ -__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - register uint32_t __regfpscr __ASM("fpscr"); - __regfpscr = (fpscr); -#endif -} - -#endif /* (__CORTEX_M == 0x04) */ - - -#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -#include <cmsis_iar.h> - - -#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ -/* TI CCS specific functions */ - -#include <cmsis_ccs.h> - - -#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/** \brief Enable IRQ Interrupts - - This function enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} - - -/** \brief Disable IRQ Interrupts - - This function disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} - - -/** \brief Get Control Register - - This function returns the content of the Control Register. - - \return Control Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -/** \brief Set Control Register - - This function writes the given value to the Control Register. - - \param [in] control Control Register value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); -} - - -/** \brief Get IPSR Register - - This function returns the content of the IPSR Register. - - \return IPSR Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get APSR Register - - This function returns the content of the APSR Register. - - \return APSR Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get xPSR Register - - This function returns the content of the xPSR Register. - - \return xPSR Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get Process Stack Pointer - - This function returns the current value of the Process Stack Pointer (PSP). - - \return PSP Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); - return(result); -} - - -/** \brief Set Process Stack Pointer - - This function assigns the given value to the Process Stack Pointer (PSP). - - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp"); -} - - -/** \brief Get Main Stack Pointer - - This function returns the current value of the Main Stack Pointer (MSP). - - \return MSP Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); - return(result); -} - - -/** \brief Set Main Stack Pointer - - This function assigns the given value to the Main Stack Pointer (MSP). - - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); -} - - -/** \brief Get Priority Mask - - This function returns the current state of the priority mask bit from the Priority Mask Register. - - \return Priority Mask value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -/** \brief Set Priority Mask - - This function assigns the given value to the Priority Mask Register. - - \param [in] priMask Priority Mask - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Enable FIQ - - This function enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** \brief Disable FIQ - - This function disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** \brief Get Base Priority - - This function returns the current value of the Base Priority register. - - \return Base Priority register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); - return(result); -} - - -/** \brief Set Base Priority - - This function assigns the given value to the Base Priority register. - - \param [in] basePri Base Priority value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory"); -} - - -/** \brief Get Fault Mask - - This function returns the current value of the Fault Mask register. - - \return Fault Mask register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -/** \brief Set Fault Mask - - This function assigns the given value to the Fault Mask register. - - \param [in] faultMask Fault Mask value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - -#if (__CORTEX_M == 0x04) - -/** \brief Get FPSCR - - This function returns the current value of the Floating Point Status/Control register. - - \return Floating Point Status/Control register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - uint32_t result; - - /* Empty asm statement works as a scheduling barrier */ - __ASM volatile (""); - __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); - __ASM volatile (""); - return(result); -#else - return(0); -#endif -} - - -/** \brief Set FPSCR - - This function assigns the given value to the Floating Point Status/Control register. - - \param [in] fpscr Floating Point Status/Control value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - /* Empty asm statement works as a scheduling barrier */ - __ASM volatile (""); - __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc"); - __ASM volatile (""); -#endif -} - -#endif /* (__CORTEX_M == 0x04) */ - - -#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ -/* TASKING carm specific functions */ - -/* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all instrinsics, - * Including the CMSIS ones. - */ - -#endif - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -#endif /* __CORE_CMFUNC_H */ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cmInstr.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cmInstr.h deleted file mode 100644 index d213f0e..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_cmInstr.h +++ /dev/null @@ -1,688 +0,0 @@ -/**************************************************************************//** - * @file core_cmInstr.h - * @brief CMSIS Cortex-M Core Instruction Access Header File - * @version V3.20 - * @date 05. March 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#ifndef __CORE_CMINSTR_H -#define __CORE_CMINSTR_H - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -#if (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - - -/** \brief No Operation - - No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __nop - - -/** \brief Wait For Interrupt - - Wait For Interrupt is a hint instruction that suspends execution - until one of a number of events occurs. - */ -#define __WFI __wfi - - -/** \brief Wait For Event - - Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __wfe - - -/** \brief Send Event - - Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __sev - - -/** \brief Instruction Synchronization Barrier - - Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or - memory, after the instruction has been completed. - */ -#define __ISB() __isb(0xF) - - -/** \brief Data Synchronization Barrier - - This function acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __dsb(0xF) - - -/** \brief Data Memory Barrier - - This function ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __dmb(0xF) - - -/** \brief Reverse byte order (32 bit) - - This function reverses the byte order in integer value. - - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __rev - - -/** \brief Reverse byte order (16 bit) - - This function reverses the byte order in two unsigned short values. - - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) -{ - rev16 r0, r0 - bx lr -} -#endif - -/** \brief Reverse byte order in signed short value - - This function reverses the byte order in a signed short value with sign extension to integer. - - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) -{ - revsh r0, r0 - bx lr -} -#endif - - -/** \brief Rotate Right in unsigned value (32 bit) - - This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - - \param [in] value Value to rotate - \param [in] value Number of Bits to rotate - \return Rotated value - */ -#define __ROR __ror - - -/** \brief Breakpoint - - This function causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __breakpoint(value) - - -#if (__CORTEX_M >= 0x03) - -/** \brief Reverse bit order of value - - This function reverses the bit order of the given value. - - \param [in] value Value to reverse - \return Reversed value - */ -#define __RBIT __rbit - - -/** \brief LDR Exclusive (8 bit) - - This function performs a exclusive LDR command for 8 bit value. - - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) - - -/** \brief LDR Exclusive (16 bit) - - This function performs a exclusive LDR command for 16 bit values. - - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) - - -/** \brief LDR Exclusive (32 bit) - - This function performs a exclusive LDR command for 32 bit values. - - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) - - -/** \brief STR Exclusive (8 bit) - - This function performs a exclusive STR command for 8 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB(value, ptr) __strex(value, ptr) - - -/** \brief STR Exclusive (16 bit) - - This function performs a exclusive STR command for 16 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH(value, ptr) __strex(value, ptr) - - -/** \brief STR Exclusive (32 bit) - - This function performs a exclusive STR command for 32 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW(value, ptr) __strex(value, ptr) - - -/** \brief Remove the exclusive lock - - This function removes the exclusive lock which is created by LDREX. - - */ -#define __CLREX __clrex - - -/** \brief Signed Saturate - - This function saturates a signed value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __ssat - - -/** \brief Unsigned Saturate - - This function saturates an unsigned value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __usat - - -/** \brief Count leading zeros - - This function counts the number of leading zeros of a data value. - - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __clz - -#endif /* (__CORTEX_M >= 0x03) */ - - - -#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -#include <cmsis_iar.h> - - -#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ -/* TI CCS specific functions */ - -#include <cmsis_ccs.h> - - -#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constrant "l" - * Otherwise, use general registers, specified by constrant "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** \brief No Operation - - No Operation does nothing. This instruction can be used for code alignment purposes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void) -{ - __ASM volatile ("nop"); -} - - -/** \brief Wait For Interrupt - - Wait For Interrupt is a hint instruction that suspends execution - until one of a number of events occurs. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void) -{ - __ASM volatile ("wfi"); -} - - -/** \brief Wait For Event - - Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void) -{ - __ASM volatile ("wfe"); -} - - -/** \brief Send Event - - Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void) -{ - __ASM volatile ("sev"); -} - - -/** \brief Instruction Synchronization Barrier - - Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or - memory, after the instruction has been completed. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void) -{ - __ASM volatile ("isb"); -} - - -/** \brief Data Synchronization Barrier - - This function acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void) -{ - __ASM volatile ("dsb"); -} - - -/** \brief Data Memory Barrier - - This function ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void) -{ - __ASM volatile ("dmb"); -} - - -/** \brief Reverse byte order (32 bit) - - This function reverses the byte order in integer value. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) - return __builtin_bswap32(value); -#else - uint32_t result; - - __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -#endif -} - - -/** \brief Reverse byte order (16 bit) - - This function reverses the byte order in two unsigned short values. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** \brief Reverse byte order in signed short value - - This function reverses the byte order in a signed short value with sign extension to integer. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - return (short)__builtin_bswap16(value); -#else - uint32_t result; - - __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -#endif -} - - -/** \brief Rotate Right in unsigned value (32 bit) - - This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - - \param [in] value Value to rotate - \param [in] value Number of Bits to rotate - \return Rotated value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - return (op1 >> op2) | (op1 << (32 - op2)); -} - - -/** \brief Breakpoint - - This function causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -#if (__CORTEX_M >= 0x03) - -/** \brief Reverse bit order of value - - This function reverses the bit order of the given value. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -/** \brief LDR Exclusive (8 bit) - - This function performs a exclusive LDR command for 8 bit value. - - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return(result); -} - - -/** \brief LDR Exclusive (16 bit) - - This function performs a exclusive LDR command for 16 bit values. - - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return(result); -} - - -/** \brief LDR Exclusive (32 bit) - - This function performs a exclusive LDR command for 32 bit values. - - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); - return(result); -} - - -/** \brief STR Exclusive (8 bit) - - This function performs a exclusive STR command for 8 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); - return(result); -} - - -/** \brief STR Exclusive (16 bit) - - This function performs a exclusive STR command for 16 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); - return(result); -} - - -/** \brief STR Exclusive (32 bit) - - This function performs a exclusive STR command for 32 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); - return(result); -} - - -/** \brief Remove the exclusive lock - - This function removes the exclusive lock which is created by LDREX. - - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void) -{ - __ASM volatile ("clrex" ::: "memory"); -} - - -/** \brief Signed Saturate - - This function saturates a signed value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** \brief Unsigned Saturate - - This function saturates an unsigned value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** \brief Count leading zeros - - This function counts the number of leading zeros of a data value. - - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - - - -#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ -/* TASKING carm specific functions */ - -/* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ - -#endif - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - -#endif /* __CORE_CMINSTR_H */ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_sc000.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_sc000.h deleted file mode 100644 index 1a2a0f2..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_sc000.h +++ /dev/null @@ -1,813 +0,0 @@ -/**************************************************************************//** - * @file core_sc000.h - * @brief CMSIS SC000 Core Peripheral Access Layer Header File - * @version V3.20 - * @date 25. February 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_SC000_H_GENERIC -#define __CORE_SC000_H_GENERIC - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.<br> - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.<br> - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup SC000 - @{ - */ - -/* CMSIS SC000 definitions */ -#define __SC000_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ -#define __SC000_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ -#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16) | \ - __SC000_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_SC (0) /*!< Cortex secure core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#endif - -#include <stdint.h> /* standard types definitions */ -#include <core_cmInstr.h> /* Core Instruction Access */ -#include <core_cmFunc.h> /* Core Function Access */ - -#endif /* __CORE_SC000_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC000_H_DEPENDANT -#define __CORE_SC000_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC000_REV - #define __SC000_REV 0x0000 - #warning "__SC000_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - <strong>IO Type Qualifiers</strong> are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group SC000 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31]; - __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31]; - __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31]; - __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31]; - uint32_t RESERVED4[64]; - __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED0[1]; - __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - uint32_t RESERVED1[154]; - __IO uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/* SCB Security Features Register Definitions */ -#define SCB_SFCR_UNIBRTIMING_Pos 0 /*!< SCB SFCR: UNIBRTIMING Position */ -#define SCB_SFCR_UNIBRTIMING_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SFCR: UNIBRTIMING Mask */ - -#define SCB_SFCR_SECKEY_Pos 16 /*!< SCB SFCR: SECKEY Position */ -#define SCB_SFCR_SECKEY_Msk (0xFFFFUL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SFCR: SECKEY Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[2]; - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 8 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) - are only accessible over DAP and not via processor. Therefore - they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of SC000 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) -#define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) ) -#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } - else { - NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */ - else { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the - function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = ticks - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#endif /* __CORE_SC000_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_sc300.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_sc300.h deleted file mode 100644 index cc34d6f..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/CMSIS/Include/core_sc300.h +++ /dev/null @@ -1,1598 +0,0 @@ -/**************************************************************************//** - * @file core_sc300.h - * @brief CMSIS SC300 Core Peripheral Access Layer Header File - * @version V3.20 - * @date 25. February 2013 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2013 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_SC300_H_GENERIC -#define __CORE_SC300_H_GENERIC - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.<br> - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.<br> - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup SC3000 - @{ - */ - -/* CMSIS SC300 definitions */ -#define __SC300_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ -#define __SC300_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ -#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16) | \ - __SC300_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_SC (300) /*!< Cortex secure core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#endif - -#include <stdint.h> /* standard types definitions */ -#include <core_cmInstr.h> /* Core Instruction Access */ -#include <core_cmFunc.h> /* Core Function Access */ - -#endif /* __CORE_SC300_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC300_H_DEPENDANT -#define __CORE_SC300_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC300_REV - #define __SC300_REV 0x0000 - #warning "__SC300_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - <strong>IO Type Qualifiers</strong> are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group SC300 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLBASE_Pos 29 /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - uint32_t RESERVED1[1]; -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __O union - { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29]; - __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43]; - __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6]; - __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1]; - __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1]; - __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1]; - __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL << DWT_CTRL_CYCCNTENA_Pos) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL << DWT_CPICNT_CPICNT_Pos) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL << DWT_EXCCNT_EXCCNT_Pos) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL << DWT_SLEEPCNT_SLEEPCNT_Pos) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL << DWT_LSUCNT_LSUCNT_Pos) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL << DWT_FOLDCNT_FOLDCNT_Pos) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL << DWT_MASK_MASK_Pos) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL << DWT_FUNCTION_FUNCTION_Pos) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2]; - __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55]; - __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131]; - __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759]; - __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1]; - __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39]; - __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8]; - __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL << TPI_ACPR_PRESCALER_Pos) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL << TPI_SPPR_TXMODE_Pos) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL << TPI_FFSR_FlInProg_Pos) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL << TPI_TRIGGER_TRIGGER_Pos) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL << TPI_FIFO0_ETM0_Pos) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL << TPI_ITATBCTR2_ATREADY_Pos) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL << TPI_FIFO1_ITM0_Pos) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL << TPI_ITATBCTR0_ATREADY_Pos) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL << TPI_ITCTRL_Mode_Pos) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL << TPI_DEVID_NrTraceInput_Pos) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL << TPI_DEVTYPE_SubType_Pos) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M3 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/** \brief Set Priority Grouping - - The function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** \brief Get Priority Grouping - - The function reads the priority grouping field from the NVIC Interrupt Controller. - - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ -} - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Get Active Interrupt - - The function reads the active register in NVIC and returns the active bit. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ - else { - NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ - else { - return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief Encode Priority - - The function encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the samllest possible priority group is set. - - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - return ( - ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | - ((SubPriority & ((1 << (SubPriorityBits )) - 1))) - ); -} - - -/** \brief Decode Priority - - The function decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); - *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the - function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = ticks - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** \brief ITM Send Character - - The function transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - - \param [in] ch Character to transmit. - - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if ((ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ - (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0].u32 == 0); - ITM->PORT[0].u8 = (uint8_t) ch; - } - return (ch); -} - - -/** \brief ITM Receive Character - - The function inputs a character via the external variable \ref ITM_RxBuffer. - - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) { - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** \brief ITM Check Character - - The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) { - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - -#endif /* __CORE_SC300_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_adc.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_adc.h deleted file mode 100644 index b570068..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_adc.h +++ /dev/null @@ -1,450 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_adc.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the ADC firmware - * library - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_ADC_H -#define __STM32F0XX_ADC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup ADC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief ADC Init structure definition - */ - -typedef struct -{ - uint32_t ADC_Resolution; /*!< Selects the resolution of the conversion. - This parameter can be a value of @ref ADC_Resolution */ - - FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion is performed in - Continuous or Single mode. - This parameter can be set to ENABLE or DISABLE. */ - - uint32_t ADC_ExternalTrigConvEdge; /*!< Selects the external trigger Edge and enables the - trigger of a regular group. This parameter can be a value - of @ref ADC_external_trigger_edge_conversion */ - - uint32_t ADC_ExternalTrigConv; /*!< Defines the external trigger used to start the analog - to digital conversion of regular channels. This parameter - can be a value of @ref ADC_external_trigger_sources_for_channels_conversion */ - - uint32_t ADC_DataAlign; /*!< Specifies whether the ADC data alignment is left or right. - This parameter can be a value of @ref ADC_data_align */ - - uint32_t ADC_ScanDirection; /*!< Specifies in which direction the channels will be scanned - in the sequence. - This parameter can be a value of @ref ADC_Scan_Direction */ -}ADC_InitTypeDef; - - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup ADC_Exported_Constants - * @{ - */ -#define IS_ADC_ALL_PERIPH(PERIPH) ((PERIPH) == ADC1) - -/** @defgroup ADC_JitterOff - * @{ - */ -/* These defines are obsolete and maintained for legacy purpose only. They are replaced by the ADC_ClockMode */ -#define ADC_JitterOff_PCLKDiv2 ADC_CFGR2_JITOFFDIV2 -#define ADC_JitterOff_PCLKDiv4 ADC_CFGR2_JITOFFDIV4 - -#define IS_ADC_JITTEROFF(JITTEROFF) (((JITTEROFF) & 0x3FFFFFFF) == (uint32_t)RESET) - -/** - * @} - */ - -/** @defgroup ADC_ClockMode - * @{ - */ -#define ADC_ClockMode_AsynClk ((uint32_t)0x00000000) /*!< ADC Asynchronous clock mode */ -#define ADC_ClockMode_SynClkDiv2 ADC_CFGR2_CKMODE_0 /*!< Synchronous clock mode divided by 2 */ -#define ADC_ClockMode_SynClkDiv4 ADC_CFGR2_CKMODE_1 /*!< Synchronous clock mode divided by 4 */ -#define IS_ADC_CLOCKMODE(CLOCK) (((CLOCK) == ADC_ClockMode_AsynClk) ||\ - ((CLOCK) == ADC_ClockMode_SynClkDiv2) ||\ - ((CLOCK) == ADC_ClockMode_SynClkDiv4)) - -/** - * @} - */ - -/** @defgroup ADC_Resolution - * @{ - */ -#define ADC_Resolution_12b ((uint32_t)0x00000000) -#define ADC_Resolution_10b ADC_CFGR1_RES_0 -#define ADC_Resolution_8b ADC_CFGR1_RES_1 -#define ADC_Resolution_6b ADC_CFGR1_RES - -#define IS_ADC_RESOLUTION(RESOLUTION) (((RESOLUTION) == ADC_Resolution_12b) || \ - ((RESOLUTION) == ADC_Resolution_10b) || \ - ((RESOLUTION) == ADC_Resolution_8b) || \ - ((RESOLUTION) == ADC_Resolution_6b)) - -/** - * @} - */ - -/** @defgroup ADC_external_trigger_edge_conversion - * @{ - */ -#define ADC_ExternalTrigConvEdge_None ((uint32_t)0x00000000) -#define ADC_ExternalTrigConvEdge_Rising ADC_CFGR1_EXTEN_0 -#define ADC_ExternalTrigConvEdge_Falling ADC_CFGR1_EXTEN_1 -#define ADC_ExternalTrigConvEdge_RisingFalling ADC_CFGR1_EXTEN - -#define IS_ADC_EXT_TRIG_EDGE(EDGE) (((EDGE) == ADC_ExternalTrigConvEdge_None) || \ - ((EDGE) == ADC_ExternalTrigConvEdge_Rising) || \ - ((EDGE) == ADC_ExternalTrigConvEdge_Falling) || \ - ((EDGE) == ADC_ExternalTrigConvEdge_RisingFalling)) -/** - * @} - */ - -/** @defgroup ADC_external_trigger_sources_for_channels_conversion - * @{ - */ - -/* TIM1 */ -#define ADC_ExternalTrigConv_T1_TRGO ((uint32_t)0x00000000) -#define ADC_ExternalTrigConv_T1_CC4 ADC_CFGR1_EXTSEL_0 - -/* TIM2 */ -#define ADC_ExternalTrigConv_T2_TRGO ADC_CFGR1_EXTSEL_1 - -/* TIM3 */ -#define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)(ADC_CFGR1_EXTSEL_0 | ADC_CFGR1_EXTSEL_1)) - -/* TIM15 */ -#define ADC_ExternalTrigConv_T15_TRGO ADC_CFGR1_EXTSEL_2 - -#define IS_ADC_EXTERNAL_TRIG_CONV(CONV) (((CONV) == ADC_ExternalTrigConv_T1_TRGO) || \ - ((CONV) == ADC_ExternalTrigConv_T1_CC4) || \ - ((CONV) == ADC_ExternalTrigConv_T2_TRGO) || \ - ((CONV) == ADC_ExternalTrigConv_T3_TRGO) || \ - ((CONV) == ADC_ExternalTrigConv_T15_TRGO)) -/** - * @} - */ - -/** @defgroup ADC_data_align - * @{ - */ - -#define ADC_DataAlign_Right ((uint32_t)0x00000000) -#define ADC_DataAlign_Left ADC_CFGR1_ALIGN - -#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \ - ((ALIGN) == ADC_DataAlign_Left)) -/** - * @} - */ - -/** @defgroup ADC_Scan_Direction - * @{ - */ - -#define ADC_ScanDirection_Upward ((uint32_t)0x00000000) -#define ADC_ScanDirection_Backward ADC_CFGR1_SCANDIR - -#define IS_ADC_SCAN_DIRECTION(DIRECTION) (((DIRECTION) == ADC_ScanDirection_Upward) || \ - ((DIRECTION) == ADC_ScanDirection_Backward)) -/** - * @} - */ - -/** @defgroup ADC_DMA_Mode - * @{ - */ - -#define ADC_DMAMode_OneShot ((uint32_t)0x00000000) -#define ADC_DMAMode_Circular ADC_CFGR1_DMACFG - -#define IS_ADC_DMA_MODE(MODE) (((MODE) == ADC_DMAMode_OneShot) || \ - ((MODE) == ADC_DMAMode_Circular)) -/** - * @} - */ - -/** @defgroup ADC_analog_watchdog_selection - * @{ - */ - -#define ADC_AnalogWatchdog_Channel_0 ((uint32_t)0x00000000) -#define ADC_AnalogWatchdog_Channel_1 ((uint32_t)0x04000000) -#define ADC_AnalogWatchdog_Channel_2 ((uint32_t)0x08000000) -#define ADC_AnalogWatchdog_Channel_3 ((uint32_t)0x0C000000) -#define ADC_AnalogWatchdog_Channel_4 ((uint32_t)0x10000000) -#define ADC_AnalogWatchdog_Channel_5 ((uint32_t)0x14000000) -#define ADC_AnalogWatchdog_Channel_6 ((uint32_t)0x18000000) -#define ADC_AnalogWatchdog_Channel_7 ((uint32_t)0x1C000000) -#define ADC_AnalogWatchdog_Channel_8 ((uint32_t)0x20000000) -#define ADC_AnalogWatchdog_Channel_9 ((uint32_t)0x24000000) -#define ADC_AnalogWatchdog_Channel_10 ((uint32_t)0x28000000) /*!< Not available for STM32F031 devices */ -#define ADC_AnalogWatchdog_Channel_11 ((uint32_t)0x2C000000) /*!< Not available for STM32F031 devices */ -#define ADC_AnalogWatchdog_Channel_12 ((uint32_t)0x30000000) /*!< Not available for STM32F031 devices */ -#define ADC_AnalogWatchdog_Channel_13 ((uint32_t)0x34000000) /*!< Not available for STM32F031 devices */ -#define ADC_AnalogWatchdog_Channel_14 ((uint32_t)0x38000000) /*!< Not available for STM32F031 devices */ -#define ADC_AnalogWatchdog_Channel_15 ((uint32_t)0x3C000000) /*!< Not available for STM32F031 devices */ -#define ADC_AnalogWatchdog_Channel_16 ((uint32_t)0x40000000) -#define ADC_AnalogWatchdog_Channel_17 ((uint32_t)0x44000000) -#define ADC_AnalogWatchdog_Channel_18 ((uint32_t)0x48000000) - - -#define IS_ADC_ANALOG_WATCHDOG_CHANNEL(CHANNEL) (((CHANNEL) == ADC_AnalogWatchdog_Channel_0) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_1) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_2) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_3) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_4) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_5) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_6) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_7) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_8) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_9) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_10) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_11) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_12) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_13) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_14) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_15) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_16) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_17) || \ - ((CHANNEL) == ADC_AnalogWatchdog_Channel_18)) -/** - * @} - */ - -/** @defgroup ADC_sampling_times - * @{ - */ - -#define ADC_SampleTime_1_5Cycles ((uint32_t)0x00000000) -#define ADC_SampleTime_7_5Cycles ((uint32_t)0x00000001) -#define ADC_SampleTime_13_5Cycles ((uint32_t)0x00000002) -#define ADC_SampleTime_28_5Cycles ((uint32_t)0x00000003) -#define ADC_SampleTime_41_5Cycles ((uint32_t)0x00000004) -#define ADC_SampleTime_55_5Cycles ((uint32_t)0x00000005) -#define ADC_SampleTime_71_5Cycles ((uint32_t)0x00000006) -#define ADC_SampleTime_239_5Cycles ((uint32_t)0x00000007) - -#define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SampleTime_1_5Cycles) || \ - ((TIME) == ADC_SampleTime_7_5Cycles) || \ - ((TIME) == ADC_SampleTime_13_5Cycles) || \ - ((TIME) == ADC_SampleTime_28_5Cycles) || \ - ((TIME) == ADC_SampleTime_41_5Cycles) || \ - ((TIME) == ADC_SampleTime_55_5Cycles) || \ - ((TIME) == ADC_SampleTime_71_5Cycles) || \ - ((TIME) == ADC_SampleTime_239_5Cycles)) -/** - * @} - */ - -/** @defgroup ADC_thresholds - * @{ - */ - -#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFF) - -/** - * @} - */ - -/** @defgroup ADC_channels - * @{ - */ - -#define ADC_Channel_0 ADC_CHSELR_CHSEL0 -#define ADC_Channel_1 ADC_CHSELR_CHSEL1 -#define ADC_Channel_2 ADC_CHSELR_CHSEL2 -#define ADC_Channel_3 ADC_CHSELR_CHSEL3 -#define ADC_Channel_4 ADC_CHSELR_CHSEL4 -#define ADC_Channel_5 ADC_CHSELR_CHSEL5 -#define ADC_Channel_6 ADC_CHSELR_CHSEL6 -#define ADC_Channel_7 ADC_CHSELR_CHSEL7 -#define ADC_Channel_8 ADC_CHSELR_CHSEL8 -#define ADC_Channel_9 ADC_CHSELR_CHSEL9 -#define ADC_Channel_10 ADC_CHSELR_CHSEL10 /*!< Not available for STM32F031 devices */ -#define ADC_Channel_11 ADC_CHSELR_CHSEL11 /*!< Not available for STM32F031 devices */ -#define ADC_Channel_12 ADC_CHSELR_CHSEL12 /*!< Not available for STM32F031 devices */ -#define ADC_Channel_13 ADC_CHSELR_CHSEL13 /*!< Not available for STM32F031 devices */ -#define ADC_Channel_14 ADC_CHSELR_CHSEL14 /*!< Not available for STM32F031 devices */ -#define ADC_Channel_15 ADC_CHSELR_CHSEL15 /*!< Not available for STM32F031 devices */ -#define ADC_Channel_16 ADC_CHSELR_CHSEL16 -#define ADC_Channel_17 ADC_CHSELR_CHSEL17 -#define ADC_Channel_18 ADC_CHSELR_CHSEL18 /*!< Not available for STM32F030 devices */ - -#define ADC_Channel_TempSensor ((uint32_t)ADC_Channel_16) -#define ADC_Channel_Vrefint ((uint32_t)ADC_Channel_17) -#define ADC_Channel_Vbat ((uint32_t)ADC_Channel_18) /*!< Not available for STM32F030 devices */ - -#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) != (uint32_t)RESET) && (((CHANNEL) & 0xFFF80000) == (uint32_t)RESET)) - -/** - * @} - */ - -/** @defgroup ADC_interrupts_definition - * @{ - */ - -#define ADC_IT_ADRDY ADC_IER_ADRDYIE -#define ADC_IT_EOSMP ADC_IER_EOSMPIE -#define ADC_IT_EOC ADC_IER_EOCIE -#define ADC_IT_EOSEQ ADC_IER_EOSEQIE -#define ADC_IT_OVR ADC_IER_OVRIE -#define ADC_IT_AWD ADC_IER_AWDIE - -#define IS_ADC_CONFIG_IT(IT) (((IT) != (uint32_t)RESET) && (((IT) & 0xFFFFFF60) == (uint32_t)RESET)) - -#define IS_ADC_GET_IT(IT) (((IT) == ADC_IT_ADRDY) || ((IT) == ADC_IT_EOSMP) || \ - ((IT) == ADC_IT_EOC) || ((IT) == ADC_IT_EOSEQ) || \ - ((IT) == ADC_IT_OVR) || ((IT) == ADC_IT_AWD)) - -#define IS_ADC_CLEAR_IT(IT) (((IT) != (uint32_t)RESET) && (((IT) & 0xFFFFFF60) == (uint32_t)RESET)) - -/** - * @} - */ - -/** @defgroup ADC_flags_definition - * @{ - */ - -#define ADC_FLAG_ADRDY ADC_ISR_ADRDY -#define ADC_FLAG_EOSMP ADC_ISR_EOSMP -#define ADC_FLAG_EOC ADC_ISR_EOC -#define ADC_FLAG_EOSEQ ADC_ISR_EOSEQ -#define ADC_FLAG_OVR ADC_ISR_OVR -#define ADC_FLAG_AWD ADC_ISR_AWD - -#define ADC_FLAG_ADEN ((uint32_t)0x01000001) -#define ADC_FLAG_ADDIS ((uint32_t)0x01000002) -#define ADC_FLAG_ADSTART ((uint32_t)0x01000004) -#define ADC_FLAG_ADSTP ((uint32_t)0x01000010) -#define ADC_FLAG_ADCAL ((uint32_t)0x81000000) - -#define IS_ADC_CLEAR_FLAG(FLAG) (((FLAG) != (uint32_t)RESET) && (((FLAG) & 0xFFFFFF60) == (uint32_t)RESET)) - -#define IS_ADC_GET_FLAG(FLAG) (((FLAG) == ADC_FLAG_ADRDY) || ((FLAG) == ADC_FLAG_EOSMP) || \ - ((FLAG) == ADC_FLAG_EOC) || ((FLAG) == ADC_FLAG_EOSEQ) || \ - ((FLAG) == ADC_FLAG_AWD) || ((FLAG) == ADC_FLAG_OVR) || \ - ((FLAG) == ADC_FLAG_ADEN) || ((FLAG) == ADC_FLAG_ADDIS) || \ - ((FLAG) == ADC_FLAG_ADSTART) || ((FLAG) == ADC_FLAG_ADSTP) || \ - ((FLAG) == ADC_FLAG_ADCAL)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Function used to set the ADC configuration to the default reset state *****/ -void ADC_DeInit(ADC_TypeDef* ADCx); - -/* Initialization and Configuration functions *********************************/ -void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); -void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); -void ADC_ClockModeConfig(ADC_TypeDef* ADCx, uint32_t ADC_ClockMode); -void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); -/* This Function is obsolete and maintained for legacy purpose only. - ADC_ClockModeConfig() function should be used instead */ -void ADC_JitterCmd(ADC_TypeDef* ADCx, uint32_t ADC_JitterOff, FunctionalState NewState); - -/* Power saving functions *****************************************************/ -void ADC_AutoPowerOffCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_WaitModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); - -/* Analog Watchdog configuration functions ************************************/ -void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold,uint16_t LowThreshold); -void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog_Channel); -void ADC_AnalogWatchdogSingleChannelCmd(ADC_TypeDef* ADCx, FunctionalState NewState); - -/* Temperature Sensor , Vrefint and Vbat management function ******************/ -void ADC_TempSensorCmd(FunctionalState NewState); -void ADC_VrefintCmd(FunctionalState NewState); -void ADC_VbatCmd(FunctionalState NewState); /*!< Not applicable for STM32F030 devices */ - -/* Channels Configuration functions *******************************************/ -void ADC_ChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_Channel, uint32_t ADC_SampleTime); -void ADC_ContinuousModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_OverrunModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -uint32_t ADC_GetCalibrationFactor(ADC_TypeDef* ADCx); -void ADC_StopOfConversion(ADC_TypeDef* ADCx); -void ADC_StartOfConversion(ADC_TypeDef* ADCx); -uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); - -/* Regular Channels DMA Configuration functions *******************************/ -void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_DMARequestModeConfig(ADC_TypeDef* ADCx, uint32_t ADC_DMARequestMode); - -/* Interrupts and flags management functions **********************************/ -void ADC_ITConfig(ADC_TypeDef* ADCx, uint32_t ADC_IT, FunctionalState NewState); -FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint32_t ADC_FLAG); -void ADC_ClearFlag(ADC_TypeDef* ADCx, uint32_t ADC_FLAG); -ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint32_t ADC_IT); -void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint32_t ADC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F0XX_ADC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_can.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_can.h deleted file mode 100644 index 60a4098..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_can.h +++ /dev/null @@ -1,643 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_can.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the CAN firmware - * library, applicable only for STM32F072 devices. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0xx_CAN_H -#define __STM32F0xx_CAN_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup CAN - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -#define IS_CAN_ALL_PERIPH(PERIPH) (((PERIPH) == CAN)) - -/** - * @brief CAN init structure definition - */ -typedef struct -{ - uint16_t CAN_Prescaler; /*!< Specifies the length of a time quantum. - It ranges from 1 to 1024. */ - - uint8_t CAN_Mode; /*!< Specifies the CAN operating mode. - This parameter can be a value of @ref CAN_operating_mode */ - - uint8_t CAN_SJW; /*!< Specifies the maximum number of time quanta - the CAN hardware is allowed to lengthen or - shorten a bit to perform resynchronization. - This parameter can be a value of @ref CAN_synchronisation_jump_width */ - - uint8_t CAN_BS1; /*!< Specifies the number of time quanta in Bit - Segment 1. This parameter can be a value of - @ref CAN_time_quantum_in_bit_segment_1 */ - - uint8_t CAN_BS2; /*!< Specifies the number of time quanta in Bit Segment 2. - This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 */ - - FunctionalState CAN_TTCM; /*!< Enable or disable the time triggered communication mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_ABOM; /*!< Enable or disable the automatic bus-off management. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_AWUM; /*!< Enable or disable the automatic wake-up mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_NART; /*!< Enable or disable the non-automatic retransmission mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_RFLM; /*!< Enable or disable the Receive FIFO Locked mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_TXFP; /*!< Enable or disable the transmit FIFO priority. - This parameter can be set either to ENABLE or DISABLE. */ -} CAN_InitTypeDef; - -/** - * @brief CAN filter init structure definition - */ -typedef struct -{ - uint16_t CAN_FilterIdHigh; /*!< Specifies the filter identification number (MSBs for a 32-bit - configuration, first one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterIdLow; /*!< Specifies the filter identification number (LSBs for a 32-bit - configuration, second one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterMaskIdHigh; /*!< Specifies the filter mask number or identification number, - according to the mode (MSBs for a 32-bit configuration, - first one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterMaskIdLow; /*!< Specifies the filter mask number or identification number, - according to the mode (LSBs for a 32-bit configuration, - second one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterFIFOAssignment; /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter. - This parameter can be a value of @ref CAN_filter_FIFO */ - - uint8_t CAN_FilterNumber; /*!< Specifies the filter which will be initialized. It ranges from 0 to 13. */ - - uint8_t CAN_FilterMode; /*!< Specifies the filter mode to be initialized. - This parameter can be a value of @ref CAN_filter_mode */ - - uint8_t CAN_FilterScale; /*!< Specifies the filter scale. - This parameter can be a value of @ref CAN_filter_scale */ - - FunctionalState CAN_FilterActivation; /*!< Enable or disable the filter. - This parameter can be set either to ENABLE or DISABLE. */ -} CAN_FilterInitTypeDef; - -/** - * @brief CAN Tx message structure definition - */ -typedef struct -{ - uint32_t StdId; /*!< Specifies the standard identifier. - This parameter can be a value between 0 to 0x7FF. */ - - uint32_t ExtId; /*!< Specifies the extended identifier. - This parameter can be a value between 0 to 0x1FFFFFFF. */ - - uint8_t IDE; /*!< Specifies the type of identifier for the message that - will be transmitted. This parameter can be a value - of @ref CAN_identifier_type */ - - uint8_t RTR; /*!< Specifies the type of frame for the message that will - be transmitted. This parameter can be a value of - @ref CAN_remote_transmission_request */ - - uint8_t DLC; /*!< Specifies the length of the frame that will be - transmitted. This parameter can be a value between - 0 to 8 */ - - uint8_t Data[8]; /*!< Contains the data to be transmitted. It ranges from 0 - to 0xFF. */ -} CanTxMsg; - -/** - * @brief CAN Rx message structure definition - */ -typedef struct -{ - uint32_t StdId; /*!< Specifies the standard identifier. - This parameter can be a value between 0 to 0x7FF. */ - - uint32_t ExtId; /*!< Specifies the extended identifier. - This parameter can be a value between 0 to 0x1FFFFFFF. */ - - uint8_t IDE; /*!< Specifies the type of identifier for the message that - will be received. This parameter can be a value of - @ref CAN_identifier_type */ - - uint8_t RTR; /*!< Specifies the type of frame for the received message. - This parameter can be a value of - @ref CAN_remote_transmission_request */ - - uint8_t DLC; /*!< Specifies the length of the frame that will be received. - This parameter can be a value between 0 to 8 */ - - uint8_t Data[8]; /*!< Contains the data to be received. It ranges from 0 to - 0xFF. */ - - uint8_t FMI; /*!< Specifies the index of the filter the message stored in - the mailbox passes through. This parameter can be a - value between 0 to 0xFF */ -} CanRxMsg; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CAN_Exported_Constants - * @{ - */ - -/** @defgroup CAN_InitStatus - * @{ - */ - -#define CAN_InitStatus_Failed ((uint8_t)0x00) /*!< CAN initialization failed */ -#define CAN_InitStatus_Success ((uint8_t)0x01) /*!< CAN initialization OK */ - - -/* Legacy defines */ -#define CANINITFAILED CAN_InitStatus_Failed -#define CANINITOK CAN_InitStatus_Success -/** - * @} - */ - -/** @defgroup CAN_operating_mode - * @{ - */ - -#define CAN_Mode_Normal ((uint8_t)0x00) /*!< normal mode */ -#define CAN_Mode_LoopBack ((uint8_t)0x01) /*!< loopback mode */ -#define CAN_Mode_Silent ((uint8_t)0x02) /*!< silent mode */ -#define CAN_Mode_Silent_LoopBack ((uint8_t)0x03) /*!< loopback combined with silent mode */ - -#define IS_CAN_MODE(MODE) (((MODE) == CAN_Mode_Normal) || \ - ((MODE) == CAN_Mode_LoopBack)|| \ - ((MODE) == CAN_Mode_Silent) || \ - ((MODE) == CAN_Mode_Silent_LoopBack)) -/** - * @} - */ - - - /** - * @defgroup CAN_operating_mode - * @{ - */ -#define CAN_OperatingMode_Initialization ((uint8_t)0x00) /*!< Initialization mode */ -#define CAN_OperatingMode_Normal ((uint8_t)0x01) /*!< Normal mode */ -#define CAN_OperatingMode_Sleep ((uint8_t)0x02) /*!< sleep mode */ - - -#define IS_CAN_OPERATING_MODE(MODE) (((MODE) == CAN_OperatingMode_Initialization) ||\ - ((MODE) == CAN_OperatingMode_Normal)|| \ - ((MODE) == CAN_OperatingMode_Sleep)) -/** - * @} - */ - -/** - * @defgroup CAN_operating_mode_status - * @{ - */ - -#define CAN_ModeStatus_Failed ((uint8_t)0x00) /*!< CAN entering the specific mode failed */ -#define CAN_ModeStatus_Success ((uint8_t)!CAN_ModeStatus_Failed) /*!< CAN entering the specific mode Succeed */ -/** - * @} - */ - -/** @defgroup CAN_synchronisation_jump_width - * @{ - */ -#define CAN_SJW_1tq ((uint8_t)0x00) /*!< 1 time quantum */ -#define CAN_SJW_2tq ((uint8_t)0x01) /*!< 2 time quantum */ -#define CAN_SJW_3tq ((uint8_t)0x02) /*!< 3 time quantum */ -#define CAN_SJW_4tq ((uint8_t)0x03) /*!< 4 time quantum */ - -#define IS_CAN_SJW(SJW) (((SJW) == CAN_SJW_1tq) || ((SJW) == CAN_SJW_2tq)|| \ - ((SJW) == CAN_SJW_3tq) || ((SJW) == CAN_SJW_4tq)) -/** - * @} - */ - -/** @defgroup CAN_time_quantum_in_bit_segment_1 - * @{ - */ -#define CAN_BS1_1tq ((uint8_t)0x00) /*!< 1 time quantum */ -#define CAN_BS1_2tq ((uint8_t)0x01) /*!< 2 time quantum */ -#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */ -#define CAN_BS1_4tq ((uint8_t)0x03) /*!< 4 time quantum */ -#define CAN_BS1_5tq ((uint8_t)0x04) /*!< 5 time quantum */ -#define CAN_BS1_6tq ((uint8_t)0x05) /*!< 6 time quantum */ -#define CAN_BS1_7tq ((uint8_t)0x06) /*!< 7 time quantum */ -#define CAN_BS1_8tq ((uint8_t)0x07) /*!< 8 time quantum */ -#define CAN_BS1_9tq ((uint8_t)0x08) /*!< 9 time quantum */ -#define CAN_BS1_10tq ((uint8_t)0x09) /*!< 10 time quantum */ -#define CAN_BS1_11tq ((uint8_t)0x0A) /*!< 11 time quantum */ -#define CAN_BS1_12tq ((uint8_t)0x0B) /*!< 12 time quantum */ -#define CAN_BS1_13tq ((uint8_t)0x0C) /*!< 13 time quantum */ -#define CAN_BS1_14tq ((uint8_t)0x0D) /*!< 14 time quantum */ -#define CAN_BS1_15tq ((uint8_t)0x0E) /*!< 15 time quantum */ -#define CAN_BS1_16tq ((uint8_t)0x0F) /*!< 16 time quantum */ - -#define IS_CAN_BS1(BS1) ((BS1) <= CAN_BS1_16tq) -/** - * @} - */ - -/** @defgroup CAN_time_quantum_in_bit_segment_2 - * @{ - */ -#define CAN_BS2_1tq ((uint8_t)0x00) /*!< 1 time quantum */ -#define CAN_BS2_2tq ((uint8_t)0x01) /*!< 2 time quantum */ -#define CAN_BS2_3tq ((uint8_t)0x02) /*!< 3 time quantum */ -#define CAN_BS2_4tq ((uint8_t)0x03) /*!< 4 time quantum */ -#define CAN_BS2_5tq ((uint8_t)0x04) /*!< 5 time quantum */ -#define CAN_BS2_6tq ((uint8_t)0x05) /*!< 6 time quantum */ -#define CAN_BS2_7tq ((uint8_t)0x06) /*!< 7 time quantum */ -#define CAN_BS2_8tq ((uint8_t)0x07) /*!< 8 time quantum */ - -#define IS_CAN_BS2(BS2) ((BS2) <= CAN_BS2_8tq) -/** - * @} - */ - -/** @defgroup CAN_clock_prescaler - * @{ - */ -#define IS_CAN_PRESCALER(PRESCALER) (((PRESCALER) >= 1) && ((PRESCALER) <= 1024)) -/** - * @} - */ - -/** @defgroup CAN_filter_number - * @{ - */ -#define IS_CAN_FILTER_NUMBER(NUMBER) ((NUMBER) <= 27) -/** - * @} - */ - -/** @defgroup CAN_filter_mode - * @{ - */ -#define CAN_FilterMode_IdMask ((uint8_t)0x00) /*!< identifier/mask mode */ -#define CAN_FilterMode_IdList ((uint8_t)0x01) /*!< identifier list mode */ - -#define IS_CAN_FILTER_MODE(MODE) (((MODE) == CAN_FilterMode_IdMask) || \ - ((MODE) == CAN_FilterMode_IdList)) -/** - * @} - */ - -/** @defgroup CAN_filter_scale - * @{ - */ -#define CAN_FilterScale_16bit ((uint8_t)0x00) /*!< Two 16-bit filters */ -#define CAN_FilterScale_32bit ((uint8_t)0x01) /*!< One 32-bit filter */ - -#define IS_CAN_FILTER_SCALE(SCALE) (((SCALE) == CAN_FilterScale_16bit) || \ - ((SCALE) == CAN_FilterScale_32bit)) -/** - * @} - */ - -/** @defgroup CAN_filter_FIFO - * @{ - */ -#define CAN_Filter_FIFO0 ((uint8_t)0x00) /*!< Filter FIFO 0 assignment for filter x */ -#define CAN_Filter_FIFO1 ((uint8_t)0x01) /*!< Filter FIFO 1 assignment for filter x */ -#define IS_CAN_FILTER_FIFO(FIFO) (((FIFO) == CAN_FilterFIFO0) || \ - ((FIFO) == CAN_FilterFIFO1)) - -/* Legacy defines */ -#define CAN_FilterFIFO0 CAN_Filter_FIFO0 -#define CAN_FilterFIFO1 CAN_Filter_FIFO1 -/** - * @} - */ - -/** @defgroup CAN_Start_bank_filter_for_slave_CAN - * @{ - */ -#define IS_CAN_BANKNUMBER(BANKNUMBER) (((BANKNUMBER) >= 1) && ((BANKNUMBER) <= 27)) -/** - * @} - */ - -/** @defgroup CAN_Tx - * @{ - */ -#define IS_CAN_TRANSMITMAILBOX(TRANSMITMAILBOX) ((TRANSMITMAILBOX) <= ((uint8_t)0x02)) -#define IS_CAN_STDID(STDID) ((STDID) <= ((uint32_t)0x7FF)) -#define IS_CAN_EXTID(EXTID) ((EXTID) <= ((uint32_t)0x1FFFFFFF)) -#define IS_CAN_DLC(DLC) ((DLC) <= ((uint8_t)0x08)) -/** - * @} - */ - -/** @defgroup CAN_identifier_type - * @{ - */ -#define CAN_Id_Standard ((uint32_t)0x00000000) /*!< Standard Id */ -#define CAN_Id_Extended ((uint32_t)0x00000004) /*!< Extended Id */ -#define IS_CAN_IDTYPE(IDTYPE) (((IDTYPE) == CAN_Id_Standard) || \ - ((IDTYPE) == CAN_Id_Extended)) - -/* Legacy defines */ -#define CAN_ID_STD CAN_Id_Standard -#define CAN_ID_EXT CAN_Id_Extended -/** - * @} - */ - -/** @defgroup CAN_remote_transmission_request - * @{ - */ -#define CAN_RTR_Data ((uint32_t)0x00000000) /*!< Data frame */ -#define CAN_RTR_Remote ((uint32_t)0x00000002) /*!< Remote frame */ -#define IS_CAN_RTR(RTR) (((RTR) == CAN_RTR_Data) || ((RTR) == CAN_RTR_Remote)) - -/* Legacy defines */ -#define CAN_RTR_DATA CAN_RTR_Data -#define CAN_RTR_REMOTE CAN_RTR_Remote -/** - * @} - */ - -/** @defgroup CAN_transmit_constants - * @{ - */ -#define CAN_TxStatus_Failed ((uint8_t)0x00)/*!< CAN transmission failed */ -#define CAN_TxStatus_Ok ((uint8_t)0x01) /*!< CAN transmission succeeded */ -#define CAN_TxStatus_Pending ((uint8_t)0x02) /*!< CAN transmission pending */ -#define CAN_TxStatus_NoMailBox ((uint8_t)0x04) /*!< CAN cell did not provide - an empty mailbox */ -/* Legacy defines */ -#define CANTXFAILED CAN_TxStatus_Failed -#define CANTXOK CAN_TxStatus_Ok -#define CANTXPENDING CAN_TxStatus_Pending -#define CAN_NO_MB CAN_TxStatus_NoMailBox -/** - * @} - */ - -/** @defgroup CAN_receive_FIFO_number_constants - * @{ - */ -#define CAN_FIFO0 ((uint8_t)0x00) /*!< CAN FIFO 0 used to receive */ -#define CAN_FIFO1 ((uint8_t)0x01) /*!< CAN FIFO 1 used to receive */ - -#define IS_CAN_FIFO(FIFO) (((FIFO) == CAN_FIFO0) || ((FIFO) == CAN_FIFO1)) -/** - * @} - */ - -/** @defgroup CAN_sleep_constants - * @{ - */ -#define CAN_Sleep_Failed ((uint8_t)0x00) /*!< CAN did not enter the sleep mode */ -#define CAN_Sleep_Ok ((uint8_t)0x01) /*!< CAN entered the sleep mode */ - -/* Legacy defines */ -#define CANSLEEPFAILED CAN_Sleep_Failed -#define CANSLEEPOK CAN_Sleep_Ok -/** - * @} - */ - -/** @defgroup CAN_wake_up_constants - * @{ - */ -#define CAN_WakeUp_Failed ((uint8_t)0x00) /*!< CAN did not leave the sleep mode */ -#define CAN_WakeUp_Ok ((uint8_t)0x01) /*!< CAN leaved the sleep mode */ - -/* Legacy defines */ -#define CANWAKEUPFAILED CAN_WakeUp_Failed -#define CANWAKEUPOK CAN_WakeUp_Ok -/** - * @} - */ - -/** - * @defgroup CAN_Error_Code_constants - * @{ - */ -#define CAN_ErrorCode_NoErr ((uint8_t)0x00) /*!< No Error */ -#define CAN_ErrorCode_StuffErr ((uint8_t)0x10) /*!< Stuff Error */ -#define CAN_ErrorCode_FormErr ((uint8_t)0x20) /*!< Form Error */ -#define CAN_ErrorCode_ACKErr ((uint8_t)0x30) /*!< Acknowledgment Error */ -#define CAN_ErrorCode_BitRecessiveErr ((uint8_t)0x40) /*!< Bit Recessive Error */ -#define CAN_ErrorCode_BitDominantErr ((uint8_t)0x50) /*!< Bit Dominant Error */ -#define CAN_ErrorCode_CRCErr ((uint8_t)0x60) /*!< CRC Error */ -#define CAN_ErrorCode_SoftwareSetErr ((uint8_t)0x70) /*!< Software Set Error */ -/** - * @} - */ - -/** @defgroup CAN_flags - * @{ - */ -/* If the flag is 0x3XXXXXXX, it means that it can be used with CAN_GetFlagStatus() - and CAN_ClearFlag() functions. */ -/* If the flag is 0x1XXXXXXX, it means that it can only be used with - CAN_GetFlagStatus() function. */ - -/* Transmit Flags */ -#define CAN_FLAG_RQCP0 ((uint32_t)0x38000001) /*!< Request MailBox0 Flag */ -#define CAN_FLAG_RQCP1 ((uint32_t)0x38000100) /*!< Request MailBox1 Flag */ -#define CAN_FLAG_RQCP2 ((uint32_t)0x38010000) /*!< Request MailBox2 Flag */ - -/* Receive Flags */ -#define CAN_FLAG_FMP0 ((uint32_t)0x12000003) /*!< FIFO 0 Message Pending Flag */ -#define CAN_FLAG_FF0 ((uint32_t)0x32000008) /*!< FIFO 0 Full Flag */ -#define CAN_FLAG_FOV0 ((uint32_t)0x32000010) /*!< FIFO 0 Overrun Flag */ -#define CAN_FLAG_FMP1 ((uint32_t)0x14000003) /*!< FIFO 1 Message Pending Flag */ -#define CAN_FLAG_FF1 ((uint32_t)0x34000008) /*!< FIFO 1 Full Flag */ -#define CAN_FLAG_FOV1 ((uint32_t)0x34000010) /*!< FIFO 1 Overrun Flag */ - -/* Operating Mode Flags */ -#define CAN_FLAG_WKU ((uint32_t)0x31000008) /*!< Wake up Flag */ -#define CAN_FLAG_SLAK ((uint32_t)0x31000012) /*!< Sleep acknowledge Flag */ -/* @note When SLAK interrupt is disabled (SLKIE=0), no polling on SLAKI is possible. - In this case the SLAK bit can be polled.*/ - -/* Error Flags */ -#define CAN_FLAG_EWG ((uint32_t)0x10F00001) /*!< Error Warning Flag */ -#define CAN_FLAG_EPV ((uint32_t)0x10F00002) /*!< Error Passive Flag */ -#define CAN_FLAG_BOF ((uint32_t)0x10F00004) /*!< Bus-Off Flag */ -#define CAN_FLAG_LEC ((uint32_t)0x30F00070) /*!< Last error code Flag */ - -#define IS_CAN_GET_FLAG(FLAG) (((FLAG) == CAN_FLAG_LEC) || ((FLAG) == CAN_FLAG_BOF) || \ - ((FLAG) == CAN_FLAG_EPV) || ((FLAG) == CAN_FLAG_EWG) || \ - ((FLAG) == CAN_FLAG_WKU) || ((FLAG) == CAN_FLAG_FOV0) || \ - ((FLAG) == CAN_FLAG_FF0) || ((FLAG) == CAN_FLAG_FMP0) || \ - ((FLAG) == CAN_FLAG_FOV1) || ((FLAG) == CAN_FLAG_FF1) || \ - ((FLAG) == CAN_FLAG_FMP1) || ((FLAG) == CAN_FLAG_RQCP2) || \ - ((FLAG) == CAN_FLAG_RQCP1)|| ((FLAG) == CAN_FLAG_RQCP0) || \ - ((FLAG) == CAN_FLAG_SLAK )) - -#define IS_CAN_CLEAR_FLAG(FLAG)(((FLAG) == CAN_FLAG_LEC) || ((FLAG) == CAN_FLAG_RQCP2) || \ - ((FLAG) == CAN_FLAG_RQCP1) || ((FLAG) == CAN_FLAG_RQCP0) || \ - ((FLAG) == CAN_FLAG_FF0) || ((FLAG) == CAN_FLAG_FOV0) ||\ - ((FLAG) == CAN_FLAG_FF1) || ((FLAG) == CAN_FLAG_FOV1) || \ - ((FLAG) == CAN_FLAG_WKU) || ((FLAG) == CAN_FLAG_SLAK)) -/** - * @} - */ - - -/** @defgroup CAN_interrupts - * @{ - */ -#define CAN_IT_TME ((uint32_t)0x00000001) /*!< Transmit mailbox empty Interrupt*/ - -/* Receive Interrupts */ -#define CAN_IT_FMP0 ((uint32_t)0x00000002) /*!< FIFO 0 message pending Interrupt*/ -#define CAN_IT_FF0 ((uint32_t)0x00000004) /*!< FIFO 0 full Interrupt*/ -#define CAN_IT_FOV0 ((uint32_t)0x00000008) /*!< FIFO 0 overrun Interrupt*/ -#define CAN_IT_FMP1 ((uint32_t)0x00000010) /*!< FIFO 1 message pending Interrupt*/ -#define CAN_IT_FF1 ((uint32_t)0x00000020) /*!< FIFO 1 full Interrupt*/ -#define CAN_IT_FOV1 ((uint32_t)0x00000040) /*!< FIFO 1 overrun Interrupt*/ - -/* Operating Mode Interrupts */ -#define CAN_IT_WKU ((uint32_t)0x00010000) /*!< Wake-up Interrupt*/ -#define CAN_IT_SLK ((uint32_t)0x00020000) /*!< Sleep acknowledge Interrupt*/ - -/* Error Interrupts */ -#define CAN_IT_EWG ((uint32_t)0x00000100) /*!< Error warning Interrupt*/ -#define CAN_IT_EPV ((uint32_t)0x00000200) /*!< Error passive Interrupt*/ -#define CAN_IT_BOF ((uint32_t)0x00000400) /*!< Bus-off Interrupt*/ -#define CAN_IT_LEC ((uint32_t)0x00000800) /*!< Last error code Interrupt*/ -#define CAN_IT_ERR ((uint32_t)0x00008000) /*!< Error Interrupt*/ - -/* Flags named as Interrupts : kept only for FW compatibility */ -#define CAN_IT_RQCP0 CAN_IT_TME -#define CAN_IT_RQCP1 CAN_IT_TME -#define CAN_IT_RQCP2 CAN_IT_TME - - -#define IS_CAN_IT(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FMP0) ||\ - ((IT) == CAN_IT_FF0) || ((IT) == CAN_IT_FOV0) ||\ - ((IT) == CAN_IT_FMP1) || ((IT) == CAN_IT_FF1) ||\ - ((IT) == CAN_IT_FOV1) || ((IT) == CAN_IT_EWG) ||\ - ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||\ - ((IT) == CAN_IT_LEC) || ((IT) == CAN_IT_ERR) ||\ - ((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK)) - -#define IS_CAN_CLEAR_IT(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FF0) ||\ - ((IT) == CAN_IT_FOV0)|| ((IT) == CAN_IT_FF1) ||\ - ((IT) == CAN_IT_FOV1)|| ((IT) == CAN_IT_EWG) ||\ - ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||\ - ((IT) == CAN_IT_LEC) || ((IT) == CAN_IT_ERR) ||\ - ((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the CAN configuration to the default reset state *****/ -void CAN_DeInit(CAN_TypeDef* CANx); - -/* Initialization and Configuration functions *********************************/ -uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct); -void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct); -void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct); -void CAN_SlaveStartBank(uint8_t CAN_BankNumber); -void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState); -void CAN_TTComModeCmd(CAN_TypeDef* CANx, FunctionalState NewState); - -/* CAN Frames Transmission functions ******************************************/ -uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage); -uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox); -void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox); - -/* CAN Frames Reception functions *********************************************/ -void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage); -void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber); -uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber); - -/* Operation modes functions **************************************************/ -uint8_t CAN_OperatingModeRequest(CAN_TypeDef* CANx, uint8_t CAN_OperatingMode); -uint8_t CAN_Sleep(CAN_TypeDef* CANx); -uint8_t CAN_WakeUp(CAN_TypeDef* CANx); - -/* CAN Bus Error management functions *****************************************/ -uint8_t CAN_GetLastErrorCode(CAN_TypeDef* CANx); -uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef* CANx); -uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef* CANx); - -/* Interrupts and flags management functions **********************************/ -void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState); -FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG); -void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG); -ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT); -void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0xx_CAN_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_cec.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_cec.h deleted file mode 100644 index 29f06a6..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_cec.h +++ /dev/null @@ -1,300 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_cec.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the CEC firmware - * library, applicable only for STM32F051, STM32F042 and STM32F072 devices. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_CEC_H -#define __STM32F0XX_CEC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup CEC - * @{ - */ -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief CEC Init structure definition - */ -typedef struct -{ - uint32_t CEC_SignalFreeTime; /*!< Specifies the CEC Signal Free Time configuration. - This parameter can be a value of @ref CEC_Signal_Free_Time */ - uint32_t CEC_RxTolerance; /*!< Specifies the CEC Reception Tolerance. - This parameter can be a value of @ref CEC_RxTolerance */ - uint32_t CEC_StopReception; /*!< Specifies the CEC Stop Reception. - This parameter can be a value of @ref CEC_Stop_Reception */ - uint32_t CEC_BitRisingError; /*!< Specifies the CEC Bit Rising Error generation. - This parameter can be a value of @ref CEC_Bit_Rising_Error_Generation */ - uint32_t CEC_LongBitPeriodError; /*!< Specifies the CEC Long Bit Error generation. - This parameter can be a value of @ref CEC_Long_Bit_Error_Generation */ - uint32_t CEC_BRDNoGen; /*!< Specifies the CEC Broadcast Error generation. - This parameter can be a value of @ref CEC_BDR_No_Gen */ - uint32_t CEC_SFTOption; /*!< Specifies the CEC Signal Free Time option. - This parameter can be a value of @ref CEC_SFT_Option */ - -}CEC_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CEC_Exported_Constants - * @{ - */ - -/** @defgroup CEC_Signal_Free_Time - * @{ - */ -#define CEC_SignalFreeTime_Standard ((uint32_t)0x00000000) /*!< CEC Signal Free Time Standard */ -#define CEC_SignalFreeTime_1T ((uint32_t)0x00000001) /*!< CEC 1.5 nominal data bit periods */ -#define CEC_SignalFreeTime_2T ((uint32_t)0x00000002) /*!< CEC 2.5 nominal data bit periods */ -#define CEC_SignalFreeTime_3T ((uint32_t)0x00000003) /*!< CEC 3.5 nominal data bit periods */ -#define CEC_SignalFreeTime_4T ((uint32_t)0x00000004) /*!< CEC 4.5 nominal data bit periods */ -#define CEC_SignalFreeTime_5T ((uint32_t)0x00000005) /*!< CEC 5.5 nominal data bit periods */ -#define CEC_SignalFreeTime_6T ((uint32_t)0x00000006) /*!< CEC 6.5 nominal data bit periods */ -#define CEC_SignalFreeTime_7T ((uint32_t)0x00000007) /*!< CEC 7.5 nominal data bit periods */ - -#define IS_CEC_SIGNAL_FREE_TIME(TIME) (((TIME) == CEC_SignalFreeTime_Standard) || \ - ((TIME) == CEC_SignalFreeTime_1T)|| \ - ((TIME) == CEC_SignalFreeTime_2T)|| \ - ((TIME) == CEC_SignalFreeTime_3T)|| \ - ((TIME) == CEC_SignalFreeTime_4T)|| \ - ((TIME) == CEC_SignalFreeTime_5T)|| \ - ((TIME) == CEC_SignalFreeTime_6T)|| \ - ((TIME) == CEC_SignalFreeTime_7T)) -/** - * @} - */ - -/** @defgroup CEC_RxTolerance - * @{ - */ -#define CEC_RxTolerance_Standard ((uint32_t)0x00000000) /*!< Standard Tolerance Margin */ -#define CEC_RxTolerance_Extended CEC_CFGR_RXTOL /*!< Extended Tolerance Margin */ - -#define IS_CEC_RX_TOLERANCE(TOLERANCE) (((TOLERANCE) == CEC_RxTolerance_Standard) || \ - ((TOLERANCE) == CEC_RxTolerance_Extended)) -/** - * @} - */ - -/** @defgroup CEC_Stop_Reception - * @{ - */ -#define CEC_StopReception_Off ((uint32_t)0x00000000) /*!< No RX Stop on bit Rising Error (BRE) */ -#define CEC_StopReception_On CEC_CFGR_BRESTP /*!< RX Stop on bit Rising Error (BRE) */ - -#define IS_CEC_STOP_RECEPTION(RECEPTION) (((RECEPTION) == CEC_StopReception_On) || \ - ((RECEPTION) == CEC_StopReception_Off)) -/** - * @} - */ - -/** @defgroup CEC_Bit_Rising_Error_Generation - * @{ - */ -#define CEC_BitRisingError_Off ((uint32_t)0x00000000) /*!< Bit Rising Error generation turned Off */ -#define CEC_BitRisingError_On CEC_CFGR_BREGEN /*!< Bit Rising Error generation turned On */ - -#define IS_CEC_BIT_RISING_ERROR(ERROR) (((ERROR) == CEC_BitRisingError_Off) || \ - ((ERROR) == CEC_BitRisingError_On)) -/** - * @} - */ - -/** @defgroup CEC_Long_Bit_Error_Generation - * @{ - */ -#define CEC_LongBitPeriodError_Off ((uint32_t)0x00000000) /*!< Long Bit Period Error generation turned Off */ -#define CEC_LongBitPeriodError_On CEC_CFGR_LREGEN /*!< Long Bit Period Error generation turned On */ - -#define IS_CEC_LONG_BIT_PERIOD_ERROR(ERROR) (((ERROR) == CEC_LongBitPeriodError_Off) || \ - ((ERROR) == CEC_LongBitPeriodError_On)) -/** - * @} - */ - -/** @defgroup CEC_BDR_No_Gen - * @{ - */ - -#define CEC_BRDNoGen_Off ((uint32_t)0x00000000) /*!< Broadcast Bit Rising Error generation turned Off */ -#define CEC_BRDNoGen_On CEC_CFGR_BRDNOGEN /*!< Broadcast Bit Rising Error generation turned On */ - -#define IS_CEC_BDR_NO_GEN_ERROR(ERROR) (((ERROR) == CEC_BRDNoGen_Off) || \ - ((ERROR) == CEC_BRDNoGen_On)) -/** - * @} - */ - -/** @defgroup CEC_SFT_Option - * @{ - */ -#define CEC_SFTOption_Off ((uint32_t)0x00000000) /*!< SFT option turned Off */ -#define CEC_SFTOption_On CEC_CFGR_SFTOPT /*!< SFT option turned On */ - -#define IS_CEC_SFT_OPTION(OPTION) (((OPTION) == CEC_SFTOption_Off) || \ - ((OPTION) == CEC_SFTOption_On)) -/** - * @} - */ - -/** @defgroup CEC_Own_Address - * @{ - */ -#define IS_CEC_ADDRESS(ADDRESS) ((ADDRESS) < 0x10) - -/** - * @} - */ - -/** @defgroup CEC_Interrupt_Configuration_definition - * @{ - */ -#define CEC_IT_TXACKE CEC_IER_TXACKEIE -#define CEC_IT_TXERR CEC_IER_TXERRIE -#define CEC_IT_TXUDR CEC_IER_TXUDRIE -#define CEC_IT_TXEND CEC_IER_TXENDIE -#define CEC_IT_TXBR CEC_IER_TXBRIE -#define CEC_IT_ARBLST CEC_IER_ARBLSTIE -#define CEC_IT_RXACKE CEC_IER_RXACKEIE -#define CEC_IT_LBPE CEC_IER_LBPEIE -#define CEC_IT_SBPE CEC_IER_SBPEIE -#define CEC_IT_BRE CEC_IER_BREIEIE -#define CEC_IT_RXOVR CEC_IER_RXOVRIE -#define CEC_IT_RXEND CEC_IER_RXENDIE -#define CEC_IT_RXBR CEC_IER_RXBRIE - -#define IS_CEC_IT(IT) ((((IT) & (uint32_t)0xFFFFE000) == 0x00) && ((IT) != 0x00)) - -#define IS_CEC_GET_IT(IT) (((IT) == CEC_IT_TXACKE) || \ - ((IT) == CEC_IT_TXERR)|| \ - ((IT) == CEC_IT_TXUDR)|| \ - ((IT) == CEC_IT_TXEND)|| \ - ((IT) == CEC_IT_TXBR)|| \ - ((IT) == CEC_IT_ARBLST)|| \ - ((IT) == CEC_IT_RXACKE)|| \ - ((IT) == CEC_IT_LBPE)|| \ - ((IT) == CEC_IT_SBPE)|| \ - ((IT) == CEC_IT_BRE)|| \ - ((IT) == CEC_IT_RXOVR)|| \ - ((IT) == CEC_IT_RXEND)|| \ - ((IT) == CEC_IT_RXBR)) -/** - * @} - */ - -/** @defgroup CEC_ISR_register_flags_definition - * @{ - */ -#define CEC_FLAG_TXACKE CEC_ISR_TXACKE -#define CEC_FLAG_TXERR CEC_ISR_TXERR -#define CEC_FLAG_TXUDR CEC_ISR_TXUDR -#define CEC_FLAG_TXEND CEC_ISR_TXEND -#define CEC_FLAG_TXBR CEC_ISR_TXBR -#define CEC_FLAG_ARBLST CEC_ISR_ARBLST -#define CEC_FLAG_RXACKE CEC_ISR_RXACKE -#define CEC_FLAG_LBPE CEC_ISR_LBPE -#define CEC_FLAG_SBPE CEC_ISR_SBPE -#define CEC_FLAG_BRE CEC_ISR_BRE -#define CEC_FLAG_RXOVR CEC_ISR_RXOVR -#define CEC_FLAG_RXEND CEC_ISR_RXEND -#define CEC_FLAG_RXBR CEC_ISR_RXBR - -#define IS_CEC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFE000) == 0x00) && ((FLAG) != 0x00)) - -#define IS_CEC_GET_FLAG(FLAG) (((FLAG) == CEC_FLAG_TXACKE) || \ - ((FLAG) == CEC_FLAG_TXERR)|| \ - ((FLAG) == CEC_FLAG_TXUDR)|| \ - ((FLAG) == CEC_FLAG_TXEND)|| \ - ((FLAG) == CEC_FLAG_TXBR)|| \ - ((FLAG) == CEC_FLAG_ARBLST)|| \ - ((FLAG) == CEC_FLAG_RXACKE)|| \ - ((FLAG) == CEC_FLAG_LBPE)|| \ - ((FLAG) == CEC_FLAG_SBPE)|| \ - ((FLAG) == CEC_FLAG_BRE)|| \ - ((FLAG) == CEC_FLAG_RXOVR)|| \ - ((FLAG) == CEC_FLAG_RXEND)|| \ - ((FLAG) == CEC_FLAG_RXBR)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Function used to set the CEC configuration to the default reset state *****/ -void CEC_DeInit(void); - -/* CEC_Initialization and Configuration functions *****************************/ -void CEC_Init(CEC_InitTypeDef* CEC_InitStruct); -void CEC_StructInit(CEC_InitTypeDef* CEC_InitStruct); -void CEC_Cmd(FunctionalState NewState); -void CEC_ListenModeCmd(FunctionalState NewState); -void CEC_OwnAddressConfig(uint8_t CEC_OwnAddress); -void CEC_OwnAddressClear(void); - -/* CEC_Data transfers functions ***********************************************/ -void CEC_SendData(uint8_t Data); -uint8_t CEC_ReceiveData(void); -void CEC_StartOfMessage(void); -void CEC_EndOfMessage(void); - -/* CEC_Interrupts and flags management functions ******************************/ -void CEC_ITConfig(uint16_t CEC_IT, FunctionalState NewState); -FlagStatus CEC_GetFlagStatus(uint16_t CEC_FLAG); -void CEC_ClearFlag(uint32_t CEC_FLAG); -ITStatus CEC_GetITStatus(uint16_t CEC_IT); -void CEC_ClearITPendingBit(uint16_t CEC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_CEC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_comp.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_comp.h deleted file mode 100644 index da8b152..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_comp.h +++ /dev/null @@ -1,245 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_comp.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the COMP firmware - * library, applicable only for STM32F051 and STM32F072 devices. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_COMP_H -#define __STM32F0XX_COMP_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup COMP - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief COMP Init structure definition - */ - -typedef struct -{ - - uint32_t COMP_InvertingInput; /*!< Selects the inverting input of the comparator. - This parameter can be a value of @ref COMP_InvertingInput */ - - uint32_t COMP_Output; /*!< Selects the output redirection of the comparator. - This parameter can be a value of @ref COMP_Output */ - - uint32_t COMP_OutputPol; /*!< Selects the output polarity of the comparator. - This parameter can be a value of @ref COMP_OutputPolarity */ - - uint32_t COMP_Hysteresis; /*!< Selects the hysteresis voltage of the comparator. - This parameter can be a value of @ref COMP_Hysteresis */ - - uint32_t COMP_Mode; /*!< Selects the operating mode of the comparator - and allows to adjust the speed/consumption. - This parameter can be a value of @ref COMP_Mode */ - -}COMP_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup COMP_Exported_Constants - * @{ - */ - -/** @defgroup COMP_Selection - * @{ - */ - -#define COMP_Selection_COMP1 ((uint32_t)0x00000000) /*!< COMP1 Selection */ -#define COMP_Selection_COMP2 ((uint32_t)0x00000010) /*!< COMP2 Selection */ - -#define IS_COMP_ALL_PERIPH(PERIPH) (((PERIPH) == COMP_Selection_COMP1) || \ - ((PERIPH) == COMP_Selection_COMP2)) - -/** - * @} - */ - -/** @defgroup COMP_InvertingInput - * @{ - */ - -#define COMP_InvertingInput_1_4VREFINT ((uint32_t)0x00000000) /*!< 1/4 VREFINT connected to comparator inverting input */ -#define COMP_InvertingInput_1_2VREFINT COMP_CSR_COMP1INSEL_0 /*!< 1/2 VREFINT connected to comparator inverting input */ -#define COMP_InvertingInput_3_4VREFINT COMP_CSR_COMP1INSEL_1 /*!< 3/4 VREFINT connected to comparator inverting input */ -#define COMP_InvertingInput_VREFINT ((uint32_t)0x00000030) /*!< VREFINT connected to comparator inverting input */ -#define COMP_InvertingInput_DAC1 COMP_CSR_COMP1INSEL_2 /*!< DAC1_OUT (PA4) connected to comparator inverting input */ -#define COMP_InvertingInput_DAC2 ((uint32_t)0x00000050) /*!< DAC2_OUT (PA5) connected to comparator inverting input, applicable only for STM32F072 devices */ -#define COMP_InvertingInput_IO ((uint32_t)0x00000060) /*!< I/O (PA0 for COMP1 and PA2 for COMP2) connected to comparator inverting input */ - -#define IS_COMP_INVERTING_INPUT(INPUT) (((INPUT) == COMP_InvertingInput_1_4VREFINT) || \ - ((INPUT) == COMP_InvertingInput_1_2VREFINT) || \ - ((INPUT) == COMP_InvertingInput_3_4VREFINT) || \ - ((INPUT) == COMP_InvertingInput_VREFINT) || \ - ((INPUT) == COMP_InvertingInput_DAC1) || \ - ((INPUT) == COMP_InvertingInput_DAC2) || \ - ((INPUT) == COMP_InvertingInput_1_4VREFINT) || \ - ((INPUT) == COMP_InvertingInput_IO)) -/** - * @} - */ - -/** @defgroup COMP_Output - * @{ - */ - -#define COMP_Output_None ((uint32_t)0x00000000) /*!< COMP output isn't connected to other peripherals */ -#define COMP_Output_TIM1BKIN COMP_CSR_COMP1OUTSEL_0 /*!< COMP output connected to TIM1 Break Input (BKIN) */ -#define COMP_Output_TIM1IC1 COMP_CSR_COMP1OUTSEL_1 /*!< COMP output connected to TIM1 Input Capture 1 */ -#define COMP_Output_TIM1OCREFCLR ((uint32_t)0x00000300) /*!< COMP output connected to TIM1 OCREF Clear */ -#define COMP_Output_TIM2IC4 COMP_CSR_COMP1OUTSEL_2 /*!< COMP output connected to TIM2 Input Capture 4 */ -#define COMP_Output_TIM2OCREFCLR ((uint32_t)0x00000500) /*!< COMP output connected to TIM2 OCREF Clear */ -#define COMP_Output_TIM3IC1 ((uint32_t)0x00000600) /*!< COMP output connected to TIM3 Input Capture 1 */ -#define COMP_Output_TIM3OCREFCLR COMP_CSR_COMP1OUTSEL /*!< COMP output connected to TIM3 OCREF Clear */ - - -#define IS_COMP_OUTPUT(OUTPUT) (((OUTPUT) == COMP_Output_None) || \ - ((OUTPUT) == COMP_Output_TIM1BKIN) || \ - ((OUTPUT) == COMP_Output_TIM1IC1) || \ - ((OUTPUT) == COMP_Output_TIM1OCREFCLR) || \ - ((OUTPUT) == COMP_Output_TIM2IC4) || \ - ((OUTPUT) == COMP_Output_TIM2OCREFCLR) || \ - ((OUTPUT) == COMP_Output_TIM3IC1) || \ - ((OUTPUT) == COMP_Output_TIM3OCREFCLR)) -/** - * @} - */ - -/** @defgroup COMP_OutputPolarity - * @{ - */ -#define COMP_OutputPol_NonInverted ((uint32_t)0x00000000) /*!< COMP output on GPIO isn't inverted */ -#define COMP_OutputPol_Inverted COMP_CSR_COMP1POL /*!< COMP output on GPIO is inverted */ - -#define IS_COMP_OUTPUT_POL(POL) (((POL) == COMP_OutputPol_NonInverted) || \ - ((POL) == COMP_OutputPol_Inverted)) - -/** - * @} - */ - -/** @defgroup COMP_Hysteresis - * @{ - */ -/* Please refer to the electrical characteristics in the device datasheet for - the hysteresis level */ -#define COMP_Hysteresis_No 0x00000000 /*!< No hysteresis */ -#define COMP_Hysteresis_Low COMP_CSR_COMP1HYST_0 /*!< Hysteresis level low */ -#define COMP_Hysteresis_Medium COMP_CSR_COMP1HYST_1 /*!< Hysteresis level medium */ -#define COMP_Hysteresis_High COMP_CSR_COMP1HYST /*!< Hysteresis level high */ - -#define IS_COMP_HYSTERESIS(HYSTERESIS) (((HYSTERESIS) == COMP_Hysteresis_No) || \ - ((HYSTERESIS) == COMP_Hysteresis_Low) || \ - ((HYSTERESIS) == COMP_Hysteresis_Medium) || \ - ((HYSTERESIS) == COMP_Hysteresis_High)) -/** - * @} - */ - -/** @defgroup COMP_Mode - * @{ - */ -/* Please refer to the electrical characteristics in the device datasheet for - the power consumption values */ -#define COMP_Mode_HighSpeed 0x00000000 /*!< High Speed */ -#define COMP_Mode_MediumSpeed COMP_CSR_COMP1MODE_0 /*!< Medium Speed */ -#define COMP_Mode_LowPower COMP_CSR_COMP1MODE_1 /*!< Low power mode */ -#define COMP_Mode_UltraLowPower COMP_CSR_COMP1MODE /*!< Ultra-low power mode */ - -#define IS_COMP_MODE(MODE) (((MODE) == COMP_Mode_UltraLowPower) || \ - ((MODE) == COMP_Mode_LowPower) || \ - ((MODE) == COMP_Mode_MediumSpeed) || \ - ((MODE) == COMP_Mode_HighSpeed)) -/** - * @} - */ - -/** @defgroup COMP_OutputLevel - * @{ - */ -/* When output polarity is not inverted, comparator output is high when - the non-inverting input is at a higher voltage than the inverting input */ -#define COMP_OutputLevel_High COMP_CSR_COMP1OUT -/* When output polarity is not inverted, comparator output is low when - the non-inverting input is at a lower voltage than the inverting input*/ -#define COMP_OutputLevel_Low ((uint32_t)0x00000000) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Function used to set the COMP configuration to the default reset state ****/ -void COMP_DeInit(void); - -/* Initialization and Configuration functions *********************************/ -void COMP_Init(uint32_t COMP_Selection, COMP_InitTypeDef* COMP_InitStruct); -void COMP_StructInit(COMP_InitTypeDef* COMP_InitStruct); -void COMP_Cmd(uint32_t COMP_Selection, FunctionalState NewState); -void COMP_SwitchCmd(FunctionalState NewState); -uint32_t COMP_GetOutputLevel(uint32_t COMP_Selection); - -/* Window mode control function ***********************************************/ -void COMP_WindowCmd(FunctionalState NewState); - -/* COMP configuration locking function ****************************************/ -void COMP_LockConfig(uint32_t COMP_Selection); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F0XX_COMP_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_crc.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_crc.h deleted file mode 100644 index ef1d436..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_crc.h +++ /dev/null @@ -1,122 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_crc.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the CRC firmware - * library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_CRC_H -#define __STM32F0XX_CRC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/*!< Includes ----------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup CRC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CRC_ReverseInputData - * @{ - */ -#define CRC_ReverseInputData_No ((uint32_t)0x00000000) /*!< No reverse operation of Input Data */ -#define CRC_ReverseInputData_8bits CRC_CR_REV_IN_0 /*!< Reverse operation of Input Data on 8 bits */ -#define CRC_ReverseInputData_16bits CRC_CR_REV_IN_1 /*!< Reverse operation of Input Data on 16 bits */ -#define CRC_ReverseInputData_32bits CRC_CR_REV_IN /*!< Reverse operation of Input Data on 32 bits */ - -#define IS_CRC_REVERSE_INPUT_DATA(DATA) (((DATA) == CRC_ReverseInputData_No) || \ - ((DATA) == CRC_ReverseInputData_8bits) || \ - ((DATA) == CRC_ReverseInputData_16bits) || \ - ((DATA) == CRC_ReverseInputData_32bits)) - -/** - * @} - */ - -/** @defgroup CRC_PolynomialSize - * @brief Only applicable for STM32F042 and STM32F072 devices - * @{ - */ -#define CRC_PolSize_7 CRC_CR_POLSIZE /*!< 7-bit polynomial for CRC calculation */ -#define CRC_PolSize_8 CRC_CR_POLSIZE_1 /*!< 8-bit polynomial for CRC calculation */ -#define CRC_PolSize_16 CRC_CR_POLSIZE_0 /*!< 16-bit polynomial for CRC calculation */ -#define CRC_PolSize_32 ((uint32_t)0x00000000)/*!< 32-bit polynomial for CRC calculation */ - -#define IS_CRC_POL_SIZE(SIZE) (((SIZE) == CRC_PolSize_7) || \ - ((SIZE) == CRC_PolSize_8) || \ - ((SIZE) == CRC_PolSize_16) || \ - ((SIZE) == CRC_PolSize_32)) - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -/* Configuration of the CRC computation unit **********************************/ -void CRC_DeInit(void); -void CRC_ResetDR(void); -void CRC_PolynomialSizeSelect(uint32_t CRC_PolSize); /*!< Only applicable for STM32F042 and STM32F072 devices */ -void CRC_ReverseInputDataSelect(uint32_t CRC_ReverseInputData); -void CRC_ReverseOutputDataCmd(FunctionalState NewState); -void CRC_SetInitRegister(uint32_t CRC_InitValue); -void CRC_SetPolynomial(uint32_t CRC_Pol); /*!< Only applicable for STM32F042 and STM32F072 devices */ - -/* CRC computation ************************************************************/ -uint32_t CRC_CalcCRC(uint32_t CRC_Data); -uint32_t CRC_CalcCRC16bits(uint16_t CRC_Data); /*!< Only applicable for STM32F042 and STM32F072 devices */ -uint32_t CRC_CalcCRC8bits(uint8_t CRC_Data); /*!< Only applicable for STM32F042 and STM32F072 devices */ -uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength); -uint32_t CRC_GetCRC(void); - -/* Independent register (IDR) access (write/read) *****************************/ -void CRC_SetIDRegister(uint8_t CRC_IDValue); -uint8_t CRC_GetIDRegister(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_CRC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_crs.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_crs.h deleted file mode 100644 index 6f37b4f..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_crs.h +++ /dev/null @@ -1,183 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_crs.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the CRS firmware - * library, applicable only for STM32F042 and STM32F072 devices. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_CRS_H -#define __STM32F0XX_CRS_H - -#ifdef __cplusplus - extern "C" { -#endif - -/*!< Includes ----------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup CRS - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CRS_Interrupt_Sources - * @{ - */ -#define CRS_IT_SYNCOK CRS_ISR_SYNCOKF /*!< SYNC event OK */ -#define CRS_IT_SYNCWARN CRS_ISR_SYNCWARNF /*!< SYNC warning */ -#define CRS_IT_ERR CRS_ISR_ERRF /*!< error */ -#define CRS_IT_ESYNC CRS_ISR_ESYNCF /*!< Expected SYNC */ -#define CRS_IT_TRIMOVF CRS_ISR_TRIMOVF /*!< Trimming overflow or underflow */ -#define CRS_IT_SYNCERR CRS_ISR_SYNCERR /*!< SYNC error */ -#define CRS_IT_SYNCMISS CRS_ISR_SYNCMISS /*!< SYNC missed*/ - -#define IS_CRS_IT(IT) (((IT) == CRS_IT_SYNCOK) || ((IT) == CRS_IT_SYNCWARN) || \ - ((IT) == CRS_IT_ERR) || ((IT) == CRS_IT_ESYNC)) - -#define IS_CRS_GET_IT(IT) (((IT) == CRS_IT_SYNCOK) || ((IT) == CRS_IT_SYNCWARN) || \ - ((IT) == CRS_IT_ERR) || ((IT) == CRS_IT_ESYNC) || \ - ((IT) == CRS_IT_TRIMOVF) || ((IT) == CRS_IT_SYNCERR) || \ - ((IT) == CRS_IT_SYNCMISS)) - -#define IS_CRS_CLEAR_IT(IT) ((IT) != 0x00) - -/** - * @} - */ - -/** @defgroup CRS_Flags - * @{ - */ -#define CRS_FLAG_SYNCOK CRS_ISR_SYNCOKF /*!< SYNC event OK */ -#define CRS_FLAG_SYNCWARN CRS_ISR_SYNCWARNF /*!< SYNC warning */ -#define CRS_FLAG_ERR CRS_ISR_ERRF /*!< error */ -#define CRS_FLAG_ESYNC CRS_ISR_ESYNCF /*!< Expected SYNC */ -#define CRS_FLAG_TRIMOVF CRS_ISR_TRIMOVF /*!< Trimming overflow or underflow */ -#define CRS_FLAG_SYNCERR CRS_ISR_SYNCERR /*!< SYNC error */ -#define CRS_FLAG_SYNCMISS CRS_ISR_SYNCMISS /*!< SYNC missed*/ - -#define IS_CRS_FLAG(FLAG) (((FLAG) == CRS_FLAG_SYNCOK) || ((FLAG) == CRS_FLAG_SYNCWARN) || \ - ((FLAG) == CRS_FLAG_ERR) || ((FLAG) == CRS_FLAG_ESYNC) || \ - ((FLAG) == CRS_FLAG_TRIMOVF) || ((FLAG) == CRS_FLAG_SYNCERR) || \ - ((FLAG) == CRS_FLAG_SYNCMISS)) - -/** - * @} - */ - -/** @defgroup CRS_Synchro_Source - * @{ - */ -#define CRS_SYNCSource_GPIO ((uint32_t)0x00) /*!< Synchro Signal soucre GPIO */ -#define CRS_SYNCSource_LSE CRS_CFGR_SYNCSRC_0 /*!< Synchro Signal source LSE */ -#define CRS_SYNCSource_USB CRS_CFGR_SYNCSRC_1 /*!< Synchro Signal source USB SOF */ - -#define IS_CRS_SYNC_SOURCE(SOURCE) (((SOURCE) == CRS_SYNCSource_GPIO) || \ - ((SOURCE) == CRS_SYNCSource_LSE) ||\ - ((SOURCE) == CRS_SYNCSource_USB)) -/** - * @} - */ - -/** @defgroup CRS_SynchroDivider - * @{ - */ -#define CRS_SYNC_Div1 ((uint32_t)0x00) /*!< Synchro Signal not divided */ -#define CRS_SYNC_Div2 CRS_CFGR_SYNCDIV_0 /*!< Synchro Signal divided by 2 */ -#define CRS_SYNC_Div4 CRS_CFGR_SYNCDIV_1 /*!< Synchro Signal divided by 4 */ -#define CRS_SYNC_Div8 (CRS_CFGR_SYNCDIV_1 | CRS_CFGR_SYNCDIV_0) /*!< Synchro Signal divided by 8 */ -#define CRS_SYNC_Div16 CRS_CFGR_SYNCDIV_2 /*!< Synchro Signal divided by 16 */ -#define CRS_SYNC_Div32 (CRS_CFGR_SYNCDIV_2 | CRS_CFGR_SYNCDIV_0) /*!< Synchro Signal divided by 32 */ -#define CRS_SYNC_Div64 (CRS_CFGR_SYNCDIV_2 | CRS_CFGR_SYNCDIV_1) /*!< Synchro Signal divided by 64 */ -#define CRS_SYNC_Div128 CRS_CFGR_SYNCDIV /*!< Synchro Signal divided by 128 */ - -#define IS_CRS_SYNC_DIV(DIV) (((DIV) == CRS_SYNC_Div1) || ((DIV) == CRS_SYNC_Div2) ||\ - ((DIV) == CRS_SYNC_Div4) || ((DIV) == CRS_SYNC_Div8) || \ - ((DIV) == CRS_SYNC_Div16) || ((DIV) == CRS_SYNC_Div32) || \ - ((DIV) == CRS_SYNC_Div64) || ((DIV) == CRS_SYNC_Div128)) -/** - * @} - */ - -/** @defgroup CRS_SynchroPolarity - * @{ - */ -#define CRS_SYNCPolarity_Rising ((uint32_t)0x00) /*!< Synchro Active on rising edge */ -#define CRS_SYNCPolarity_Falling CRS_CFGR_SYNCPOL /*!< Synchro Active on falling edge */ - -#define IS_CRS_SYNC_POLARITY(POLARITY) (((POLARITY) == CRS_SYNCPolarity_Rising) || \ - ((POLARITY) == CRS_SYNCPolarity_Falling)) -/** - * @} - */ - - - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -/* Configuration of the CRS **********************************/ -void CRS_DeInit(void); -void CRS_AdjustHSI48CalibrationValue(uint8_t CRS_HSI48CalibrationValue); -void CRS_FrequencyErrorCounterCmd(FunctionalState NewState); -void CRS_AutomaticCalibrationCmd(FunctionalState NewState); -void CRS_SoftwareSynchronizationGenerate(void); -void CRS_FrequencyErrorCounterReload(uint32_t CRS_ReloadValue); -void CRS_FrequencyErrorLimitConfig(uint8_t CRS_ErrorLimitValue); -void CRS_SynchronizationPrescalerConfig(uint32_t CRS_Prescaler); -void CRS_SynchronizationSourceConfig(uint32_t CRS_Source); -void CRS_SynchronizationPolarityConfig(uint32_t CRS_Polarity); -uint32_t CRS_GetReloadValue(void); -uint32_t CRS_GetHSI48CalibrationValue(void); -uint32_t CRS_GetFrequencyErrorValue(void); -uint32_t CRS_GetFrequencyErrorDirection(void); - -/* Interrupts and flags management functions **********************************/ -void CRS_ITConfig(uint32_t CRS_IT, FunctionalState NewState); -FlagStatus CRS_GetFlagStatus(uint32_t CRS_FLAG); -void CRS_ClearFlag(uint32_t CRS_FLAG); -ITStatus CRS_GetITStatus(uint32_t CRS_IT); -void CRS_ClearITPendingBit(uint32_t CRS_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_CRS_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dac.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dac.h deleted file mode 100644 index f2884bb..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dac.h +++ /dev/null @@ -1,312 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_dac.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the DAC firmware - * library, applicable only for STM32F051 and STM32F072 devices. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_DAC_H -#define __STM32F0XX_DAC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup DAC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief DAC Init structure definition - */ - -typedef struct -{ - uint32_t DAC_Trigger; /*!< Specifies the external trigger for the selected DAC channel. - This parameter can be a value of @ref DAC_trigger_selection */ - - uint32_t DAC_WaveGeneration; /*!< Specifies whether DAC channel noise waves or triangle waves - are generated, or whether no wave is generated. - This parameter can be a value of @ref DAC_wave_generation - This parameter is only applicable for STM32F072 devices */ - - uint32_t DAC_LFSRUnmask_TriangleAmplitude; /*!< Specifies the LFSR mask for noise wave generation or - the maximum amplitude triangle generation for the DAC channel. - This parameter can be a value of @ref DAC_lfsrunmask_triangleamplitude - This parameter is only applicable for STM32F072 devices */ - - uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled. - This parameter can be a value of @ref DAC_output_buffer */ -}DAC_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup DAC_Exported_Constants - * @{ - */ - -/** @defgroup DAC_Trigger - * @{ - */ - -#define DAC_Trigger_None ((uint32_t)0x00000000) /*!< Conversion is automatic once the DAC1_DHRxxxx register - has been loaded, and not by external trigger */ -#define DAC_Trigger_T6_TRGO ((uint32_t)0x00000004) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel1 */ -#define DAC_Trigger_T3_TRGO ((uint32_t)0x0000000C) /*!< TIM3 TRGO selected as external conversion trigger for DAC channel1 */ -#define DAC_Trigger_T7_TRGO ((uint32_t)0x00000014) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel1, - applicable only for STM32F072 devices */ -#define DAC_Trigger_T15_TRGO ((uint32_t)0x0000001C) /*!< TIM15 TRGO selected as external conversion trigger for DAC channel1 */ -#define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel1 */ -#define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /*!< EXTI Line9 event selected as external conversion trigger for DAC channels */ -#define DAC_Trigger_Software ((uint32_t)0x0000003C) /*!< Conversion started by software trigger for DAC channels */ - -#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_Trigger_None) || \ - ((TRIGGER) == DAC_Trigger_T6_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T7_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T3_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T15_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T2_TRGO) || \ - ((TRIGGER) == DAC_Trigger_Ext_IT9) || \ - ((TRIGGER) == DAC_Trigger_Software)) - -/** - * @} - */ - -/** @defgroup DAC_wave_generation - * @brief This parameters are only applicable for STM32F072 devices. - * @{ - */ - -#define DAC_WaveGeneration_None ((uint32_t)0x00000000) -#define DAC_WaveGeneration_Noise ((uint32_t)0x00000040) -#define DAC_WaveGeneration_Triangle ((uint32_t)0x00000080) -#define IS_DAC_GENERATE_WAVE(WAVE) (((WAVE) == DAC_WaveGeneration_None) || \ - ((WAVE) == DAC_WaveGeneration_Noise) || \ - ((WAVE) == DAC_WaveGeneration_Triangle)) -/** - * @} - */ - -/** @defgroup DAC_lfsrunmask_triangleamplitude - * @brief These parameters are only applicable for STM32F072 devices. - * @{ - */ - -#define DAC_LFSRUnmask_Bit0 ((uint32_t)0x00000000) /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ -#define DAC_LFSRUnmask_Bits1_0 ((uint32_t)0x00000100) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits2_0 ((uint32_t)0x00000200) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits3_0 ((uint32_t)0x00000300) /*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits4_0 ((uint32_t)0x00000400) /*!< Unmask DAC channel LFSR bit[4:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits5_0 ((uint32_t)0x00000500) /*!< Unmask DAC channel LFSR bit[5:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits6_0 ((uint32_t)0x00000600) /*!< Unmask DAC channel LFSR bit[6:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits7_0 ((uint32_t)0x00000700) /*!< Unmask DAC channel LFSR bit[7:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits8_0 ((uint32_t)0x00000800) /*!< Unmask DAC channel LFSR bit[8:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits9_0 ((uint32_t)0x00000900) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits10_0 ((uint32_t)0x00000A00) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits11_0 ((uint32_t)0x00000B00) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */ -#define DAC_TriangleAmplitude_1 ((uint32_t)0x00000000) /*!< Select max triangle amplitude of 1 */ -#define DAC_TriangleAmplitude_3 ((uint32_t)0x00000100) /*!< Select max triangle amplitude of 3 */ -#define DAC_TriangleAmplitude_7 ((uint32_t)0x00000200) /*!< Select max triangle amplitude of 7 */ -#define DAC_TriangleAmplitude_15 ((uint32_t)0x00000300) /*!< Select max triangle amplitude of 15 */ -#define DAC_TriangleAmplitude_31 ((uint32_t)0x00000400) /*!< Select max triangle amplitude of 31 */ -#define DAC_TriangleAmplitude_63 ((uint32_t)0x00000500) /*!< Select max triangle amplitude of 63 */ -#define DAC_TriangleAmplitude_127 ((uint32_t)0x00000600) /*!< Select max triangle amplitude of 127 */ -#define DAC_TriangleAmplitude_255 ((uint32_t)0x00000700) /*!< Select max triangle amplitude of 255 */ -#define DAC_TriangleAmplitude_511 ((uint32_t)0x00000800) /*!< Select max triangle amplitude of 511 */ -#define DAC_TriangleAmplitude_1023 ((uint32_t)0x00000900) /*!< Select max triangle amplitude of 1023 */ -#define DAC_TriangleAmplitude_2047 ((uint32_t)0x00000A00) /*!< Select max triangle amplitude of 2047 */ -#define DAC_TriangleAmplitude_4095 ((uint32_t)0x00000B00) /*!< Select max triangle amplitude of 4095 */ - -#define IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(VALUE) (((VALUE) == DAC_LFSRUnmask_Bit0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits1_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits2_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits3_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits4_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits5_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits6_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits7_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits8_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits9_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits10_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits11_0) || \ - ((VALUE) == DAC_TriangleAmplitude_1) || \ - ((VALUE) == DAC_TriangleAmplitude_3) || \ - ((VALUE) == DAC_TriangleAmplitude_7) || \ - ((VALUE) == DAC_TriangleAmplitude_15) || \ - ((VALUE) == DAC_TriangleAmplitude_31) || \ - ((VALUE) == DAC_TriangleAmplitude_63) || \ - ((VALUE) == DAC_TriangleAmplitude_127) || \ - ((VALUE) == DAC_TriangleAmplitude_255) || \ - ((VALUE) == DAC_TriangleAmplitude_511) || \ - ((VALUE) == DAC_TriangleAmplitude_1023) || \ - ((VALUE) == DAC_TriangleAmplitude_2047) || \ - ((VALUE) == DAC_TriangleAmplitude_4095)) -/** - * @} - */ - -/** @defgroup DAC_OutputBuffer - * @{ - */ - -#define DAC_OutputBuffer_Enable ((uint32_t)0x00000000) -#define DAC_OutputBuffer_Disable DAC_CR_BOFF1 -#define IS_DAC_OUTPUT_BUFFER_STATE(STATE) (((STATE) == DAC_OutputBuffer_Enable) || \ - ((STATE) == DAC_OutputBuffer_Disable)) -/** - * @} - */ - -/** @defgroup DAC_Channel_selection - * @{ - */ - -#define DAC_Channel_1 ((uint32_t)0x00000000) -#define DAC_Channel_2 ((uint32_t)0x00000010) /*!< Only applicable for STM32F072 devices */ -#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_Channel_1) || \ - ((CHANNEL) == DAC_Channel_2)) - -/** - * @} - */ - -/** @defgroup DAC_data_alignment - * @{ - */ - -#define DAC_Align_12b_R ((uint32_t)0x00000000) -#define DAC_Align_12b_L ((uint32_t)0x00000004) -#define DAC_Align_8b_R ((uint32_t)0x00000008) -#define IS_DAC_ALIGN(ALIGN) (((ALIGN) == DAC_Align_12b_R) || \ - ((ALIGN) == DAC_Align_12b_L) || \ - ((ALIGN) == DAC_Align_8b_R)) -/** - * @} - */ - -/** @defgroup DAC_wave_generation - * @brief These parameters are only applicable for STM32F072 devices. - * @{ - */ - -#define DAC_Wave_Noise ((uint32_t)0x00000040) -#define DAC_Wave_Triangle ((uint32_t)0x00000080) -#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_Wave_Noise) || \ - ((WAVE) == DAC_Wave_Triangle)) -/** - * @} - */ - -/** @defgroup DAC_data - * @{ - */ - -#define IS_DAC_DATA(DATA) ((DATA) <= 0xFFF0) - -/** - * @} - */ - -/** @defgroup DAC_interrupts_definition - * @{ - */ - -#define DAC_IT_DMAUDR DAC_SR_DMAUDR1 -#define IS_DAC_IT(IT) (((IT) == DAC_IT_DMAUDR)) - -/** - * @} - */ - - -/** @defgroup DAC_flags_definition - * @{ - */ - -#define DAC_FLAG_DMAUDR DAC_SR_DMAUDR1 - -#define IS_DAC_FLAG(FLAG) (((FLAG) == DAC_FLAG_DMAUDR)) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Function used to set the DAC configuration to the default reset state *****/ -void DAC_DeInit(void); - -/* DAC channels configuration: trigger, output buffer, data format functions */ -void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct); -void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct); -void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState); -void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState); -void DAC_DualSoftwareTriggerCmd(FunctionalState NewState); /*!< Only applicable for STM32F072 devices */ -void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState); /*!< Only applicable for STM32F072 devices */ -void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data); -void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data); /*!< Only applicable for STM32F072 devices */ -void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1); /*!< Only applicable for STM32F072 devices */ -uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel); - -/* DMA management functions ***************************************************/ -void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState); - -/* Interrupts and flags management functions **********************************/ -void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState); -FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG); -void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG); -ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT); -void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F0XX_DAC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dbgmcu.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dbgmcu.h deleted file mode 100644 index 0ce7130..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dbgmcu.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_dbgmcu.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the DBGMCU firmware - * library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_DBGMCU_H -#define __STM32F0XX_DBGMCU_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup DBGMCU - * @{ - */ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - - -/** @defgroup DBGMCU_Exported_Constants - * @{ - */ - -#define DBGMCU_STOP DBGMCU_CR_DBG_STOP -#define DBGMCU_STANDBY DBGMCU_CR_DBG_STANDBY -#define IS_DBGMCU_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFFF9) == 0x00) && ((PERIPH) != 0x00)) - -#define DBGMCU_TIM2_STOP DBGMCU_APB1_FZ_DBG_TIM2_STOP /*!< Not applicable for STM32F030 devices */ -#define DBGMCU_TIM3_STOP DBGMCU_APB1_FZ_DBG_TIM3_STOP -#define DBGMCU_TIM6_STOP DBGMCU_APB1_FZ_DBG_TIM6_STOP -#define DBGMCU_TIM7_STOP DBGMCU_APB1_FZ_DBG_TIM7_STOP /*!< Only applicable for STM32F072 devices */ -#define DBGMCU_TIM14_STOP DBGMCU_APB1_FZ_DBG_TIM14_STOP -#define DBGMCU_RTC_STOP DBGMCU_APB1_FZ_DBG_RTC_STOP -#define DBGMCU_WWDG_STOP DBGMCU_APB1_FZ_DBG_WWDG_STOP -#define DBGMCU_IWDG_STOP DBGMCU_APB1_FZ_DBG_IWDG_STOP -#define DBGMCU_I2C1_SMBUS_TIMEOUT DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT -#define DBGMCU_CAN1_STOP DBGMCU_APB1_FZ_DBG_CAN1_STOP /*!< Only applicable for STM32F042 and STM32F072 devices */ -#define IS_DBGMCU_APB1PERIPH(PERIPH) ((((PERIPH) & 0xFDDFE2CC) == 0x00) && ((PERIPH) != 0x00)) - -#define DBGMCU_TIM1_STOP DBGMCU_APB2_FZ_DBG_TIM1_STOP -#define DBGMCU_TIM15_STOP DBGMCU_APB2_FZ_DBG_TIM15_STOP -#define DBGMCU_TIM16_STOP DBGMCU_APB2_FZ_DBG_TIM16_STOP -#define DBGMCU_TIM17_STOP DBGMCU_APB2_FZ_DBG_TIM17_STOP -#define IS_DBGMCU_APB2PERIPH(PERIPH) ((((PERIPH) & 0xFFF8F7FF) == 0x00) && ((PERIPH) != 0x00)) - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Device and Revision ID management functions ********************************/ -uint32_t DBGMCU_GetREVID(void); -uint32_t DBGMCU_GetDEVID(void); - -/* Peripherals Configuration functions ****************************************/ -void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState); -void DBGMCU_APB1PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState); -void DBGMCU_APB2PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_DBGMCU_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dma.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dma.h deleted file mode 100644 index d24decb..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_dma.h +++ /dev/null @@ -1,377 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_dma.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the DMA firmware - * library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_DMA_H -#define __STM32F0XX_DMA_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup DMA - * @{ - */ -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief DMA Init structures definition - */ -typedef struct -{ - uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Channelx. */ - - uint32_t DMA_MemoryBaseAddr; /*!< Specifies the memory base address for DMAy Channelx. */ - - uint32_t DMA_DIR; /*!< Specifies if the peripheral is the source or destination. - This parameter can be a value of @ref DMA_data_transfer_direction */ - - uint32_t DMA_BufferSize; /*!< Specifies the buffer size, in data unit, of the specified Channel. - The data unit is equal to the configuration set in DMA_PeripheralDataSize - or DMA_MemoryDataSize members depending in the transfer direction */ - - uint32_t DMA_PeripheralInc; /*!< Specifies whether the Peripheral address register is incremented or not. - This parameter can be a value of @ref DMA_peripheral_incremented_mode */ - - uint32_t DMA_MemoryInc; /*!< Specifies whether the memory address register is incremented or not. - This parameter can be a value of @ref DMA_memory_incremented_mode */ - - uint32_t DMA_PeripheralDataSize; /*!< Specifies the Peripheral data width. - This parameter can be a value of @ref DMA_peripheral_data_size */ - - uint32_t DMA_MemoryDataSize; /*!< Specifies the Memory data width. - This parameter can be a value of @ref DMA_memory_data_size */ - - uint32_t DMA_Mode; /*!< Specifies the operation mode of the DMAy Channelx. - This parameter can be a value of @ref DMA_circular_normal_mode - @note: The circular buffer mode cannot be used if the memory-to-memory - data transfer is configured on the selected Channel */ - - uint32_t DMA_Priority; /*!< Specifies the software priority for the DMAy Channelx. - This parameter can be a value of @ref DMA_priority_level */ - - uint32_t DMA_M2M; /*!< Specifies if the DMAy Channelx will be used in memory-to-memory transfer. - This parameter can be a value of @ref DMA_memory_to_memory */ -}DMA_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Constants - * @{ - */ - -#define IS_DMA_ALL_PERIPH(PERIPH) (((PERIPH) == DMA1_Channel1) || \ - ((PERIPH) == DMA1_Channel2) || \ - ((PERIPH) == DMA1_Channel3) || \ - ((PERIPH) == DMA1_Channel4) || \ - ((PERIPH) == DMA1_Channel5) || \ - ((PERIPH) == DMA1_Channel6) || \ - ((PERIPH) == DMA1_Channel7)) - -/** @defgroup DMA_data_transfer_direction - * @{ - */ - -#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000) -#define DMA_DIR_PeripheralDST DMA_CCR_DIR - -#define IS_DMA_DIR(DIR) (((DIR) == DMA_DIR_PeripheralSRC) || \ - ((DIR) == DMA_DIR_PeripheralDST)) -/** - * @} - */ - -/** @defgroup DMA_peripheral_incremented_mode - * @{ - */ - -#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000) -#define DMA_PeripheralInc_Enable DMA_CCR_PINC - -#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PeripheralInc_Disable) || \ - ((STATE) == DMA_PeripheralInc_Enable)) -/** - * @} - */ - -/** @defgroup DMA_memory_incremented_mode - * @{ - */ - -#define DMA_MemoryInc_Disable ((uint32_t)0x00000000) -#define DMA_MemoryInc_Enable DMA_CCR_MINC - -#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MemoryInc_Disable) || \ - ((STATE) == DMA_MemoryInc_Enable)) -/** - * @} - */ - -/** @defgroup DMA_peripheral_data_size - * @{ - */ - -#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) -#define DMA_PeripheralDataSize_HalfWord DMA_CCR_PSIZE_0 -#define DMA_PeripheralDataSize_Word DMA_CCR_PSIZE_1 - -#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PeripheralDataSize_Byte) || \ - ((SIZE) == DMA_PeripheralDataSize_HalfWord) || \ - ((SIZE) == DMA_PeripheralDataSize_Word)) -/** - * @} - */ - -/** @defgroup DMA_memory_data_size - * @{ - */ - -#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000) -#define DMA_MemoryDataSize_HalfWord DMA_CCR_MSIZE_0 -#define DMA_MemoryDataSize_Word DMA_CCR_MSIZE_1 - -#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MemoryDataSize_Byte) || \ - ((SIZE) == DMA_MemoryDataSize_HalfWord) || \ - ((SIZE) == DMA_MemoryDataSize_Word)) -/** - * @} - */ - -/** @defgroup DMA_circular_normal_mode - * @{ - */ - -#define DMA_Mode_Normal ((uint32_t)0x00000000) -#define DMA_Mode_Circular DMA_CCR_CIRC - -#define IS_DMA_MODE(MODE) (((MODE) == DMA_Mode_Normal) || ((MODE) == DMA_Mode_Circular)) -/** - * @} - */ - -/** @defgroup DMA_priority_level - * @{ - */ - -#define DMA_Priority_VeryHigh DMA_CCR_PL -#define DMA_Priority_High DMA_CCR_PL_1 -#define DMA_Priority_Medium DMA_CCR_PL_0 -#define DMA_Priority_Low ((uint32_t)0x00000000) - -#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_Priority_VeryHigh) || \ - ((PRIORITY) == DMA_Priority_High) || \ - ((PRIORITY) == DMA_Priority_Medium) || \ - ((PRIORITY) == DMA_Priority_Low)) -/** - * @} - */ - -/** @defgroup DMA_memory_to_memory - * @{ - */ - -#define DMA_M2M_Disable ((uint32_t)0x00000000) -#define DMA_M2M_Enable DMA_CCR_MEM2MEM - -#define IS_DMA_M2M_STATE(STATE) (((STATE) == DMA_M2M_Disable) || ((STATE) == DMA_M2M_Enable)) - -/** - * @} - */ - -/** @defgroup DMA_interrupts_definition - * @{ - */ - -#define DMA_IT_TC DMA_CCR_TCIE -#define DMA_IT_HT DMA_CCR_HTIE -#define DMA_IT_TE DMA_CCR_TEIE - -#define IS_DMA_CONFIG_IT(IT) ((((IT) & 0xFFFFFFF1) == 0x00) && ((IT) != 0x00)) - -#define DMA1_IT_GL1 DMA_ISR_GIF1 -#define DMA1_IT_TC1 DMA_ISR_TCIF1 -#define DMA1_IT_HT1 DMA_ISR_HTIF1 -#define DMA1_IT_TE1 DMA_ISR_TEIF1 -#define DMA1_IT_GL2 DMA_ISR_GIF2 -#define DMA1_IT_TC2 DMA_ISR_TCIF2 -#define DMA1_IT_HT2 DMA_ISR_HTIF2 -#define DMA1_IT_TE2 DMA_ISR_TEIF2 -#define DMA1_IT_GL3 DMA_ISR_GIF3 -#define DMA1_IT_TC3 DMA_ISR_TCIF3 -#define DMA1_IT_HT3 DMA_ISR_HTIF3 -#define DMA1_IT_TE3 DMA_ISR_TEIF3 -#define DMA1_IT_GL4 DMA_ISR_GIF4 -#define DMA1_IT_TC4 DMA_ISR_TCIF4 -#define DMA1_IT_HT4 DMA_ISR_HTIF4 -#define DMA1_IT_TE4 DMA_ISR_TEIF4 -#define DMA1_IT_GL5 DMA_ISR_GIF5 -#define DMA1_IT_TC5 DMA_ISR_TCIF5 -#define DMA1_IT_HT5 DMA_ISR_HTIF5 -#define DMA1_IT_TE5 DMA_ISR_TEIF5 -#define DMA1_IT_GL6 DMA_ISR_GIF6 /*!< Only applicable for STM32F072 devices */ -#define DMA1_IT_TC6 DMA_ISR_TCIF6 /*!< Only applicable for STM32F072 devices */ -#define DMA1_IT_HT6 DMA_ISR_HTIF6 /*!< Only applicable for STM32F072 devices */ -#define DMA1_IT_TE6 DMA_ISR_TEIF6 /*!< Only applicable for STM32F072 devices */ -#define DMA1_IT_GL7 DMA_ISR_GIF7 /*!< Only applicable for STM32F072 devices */ -#define DMA1_IT_TC7 DMA_ISR_TCIF7 /*!< Only applicable for STM32F072 devices */ -#define DMA1_IT_HT7 DMA_ISR_HTIF7 /*!< Only applicable for STM32F072 devices */ -#define DMA1_IT_TE7 DMA_ISR_TEIF7 /*!< Only applicable for STM32F072 devices */ - -#define IS_DMA_CLEAR_IT(IT) ((((IT) & 0xF0000000) == 0x00) && ((IT) != 0x00)) - -#define IS_DMA_GET_IT(IT) (((IT) == DMA1_IT_GL1) || ((IT) == DMA1_IT_TC1) || \ - ((IT) == DMA1_IT_HT1) || ((IT) == DMA1_IT_TE1) || \ - ((IT) == DMA1_IT_GL2) || ((IT) == DMA1_IT_TC2) || \ - ((IT) == DMA1_IT_HT2) || ((IT) == DMA1_IT_TE2) || \ - ((IT) == DMA1_IT_GL3) || ((IT) == DMA1_IT_TC3) || \ - ((IT) == DMA1_IT_HT3) || ((IT) == DMA1_IT_TE3) || \ - ((IT) == DMA1_IT_GL4) || ((IT) == DMA1_IT_TC4) || \ - ((IT) == DMA1_IT_HT4) || ((IT) == DMA1_IT_TE4) || \ - ((IT) == DMA1_IT_GL5) || ((IT) == DMA1_IT_TC5) || \ - ((IT) == DMA1_IT_HT5) || ((IT) == DMA1_IT_TE5) || \ - ((IT) == DMA1_IT_GL6) || ((IT) == DMA1_IT_TC6) || \ - ((IT) == DMA1_IT_HT6) || ((IT) == DMA1_IT_TE6) || \ - ((IT) == DMA1_IT_GL7) || ((IT) == DMA1_IT_TC7) || \ - ((IT) == DMA1_IT_HT7) || ((IT) == DMA1_IT_TE7)) - -/** - * @} - */ - -/** @defgroup DMA_flags_definition - * @{ - */ -#define DMA1_FLAG_GL1 DMA_ISR_GIF1 -#define DMA1_FLAG_TC1 DMA_ISR_TCIF1 -#define DMA1_FLAG_HT1 DMA_ISR_HTIF1 -#define DMA1_FLAG_TE1 DMA_ISR_TEIF1 -#define DMA1_FLAG_GL2 DMA_ISR_GIF2 -#define DMA1_FLAG_TC2 DMA_ISR_TCIF2 -#define DMA1_FLAG_HT2 DMA_ISR_HTIF2 -#define DMA1_FLAG_TE2 DMA_ISR_TEIF2 -#define DMA1_FLAG_GL3 DMA_ISR_GIF3 -#define DMA1_FLAG_TC3 DMA_ISR_TCIF3 -#define DMA1_FLAG_HT3 DMA_ISR_HTIF3 -#define DMA1_FLAG_TE3 DMA_ISR_TEIF3 -#define DMA1_FLAG_GL4 DMA_ISR_GIF4 -#define DMA1_FLAG_TC4 DMA_ISR_TCIF4 -#define DMA1_FLAG_HT4 DMA_ISR_HTIF4 -#define DMA1_FLAG_TE4 DMA_ISR_TEIF4 -#define DMA1_FLAG_GL5 DMA_ISR_GIF5 -#define DMA1_FLAG_TC5 DMA_ISR_TCIF5 -#define DMA1_FLAG_HT5 DMA_ISR_HTIF5 -#define DMA1_FLAG_TE5 DMA_ISR_TEIF5 -#define DMA1_FLAG_GL6 DMA_ISR_GIF6 /*!< Only applicable for STM32F072 devices */ -#define DMA1_FLAG_TC6 DMA_ISR_TCIF6 /*!< Only applicable for STM32F072 devices */ -#define DMA1_FLAG_HT6 DMA_ISR_HTIF6 /*!< Only applicable for STM32F072 devices */ -#define DMA1_FLAG_TE6 DMA_ISR_TEIF6 /*!< Only applicable for STM32F072 devices */ -#define DMA1_FLAG_GL7 DMA_ISR_GIF7 /*!< Only applicable for STM32F072 devices */ -#define DMA1_FLAG_TC7 DMA_ISR_TCIF7 /*!< Only applicable for STM32F072 devices */ -#define DMA1_FLAG_HT7 DMA_ISR_HTIF7 /*!< Only applicable for STM32F072 devices */ -#define DMA1_FLAG_TE7 DMA_ISR_TEIF7 /*!< Only applicable for STM32F072 devices */ - -#define IS_DMA_CLEAR_FLAG(FLAG) ((((FLAG) & 0xF0000000) == 0x00) && ((FLAG) != 0x00)) - -#define IS_DMA_GET_FLAG(FLAG) (((FLAG) == DMA1_FLAG_GL1) || ((FLAG) == DMA1_FLAG_TC1) || \ - ((FLAG) == DMA1_FLAG_HT1) || ((FLAG) == DMA1_FLAG_TE1) || \ - ((FLAG) == DMA1_FLAG_GL2) || ((FLAG) == DMA1_FLAG_TC2) || \ - ((FLAG) == DMA1_FLAG_HT2) || ((FLAG) == DMA1_FLAG_TE2) || \ - ((FLAG) == DMA1_FLAG_GL3) || ((FLAG) == DMA1_FLAG_TC3) || \ - ((FLAG) == DMA1_FLAG_HT3) || ((FLAG) == DMA1_FLAG_TE3) || \ - ((FLAG) == DMA1_FLAG_GL4) || ((FLAG) == DMA1_FLAG_TC4) || \ - ((FLAG) == DMA1_FLAG_HT4) || ((FLAG) == DMA1_FLAG_TE4) || \ - ((FLAG) == DMA1_FLAG_GL5) || ((FLAG) == DMA1_FLAG_TC5) || \ - ((FLAG) == DMA1_FLAG_HT5) || ((FLAG) == DMA1_FLAG_TE5) || \ - ((FLAG) == DMA1_FLAG_GL6) || ((FLAG) == DMA1_FLAG_TC6) || \ - ((FLAG) == DMA1_FLAG_HT6) || ((FLAG) == DMA1_FLAG_TE6) || \ - ((FLAG) == DMA1_FLAG_GL7) || ((FLAG) == DMA1_FLAG_TC7) || \ - ((FLAG) == DMA1_FLAG_HT7) || ((FLAG) == DMA1_FLAG_TE7)) - -/** - * @} - */ - -/** @defgroup DMA_Buffer_Size - * @{ - */ - -#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x1) && ((SIZE) < 0x10000)) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Function used to set the DMA configuration to the default reset state ******/ -void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); - -/* Initialization and Configuration functions *********************************/ -void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); -void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct); -void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState); - -/* Data Counter functions******************************************************/ -void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); -uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); - -/* Interrupts and flags management functions **********************************/ -void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); -FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG); -void DMA_ClearFlag(uint32_t DMA_FLAG); -ITStatus DMA_GetITStatus(uint32_t DMA_IT); -void DMA_ClearITPendingBit(uint32_t DMA_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F0XX_DMA_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_exti.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_exti.h deleted file mode 100644 index f223166..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_exti.h +++ /dev/null @@ -1,216 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_exti.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the EXTI - * firmware library - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_EXTI_H -#define __STM32F0XX_EXTI_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup EXTI - * @{ - */ -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief EXTI mode enumeration - */ - -typedef enum -{ - EXTI_Mode_Interrupt = 0x00, - EXTI_Mode_Event = 0x04 -}EXTIMode_TypeDef; - -#define IS_EXTI_MODE(MODE) (((MODE) == EXTI_Mode_Interrupt) || ((MODE) == EXTI_Mode_Event)) - -/** - * @brief EXTI Trigger enumeration - */ - -typedef enum -{ - EXTI_Trigger_Rising = 0x08, - EXTI_Trigger_Falling = 0x0C, - EXTI_Trigger_Rising_Falling = 0x10 -}EXTITrigger_TypeDef; - -#define IS_EXTI_TRIGGER(TRIGGER) (((TRIGGER) == EXTI_Trigger_Rising) || \ - ((TRIGGER) == EXTI_Trigger_Falling) || \ - ((TRIGGER) == EXTI_Trigger_Rising_Falling)) -/** - * @brief EXTI Init Structure definition - */ - -typedef struct -{ - uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled. - This parameter can be any combination of @ref EXTI_Lines */ - - EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines. - This parameter can be a value of @ref EXTIMode_TypeDef */ - - EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. - This parameter can be a value of @ref EXTIMode_TypeDef */ - - FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines. - This parameter can be set either to ENABLE or DISABLE */ -}EXTI_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup EXTI_Exported_Constants - * @{ - */ -/** @defgroup EXTI_Lines - * @{ - */ - -#define EXTI_Line0 ((uint32_t)0x00000001) /*!< External interrupt line 0 */ -#define EXTI_Line1 ((uint32_t)0x00000002) /*!< External interrupt line 1 */ -#define EXTI_Line2 ((uint32_t)0x00000004) /*!< External interrupt line 2 */ -#define EXTI_Line3 ((uint32_t)0x00000008) /*!< External interrupt line 3 */ -#define EXTI_Line4 ((uint32_t)0x00000010) /*!< External interrupt line 4 */ -#define EXTI_Line5 ((uint32_t)0x00000020) /*!< External interrupt line 5 */ -#define EXTI_Line6 ((uint32_t)0x00000040) /*!< External interrupt line 6 */ -#define EXTI_Line7 ((uint32_t)0x00000080) /*!< External interrupt line 7 */ -#define EXTI_Line8 ((uint32_t)0x00000100) /*!< External interrupt line 8 */ -#define EXTI_Line9 ((uint32_t)0x00000200) /*!< External interrupt line 9 */ -#define EXTI_Line10 ((uint32_t)0x00000400) /*!< External interrupt line 10 */ -#define EXTI_Line11 ((uint32_t)0x00000800) /*!< External interrupt line 11 */ -#define EXTI_Line12 ((uint32_t)0x00001000) /*!< External interrupt line 12 */ -#define EXTI_Line13 ((uint32_t)0x00002000) /*!< External interrupt line 13 */ -#define EXTI_Line14 ((uint32_t)0x00004000) /*!< External interrupt line 14 */ -#define EXTI_Line15 ((uint32_t)0x00008000) /*!< External interrupt line 15 */ -#define EXTI_Line16 ((uint32_t)0x00010000) /*!< External interrupt line 16 - Connected to the PVD Output, - not applicable for STM32F030 devices */ -#define EXTI_Line17 ((uint32_t)0x00020000) /*!< Internal interrupt line 17 - Connected to the RTC Alarm - event */ -#define EXTI_Line18 ((uint32_t)0x00040000) /*!< Internal interrupt line 18 - Connected to the USB - event, only applicable for - STM32F072 devices */ -#define EXTI_Line19 ((uint32_t)0x00080000) /*!< Internal interrupt line 19 - Connected to the RTC Tamper - and Time Stamp events */ -#define EXTI_Line20 ((uint32_t)0x00100000) /*!< Internal interrupt line 20 - Connected to the RTC wakeup - event, only applicable for - STM32F072 devices */ -#define EXTI_Line21 ((uint32_t)0x00200000) /*!< Internal interrupt line 21 - Connected to the Comparator 1 - event, only applicable for STM32F051 - ans STM32F072 devices */ -#define EXTI_Line22 ((uint32_t)0x00400000) /*!< Internal interrupt line 22 - Connected to the Comparator 2 - event, only applicable for STM32F051 - and STM32F072 devices */ -#define EXTI_Line23 ((uint32_t)0x00800000) /*!< Internal interrupt line 23 - Connected to the I2C1 wakeup - event, not applicable for STM32F030 devices */ -#define EXTI_Line25 ((uint32_t)0x02000000) /*!< Internal interrupt line 25 - Connected to the USART1 wakeup - event, not applicable for STM32F030 devices */ -#define EXTI_Line26 ((uint32_t)0x04000000) /*!< Internal interrupt line 26 - Connected to the USART2 wakeup - event, applicable only for - STM32F072 devices */ -#define EXTI_Line27 ((uint32_t)0x08000000) /*!< Internal interrupt line 27 - Connected to the CEC wakeup - event, applicable only for STM32F051 - and STM32F072 devices */ -#define EXTI_Line31 ((uint32_t)0x80000000) /*!< Internal interrupt line 31 - Connected to the VDD USB monitor - event, applicable only for - STM32F072 devices */ -#define IS_EXTI_LINE(LINE) ((((LINE) & (uint32_t)0x71000000) == 0x00) && ((LINE) != (uint16_t)0x00)) - -#define IS_GET_EXTI_LINE(LINE) (((LINE) == EXTI_Line0) || ((LINE) == EXTI_Line1) || \ - ((LINE) == EXTI_Line2) || ((LINE) == EXTI_Line3) || \ - ((LINE) == EXTI_Line4) || ((LINE) == EXTI_Line5) || \ - ((LINE) == EXTI_Line6) || ((LINE) == EXTI_Line7) || \ - ((LINE) == EXTI_Line8) || ((LINE) == EXTI_Line9) || \ - ((LINE) == EXTI_Line10) || ((LINE) == EXTI_Line11) || \ - ((LINE) == EXTI_Line12) || ((LINE) == EXTI_Line13) || \ - ((LINE) == EXTI_Line14) || ((LINE) == EXTI_Line15) || \ - ((LINE) == EXTI_Line16) || ((LINE) == EXTI_Line17) || \ - ((LINE) == EXTI_Line18) || ((LINE) == EXTI_Line19) || \ - ((LINE) == EXTI_Line20) || ((LINE) == EXTI_Line21) || \ - ((LINE) == EXTI_Line22) || ((LINE) == EXTI_Line23) || \ - ((LINE) == EXTI_Line25) || ((LINE) == EXTI_Line26) || \ - ((LINE) == EXTI_Line27) || ((LINE) == EXTI_Line31)) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -/* Function used to set the EXTI configuration to the default reset state *****/ -void EXTI_DeInit(void); - -/* Initialization and Configuration functions *********************************/ -void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); -void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct); -void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); - -/* Interrupts and flags management functions **********************************/ -FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line); -void EXTI_ClearFlag(uint32_t EXTI_Line); -ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); -void EXTI_ClearITPendingBit(uint32_t EXTI_Line); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_EXTI_H */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_flash.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_flash.h deleted file mode 100644 index 40a2976..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_flash.h +++ /dev/null @@ -1,430 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_flash.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the FLASH - * firmware library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_FLASH_H -#define __STM32F0XX_FLASH_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup FLASH - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief FLASH Status - */ -typedef enum -{ - FLASH_BUSY = 1, - FLASH_ERROR_WRP, - FLASH_ERROR_PROGRAM, - FLASH_COMPLETE, - FLASH_TIMEOUT -}FLASH_Status; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup FLASH_Exported_Constants - * @{ - */ - -/** @defgroup FLASH_Latency - * @{ - */ -#define FLASH_Latency_0 ((uint32_t)0x00000000) /*!< FLASH Zero Latency cycle */ -#define FLASH_Latency_1 FLASH_ACR_LATENCY /*!< FLASH One Latency cycle */ - -#define IS_FLASH_LATENCY(LATENCY) (((LATENCY) == FLASH_Latency_0) || \ - ((LATENCY) == FLASH_Latency_1)) -/** - * @} - */ - -/** @defgroup FLASH_Interrupts - * @{ - */ - -#define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of programming interrupt source */ -#define FLASH_IT_ERR FLASH_CR_ERRIE /*!< Error interrupt source */ -#define IS_FLASH_IT(IT) ((((IT) & (uint32_t)0xFFFFEBFF) == 0x00000000) && (((IT) != 0x00000000))) -/** - * @} - */ - -/** @defgroup FLASH_Address - * @{ - */ -#ifndef STM32F072 - #define IS_FLASH_PROGRAM_ADDRESS(ADDRESS) (((ADDRESS) >= 0x08000000) && ((ADDRESS) <= 0x0800FFFF)) -#else - #define IS_FLASH_PROGRAM_ADDRESS(ADDRESS) (((ADDRESS) >= 0x08000000) && ((ADDRESS) <= 0x0801FFFF)) -#endif /* STM32F072 */ -/** - * @} - */ - -/** @defgroup FLASH_OB_DATA_ADDRESS - * @{ - */ -#define IS_OB_DATA_ADDRESS(ADDRESS) (((ADDRESS) == 0x1FFFF804) || ((ADDRESS) == 0x1FFFF806)) - -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_Write_Protection - * @{ - */ - -#ifndef STM32F072 - -#define OB_WRP_Pages0to3 ((uint32_t)0x00000001) /* Write protection of page 0 to 3 */ -#define OB_WRP_Pages4to7 ((uint32_t)0x00000002) /* Write protection of page 4 to 7 */ -#define OB_WRP_Pages8to11 ((uint32_t)0x00000004) /* Write protection of page 8 to 11 */ -#define OB_WRP_Pages12to15 ((uint32_t)0x00000008) /* Write protection of page 12 to 15 */ -#define OB_WRP_Pages16to19 ((uint32_t)0x00000010) /* Write protection of page 16 to 19 */ -#define OB_WRP_Pages20to23 ((uint32_t)0x00000020) /* Write protection of page 20 to 23 */ -#define OB_WRP_Pages24to27 ((uint32_t)0x00000040) /* Write protection of page 24 to 27 */ -#define OB_WRP_Pages28to31 ((uint32_t)0x00000080) /* Write protection of page 28 to 31 */ -#define OB_WRP_Pages32to35 ((uint32_t)0x00000100) /* Write protection of page 32 to 35 */ -#define OB_WRP_Pages36to39 ((uint32_t)0x00000200) /* Write protection of page 36 to 39 */ -#define OB_WRP_Pages40to43 ((uint32_t)0x00000400) /* Write protection of page 40 to 43 */ -#define OB_WRP_Pages44to47 ((uint32_t)0x00000800) /* Write protection of page 44 to 47 */ -#define OB_WRP_Pages48to51 ((uint32_t)0x00001000) /* Write protection of page 48 to 51 */ -#define OB_WRP_Pages52to55 ((uint32_t)0x00002000) /* Write protection of page 52 to 55 */ -#define OB_WRP_Pages56to59 ((uint32_t)0x00004000) /* Write protection of page 56 to 59 */ -#define OB_WRP_Pages60to63 ((uint32_t)0x00008000) /* Write protection of page 60 to 63 */ - -#define OB_WRP_AllPages ((uint32_t)0x0000FFFF) /*!< Write protection of all Sectors */ - -#define IS_OB_WRP(PAGE) (((PAGE) != 0x0000000)) - -#else - -#define OB_WRP_Pages0to1 ((uint32_t)0x00000001) /* Write protection of page 0 to 1 */ -#define OB_WRP_Pages2to3 ((uint32_t)0x00000002) /* Write protection of page 2 to 3 */ -#define OB_WRP_Pages4to5 ((uint32_t)0x00000004) /* Write protection of page 4 to 5 */ -#define OB_WRP_Pages6to7 ((uint32_t)0x00000008) /* Write protection of page 6 to 7 */ -#define OB_WRP_Pages8to9 ((uint32_t)0x00000010) /* Write protection of page 8 to 9 */ -#define OB_WRP_Pages10to11 ((uint32_t)0x00000020) /* Write protection of page 10 to 11 */ -#define OB_WRP_Pages12to13 ((uint32_t)0x00000040) /* Write protection of page 12 to 13 */ -#define OB_WRP_Pages14to15 ((uint32_t)0x00000080) /* Write protection of page 14 to 15 */ -#define OB_WRP_Pages16to17 ((uint32_t)0x00000100) /* Write protection of page 16 to 17 */ -#define OB_WRP_Pages18to19 ((uint32_t)0x00000200) /* Write protection of page 18 to 19 */ -#define OB_WRP_Pages20to21 ((uint32_t)0x00000400) /* Write protection of page 20 to 21 */ -#define OB_WRP_Pages22to23 ((uint32_t)0x00000800) /* Write protection of page 22 to 23 */ -#define OB_WRP_Pages24to25 ((uint32_t)0x00001000) /* Write protection of page 24 to 25 */ -#define OB_WRP_Pages26to27 ((uint32_t)0x00002000) /* Write protection of page 26 to 27 */ -#define OB_WRP_Pages28to29 ((uint32_t)0x00004000) /* Write protection of page 28 to 29 */ -#define OB_WRP_Pages30to31 ((uint32_t)0x00008000) /* Write protection of page 30 to 31 */ -#define OB_WRP_Pages32to33 ((uint32_t)0x00010000) /* Write protection of page 32 to 33 */ -#define OB_WRP_Pages34to35 ((uint32_t)0x00020000) /* Write protection of page 34 to 35 */ -#define OB_WRP_Pages36to37 ((uint32_t)0x00040000) /* Write protection of page 36 to 37 */ -#define OB_WRP_Pages38to39 ((uint32_t)0x00080000) /* Write protection of page 38 to 39 */ -#define OB_WRP_Pages40to41 ((uint32_t)0x00100000) /* Write protection of page 40 to 41 */ -#define OB_WRP_Pages42to43 ((uint32_t)0x00200000) /* Write protection of page 42 to 43 */ -#define OB_WRP_Pages44to45 ((uint32_t)0x00400000) /* Write protection of page 44 to 45 */ -#define OB_WRP_Pages46to47 ((uint32_t)0x00800000) /* Write protection of page 46 to 47 */ -#define OB_WRP_Pages48to49 ((uint32_t)0x01000000) /* Write protection of page 48 to 49 */ -#define OB_WRP_Pages50to51 ((uint32_t)0x02000000) /* Write protection of page 50 to 51 */ -#define OB_WRP_Pages52to53 ((uint32_t)0x04000000) /* Write protection of page 52 to 53 */ -#define OB_WRP_Pages54to55 ((uint32_t)0x08000000) /* Write protection of page 54 to 55 */ -#define OB_WRP_Pages56to57 ((uint32_t)0x10000000) /* Write protection of page 56 to 57 */ -#define OB_WRP_Pages58to59 ((uint32_t)0x20000000) /* Write protection of page 58 to 59 */ -#define OB_WRP_Pages60to61 ((uint32_t)0x40000000) /* Write protection of page 60 to 61 */ -#define OB_WRP_Pages62to63 ((uint32_t)0x80000000) /* Write protection of page 62 to 63 */ - -#define OB_WRP_AllPages ((uint32_t)0xFFFFFFFF) /*!< Write protection of all Sectors */ - -#define IS_OB_WRP(PAGE) (((PAGE) != 0x0000000)) - -#endif /* STM32F072 */ - -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_Read_Protection - * @{ - */ - -/** - * @brief FLASH_Read Protection Level - */ -#define OB_RDP_Level_0 ((uint8_t)0xAA) -#define OB_RDP_Level_1 ((uint8_t)0xBB) -/*#define OB_RDP_Level_2 ((uint8_t)0xCC)*/ /* Warning: When enabling read protection level 2 - it's no more possible to go back to level 1 or 0 */ - -#define IS_OB_RDP(LEVEL) (((LEVEL) == OB_RDP_Level_0)||\ - ((LEVEL) == OB_RDP_Level_1))/*||\ - ((LEVEL) == OB_RDP_Level_2))*/ -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_IWatchdog - * @{ - */ - -#define OB_IWDG_SW ((uint8_t)0x01) /*!< Software IWDG selected */ -#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */ -#define IS_OB_IWDG_SOURCE(SOURCE) (((SOURCE) == OB_IWDG_SW) || ((SOURCE) == OB_IWDG_HW)) - -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_nRST_STOP - * @{ - */ - -#define OB_STOP_NoRST ((uint8_t)0x02) /*!< No reset generated when entering in STOP */ -#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ -#define IS_OB_STOP_SOURCE(SOURCE) (((SOURCE) == OB_STOP_NoRST) || ((SOURCE) == OB_STOP_RST)) - -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_nRST_STDBY - * @{ - */ - -#define OB_STDBY_NoRST ((uint8_t)0x04) /*!< No reset generated when entering in STANDBY */ -#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ -#define IS_OB_STDBY_SOURCE(SOURCE) (((SOURCE) == OB_STDBY_NoRST) || ((SOURCE) == OB_STDBY_RST)) - -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_BOOT1 - * @{ - */ - -#define OB_BOOT1_RESET ((uint8_t)0x00) /*!< BOOT1 Reset */ -#define OB_BOOT1_SET ((uint8_t)0x10) /*!< BOOT1 Set */ -#define IS_OB_BOOT1(BOOT1) (((BOOT1) == OB_BOOT1_RESET) || ((BOOT1) == OB_BOOT1_SET)) - -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_BOOT0 - * @{ - */ - -#define OB_BOOT0_RESET ((uint8_t)0x00) /*!< BOOT0 Reset */ -#define OB_BOOT0_SET ((uint8_t)0x08) /*!< BOOT0 Set */ -#define IS_OB_BOOT0(BOOT0) (((BOOT0) == OB_BOOT0_RESET) || ((BOOT0) == OB_BOOT0_SET)) - -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_BOOT0SW - * @{ - */ - -#define OB_BOOT0_SW ((uint8_t)0x00) /*!< BOOT0 pin disabled */ -#define OB_BOOT0_HW ((uint8_t)0x80) /*!< BOOT0 pin bonded with GPIO */ -#define IS_OB_BOOT0SW(BOOT0) (((BOOT0) == OB_BOOT0_SW) || ((BOOT0) == OB_BOOT0_HW)) - -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_VDDA_Analog_Monitoring - * @{ - */ - -#define OB_VDDA_ANALOG_ON ((uint8_t)0x20) /*!< Analog monitoring on VDDA Power source ON */ -#define OB_VDDA_ANALOG_OFF ((uint8_t)0x00) /*!< Analog monitoring on VDDA Power source OFF */ - -#define IS_OB_VDDA_ANALOG(ANALOG) (((ANALOG) == OB_VDDA_ANALOG_ON) || ((ANALOG) == OB_VDDA_ANALOG_OFF)) - -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_SRAM_Parity_Enable - * @{ - */ - -#define OB_SRAM_PARITY_SET ((uint8_t)0x00) /*!< SRAM parity enable Set */ -#define OB_SRAM_PARITY_RESET ((uint8_t)0x40) /*!< SRAM parity enable reset */ - -#define IS_OB_SRAM_PARITY(PARITY) (((PARITY) == OB_SRAM_PARITY_SET) || ((PARITY) == OB_SRAM_PARITY_RESET)) - -/** - * @} - */ - -/** @defgroup FLASH_Flags - * @{ - */ - -#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ -#define FLASH_FLAG_PGERR FLASH_SR_PGERR /*!< FLASH Programming error flag */ -#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */ -#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Programming flag */ - -#define IS_FLASH_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFCB) == 0x00000000) && ((FLAG) != 0x00000000)) - -#define IS_FLASH_GET_FLAG(FLAG) (((FLAG) == FLASH_FLAG_BSY) || ((FLAG) == FLASH_FLAG_PGERR) || \ - ((FLAG) == FLASH_FLAG_WRPERR) || ((FLAG) == FLASH_FLAG_EOP)) -/** - * @} - */ - -/** @defgroup FLASH_Timeout_definition - * @{ - */ -#define FLASH_ER_PRG_TIMEOUT ((uint32_t)0x000B0000) - -/** - * @} - */ - -/** @defgroup FLASH_Legacy - * @{ - */ -#define FLASH_WRProt_Pages0to3 OB_WRP_Pages0to3 -#define FLASH_WRProt_Pages4to7 OB_WRP_Pages4to7 -#define FLASH_WRProt_Pages8to11 OB_WRP_Pages8to11 -#define FLASH_WRProt_Pages12to15 OB_WRP_Pages12to15 -#define FLASH_WRProt_Pages16to19 OB_WRP_Pages16to19 -#define FLASH_WRProt_Pages20to23 OB_WRP_Pages20to23 -#define FLASH_WRProt_Pages24to27 OB_WRP_Pages24to27 -#define FLASH_WRProt_Pages28to31 OB_WRP_Pages28to31 -#define FLASH_WRProt_Pages32to35 OB_WRP_Pages32to35 -#define FLASH_WRProt_Pages36to39 OB_WRP_Pages36to39 -#define FLASH_WRProt_Pages40to43 OB_WRP_Pages40to21 -#define FLASH_WRProt_Pages44to47 OB_WRP_Pages44to23 -#define FLASH_WRProt_Pages48to51 OB_WRP_Pages48to51 -#define FLASH_WRProt_Pages52to55 OB_WRP_Pages52to55 -#define FLASH_WRProt_Pages56to59 OB_WRP_Pages56to59 -#define FLASH_WRProt_Pages60to63 OB_WRP_Pages60to63 - - -#define FLASH_WRProt_AllPages OB_WRP_AllPages -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/** - * @brief FLASH memory functions that can be executed from FLASH. - */ -/* FLASH Interface configuration functions ************************************/ -void FLASH_SetLatency(uint32_t FLASH_Latency); -void FLASH_PrefetchBufferCmd(FunctionalState NewState); -FlagStatus FLASH_GetPrefetchBufferStatus(void); - -/* FLASH Memory Programming functions *****************************************/ -void FLASH_Unlock(void); -void FLASH_Lock(void); -FLASH_Status FLASH_ErasePage(uint32_t Page_Address); -FLASH_Status FLASH_EraseAllPages(void); -FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); -FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); - -/* FLASH Option Bytes Programming functions *****************************************/ -void FLASH_OB_Unlock(void); -void FLASH_OB_Lock(void); -void FLASH_OB_Launch(void); -FLASH_Status FLASH_OB_Erase(void); -FLASH_Status FLASH_OB_EnableWRP(uint32_t OB_WRP); -FLASH_Status FLASH_OB_RDPConfig(uint8_t OB_RDP); -FLASH_Status FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY); -FLASH_Status FLASH_OB_BOOTConfig(uint8_t OB_BOOT1); -FLASH_Status FLASH_OB_BOOT0Config(uint8_t OB_BOOT0); -FLASH_Status FLASH_OB_BOOT0SWConfig(uint8_t OB_BOOT0SW); -FLASH_Status FLASH_OB_VDDAConfig(uint8_t OB_VDDA_ANALOG); -FLASH_Status FLASH_OB_SRAMParityConfig(uint8_t OB_SRAM_Parity); -FLASH_Status FLASH_OB_WriteUser(uint8_t OB_USER); -FLASH_Status FLASH_OB_ProgramData(uint32_t Address, uint8_t Data); -uint8_t FLASH_OB_GetUser(void); -uint32_t FLASH_OB_GetWRP(void); -FlagStatus FLASH_OB_GetRDP(void); - -/* FLASH Interrupts and flags management functions **********************************/ -void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState); -FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG); -void FLASH_ClearFlag(uint32_t FLASH_FLAG); -FLASH_Status FLASH_GetStatus(void); -FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout); - -/** @defgroup FLASH_Legacy - * @{ - */ -#define FLASH_EraseOptionBytes FLASH_OB_Erase -#define FLASH_EnableWriteProtection FLASH_OB_EnableWRP -#define FLASH_UserOptionByteConfig FLASH_OB_UserConfig -#define FLASH_ProgramOptionByteData FLASH_OB_ProgramData -#define FLASH_GetUserOptionByte FLASH_OB_GetUser -#define FLASH_GetWriteProtectionOptionByte FLASH_OB_GetWRP - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_FLASH_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_gpio.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_gpio.h deleted file mode 100644 index b2625b6..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_gpio.h +++ /dev/null @@ -1,358 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_gpio.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the GPIO - * firmware library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_GPIO_H -#define __STM32F0XX_GPIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup GPIO - * @{ - */ -/* Exported types ------------------------------------------------------------*/ - -#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \ - ((PERIPH) == GPIOB) || \ - ((PERIPH) == GPIOC) || \ - ((PERIPH) == GPIOD) || \ - ((PERIPH) == GPIOE) || \ - ((PERIPH) == GPIOF)) - -#define IS_GPIO_LIST_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \ - ((PERIPH) == GPIOB)) - -/** @defgroup Configuration_Mode_enumeration - * @{ - */ -typedef enum -{ - GPIO_Mode_IN = 0x00, /*!< GPIO Input Mode */ - GPIO_Mode_OUT = 0x01, /*!< GPIO Output Mode */ - GPIO_Mode_AF = 0x02, /*!< GPIO Alternate function Mode */ - GPIO_Mode_AN = 0x03 /*!< GPIO Analog In/Out Mode */ -}GPIOMode_TypeDef; - -#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_IN)|| ((MODE) == GPIO_Mode_OUT) || \ - ((MODE) == GPIO_Mode_AF)|| ((MODE) == GPIO_Mode_AN)) -/** - * @} - */ - -/** @defgroup Output_type_enumeration - * @{ - */ -typedef enum -{ - GPIO_OType_PP = 0x00, - GPIO_OType_OD = 0x01 -}GPIOOType_TypeDef; - -#define IS_GPIO_OTYPE(OTYPE) (((OTYPE) == GPIO_OType_PP) || ((OTYPE) == GPIO_OType_OD)) - -/** - * @} - */ - -/** @defgroup Output_Maximum_frequency_enumeration - * @{ - */ -typedef enum -{ - GPIO_Speed_Level_1 = 0x00, /*!< I/O output speed: Low 2 MHz */ - GPIO_Speed_Level_2 = 0x01, /*!< I/O output speed: Medium 10 MHz */ - GPIO_Speed_Level_3 = 0x03 /*!< I/O output speed: High 50 MHz */ -}GPIOSpeed_TypeDef; - -#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_Level_1) || ((SPEED) == GPIO_Speed_Level_2) || \ - ((SPEED) == GPIO_Speed_Level_3)) -/** - * @} - */ - -/** @defgroup Configuration_Pull-Up_Pull-Down_enumeration - * @{ - */ -typedef enum -{ - GPIO_PuPd_NOPULL = 0x00, - GPIO_PuPd_UP = 0x01, - GPIO_PuPd_DOWN = 0x02 -}GPIOPuPd_TypeDef; - -#define IS_GPIO_PUPD(PUPD) (((PUPD) == GPIO_PuPd_NOPULL) || ((PUPD) == GPIO_PuPd_UP) || \ - ((PUPD) == GPIO_PuPd_DOWN)) -/** - * @} - */ - -/** @defgroup Bit_SET_and_Bit_RESET_enumeration - * @{ - */ -typedef enum -{ - Bit_RESET = 0, - Bit_SET -}BitAction; - -#define IS_GPIO_BIT_ACTION(ACTION) (((ACTION) == Bit_RESET) || ((ACTION) == Bit_SET)) -/** - * @} - */ - -/** - * @brief GPIO Init structure definition - */ -typedef struct -{ - uint32_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. - This parameter can be any value of @ref GPIO_pins_define */ - - GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIOMode_TypeDef */ - - GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. - This parameter can be a value of @ref GPIOSpeed_TypeDef */ - - GPIOOType_TypeDef GPIO_OType; /*!< Specifies the operating output type for the selected pins. - This parameter can be a value of @ref GPIOOType_TypeDef */ - - GPIOPuPd_TypeDef GPIO_PuPd; /*!< Specifies the operating Pull-up/Pull down for the selected pins. - This parameter can be a value of @ref GPIOPuPd_TypeDef */ -}GPIO_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup GPIO_Exported_Constants - * @{ - */ - -/** @defgroup GPIO_pins_define - * @{ - */ -#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */ -#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */ -#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */ -#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */ -#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */ -#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */ -#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */ -#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */ -#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */ -#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */ -#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */ -#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */ -#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */ -#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */ -#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */ -#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */ -#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */ - -#define IS_GPIO_PIN(PIN) ((PIN) != (uint16_t)0x00) - -#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \ - ((PIN) == GPIO_Pin_1) || \ - ((PIN) == GPIO_Pin_2) || \ - ((PIN) == GPIO_Pin_3) || \ - ((PIN) == GPIO_Pin_4) || \ - ((PIN) == GPIO_Pin_5) || \ - ((PIN) == GPIO_Pin_6) || \ - ((PIN) == GPIO_Pin_7) || \ - ((PIN) == GPIO_Pin_8) || \ - ((PIN) == GPIO_Pin_9) || \ - ((PIN) == GPIO_Pin_10) || \ - ((PIN) == GPIO_Pin_11) || \ - ((PIN) == GPIO_Pin_12) || \ - ((PIN) == GPIO_Pin_13) || \ - ((PIN) == GPIO_Pin_14) || \ - ((PIN) == GPIO_Pin_15)) - -/** - * @} - */ - -/** @defgroup GPIO_Pin_sources - * @{ - */ -#define GPIO_PinSource0 ((uint8_t)0x00) -#define GPIO_PinSource1 ((uint8_t)0x01) -#define GPIO_PinSource2 ((uint8_t)0x02) -#define GPIO_PinSource3 ((uint8_t)0x03) -#define GPIO_PinSource4 ((uint8_t)0x04) -#define GPIO_PinSource5 ((uint8_t)0x05) -#define GPIO_PinSource6 ((uint8_t)0x06) -#define GPIO_PinSource7 ((uint8_t)0x07) -#define GPIO_PinSource8 ((uint8_t)0x08) -#define GPIO_PinSource9 ((uint8_t)0x09) -#define GPIO_PinSource10 ((uint8_t)0x0A) -#define GPIO_PinSource11 ((uint8_t)0x0B) -#define GPIO_PinSource12 ((uint8_t)0x0C) -#define GPIO_PinSource13 ((uint8_t)0x0D) -#define GPIO_PinSource14 ((uint8_t)0x0E) -#define GPIO_PinSource15 ((uint8_t)0x0F) - -#define IS_GPIO_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == GPIO_PinSource0) || \ - ((PINSOURCE) == GPIO_PinSource1) || \ - ((PINSOURCE) == GPIO_PinSource2) || \ - ((PINSOURCE) == GPIO_PinSource3) || \ - ((PINSOURCE) == GPIO_PinSource4) || \ - ((PINSOURCE) == GPIO_PinSource5) || \ - ((PINSOURCE) == GPIO_PinSource6) || \ - ((PINSOURCE) == GPIO_PinSource7) || \ - ((PINSOURCE) == GPIO_PinSource8) || \ - ((PINSOURCE) == GPIO_PinSource9) || \ - ((PINSOURCE) == GPIO_PinSource10) || \ - ((PINSOURCE) == GPIO_PinSource11) || \ - ((PINSOURCE) == GPIO_PinSource12) || \ - ((PINSOURCE) == GPIO_PinSource13) || \ - ((PINSOURCE) == GPIO_PinSource14) || \ - ((PINSOURCE) == GPIO_PinSource15)) -/** - * @} - */ - -/** @defgroup GPIO_Alternate_function_selection_define - * @{ - */ - -/** - * @brief AF 0 selection - */ -#define GPIO_AF_0 ((uint8_t)0x00) /* WKUP, EVENTOUT, TIM15, SPI1, TIM17, - MCO, SWDAT, SWCLK, TIM14, BOOT, - USART1, CEC, IR_OUT, SPI2, TS, TIM3, - USART4, CAN, TIM3, USART2, USART3, - CRS, TIM16, TIM1 */ -/** - * @brief AF 1 selection - */ -#define GPIO_AF_1 ((uint8_t)0x01) /* USART2, CEC, TIM3, USART1, IR, - EVENTOUT, I2C1, I2C2, TIM15, SPI2, - USART3, TS, SPI1 */ -/** - * @brief AF 2 selection - */ -#define GPIO_AF_2 ((uint8_t)0x02) /* TIM2, TIM1, EVENTOUT, TIM16, TIM17, - USB */ -/** - * @brief AF 3 selection - */ -#define GPIO_AF_3 ((uint8_t)0x03) /* TS, I2C1, TIM15, EVENTOUT */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF_4 ((uint8_t)0x04) /* TIM14, USART4, USART3, CRS, CAN, - I2C1 */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF_5 ((uint8_t)0x05) /* TIM16, TIM17, TIM15, SPI2, I2C2, - MCO, I2C1, USB */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF_6 ((uint8_t)0x06) /* EVENTOUT */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF_7 ((uint8_t)0x07) /* COMP1 OUT and COMP2 OUT */ - -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF_0) || ((AF) == GPIO_AF_1) || \ - ((AF) == GPIO_AF_2) || ((AF) == GPIO_AF_3) || \ - ((AF) == GPIO_AF_4) || ((AF) == GPIO_AF_5) || \ - ((AF) == GPIO_AF_6) || ((AF) == GPIO_AF_7)) - -/** - * @} - */ - -/** @defgroup GPIO_Speed_Legacy - * @{ - */ - -#define GPIO_Speed_2MHz GPIO_Speed_Level_1 /*!< I/O output speed: Low 2 MHz */ -#define GPIO_Speed_10MHz GPIO_Speed_Level_2 /*!< I/O output speed: Medium 10 MHz */ -#define GPIO_Speed_50MHz GPIO_Speed_Level_3 /*!< I/O output speed: High 50 MHz */ - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -/* Function used to set the GPIO configuration to the default reset state *****/ -void GPIO_DeInit(GPIO_TypeDef* GPIOx); - -/* Initialization and Configuration functions *********************************/ -void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); -void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); -void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); - -/* GPIO Read and Write functions **********************************************/ -uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); -uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); -void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); -void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); - -/* GPIO Alternate functions configuration functions ***************************/ -void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_GPIO_H */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_i2c.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_i2c.h deleted file mode 100644 index 1c56b9c..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_i2c.h +++ /dev/null @@ -1,478 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_i2c.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the I2C firmware - * library - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_I2C_H -#define __STM32F0XX_I2C_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup I2C - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief I2C Init structure definition - */ - -typedef struct -{ - uint32_t I2C_Timing; /*!< Specifies the I2C_TIMINGR_register value. - This parameter must be set by referring to I2C_Timing_Config_Tool*/ - - uint32_t I2C_AnalogFilter; /*!< Enables or disables analog noise filter. - This parameter can be a value of @ref I2C_Analog_Filter*/ - - uint32_t I2C_DigitalFilter; /*!< Configures the digital noise filter. - This parameter can be a number between 0x00 and 0x0F*/ - - uint32_t I2C_Mode; /*!< Specifies the I2C mode. - This parameter can be a value of @ref I2C_mode*/ - - uint32_t I2C_OwnAddress1; /*!< Specifies the device own address 1. - This parameter can be a 7-bit or 10-bit address*/ - - uint32_t I2C_Ack; /*!< Enables or disables the acknowledgement. - This parameter can be a value of @ref I2C_acknowledgement*/ - - uint32_t I2C_AcknowledgedAddress; /*!< Specifies if 7-bit or 10-bit address is acknowledged. - This parameter can be a value of @ref I2C_acknowledged_address*/ -}I2C_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - - -/** @defgroup I2C_Exported_Constants - * @{ - */ - -#define IS_I2C_ALL_PERIPH(PERIPH) (((PERIPH) == I2C1) || \ - ((PERIPH) == I2C2)) - -#define IS_I2C_1_PERIPH(PERIPH) ((PERIPH) == I2C1) - -/** @defgroup I2C_Analog_Filter - * @{ - */ - -#define I2C_AnalogFilter_Enable ((uint32_t)0x00000000) -#define I2C_AnalogFilter_Disable I2C_CR1_ANFOFF - -#define IS_I2C_ANALOG_FILTER(FILTER) (((FILTER) == I2C_AnalogFilter_Enable) || \ - ((FILTER) == I2C_AnalogFilter_Disable)) -/** - * @} - */ - -/** @defgroup I2C_Digital_Filter - * @{ - */ - -#define IS_I2C_DIGITAL_FILTER(FILTER) ((FILTER) <= 0x0000000F) -/** - * @} - */ - -/** @defgroup I2C_mode - * @{ - */ - -#define I2C_Mode_I2C ((uint32_t)0x00000000) -#define I2C_Mode_SMBusDevice I2C_CR1_SMBDEN -#define I2C_Mode_SMBusHost I2C_CR1_SMBHEN - -#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \ - ((MODE) == I2C_Mode_SMBusDevice) || \ - ((MODE) == I2C_Mode_SMBusHost)) -/** - * @} - */ - -/** @defgroup I2C_acknowledgement - * @{ - */ - -#define I2C_Ack_Enable ((uint32_t)0x00000000) -#define I2C_Ack_Disable I2C_CR2_NACK - -#define IS_I2C_ACK(ACK) (((ACK) == I2C_Ack_Enable) || \ - ((ACK) == I2C_Ack_Disable)) -/** - * @} - */ - -/** @defgroup I2C_acknowledged_address - * @{ - */ - -#define I2C_AcknowledgedAddress_7bit ((uint32_t)0x00000000) -#define I2C_AcknowledgedAddress_10bit I2C_OAR1_OA1MODE - -#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \ - ((ADDRESS) == I2C_AcknowledgedAddress_10bit)) -/** - * @} - */ - -/** @defgroup I2C_own_address1 - * @{ - */ - -#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= (uint32_t)0x000003FF) -/** - * @} - */ - -/** @defgroup I2C_transfer_direction - * @{ - */ - -#define I2C_Direction_Transmitter ((uint16_t)0x0000) -#define I2C_Direction_Receiver ((uint16_t)0x0400) - -#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \ - ((DIRECTION) == I2C_Direction_Receiver)) -/** - * @} - */ - -/** @defgroup I2C_DMA_transfer_requests - * @{ - */ - -#define I2C_DMAReq_Tx I2C_CR1_TXDMAEN -#define I2C_DMAReq_Rx I2C_CR1_RXDMAEN - -#define IS_I2C_DMA_REQ(REQ) ((((REQ) & (uint32_t)0xFFFF3FFF) == 0x00) && ((REQ) != 0x00)) -/** - * @} - */ - -/** @defgroup I2C_slave_address - * @{ - */ - -#define IS_I2C_SLAVE_ADDRESS(ADDRESS) ((ADDRESS) <= (uint16_t)0x03FF) -/** - * @} - */ - - -/** @defgroup I2C_own_address2 - * @{ - */ - -#define IS_I2C_OWN_ADDRESS2(ADDRESS2) ((ADDRESS2) <= (uint16_t)0x00FF) - -/** - * @} - */ - -/** @defgroup I2C_own_address2_mask - * @{ - */ - -#define I2C_OA2_NoMask ((uint8_t)0x00) -#define I2C_OA2_Mask01 ((uint8_t)0x01) -#define I2C_OA2_Mask02 ((uint8_t)0x02) -#define I2C_OA2_Mask03 ((uint8_t)0x03) -#define I2C_OA2_Mask04 ((uint8_t)0x04) -#define I2C_OA2_Mask05 ((uint8_t)0x05) -#define I2C_OA2_Mask06 ((uint8_t)0x06) -#define I2C_OA2_Mask07 ((uint8_t)0x07) - -#define IS_I2C_OWN_ADDRESS2_MASK(MASK) (((MASK) == I2C_OA2_NoMask) || \ - ((MASK) == I2C_OA2_Mask01) || \ - ((MASK) == I2C_OA2_Mask02) || \ - ((MASK) == I2C_OA2_Mask03) || \ - ((MASK) == I2C_OA2_Mask04) || \ - ((MASK) == I2C_OA2_Mask05) || \ - ((MASK) == I2C_OA2_Mask06) || \ - ((MASK) == I2C_OA2_Mask07)) - -/** - * @} - */ - -/** @defgroup I2C_timeout - * @{ - */ - -#define IS_I2C_TIMEOUT(TIMEOUT) ((TIMEOUT) <= (uint16_t)0x0FFF) - -/** - * @} - */ - -/** @defgroup I2C_registers - * @{ - */ - -#define I2C_Register_CR1 ((uint8_t)0x00) -#define I2C_Register_CR2 ((uint8_t)0x04) -#define I2C_Register_OAR1 ((uint8_t)0x08) -#define I2C_Register_OAR2 ((uint8_t)0x0C) -#define I2C_Register_TIMINGR ((uint8_t)0x10) -#define I2C_Register_TIMEOUTR ((uint8_t)0x14) -#define I2C_Register_ISR ((uint8_t)0x18) -#define I2C_Register_ICR ((uint8_t)0x1C) -#define I2C_Register_PECR ((uint8_t)0x20) -#define I2C_Register_RXDR ((uint8_t)0x24) -#define I2C_Register_TXDR ((uint8_t)0x28) - -#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \ - ((REGISTER) == I2C_Register_CR2) || \ - ((REGISTER) == I2C_Register_OAR1) || \ - ((REGISTER) == I2C_Register_OAR2) || \ - ((REGISTER) == I2C_Register_TIMINGR) || \ - ((REGISTER) == I2C_Register_TIMEOUTR) || \ - ((REGISTER) == I2C_Register_ISR) || \ - ((REGISTER) == I2C_Register_ICR) || \ - ((REGISTER) == I2C_Register_PECR) || \ - ((REGISTER) == I2C_Register_RXDR) || \ - ((REGISTER) == I2C_Register_TXDR)) -/** - * @} - */ - -/** @defgroup I2C_interrupts_definition - * @{ - */ - -#define I2C_IT_ERRI I2C_CR1_ERRIE -#define I2C_IT_TCI I2C_CR1_TCIE -#define I2C_IT_STOPI I2C_CR1_STOPIE -#define I2C_IT_NACKI I2C_CR1_NACKIE -#define I2C_IT_ADDRI I2C_CR1_ADDRIE -#define I2C_IT_RXI I2C_CR1_RXIE -#define I2C_IT_TXI I2C_CR1_TXIE - -#define IS_I2C_CONFIG_IT(IT) ((((IT) & (uint32_t)0xFFFFFF01) == 0x00) && ((IT) != 0x00)) - -/** - * @} - */ - -/** @defgroup I2C_flags_definition - * @{ - */ - -#define I2C_FLAG_TXE I2C_ISR_TXE -#define I2C_FLAG_TXIS I2C_ISR_TXIS -#define I2C_FLAG_RXNE I2C_ISR_RXNE -#define I2C_FLAG_ADDR I2C_ISR_ADDR -#define I2C_FLAG_NACKF I2C_ISR_NACKF -#define I2C_FLAG_STOPF I2C_ISR_STOPF -#define I2C_FLAG_TC I2C_ISR_TC -#define I2C_FLAG_TCR I2C_ISR_TCR -#define I2C_FLAG_BERR I2C_ISR_BERR -#define I2C_FLAG_ARLO I2C_ISR_ARLO -#define I2C_FLAG_OVR I2C_ISR_OVR -#define I2C_FLAG_PECERR I2C_ISR_PECERR -#define I2C_FLAG_TIMEOUT I2C_ISR_TIMEOUT -#define I2C_FLAG_ALERT I2C_ISR_ALERT -#define I2C_FLAG_BUSY I2C_ISR_BUSY - -#define IS_I2C_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFF4000) == 0x00) && ((FLAG) != 0x00)) - -#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_TXIS) || \ - ((FLAG) == I2C_FLAG_RXNE) || ((FLAG) == I2C_FLAG_ADDR) || \ - ((FLAG) == I2C_FLAG_NACKF) || ((FLAG) == I2C_FLAG_STOPF) || \ - ((FLAG) == I2C_FLAG_TC) || ((FLAG) == I2C_FLAG_TCR) || \ - ((FLAG) == I2C_FLAG_BERR) || ((FLAG) == I2C_FLAG_ARLO) || \ - ((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_PECERR) || \ - ((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_ALERT) || \ - ((FLAG) == I2C_FLAG_BUSY)) - -/** - * @} - */ - - -/** @defgroup I2C_interrupts_definition - * @{ - */ - -#define I2C_IT_TXIS I2C_ISR_TXIS -#define I2C_IT_RXNE I2C_ISR_RXNE -#define I2C_IT_ADDR I2C_ISR_ADDR -#define I2C_IT_NACKF I2C_ISR_NACKF -#define I2C_IT_STOPF I2C_ISR_STOPF -#define I2C_IT_TC I2C_ISR_TC -#define I2C_IT_TCR I2C_ISR_TCR -#define I2C_IT_BERR I2C_ISR_BERR -#define I2C_IT_ARLO I2C_ISR_ARLO -#define I2C_IT_OVR I2C_ISR_OVR -#define I2C_IT_PECERR I2C_ISR_PECERR -#define I2C_IT_TIMEOUT I2C_ISR_TIMEOUT -#define I2C_IT_ALERT I2C_ISR_ALERT - -#define IS_I2C_CLEAR_IT(IT) ((((IT) & (uint32_t)0xFFFFC001) == 0x00) && ((IT) != 0x00)) - -#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_TXIS) || ((IT) == I2C_IT_RXNE) || \ - ((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_NACKF) || \ - ((IT) == I2C_IT_STOPF) || ((IT) == I2C_IT_TC) || \ - ((IT) == I2C_IT_TCR) || ((IT) == I2C_IT_BERR) || \ - ((IT) == I2C_IT_ARLO) || ((IT) == I2C_IT_OVR) || \ - ((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_TIMEOUT) || \ - ((IT) == I2C_IT_ALERT)) - - -/** - * @} - */ - -/** @defgroup I2C_ReloadEndMode_definition - * @{ - */ - -#define I2C_Reload_Mode I2C_CR2_RELOAD -#define I2C_AutoEnd_Mode I2C_CR2_AUTOEND -#define I2C_SoftEnd_Mode ((uint32_t)0x00000000) - - -#define IS_RELOAD_END_MODE(MODE) (((MODE) == I2C_Reload_Mode) || \ - ((MODE) == I2C_AutoEnd_Mode) || \ - ((MODE) == I2C_SoftEnd_Mode)) - - -/** - * @} - */ - -/** @defgroup I2C_StartStopMode_definition - * @{ - */ - -#define I2C_No_StartStop ((uint32_t)0x00000000) -#define I2C_Generate_Stop I2C_CR2_STOP -#define I2C_Generate_Start_Read (uint32_t)(I2C_CR2_START | I2C_CR2_RD_WRN) -#define I2C_Generate_Start_Write I2C_CR2_START - - -#define IS_START_STOP_MODE(MODE) (((MODE) == I2C_Generate_Stop) || \ - ((MODE) == I2C_Generate_Start_Read) || \ - ((MODE) == I2C_Generate_Start_Write) || \ - ((MODE) == I2C_No_StartStop)) - - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - - -/* Initialization and Configuration functions *********************************/ -void I2C_DeInit(I2C_TypeDef* I2Cx); -void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct); -void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct); -void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx); -void I2C_ITConfig(I2C_TypeDef* I2Cx, uint32_t I2C_IT, FunctionalState NewState); -void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_StopModeCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); /*!< not applicable for STM32F030 devices */ -void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint16_t Address, uint8_t Mask); -void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_SlaveByteControlCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_SlaveAddressConfig(I2C_TypeDef* I2Cx, uint16_t Address); -void I2C_10BitAddressingModeCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); - -/* Communications handling functions ******************************************/ -void I2C_AutoEndCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_ReloadCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_NumberOfBytesConfig(I2C_TypeDef* I2Cx, uint8_t Number_Bytes); -void I2C_MasterRequestConfig(I2C_TypeDef* I2Cx, uint16_t I2C_Direction); -void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_10BitAddressHeaderCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState); -uint8_t I2C_GetAddressMatched(I2C_TypeDef* I2Cx); -uint16_t I2C_GetTransferDirection(I2C_TypeDef* I2Cx); -void I2C_TransferHandling(I2C_TypeDef* I2Cx, uint16_t Address, uint8_t Number_Bytes, uint32_t ReloadEndMode, uint32_t StartStopMode); - -/* SMBUS management functions ************************************************/ -void I2C_SMBusAlertCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_ClockTimeoutCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_ExtendedClockTimeoutCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_IdleClockTimeoutCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_TimeoutAConfig(I2C_TypeDef* I2Cx, uint16_t Timeout); -void I2C_TimeoutBConfig(I2C_TypeDef* I2Cx, uint16_t Timeout); -void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_PECRequestCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx); - -/* I2C registers management functions *****************************************/ -uint32_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register); - -/* Data transfers management functions ****************************************/ -void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data); -uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx); - -/* DMA transfers management functions *****************************************/ -void I2C_DMACmd(I2C_TypeDef* I2Cx, uint32_t I2C_DMAReq, FunctionalState NewState); - -/* Interrupts and flags management functions **********************************/ -FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); -void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); -ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT); -void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT); - - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F0XX_I2C_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_iwdg.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_iwdg.h deleted file mode 100644 index 4ad0f38..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_iwdg.h +++ /dev/null @@ -1,140 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_iwdg.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the IWDG - * firmware library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_IWDG_H -#define __STM32F0XX_IWDG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup IWDG - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup IWDG_Exported_Constants - * @{ - */ - -/** @defgroup IWDG_WriteAccess - * @{ - */ - -#define IWDG_WriteAccess_Enable ((uint16_t)0x5555) -#define IWDG_WriteAccess_Disable ((uint16_t)0x0000) -#define IS_IWDG_WRITE_ACCESS(ACCESS) (((ACCESS) == IWDG_WriteAccess_Enable) || \ - ((ACCESS) == IWDG_WriteAccess_Disable)) -/** - * @} - */ - -/** @defgroup IWDG_prescaler - * @{ - */ - -#define IWDG_Prescaler_4 ((uint8_t)0x00) -#define IWDG_Prescaler_8 ((uint8_t)0x01) -#define IWDG_Prescaler_16 ((uint8_t)0x02) -#define IWDG_Prescaler_32 ((uint8_t)0x03) -#define IWDG_Prescaler_64 ((uint8_t)0x04) -#define IWDG_Prescaler_128 ((uint8_t)0x05) -#define IWDG_Prescaler_256 ((uint8_t)0x06) -#define IS_IWDG_PRESCALER(PRESCALER) (((PRESCALER) == IWDG_Prescaler_4) || \ - ((PRESCALER) == IWDG_Prescaler_8) || \ - ((PRESCALER) == IWDG_Prescaler_16) || \ - ((PRESCALER) == IWDG_Prescaler_32) || \ - ((PRESCALER) == IWDG_Prescaler_64) || \ - ((PRESCALER) == IWDG_Prescaler_128)|| \ - ((PRESCALER) == IWDG_Prescaler_256)) -/** - * @} - */ - -/** @defgroup IWDG_Flag - * @{ - */ - -#define IWDG_FLAG_PVU IWDG_SR_PVU -#define IWDG_FLAG_RVU IWDG_SR_RVU -#define IWDG_FLAG_WVU IWDG_SR_WVU -#define IS_IWDG_FLAG(FLAG) (((FLAG) == IWDG_FLAG_PVU) || ((FLAG) == IWDG_FLAG_RVU) || \ - ((FLAG) == IWDG_FLAG_WVU)) - -#define IS_IWDG_RELOAD(RELOAD) ((RELOAD) <= 0xFFF) - -#define IS_IWDG_WINDOW_VALUE(VALUE) ((VALUE) <= 0xFFF) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Prescaler and Counter configuration functions ******************************/ -void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess); -void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); -void IWDG_SetReload(uint16_t Reload); -void IWDG_ReloadCounter(void); -void IWDG_SetWindowValue(uint16_t WindowValue); - -/* IWDG activation function ***************************************************/ -void IWDG_Enable(void); - -/* Flag management function ***************************************************/ -FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_IWDG_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_misc.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_misc.h deleted file mode 100644 index f5ea6bd..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_misc.h +++ /dev/null @@ -1,143 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_misc.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the miscellaneous - * firmware library functions (add-on to CMSIS functions). - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_MISC_H -#define __STM32F0XX_MISC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup MISC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief NVIC Init Structure definition - */ - -typedef struct -{ - uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled. - This parameter can be a value of @ref IRQn_Type - (For the complete STM32 Devices IRQ Channels list, - please refer to stm32f0xx.h file) */ - - uint8_t NVIC_IRQChannelPriority; /*!< Specifies the priority level for the IRQ channel specified - in NVIC_IRQChannel. This parameter can be a value - between 0 and 3. */ - - FunctionalState NVIC_IRQChannelCmd; /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel - will be enabled or disabled. - This parameter can be set either to ENABLE or DISABLE */ -} NVIC_InitTypeDef; - -/** - * -@verbatim - -@endverbatim -*/ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup MISC_Exported_Constants - * @{ - */ - -/** @defgroup MISC_System_Low_Power - * @{ - */ - -#define NVIC_LP_SEVONPEND ((uint8_t)0x10) -#define NVIC_LP_SLEEPDEEP ((uint8_t)0x04) -#define NVIC_LP_SLEEPONEXIT ((uint8_t)0x02) -#define IS_NVIC_LP(LP) (((LP) == NVIC_LP_SEVONPEND) || \ - ((LP) == NVIC_LP_SLEEPDEEP) || \ - ((LP) == NVIC_LP_SLEEPONEXIT)) -/** - * @} - */ - -/** @defgroup MISC_Preemption_Priority_Group - * @{ - */ -#define IS_NVIC_PRIORITY(PRIORITY) ((PRIORITY) < 0x04) - -/** - * @} - */ - -/** @defgroup MISC_SysTick_clock_source - * @{ - */ - -#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB) -#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004) -#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \ - ((SOURCE) == SysTick_CLKSource_HCLK_Div8)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); -void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState); -void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_MISC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_pwr.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_pwr.h deleted file mode 100644 index 491368c..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_pwr.h +++ /dev/null @@ -1,197 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_pwr.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the PWR firmware - * library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_PWR_H -#define __STM32F0XX_PWR_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup PWR - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Constants - * @{ - */ - -/** @defgroup PWR_PVD_detection_level - * @brief This parameters are only applicable for STM32F051 and STM32F072 devices - * @{ - */ - -#define PWR_PVDLevel_0 PWR_CR_PLS_LEV0 -#define PWR_PVDLevel_1 PWR_CR_PLS_LEV1 -#define PWR_PVDLevel_2 PWR_CR_PLS_LEV2 -#define PWR_PVDLevel_3 PWR_CR_PLS_LEV3 -#define PWR_PVDLevel_4 PWR_CR_PLS_LEV4 -#define PWR_PVDLevel_5 PWR_CR_PLS_LEV5 -#define PWR_PVDLevel_6 PWR_CR_PLS_LEV6 -#define PWR_PVDLevel_7 PWR_CR_PLS_LEV7 - -#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLevel_0) || ((LEVEL) == PWR_PVDLevel_1)|| \ - ((LEVEL) == PWR_PVDLevel_2) || ((LEVEL) == PWR_PVDLevel_3)|| \ - ((LEVEL) == PWR_PVDLevel_4) || ((LEVEL) == PWR_PVDLevel_5)|| \ - ((LEVEL) == PWR_PVDLevel_6) || ((LEVEL) == PWR_PVDLevel_7)) -/** - * @} - */ - -/** @defgroup PWR_WakeUp_Pins - * @{ - */ - -#define PWR_WakeUpPin_1 PWR_CSR_EWUP1 -#define PWR_WakeUpPin_2 PWR_CSR_EWUP2 -#define PWR_WakeUpPin_3 PWR_CSR_EWUP3 /*!< only applicable for STM32F072 devices */ -#define PWR_WakeUpPin_4 PWR_CSR_EWUP4 /*!< only applicable for STM32F072 devices */ -#define PWR_WakeUpPin_5 PWR_CSR_EWUP5 /*!< only applicable for STM32F072 devices */ -#define PWR_WakeUpPin_6 PWR_CSR_EWUP6 /*!< only applicable for STM32F072 devices */ -#define PWR_WakeUpPin_7 PWR_CSR_EWUP7 /*!< only applicable for STM32F072 devices */ -#define PWR_WakeUpPin_8 PWR_CSR_EWUP8 /*!< only applicable for STM32F072 devices */ -#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WakeUpPin_1) || ((PIN) == PWR_WakeUpPin_2) || \ - ((PIN) == PWR_WakeUpPin_3) || ((PIN) == PWR_WakeUpPin_4) || \ - ((PIN) == PWR_WakeUpPin_5) || ((PIN) == PWR_WakeUpPin_6) || \ - ((PIN) == PWR_WakeUpPin_7) || ((PIN) == PWR_WakeUpPin_8)) -/** - * @} - */ - - -/** @defgroup PWR_Regulator_state_is_Sleep_STOP_mode - * @{ - */ - -#define PWR_Regulator_ON ((uint32_t)0x00000000) -#define PWR_Regulator_LowPower PWR_CR_LPSDSR -#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_Regulator_ON) || \ - ((REGULATOR) == PWR_Regulator_LowPower)) -/** - * @} - */ - -/** @defgroup PWR_SLEEP_mode_entry - * @{ - */ - -#define PWR_SLEEPEntry_WFI ((uint8_t)0x01) -#define PWR_SLEEPEntry_WFE ((uint8_t)0x02) -#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPEntry_WFI) || ((ENTRY) == PWR_SLEEPEntry_WFE)) - -/** - * @} - */ - -/** @defgroup PWR_STOP_mode_entry - * @{ - */ - -#define PWR_STOPEntry_WFI ((uint8_t)0x01) -#define PWR_STOPEntry_WFE ((uint8_t)0x02) -#define PWR_STOPEntry_SLEEPONEXIT ((uint8_t)0x03) -#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPEntry_WFI) || ((ENTRY) == PWR_STOPEntry_WFE) ||\ - ((ENTRY) == PWR_STOPEntry_SLEEPONEXIT)) - -/** - * @} - */ - -/** @defgroup PWR_Flag - * @{ - */ - -#define PWR_FLAG_WU PWR_CSR_WUF -#define PWR_FLAG_SB PWR_CSR_SBF -#define PWR_FLAG_PVDO PWR_CSR_PVDO /*!< Not applicable for STM32F030 devices */ -#define PWR_FLAG_VREFINTRDY PWR_CSR_VREFINTRDYF - -#define IS_PWR_GET_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB) || \ - ((FLAG) == PWR_FLAG_PVDO) || ((FLAG) == PWR_FLAG_VREFINTRDY)) - -#define IS_PWR_CLEAR_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Function used to set the PWR configuration to the default reset state ******/ -void PWR_DeInit(void); - -/* Backup Domain Access function **********************************************/ -void PWR_BackupAccessCmd(FunctionalState NewState); - -/* PVD configuration functions ************************************************/ -void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel); /*!< only applicable for STM32F051 and STM32F072 devices */ -void PWR_PVDCmd(FunctionalState NewState); /*!< only applicable for STM32F051 and STM32F072 devices */ - -/* WakeUp pins configuration functions ****************************************/ -void PWR_WakeUpPinCmd(uint32_t PWR_WakeUpPin, FunctionalState NewState); - -/* Low Power modes configuration functions ************************************/ -void PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry); -void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); -void PWR_EnterSTANDBYMode(void); - -/* Flags management functions *************************************************/ -FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); -void PWR_ClearFlag(uint32_t PWR_FLAG); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_PWR_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_rcc.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_rcc.h deleted file mode 100644 index cd0899c..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_rcc.h +++ /dev/null @@ -1,608 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_rcc.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the RCC - * firmware library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_RCC_H -#define __STM32F0XX_RCC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup RCC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -typedef struct -{ - uint32_t SYSCLK_Frequency; - uint32_t HCLK_Frequency; - uint32_t PCLK_Frequency; - uint32_t ADCCLK_Frequency; - uint32_t CECCLK_Frequency; - uint32_t I2C1CLK_Frequency; - uint32_t USART1CLK_Frequency; - uint32_t USART2CLK_Frequency; /*!< Only applicable for STM32F072 devices */ - uint32_t USBCLK_Frequency; /*!< Only applicable for STM32F072 devices */ -}RCC_ClocksTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup RCC_Exported_Constants - * @{ - */ - -/** @defgroup RCC_HSE_configuration - * @{ - */ - -#define RCC_HSE_OFF ((uint8_t)0x00) -#define RCC_HSE_ON ((uint8_t)0x01) -#define RCC_HSE_Bypass ((uint8_t)0x05) -#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ - ((HSE) == RCC_HSE_Bypass)) - -/** - * @} - */ - -/** @defgroup RCC_PLL_Clock_Source - * @{ - */ - -#define RCC_PLLSource_HSI_Div2 RCC_CFGR_PLLSRC_HSI_Div2 -#define RCC_PLLSource_PREDIV1 RCC_CFGR_PLLSRC_HSE_PREDIV /* Old HSEPREDIV1 bit definition, maintained for legacy purpose */ -#define RCC_PLLSource_HSE RCC_CFGR_PLLSRC_HSE_PREDIV /*!< Only applicable for STM32F072 devices */ -#define RCC_PLLSource_HSI48 RCC_CFGR_PLLSRC_HSI48_PREDIV /*!< Only applicable for STM32F072 devices */ -#define RCC_PLLSource_HSI RCC_CFGR_PLLSRC_HSI_PREDIV /*!< Only applicable for STM32F072 devices */ - -#define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI_Div2) || \ - ((SOURCE) == RCC_PLLSource_HSI48) || \ - ((SOURCE) == RCC_PLLSource_HSI) || \ - ((SOURCE) == RCC_PLLSource_HSE) || \ - ((SOURCE) == RCC_PLLSource_PREDIV1)) -/** - * @} - */ - -/** @defgroup RCC_PLL_Multiplication_Factor - * @{ - */ - -#define RCC_PLLMul_2 RCC_CFGR_PLLMULL2 -#define RCC_PLLMul_3 RCC_CFGR_PLLMULL3 -#define RCC_PLLMul_4 RCC_CFGR_PLLMULL4 -#define RCC_PLLMul_5 RCC_CFGR_PLLMULL5 -#define RCC_PLLMul_6 RCC_CFGR_PLLMULL6 -#define RCC_PLLMul_7 RCC_CFGR_PLLMULL7 -#define RCC_PLLMul_8 RCC_CFGR_PLLMULL8 -#define RCC_PLLMul_9 RCC_CFGR_PLLMULL9 -#define RCC_PLLMul_10 RCC_CFGR_PLLMULL10 -#define RCC_PLLMul_11 RCC_CFGR_PLLMULL11 -#define RCC_PLLMul_12 RCC_CFGR_PLLMULL12 -#define RCC_PLLMul_13 RCC_CFGR_PLLMULL13 -#define RCC_PLLMul_14 RCC_CFGR_PLLMULL14 -#define RCC_PLLMul_15 RCC_CFGR_PLLMULL15 -#define RCC_PLLMul_16 RCC_CFGR_PLLMULL16 -#define IS_RCC_PLL_MUL(MUL) (((MUL) == RCC_PLLMul_2) || ((MUL) == RCC_PLLMul_3) || \ - ((MUL) == RCC_PLLMul_4) || ((MUL) == RCC_PLLMul_5) || \ - ((MUL) == RCC_PLLMul_6) || ((MUL) == RCC_PLLMul_7) || \ - ((MUL) == RCC_PLLMul_8) || ((MUL) == RCC_PLLMul_9) || \ - ((MUL) == RCC_PLLMul_10) || ((MUL) == RCC_PLLMul_11) || \ - ((MUL) == RCC_PLLMul_12) || ((MUL) == RCC_PLLMul_13) || \ - ((MUL) == RCC_PLLMul_14) || ((MUL) == RCC_PLLMul_15) || \ - ((MUL) == RCC_PLLMul_16)) -/** - * @} - */ - -/** @defgroup RCC_PREDIV1_division_factor - * @{ - */ -#define RCC_PREDIV1_Div1 RCC_CFGR2_PREDIV1_DIV1 -#define RCC_PREDIV1_Div2 RCC_CFGR2_PREDIV1_DIV2 -#define RCC_PREDIV1_Div3 RCC_CFGR2_PREDIV1_DIV3 -#define RCC_PREDIV1_Div4 RCC_CFGR2_PREDIV1_DIV4 -#define RCC_PREDIV1_Div5 RCC_CFGR2_PREDIV1_DIV5 -#define RCC_PREDIV1_Div6 RCC_CFGR2_PREDIV1_DIV6 -#define RCC_PREDIV1_Div7 RCC_CFGR2_PREDIV1_DIV7 -#define RCC_PREDIV1_Div8 RCC_CFGR2_PREDIV1_DIV8 -#define RCC_PREDIV1_Div9 RCC_CFGR2_PREDIV1_DIV9 -#define RCC_PREDIV1_Div10 RCC_CFGR2_PREDIV1_DIV10 -#define RCC_PREDIV1_Div11 RCC_CFGR2_PREDIV1_DIV11 -#define RCC_PREDIV1_Div12 RCC_CFGR2_PREDIV1_DIV12 -#define RCC_PREDIV1_Div13 RCC_CFGR2_PREDIV1_DIV13 -#define RCC_PREDIV1_Div14 RCC_CFGR2_PREDIV1_DIV14 -#define RCC_PREDIV1_Div15 RCC_CFGR2_PREDIV1_DIV15 -#define RCC_PREDIV1_Div16 RCC_CFGR2_PREDIV1_DIV16 - -#define IS_RCC_PREDIV1(PREDIV1) (((PREDIV1) == RCC_PREDIV1_Div1) || ((PREDIV1) == RCC_PREDIV1_Div2) || \ - ((PREDIV1) == RCC_PREDIV1_Div3) || ((PREDIV1) == RCC_PREDIV1_Div4) || \ - ((PREDIV1) == RCC_PREDIV1_Div5) || ((PREDIV1) == RCC_PREDIV1_Div6) || \ - ((PREDIV1) == RCC_PREDIV1_Div7) || ((PREDIV1) == RCC_PREDIV1_Div8) || \ - ((PREDIV1) == RCC_PREDIV1_Div9) || ((PREDIV1) == RCC_PREDIV1_Div10) || \ - ((PREDIV1) == RCC_PREDIV1_Div11) || ((PREDIV1) == RCC_PREDIV1_Div12) || \ - ((PREDIV1) == RCC_PREDIV1_Div13) || ((PREDIV1) == RCC_PREDIV1_Div14) || \ - ((PREDIV1) == RCC_PREDIV1_Div15) || ((PREDIV1) == RCC_PREDIV1_Div16)) -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source - * @{ - */ - -#define RCC_SYSCLKSource_HSI RCC_CFGR_SW_HSI -#define RCC_SYSCLKSource_HSE RCC_CFGR_SW_HSE -#define RCC_SYSCLKSource_PLLCLK RCC_CFGR_SW_PLL -#define RCC_SYSCLKSource_HSI48 RCC_CFGR_SW_HSI48 /*!< Only applicable for STM32F072 devices */ - -#define IS_RCC_SYSCLK_SOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSource_HSI) || \ - ((SOURCE) == RCC_SYSCLKSource_HSE) || \ - ((SOURCE) == RCC_SYSCLKSource_HSI48) || \ - ((SOURCE) == RCC_SYSCLKSource_PLLCLK)) -/** - * @} - */ - -/** @defgroup RCC_AHB_Clock_Source - * @{ - */ - -#define RCC_SYSCLK_Div1 RCC_CFGR_HPRE_DIV1 -#define RCC_SYSCLK_Div2 RCC_CFGR_HPRE_DIV2 -#define RCC_SYSCLK_Div4 RCC_CFGR_HPRE_DIV4 -#define RCC_SYSCLK_Div8 RCC_CFGR_HPRE_DIV8 -#define RCC_SYSCLK_Div16 RCC_CFGR_HPRE_DIV16 -#define RCC_SYSCLK_Div64 RCC_CFGR_HPRE_DIV64 -#define RCC_SYSCLK_Div128 RCC_CFGR_HPRE_DIV128 -#define RCC_SYSCLK_Div256 RCC_CFGR_HPRE_DIV256 -#define RCC_SYSCLK_Div512 RCC_CFGR_HPRE_DIV512 -#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_Div1) || ((HCLK) == RCC_SYSCLK_Div2) || \ - ((HCLK) == RCC_SYSCLK_Div4) || ((HCLK) == RCC_SYSCLK_Div8) || \ - ((HCLK) == RCC_SYSCLK_Div16) || ((HCLK) == RCC_SYSCLK_Div64) || \ - ((HCLK) == RCC_SYSCLK_Div128) || ((HCLK) == RCC_SYSCLK_Div256) || \ - ((HCLK) == RCC_SYSCLK_Div512)) -/** - * @} - */ - -/** @defgroup RCC_APB_Clock_Source - * @{ - */ - -#define RCC_HCLK_Div1 RCC_CFGR_PPRE_DIV1 -#define RCC_HCLK_Div2 RCC_CFGR_PPRE_DIV2 -#define RCC_HCLK_Div4 RCC_CFGR_PPRE_DIV4 -#define RCC_HCLK_Div8 RCC_CFGR_PPRE_DIV8 -#define RCC_HCLK_Div16 RCC_CFGR_PPRE_DIV16 -#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_Div1) || ((PCLK) == RCC_HCLK_Div2) || \ - ((PCLK) == RCC_HCLK_Div4) || ((PCLK) == RCC_HCLK_Div8) || \ - ((PCLK) == RCC_HCLK_Div16)) -/** - * @} - */ - -/** @defgroup RCC_ADC_clock_source - * @{ - */ -/* These defines are obsolete and kept for legacy purpose only. -Proper ADC clock selection is done within ADC driver by mean of the ADC_ClockModeConfig() function */ -#define RCC_ADCCLK_HSI14 ((uint32_t)0x00000000) -#define RCC_ADCCLK_PCLK_Div2 ((uint32_t)0x01000000) -#define RCC_ADCCLK_PCLK_Div4 ((uint32_t)0x01004000) - -#define IS_RCC_ADCCLK(ADCCLK) (((ADCCLK) == RCC_ADCCLK_HSI14) || ((ADCCLK) == RCC_ADCCLK_PCLK_Div2) || \ - ((ADCCLK) == RCC_ADCCLK_PCLK_Div4)) - -/** - * @} - */ - -/** @defgroup RCC_CEC_clock_source - * @{ - */ - -#define RCC_CECCLK_HSI_Div244 ((uint32_t)0x00000000) -#define RCC_CECCLK_LSE RCC_CFGR3_CECSW - -#define IS_RCC_CECCLK(CECCLK) (((CECCLK) == RCC_CECCLK_HSI_Div244) || ((CECCLK) == RCC_CECCLK_LSE)) - -/** - * @} - */ - -/** @defgroup RCC_I2C_clock_source - * @{ - */ - -#define RCC_I2C1CLK_HSI ((uint32_t)0x00000000) -#define RCC_I2C1CLK_SYSCLK RCC_CFGR3_I2C1SW - -#define IS_RCC_I2CCLK(I2CCLK) (((I2CCLK) == RCC_I2C1CLK_HSI) || ((I2CCLK) == RCC_I2C1CLK_SYSCLK)) - -/** - * @} - */ - -/** @defgroup RCC_USB_clock_source - * @brief Applicable only for STM32F072 devices - * @{ - */ - -#define RCC_USBCLK_HSI48 ((uint32_t)0x00000000) -#define RCC_USBCLK_PLLCLK RCC_CFGR3_USBSW - -#define IS_RCC_USBCLK(USBCLK) (((USBCLK) == RCC_USBCLK_HSI48) || ((USBCLK) == RCC_USBCLK_PLLCLK)) - -/** - * @} - */ - -/** @defgroup RCC_USART_clock_source - * @{ - */ - -#define RCC_USART1CLK_PCLK ((uint32_t)0x10000000) -#define RCC_USART1CLK_SYSCLK ((uint32_t)0x10000001) -#define RCC_USART1CLK_LSE ((uint32_t)0x10000002) -#define RCC_USART1CLK_HSI ((uint32_t)0x10000003) - -#define RCC_USART2CLK_PCLK ((uint32_t)0x20000000) /*!< Only applicable for STM32F072 devices */ -#define RCC_USART2CLK_SYSCLK ((uint32_t)0x20010000) /*!< Only applicable for STM32F072 devices */ -#define RCC_USART2CLK_LSE ((uint32_t)0x20020000) /*!< Only applicable for STM32F072 devices */ -#define RCC_USART2CLK_HSI ((uint32_t)0x20030000) /*!< Only applicable for STM32F072 devices */ - -#define IS_RCC_USARTCLK(USARTCLK) (((USARTCLK) == RCC_USART1CLK_PCLK) || \ - ((USARTCLK) == RCC_USART1CLK_SYSCLK) || \ - ((USARTCLK) == RCC_USART1CLK_LSE) || \ - ((USARTCLK) == RCC_USART1CLK_HSI) || \ - ((USARTCLK) == RCC_USART2CLK_PCLK) || \ - ((USARTCLK) == RCC_USART2CLK_SYSCLK) || \ - ((USARTCLK) == RCC_USART2CLK_LSE) || \ - ((USARTCLK) == RCC_USART2CLK_HSI)) - -/** - * @} - */ - -/** @defgroup RCC_Interrupt_Source - * @{ - */ - -#define RCC_IT_LSIRDY ((uint8_t)0x01) -#define RCC_IT_LSERDY ((uint8_t)0x02) -#define RCC_IT_HSIRDY ((uint8_t)0x04) -#define RCC_IT_HSERDY ((uint8_t)0x08) -#define RCC_IT_PLLRDY ((uint8_t)0x10) -#define RCC_IT_HSI14RDY ((uint8_t)0x20) -#define RCC_IT_HSI48RDY ((uint8_t)0x40) /*!< Only applicable for STM32F072 devices */ -#define RCC_IT_CSS ((uint8_t)0x80) - -#define IS_RCC_IT(IT) ((((IT) & (uint8_t)0x80) == 0x00) && ((IT) != 0x00)) - -#define IS_RCC_GET_IT(IT) (((IT) == RCC_IT_LSIRDY) || ((IT) == RCC_IT_LSERDY) || \ - ((IT) == RCC_IT_HSIRDY) || ((IT) == RCC_IT_HSERDY) || \ - ((IT) == RCC_IT_PLLRDY) || ((IT) == RCC_IT_HSI14RDY) || \ - ((IT) == RCC_IT_CSS) || ((IT) == RCC_IT_HSI48RDY)) - -#define IS_RCC_CLEAR_IT(IT) ((IT) != 0x00) - -/** - * @} - */ - -/** @defgroup RCC_LSE_Configuration - * @{ - */ - -#define RCC_LSE_OFF ((uint32_t)0x00000000) -#define RCC_LSE_ON RCC_BDCR_LSEON -#define RCC_LSE_Bypass ((uint32_t)(RCC_BDCR_LSEON | RCC_BDCR_LSEBYP)) -#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ - ((LSE) == RCC_LSE_Bypass)) -/** - * @} - */ - -/** @defgroup RCC_RTC_Clock_Source - * @{ - */ - -#define RCC_RTCCLKSource_LSE RCC_BDCR_RTCSEL_LSE -#define RCC_RTCCLKSource_LSI RCC_BDCR_RTCSEL_LSI -#define RCC_RTCCLKSource_HSE_Div32 RCC_BDCR_RTCSEL_HSE - -#define IS_RCC_RTCCLK_SOURCE(SOURCE) (((SOURCE) == RCC_RTCCLKSource_LSE) || \ - ((SOURCE) == RCC_RTCCLKSource_LSI) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div32)) -/** - * @} - */ - -/** @defgroup RCC_LSE_Drive_Configuration - * @{ - */ - -#define RCC_LSEDrive_Low ((uint32_t)0x00000000) -#define RCC_LSEDrive_MediumLow RCC_BDCR_LSEDRV_0 -#define RCC_LSEDrive_MediumHigh RCC_BDCR_LSEDRV_1 -#define RCC_LSEDrive_High RCC_BDCR_LSEDRV -#define IS_RCC_LSE_DRIVE(DRIVE) (((DRIVE) == RCC_LSEDrive_Low) || ((DRIVE) == RCC_LSEDrive_MediumLow) || \ - ((DRIVE) == RCC_LSEDrive_MediumHigh) || ((DRIVE) == RCC_LSEDrive_High)) -/** - * @} - */ - -/** @defgroup RCC_AHB_Peripherals - * @{ - */ - -#define RCC_AHBPeriph_GPIOA RCC_AHBENR_GPIOAEN -#define RCC_AHBPeriph_GPIOB RCC_AHBENR_GPIOBEN -#define RCC_AHBPeriph_GPIOC RCC_AHBENR_GPIOCEN -#define RCC_AHBPeriph_GPIOD RCC_AHBENR_GPIODEN -#define RCC_AHBPeriph_GPIOE RCC_AHBENR_GPIOEEN /*!< Only applicable for STM32F072 devices */ -#define RCC_AHBPeriph_GPIOF RCC_AHBENR_GPIOFEN -#define RCC_AHBPeriph_TS RCC_AHBENR_TSEN -#define RCC_AHBPeriph_CRC RCC_AHBENR_CRCEN -#define RCC_AHBPeriph_FLITF RCC_AHBENR_FLITFEN -#define RCC_AHBPeriph_SRAM RCC_AHBENR_SRAMEN -#define RCC_AHBPeriph_DMA1 RCC_AHBENR_DMA1EN - -#define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xFE81FFAA) == 0x00) && ((PERIPH) != 0x00)) -#define IS_RCC_AHB_RST_PERIPH(PERIPH) ((((PERIPH) & 0xFE81FFFF) == 0x00) && ((PERIPH) != 0x00)) - -/** - * @} - */ - -/** @defgroup RCC_APB2_Peripherals - * @{ - */ - -#define RCC_APB2Periph_SYSCFG RCC_APB2ENR_SYSCFGEN -#define RCC_APB2Periph_ADC1 RCC_APB2ENR_ADC1EN -#define RCC_APB2Periph_TIM1 RCC_APB2ENR_TIM1EN -#define RCC_APB2Periph_SPI1 RCC_APB2ENR_SPI1EN -#define RCC_APB2Periph_USART1 RCC_APB2ENR_USART1EN -#define RCC_APB2Periph_TIM15 RCC_APB2ENR_TIM15EN -#define RCC_APB2Periph_TIM16 RCC_APB2ENR_TIM16EN -#define RCC_APB2Periph_TIM17 RCC_APB2ENR_TIM17EN -#define RCC_APB2Periph_DBGMCU RCC_APB2ENR_DBGMCUEN - -#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFB8A5FE) == 0x00) && ((PERIPH) != 0x00)) - -/** - * @} - */ - -/** @defgroup RCC_APB1_Peripherals - * @{ - */ - -#define RCC_APB1Periph_TIM2 RCC_APB1ENR_TIM2EN /*!< Only applicable for STM32F051 and STM32F072 devices */ -#define RCC_APB1Periph_TIM3 RCC_APB1ENR_TIM3EN -#define RCC_APB1Periph_TIM6 RCC_APB1ENR_TIM6EN -#define RCC_APB1Periph_TIM7 RCC_APB1ENR_TIM7EN /*!< Only applicable for STM32F072 devices */ -#define RCC_APB1Periph_TIM14 RCC_APB1ENR_TIM14EN -#define RCC_APB1Periph_WWDG RCC_APB1ENR_WWDGEN -#define RCC_APB1Periph_SPI2 RCC_APB1ENR_SPI2EN -#define RCC_APB1Periph_USART2 RCC_APB1ENR_USART2EN -#define RCC_APB1Periph_USART3 RCC_APB1ENR_USART3EN /*!< Only applicable for STM32F072 devices */ -#define RCC_APB1Periph_USART4 RCC_APB1ENR_USART4EN /*!< Only applicable for STM32F072 devices */ -#define RCC_APB1Periph_I2C1 RCC_APB1ENR_I2C1EN -#define RCC_APB1Periph_I2C2 RCC_APB1ENR_I2C2EN -#define RCC_APB1Periph_USB RCC_APB1ENR_USBEN /*!< Only applicable for STM32F072 and STM32F042 devices */ -#define RCC_APB1Periph_CAN RCC_APB1ENR_CANEN /*!< Only applicable for STM32F072 and STM32F042 devices */ -#define RCC_APB1Periph_CRS RCC_APB1ENR_CRSEN /*!< Only applicable for STM32F072 and STM32F042 devices*/ -#define RCC_APB1Periph_PWR RCC_APB1ENR_PWREN -#define RCC_APB1Periph_DAC RCC_APB1ENR_DACEN /*!< Only applicable for STM32F051 and STM32F072 devices */ -#define RCC_APB1Periph_CEC RCC_APB1ENR_CECEN /*!< Only applicable for STM32F051, STM32F042 and STM32F072 devices */ - -#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x8511B6CC) == 0x00) && ((PERIPH) != 0x00)) -/** - * @} - */ - -/** @defgroup RCC_MCO_Clock_Source - * @{ - */ - -#define RCC_MCOSource_NoClock ((uint8_t)0x00) -#define RCC_MCOSource_HSI14 ((uint8_t)0x01) -#define RCC_MCOSource_LSI ((uint8_t)0x02) -#define RCC_MCOSource_LSE ((uint8_t)0x03) -#define RCC_MCOSource_SYSCLK ((uint8_t)0x04) -#define RCC_MCOSource_HSI ((uint8_t)0x05) -#define RCC_MCOSource_HSE ((uint8_t)0x06) -#define RCC_MCOSource_PLLCLK_Div2 ((uint8_t)0x07) -#define RCC_MCOSource_HSI48 ((uint8_t)0x08) /*!< Only applicable for STM32F072 devices */ -#define RCC_MCOSource_PLLCLK ((uint8_t)0x87) - -#define IS_RCC_MCO_SOURCE(SOURCE) (((SOURCE) == RCC_MCOSource_NoClock) || ((SOURCE) == RCC_MCOSource_HSI14) || \ - ((SOURCE) == RCC_MCOSource_SYSCLK) || ((SOURCE) == RCC_MCOSource_HSI) || \ - ((SOURCE) == RCC_MCOSource_HSE) || ((SOURCE) == RCC_MCOSource_PLLCLK_Div2)|| \ - ((SOURCE) == RCC_MCOSource_LSI) || ((SOURCE) == RCC_MCOSource_HSI48) || \ - ((SOURCE) == RCC_MCOSource_PLLCLK) || ((SOURCE) == RCC_MCOSource_LSE)) -/** - * @} - */ - -/** @defgroup RCC_MCOPrescaler - * @{ - */ -#if !defined (STM32F051) -#define RCC_MCOPrescaler_1 RCC_CFGR_MCO_PRE_1 -#define RCC_MCOPrescaler_2 RCC_CFGR_MCO_PRE_2 -#define RCC_MCOPrescaler_4 RCC_CFGR_MCO_PRE_4 -#define RCC_MCOPrescaler_8 RCC_CFGR_MCO_PRE_8 -#define RCC_MCOPrescaler_16 RCC_CFGR_MCO_PRE_16 -#define RCC_MCOPrescaler_32 RCC_CFGR_MCO_PRE_32 -#define RCC_MCOPrescaler_64 RCC_CFGR_MCO_PRE_64 -#define RCC_MCOPrescaler_128 RCC_CFGR_MCO_PRE_128 - -#define IS_RCC_MCO_PRESCALER(PRESCALER) (((PRESCALER) == RCC_MCOPrescaler_1) || \ - ((PRESCALER) == RCC_MCOPrescaler_2) || \ - ((PRESCALER) == RCC_MCOPrescaler_4) || \ - ((PRESCALER) == RCC_MCOPrescaler_8) || \ - ((PRESCALER) == RCC_MCOPrescaler_16) || \ - ((PRESCALER) == RCC_MCOPrescaler_32) || \ - ((PRESCALER) == RCC_MCOPrescaler_64) || \ - ((PRESCALER) == RCC_MCOPrescaler_128)) -#endif /* STM32F051 */ -/** - * @} - */ - -/** @defgroup RCC_Flag - * @{ - */ -#define RCC_FLAG_HSIRDY ((uint8_t)0x01) -#define RCC_FLAG_HSERDY ((uint8_t)0x11) -#define RCC_FLAG_PLLRDY ((uint8_t)0x19) -#define RCC_FLAG_LSERDY ((uint8_t)0x21) -#define RCC_FLAG_LSIRDY ((uint8_t)0x41) -#define RCC_FLAG_V18PWRRSTF ((uint8_t)0x57) -#define RCC_FLAG_OBLRST ((uint8_t)0x59) -#define RCC_FLAG_PINRST ((uint8_t)0x5A) -#define RCC_FLAG_PORRST ((uint8_t)0x5B) -#define RCC_FLAG_SFTRST ((uint8_t)0x5C) -#define RCC_FLAG_IWDGRST ((uint8_t)0x5D) -#define RCC_FLAG_WWDGRST ((uint8_t)0x5E) -#define RCC_FLAG_LPWRRST ((uint8_t)0x5F) -#define RCC_FLAG_HSI14RDY ((uint8_t)0x61) -#define RCC_FLAG_HSI48RDY ((uint8_t)0x71) /*!< Only applicable for STM32F072 devices */ - -#define IS_RCC_FLAG(FLAG) (((FLAG) == RCC_FLAG_HSIRDY) || ((FLAG) == RCC_FLAG_HSERDY) || \ - ((FLAG) == RCC_FLAG_PLLRDY) || ((FLAG) == RCC_FLAG_LSERDY) || \ - ((FLAG) == RCC_FLAG_LSIRDY) || ((FLAG) == RCC_FLAG_OBLRST) || \ - ((FLAG) == RCC_FLAG_PINRST) || ((FLAG) == RCC_FLAG_PORRST) || \ - ((FLAG) == RCC_FLAG_SFTRST) || ((FLAG) == RCC_FLAG_IWDGRST) || \ - ((FLAG) == RCC_FLAG_WWDGRST) || ((FLAG) == RCC_FLAG_LPWRRST) || \ - ((FLAG) == RCC_FLAG_HSI14RDY)|| ((FLAG) == RCC_FLAG_HSI48RDY)|| \ - ((FLAG) == RCC_FLAG_V18PWRRSTF)) - -#define IS_RCC_HSI_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1F) -#define IS_RCC_HSI14_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1F) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Function used to set the RCC clock configuration to the default reset state */ -void RCC_DeInit(void); - -/* Internal/external clocks, PLL, CSS and MCO configuration functions *********/ -void RCC_HSEConfig(uint8_t RCC_HSE); -ErrorStatus RCC_WaitForHSEStartUp(void); -void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue); -void RCC_HSICmd(FunctionalState NewState); -void RCC_AdjustHSI14CalibrationValue(uint8_t HSI14CalibrationValue); -void RCC_HSI14Cmd(FunctionalState NewState); -void RCC_HSI14ADCRequestCmd(FunctionalState NewState); -void RCC_LSEConfig(uint32_t RCC_LSE); -void RCC_LSEDriveConfig(uint32_t RCC_LSEDrive); -void RCC_LSICmd(FunctionalState NewState); -void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul); -void RCC_PLLCmd(FunctionalState NewState); -void RCC_HSI48Cmd(FunctionalState NewState); /*!< Only applicable for STM32F072 devices */ -uint32_t RCC_GetHSI48CalibrationValue(void); /*!< Only applicable for STM32F072 devices */ -void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Div); -void RCC_ClockSecuritySystemCmd(FunctionalState NewState); -#ifdef STM32F051 -void RCC_MCOConfig(uint8_t RCC_MCOSource); -#else -void RCC_MCOConfig(uint8_t RCC_MCOSource,uint32_t RCC_MCOPrescaler); -#endif /* STM32F051 */ - -/* System, AHB and APB busses clocks configuration functions ******************/ -void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); -uint8_t RCC_GetSYSCLKSource(void); -void RCC_HCLKConfig(uint32_t RCC_SYSCLK); -void RCC_PCLKConfig(uint32_t RCC_HCLK); -void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK); /* This function is obsolete. - For proper ADC clock selection, refer to - ADC_ClockModeConfig() in the ADC driver */ -void RCC_CECCLKConfig(uint32_t RCC_CECCLK); -void RCC_I2CCLKConfig(uint32_t RCC_I2CCLK); -void RCC_USARTCLKConfig(uint32_t RCC_USARTCLK); -void RCC_USBCLKConfig(uint32_t RCC_USBCLK); /*!< Only applicable for STM32F042 and STM32F072 devices */ -void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks); - -/* Peripheral clocks configuration functions **********************************/ -void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource); -void RCC_RTCCLKCmd(FunctionalState NewState); -void RCC_BackupResetCmd(FunctionalState NewState); - -void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); -void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); -void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); - -void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); -void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); -void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); - -/* Interrupts and flags management functions **********************************/ -void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState); -FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG); -void RCC_ClearFlag(void); -ITStatus RCC_GetITStatus(uint8_t RCC_IT); -void RCC_ClearITPendingBit(uint8_t RCC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_RCC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_rtc.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_rtc.h deleted file mode 100644 index 598ed66..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_rtc.h +++ /dev/null @@ -1,807 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_rtc.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the RTC firmware - * library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_RTC_H -#define __STM32F0XX_RTC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup RTC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief RTC Init structures definition - */ -typedef struct -{ - uint32_t RTC_HourFormat; /*!< Specifies the RTC Hour Format. - This parameter can be a value of @ref RTC_Hour_Formats */ - - uint32_t RTC_AsynchPrediv; /*!< Specifies the RTC Asynchronous Predivider value. - This parameter must be set to a value lower than 0x7F */ - - uint32_t RTC_SynchPrediv; /*!< Specifies the RTC Synchronous Predivider value. - This parameter must be set to a value lower than 0x1FFF */ -}RTC_InitTypeDef; - -/** - * @brief RTC Time structure definition - */ -typedef struct -{ - uint8_t RTC_Hours; /*!< Specifies the RTC Time Hour. - This parameter must be set to a value in the 0-12 range - if the RTC_HourFormat_12 is selected or 0-23 range if - the RTC_HourFormat_24 is selected. */ - - uint8_t RTC_Minutes; /*!< Specifies the RTC Time Minutes. - This parameter must be set to a value in the 0-59 range. */ - - uint8_t RTC_Seconds; /*!< Specifies the RTC Time Seconds. - This parameter must be set to a value in the 0-59 range. */ - - uint8_t RTC_H12; /*!< Specifies the RTC AM/PM Time. - This parameter can be a value of @ref RTC_AM_PM_Definitions */ -}RTC_TimeTypeDef; - -/** - * @brief RTC Date structure definition - */ -typedef struct -{ - uint8_t RTC_WeekDay; /*!< Specifies the RTC Date WeekDay. - This parameter can be a value of @ref RTC_WeekDay_Definitions */ - - uint8_t RTC_Month; /*!< Specifies the RTC Date Month. - This parameter can be a value of @ref RTC_Month_Date_Definitions */ - - uint8_t RTC_Date; /*!< Specifies the RTC Date. - This parameter must be set to a value in the 1-31 range. */ - - uint8_t RTC_Year; /*!< Specifies the RTC Date Year. - This parameter must be set to a value in the 0-99 range. */ -}RTC_DateTypeDef; - -/** - * @brief RTC Alarm structure definition - */ -typedef struct -{ - RTC_TimeTypeDef RTC_AlarmTime; /*!< Specifies the RTC Alarm Time members. */ - - uint32_t RTC_AlarmMask; /*!< Specifies the RTC Alarm Masks. - This parameter can be a value of @ref RTC_AlarmMask_Definitions */ - - uint32_t RTC_AlarmDateWeekDaySel; /*!< Specifies the RTC Alarm is on Date or WeekDay. - This parameter can be a value of @ref RTC_AlarmDateWeekDay_Definitions */ - - uint8_t RTC_AlarmDateWeekDay; /*!< Specifies the RTC Alarm Date/WeekDay. - This parameter must be set to a value in the 1-31 range - if the Alarm Date is selected. - This parameter can be a value of @ref RTC_WeekDay_Definitions - if the Alarm WeekDay is selected. */ -}RTC_AlarmTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup RTC_Exported_Constants - * @{ - */ - - -/** @defgroup RTC_Hour_Formats - * @{ - */ -#define RTC_HourFormat_24 ((uint32_t)0x00000000) -#define RTC_HourFormat_12 ((uint32_t)0x00000040) -#define IS_RTC_HOUR_FORMAT(FORMAT) (((FORMAT) == RTC_HourFormat_12) || \ - ((FORMAT) == RTC_HourFormat_24)) -/** - * @} - */ - -/** @defgroup RTC_Asynchronous_Predivider - * @{ - */ -#define IS_RTC_ASYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7F) - -/** - * @} - */ - - -/** @defgroup RTC_Synchronous_Predivider - * @{ - */ -#define IS_RTC_SYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7FFF) - -/** - * @} - */ - -/** @defgroup RTC_Time_Definitions - * @{ - */ -#define IS_RTC_HOUR12(HOUR) (((HOUR) > 0) && ((HOUR) <= 12)) -#define IS_RTC_HOUR24(HOUR) ((HOUR) <= 23) -#define IS_RTC_MINUTES(MINUTES) ((MINUTES) <= 59) -#define IS_RTC_SECONDS(SECONDS) ((SECONDS) <= 59) - -/** - * @} - */ - -/** @defgroup RTC_AM_PM_Definitions - * @{ - */ -#define RTC_H12_AM ((uint8_t)0x00) -#define RTC_H12_PM ((uint8_t)0x40) -#define IS_RTC_H12(PM) (((PM) == RTC_H12_AM) || ((PM) == RTC_H12_PM)) - -/** - * @} - */ - -/** @defgroup RTC_Year_Date_Definitions - * @{ - */ -#define IS_RTC_YEAR(YEAR) ((YEAR) <= 99) - -/** - * @} - */ - -/** @defgroup RTC_Month_Date_Definitions - * @{ - */ -#define RTC_Month_January ((uint8_t)0x01) -#define RTC_Month_February ((uint8_t)0x02) -#define RTC_Month_March ((uint8_t)0x03) -#define RTC_Month_April ((uint8_t)0x04) -#define RTC_Month_May ((uint8_t)0x05) -#define RTC_Month_June ((uint8_t)0x06) -#define RTC_Month_July ((uint8_t)0x07) -#define RTC_Month_August ((uint8_t)0x08) -#define RTC_Month_September ((uint8_t)0x09) -#define RTC_Month_October ((uint8_t)0x10) -#define RTC_Month_November ((uint8_t)0x11) -#define RTC_Month_December ((uint8_t)0x12) -#define IS_RTC_MONTH(MONTH) (((MONTH) >= 1) && ((MONTH) <= 12)) -#define IS_RTC_DATE(DATE) (((DATE) >= 1) && ((DATE) <= 31)) - -/** - * @} - */ - -/** @defgroup RTC_WeekDay_Definitions - * @{ - */ - -#define RTC_Weekday_Monday ((uint8_t)0x01) -#define RTC_Weekday_Tuesday ((uint8_t)0x02) -#define RTC_Weekday_Wednesday ((uint8_t)0x03) -#define RTC_Weekday_Thursday ((uint8_t)0x04) -#define RTC_Weekday_Friday ((uint8_t)0x05) -#define RTC_Weekday_Saturday ((uint8_t)0x6) -#define RTC_Weekday_Sunday ((uint8_t)0x07) -#define IS_RTC_WEEKDAY(WEEKDAY) (((WEEKDAY) == RTC_Weekday_Monday) || \ - ((WEEKDAY) == RTC_Weekday_Tuesday) || \ - ((WEEKDAY) == RTC_Weekday_Wednesday) || \ - ((WEEKDAY) == RTC_Weekday_Thursday) || \ - ((WEEKDAY) == RTC_Weekday_Friday) || \ - ((WEEKDAY) == RTC_Weekday_Saturday) || \ - ((WEEKDAY) == RTC_Weekday_Sunday)) -/** - * @} - */ - - -/** @defgroup RTC_Alarm_Definitions - * @{ - */ -#define IS_RTC_ALARM_DATE_WEEKDAY_DATE(DATE) (((DATE) > 0) && ((DATE) <= 31)) -#define IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(WEEKDAY) (((WEEKDAY) == RTC_Weekday_Monday) || \ - ((WEEKDAY) == RTC_Weekday_Tuesday) || \ - ((WEEKDAY) == RTC_Weekday_Wednesday) || \ - ((WEEKDAY) == RTC_Weekday_Thursday) || \ - ((WEEKDAY) == RTC_Weekday_Friday) || \ - ((WEEKDAY) == RTC_Weekday_Saturday) || \ - ((WEEKDAY) == RTC_Weekday_Sunday)) - -/** - * @} - */ - - -/** @defgroup RTC_AlarmDateWeekDay_Definitions - * @{ - */ -#define RTC_AlarmDateWeekDaySel_Date ((uint32_t)0x00000000) -#define RTC_AlarmDateWeekDaySel_WeekDay ((uint32_t)0x40000000) - -#define IS_RTC_ALARM_DATE_WEEKDAY_SEL(SEL) (((SEL) == RTC_AlarmDateWeekDaySel_Date) || \ - ((SEL) == RTC_AlarmDateWeekDaySel_WeekDay)) - -/** - * @} - */ - - -/** @defgroup RTC_AlarmMask_Definitions - * @{ - */ -#define RTC_AlarmMask_None ((uint32_t)0x00000000) -#define RTC_AlarmMask_DateWeekDay ((uint32_t)0x80000000) -#define RTC_AlarmMask_Hours ((uint32_t)0x00800000) -#define RTC_AlarmMask_Minutes ((uint32_t)0x00008000) -#define RTC_AlarmMask_Seconds ((uint32_t)0x00000080) -#define RTC_AlarmMask_All ((uint32_t)0x80808080) -#define IS_RTC_ALARM_MASK(MASK) (((MASK) & 0x7F7F7F7F) == (uint32_t)RESET) - -/** - * @} - */ - -/** @defgroup RTC_Alarms_Definitions - * @{ - */ -#define RTC_Alarm_A ((uint32_t)0x00000100) -#define IS_RTC_ALARM(ALARM) ((ALARM) == RTC_Alarm_A) -#define IS_RTC_CMD_ALARM(ALARM) (((ALARM) & (RTC_Alarm_A)) != (uint32_t)RESET) - -/** - * @} - */ - -/** @defgroup RTC_Alarm_Sub_Seconds_Masks Definitions. - * @{ - */ -#define RTC_AlarmSubSecondMask_All ((uint8_t)0x00) /*!< All Alarm SS fields are masked. - There is no comparison on sub seconds - for Alarm */ -#define RTC_AlarmSubSecondMask_SS14_1 ((uint8_t)0x01) /*!< SS[14:1] are don't care in Alarm - comparison. Only SS[0] is compared. */ -#define RTC_AlarmSubSecondMask_SS14_2 ((uint8_t)0x02) /*!< SS[14:2] are don't care in Alarm - comparison. Only SS[1:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_3 ((uint8_t)0x03) /*!< SS[14:3] are don't care in Alarm - comparison. Only SS[2:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_4 ((uint8_t)0x04) /*!< SS[14:4] are don't care in Alarm - comparison. Only SS[3:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_5 ((uint8_t)0x05) /*!< SS[14:5] are don't care in Alarm - comparison. Only SS[4:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_6 ((uint8_t)0x06) /*!< SS[14:6] are don't care in Alarm - comparison. Only SS[5:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_7 ((uint8_t)0x07) /*!< SS[14:7] are don't care in Alarm - comparison. Only SS[6:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_8 ((uint8_t)0x08) /*!< SS[14:8] are don't care in Alarm - comparison. Only SS[7:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_9 ((uint8_t)0x09) /*!< SS[14:9] are don't care in Alarm - comparison. Only SS[8:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_10 ((uint8_t)0x0A) /*!< SS[14:10] are don't care in Alarm - comparison. Only SS[9:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_11 ((uint8_t)0x0B) /*!< SS[14:11] are don't care in Alarm - comparison. Only SS[10:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_12 ((uint8_t)0x0C) /*!< SS[14:12] are don't care in Alarm - comparison.Only SS[11:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_13 ((uint8_t)0x0D) /*!< SS[14:13] are don't care in Alarm - comparison. Only SS[12:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14 ((uint8_t)0x0E) /*!< SS[14] is don't care in Alarm - comparison.Only SS[13:0] are compared */ -#define RTC_AlarmSubSecondMask_None ((uint8_t)0x0F) /*!< SS[14:0] are compared and must match - to activate alarm. */ -#define IS_RTC_ALARM_SUB_SECOND_MASK(MASK) (((MASK) == RTC_AlarmSubSecondMask_All) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_1) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_2) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_3) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_4) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_5) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_6) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_7) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_8) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_9) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_10) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_11) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_12) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_13) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14) || \ - ((MASK) == RTC_AlarmSubSecondMask_None)) -/** - * @} - */ - -/** @defgroup RTC_Alarm_Sub_Seconds_Value - * @{ - */ - -#define IS_RTC_ALARM_SUB_SECOND_VALUE(VALUE) ((VALUE) <= 0x00007FFF) - -/** - * @} - */ - -/** @defgroup RTC_Wakeup_Timer_Definitions - * @brief These parameters are only available for STM32F072 devices - * @{ - */ -#define RTC_WakeUpClock_RTCCLK_Div16 ((uint32_t)0x00000000) -#define RTC_WakeUpClock_RTCCLK_Div8 ((uint32_t)0x00000001) -#define RTC_WakeUpClock_RTCCLK_Div4 ((uint32_t)0x00000002) -#define RTC_WakeUpClock_RTCCLK_Div2 ((uint32_t)0x00000003) -#define RTC_WakeUpClock_CK_SPRE_16bits ((uint32_t)0x00000004) -#define RTC_WakeUpClock_CK_SPRE_17bits ((uint32_t)0x00000006) -#define IS_RTC_WAKEUP_CLOCK(CLOCK) (((CLOCK) == RTC_WakeUpClock_RTCCLK_Div16) || \ - ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div8) || \ - ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div4) || \ - ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div2) || \ - ((CLOCK) == RTC_WakeUpClock_CK_SPRE_16bits) || \ - ((CLOCK) == RTC_WakeUpClock_CK_SPRE_17bits)) -#define IS_RTC_WAKEUP_COUNTER(COUNTER) ((COUNTER) <= 0xFFFF) -/** - * @} - */ - -/** @defgroup RTC_Time_Stamp_Edges_definitions - * @{ - */ -#define RTC_TimeStampEdge_Rising ((uint32_t)0x00000000) -#define RTC_TimeStampEdge_Falling ((uint32_t)0x00000008) -#define IS_RTC_TIMESTAMP_EDGE(EDGE) (((EDGE) == RTC_TimeStampEdge_Rising) || \ - ((EDGE) == RTC_TimeStampEdge_Falling)) -/** - * @} - */ - -/** @defgroup RTC_Output_selection_Definitions - * @{ - */ -#define RTC_Output_Disable ((uint32_t)0x00000000) -#define RTC_Output_AlarmA ((uint32_t)0x00200000) -#define RTC_Output_WakeUp ((uint32_t)0x00600000) /*!< available only for STM32F072 devices */ - -#define IS_RTC_OUTPUT(OUTPUT) (((OUTPUT) == RTC_Output_Disable) || \ - ((OUTPUT) == RTC_Output_AlarmA) || \ - ((OUTPUT) == RTC_Output_WakeUp)) - -/** - * @} - */ - -/** @defgroup RTC_Output_Polarity_Definitions - * @{ - */ -#define RTC_OutputPolarity_High ((uint32_t)0x00000000) -#define RTC_OutputPolarity_Low ((uint32_t)0x00100000) -#define IS_RTC_OUTPUT_POL(POL) (((POL) == RTC_OutputPolarity_High) || \ - ((POL) == RTC_OutputPolarity_Low)) -/** - * @} - */ - - -/** @defgroup RTC_Calib_Output_selection_Definitions - * @{ - */ -#define RTC_CalibOutput_512Hz ((uint32_t)0x00000000) -#define RTC_CalibOutput_1Hz ((uint32_t)0x00080000) -#define IS_RTC_CALIB_OUTPUT(OUTPUT) (((OUTPUT) == RTC_CalibOutput_512Hz) || \ - ((OUTPUT) == RTC_CalibOutput_1Hz)) -/** - * @} - */ - -/** @defgroup RTC_Smooth_calib_period_Definitions - * @{ - */ -#define RTC_SmoothCalibPeriod_32sec ((uint32_t)0x00000000) /*!< if RTCCLK = 32768 Hz, Smooth calibation - period is 32s, else 2exp20 RTCCLK seconds */ -#define RTC_SmoothCalibPeriod_16sec ((uint32_t)0x00002000) /*!< if RTCCLK = 32768 Hz, Smooth calibation - period is 16s, else 2exp19 RTCCLK seconds */ -#define RTC_SmoothCalibPeriod_8sec ((uint32_t)0x00004000) /*!< if RTCCLK = 32768 Hz, Smooth calibation - period is 8s, else 2exp18 RTCCLK seconds */ -#define IS_RTC_SMOOTH_CALIB_PERIOD(PERIOD) (((PERIOD) == RTC_SmoothCalibPeriod_32sec) || \ - ((PERIOD) == RTC_SmoothCalibPeriod_16sec) || \ - ((PERIOD) == RTC_SmoothCalibPeriod_8sec)) - -/** - * @} - */ - -/** @defgroup RTC_Smooth_calib_Plus_pulses_Definitions - * @{ - */ -#define RTC_SmoothCalibPlusPulses_Set ((uint32_t)0x00008000) /*!< The number of RTCCLK pulses added - during a X -second window = Y - CALM[8:0]. - with Y = 512, 256, 128 when X = 32, 16, 8 */ -#define RTC_SmoothCalibPlusPulses_Reset ((uint32_t)0x00000000) /*!< The number of RTCCLK pulses subbstited - during a 32-second window = CALM[8:0]. */ -#define IS_RTC_SMOOTH_CALIB_PLUS(PLUS) (((PLUS) == RTC_SmoothCalibPlusPulses_Set) || \ - ((PLUS) == RTC_SmoothCalibPlusPulses_Reset)) - -/** - * @} - */ - -/** @defgroup RTC_Smooth_calib_Minus_pulses_Definitions - * @{ - */ -#define IS_RTC_SMOOTH_CALIB_MINUS(VALUE) ((VALUE) <= 0x000001FF) - -/** - * @} - */ - -/** @defgroup RTC_DayLightSaving_Definitions - * @{ - */ -#define RTC_DayLightSaving_SUB1H ((uint32_t)0x00020000) -#define RTC_DayLightSaving_ADD1H ((uint32_t)0x00010000) -#define IS_RTC_DAYLIGHT_SAVING(SAVING) (((SAVING) == RTC_DayLightSaving_SUB1H) || \ - ((SAVING) == RTC_DayLightSaving_ADD1H)) - -#define RTC_StoreOperation_Reset ((uint32_t)0x00000000) -#define RTC_StoreOperation_Set ((uint32_t)0x00040000) -#define IS_RTC_STORE_OPERATION(OPERATION) (((OPERATION) == RTC_StoreOperation_Reset) || \ - ((OPERATION) == RTC_StoreOperation_Set)) -/** - * @} - */ - -/** @defgroup RTC_Tamper_Trigger_Definitions - * @{ - */ -#define RTC_TamperTrigger_RisingEdge ((uint32_t)0x00000000) -#define RTC_TamperTrigger_FallingEdge ((uint32_t)0x00000001) -#define RTC_TamperTrigger_LowLevel ((uint32_t)0x00000000) -#define RTC_TamperTrigger_HighLevel ((uint32_t)0x00000001) -#define IS_RTC_TAMPER_TRIGGER(TRIGGER) (((TRIGGER) == RTC_TamperTrigger_RisingEdge) || \ - ((TRIGGER) == RTC_TamperTrigger_FallingEdge) || \ - ((TRIGGER) == RTC_TamperTrigger_LowLevel) || \ - ((TRIGGER) == RTC_TamperTrigger_HighLevel)) - -/** - * @} - */ - -/** @defgroup RTC_Tamper_Filter_Definitions - * @{ - */ -#define RTC_TamperFilter_Disable ((uint32_t)0x00000000) /*!< Tamper filter is disabled */ - -#define RTC_TamperFilter_2Sample ((uint32_t)0x00000800) /*!< Tamper is activated after 2 - consecutive samples at the active level */ -#define RTC_TamperFilter_4Sample ((uint32_t)0x00001000) /*!< Tamper is activated after 4 - consecutive samples at the active level */ -#define RTC_TamperFilter_8Sample ((uint32_t)0x00001800) /*!< Tamper is activated after 8 - consecutive samples at the active leve. */ -#define IS_RTC_TAMPER_FILTER(FILTER) (((FILTER) == RTC_TamperFilter_Disable) || \ - ((FILTER) == RTC_TamperFilter_2Sample) || \ - ((FILTER) == RTC_TamperFilter_4Sample) || \ - ((FILTER) == RTC_TamperFilter_8Sample)) -/** - * @} - */ - -/** @defgroup RTC_Tamper_Sampling_Frequencies_Definitions - * @{ - */ -#define RTC_TamperSamplingFreq_RTCCLK_Div32768 ((uint32_t)0x00000000) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 32768 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div16384 ((uint32_t)0x00000100) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 16384 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div8192 ((uint32_t)0x00000200) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 8192 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div4096 ((uint32_t)0x00000300) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 4096 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div2048 ((uint32_t)0x00000400) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 2048 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div1024 ((uint32_t)0x00000500) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 1024 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div512 ((uint32_t)0x00000600) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 512 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div256 ((uint32_t)0x00000700) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 256 */ -#define IS_RTC_TAMPER_SAMPLING_FREQ(FREQ) (((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div32768) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div16384) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div8192) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div4096) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div2048) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div1024) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div512) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div256)) - -/** - * @} - */ - - /** @defgroup RTC_Tamper_Pin_Precharge_Duration_Definitions - * @{ - */ -#define RTC_TamperPrechargeDuration_1RTCCLK ((uint32_t)0x00000000) /*!< Tamper pins are pre-charged before - sampling during 1 RTCCLK cycle */ -#define RTC_TamperPrechargeDuration_2RTCCLK ((uint32_t)0x00002000) /*!< Tamper pins are pre-charged before - sampling during 2 RTCCLK cycles */ -#define RTC_TamperPrechargeDuration_4RTCCLK ((uint32_t)0x00004000) /*!< Tamper pins are pre-charged before - sampling during 4 RTCCLK cycles */ -#define RTC_TamperPrechargeDuration_8RTCCLK ((uint32_t)0x00006000) /*!< Tamper pins are pre-charged before - sampling during 8 RTCCLK cycles */ - -#define IS_RTC_TAMPER_PRECHARGE_DURATION(DURATION) (((DURATION) == RTC_TamperPrechargeDuration_1RTCCLK) || \ - ((DURATION) == RTC_TamperPrechargeDuration_2RTCCLK) || \ - ((DURATION) == RTC_TamperPrechargeDuration_4RTCCLK) || \ - ((DURATION) == RTC_TamperPrechargeDuration_8RTCCLK)) -/** - * @} - */ - -/** @defgroup RTC_Tamper_Pins_Definitions - * @{ - */ -#define RTC_Tamper_1 RTC_TAFCR_TAMP1E /*!< Tamper detection enable for - input tamper 1 */ -#define RTC_Tamper_2 RTC_TAFCR_TAMP2E /*!< Tamper detection enable for - input tamper 2 */ -#define RTC_Tamper_3 RTC_TAFCR_TAMP3E /*!< Tamper detection enable for - input tamper 3, available only - for STM32F072 devices */ -#define IS_RTC_TAMPER(TAMPER) ((((TAMPER) & (uint32_t)0xFFFFFFD6) == 0x00) && ((TAMPER) != (uint32_t)RESET)) - -/** - * @} - */ - -/** @defgroup RTC_Output_Type_ALARM_OUT - * @{ - */ -#define RTC_OutputType_OpenDrain ((uint32_t)0x00000000) -#define RTC_OutputType_PushPull ((uint32_t)0x00040000) -#define IS_RTC_OUTPUT_TYPE(TYPE) (((TYPE) == RTC_OutputType_OpenDrain) || \ - ((TYPE) == RTC_OutputType_PushPull)) - -/** - * @} - */ - -/** @defgroup RTC_Add_1_Second_Parameter_Definitions - * @{ - */ -#define RTC_ShiftAdd1S_Reset ((uint32_t)0x00000000) -#define RTC_ShiftAdd1S_Set ((uint32_t)0x80000000) -#define IS_RTC_SHIFT_ADD1S(SEL) (((SEL) == RTC_ShiftAdd1S_Reset) || \ - ((SEL) == RTC_ShiftAdd1S_Set)) -/** - * @} - */ - -/** @defgroup RTC_Substract_Fraction_Of_Second_Value - * @{ - */ -#define IS_RTC_SHIFT_SUBFS(FS) ((FS) <= 0x00007FFF) - -/** - * @} - */ - -/** @defgroup RTC_Backup_Registers_Definitions - * @{ - */ - -#define RTC_BKP_DR0 ((uint32_t)0x00000000) -#define RTC_BKP_DR1 ((uint32_t)0x00000001) -#define RTC_BKP_DR2 ((uint32_t)0x00000002) -#define RTC_BKP_DR3 ((uint32_t)0x00000003) -#define RTC_BKP_DR4 ((uint32_t)0x00000004) -#define IS_RTC_BKP(BKP) (((BKP) == RTC_BKP_DR0) || \ - ((BKP) == RTC_BKP_DR1) || \ - ((BKP) == RTC_BKP_DR2) || \ - ((BKP) == RTC_BKP_DR3) || \ - ((BKP) == RTC_BKP_DR4)) -/** - * @} - */ - -/** @defgroup RTC_Input_parameter_format_definitions - * @{ - */ -#define RTC_Format_BIN ((uint32_t)0x000000000) -#define RTC_Format_BCD ((uint32_t)0x000000001) -#define IS_RTC_FORMAT(FORMAT) (((FORMAT) == RTC_Format_BIN) || ((FORMAT) == RTC_Format_BCD)) - -/** - * @} - */ - -/** @defgroup RTC_Flags_Definitions - * @{ - */ -#define RTC_FLAG_RECALPF RTC_ISR_RECALPF -#define RTC_FLAG_TAMP3F RTC_ISR_TAMP3F /*!< Only available for STM32F072 devices */ -#define RTC_FLAG_TAMP2F RTC_ISR_TAMP2F -#define RTC_FLAG_TAMP1F RTC_ISR_TAMP1F -#define RTC_FLAG_TSOVF RTC_ISR_TSOVF -#define RTC_FLAG_TSF RTC_ISR_TSF -#define RTC_FLAG_WUTF RTC_ISR_WUTF /*!< Only available for STM32F072 devices */ -#define RTC_FLAG_ALRAF RTC_ISR_ALRAF -#define RTC_FLAG_INITF RTC_ISR_INITF -#define RTC_FLAG_RSF RTC_ISR_RSF -#define RTC_FLAG_INITS RTC_ISR_INITS -#define RTC_FLAG_SHPF RTC_ISR_SHPF -#define RTC_FLAG_WUTWF RTC_ISR_WUTWF /*!< Only available for STM32F072 devices */ -#define RTC_FLAG_ALRAWF RTC_ISR_ALRAWF - -#define IS_RTC_GET_FLAG(FLAG) (((FLAG) == RTC_FLAG_TSOVF) || ((FLAG) == RTC_FLAG_TSF) || \ - ((FLAG) == RTC_FLAG_WUTF) || ((FLAG) == RTC_FLAG_ALRAWF) || \ - ((FLAG) == RTC_FLAG_ALRAF) || ((FLAG) == RTC_FLAG_INITF) || \ - ((FLAG) == RTC_FLAG_RSF) || ((FLAG) == RTC_FLAG_WUTWF) || \ - ((FLAG) == RTC_FLAG_TAMP1F) || ((FLAG) == RTC_FLAG_TAMP2F) || \ - ((FLAG) == RTC_FLAG_TAMP3F) || ((FLAG) == RTC_FLAG_RECALPF) || \ - ((FLAG) == RTC_FLAG_SHPF)) -#define IS_RTC_CLEAR_FLAG(FLAG) (((FLAG) != (uint32_t)RESET) && (((FLAG) & 0xFFFF02DF) == (uint32_t)RESET)) - -/** - * @} - */ - -/** @defgroup RTC_Interrupts_Definitions - * @{ - */ -#define RTC_IT_TS ((uint32_t)0x00008000) -#define RTC_IT_WUT ((uint32_t)0x00004000) /* Available only for STM32F072 devices */ -#define RTC_IT_ALRA ((uint32_t)0x00001000) -#define RTC_IT_TAMP ((uint32_t)0x00000004) /* Used only to Enable the Tamper Interrupt */ -#define RTC_IT_TAMP1 ((uint32_t)0x00020000) -#define RTC_IT_TAMP2 ((uint32_t)0x00040000) -#define RTC_IT_TAMP3 ((uint32_t)0x00080000) /* Available only for STM32F072 devices */ - -#define IS_RTC_CONFIG_IT(IT) (((IT) != (uint32_t)RESET) && (((IT) & 0xFFFF2FFB) == (uint32_t)RESET)) -#define IS_RTC_GET_IT(IT) (((IT) == RTC_IT_TS) || ((IT) == RTC_IT_ALRA) || \ - ((IT) == RTC_IT_TAMP1) || ((IT) == RTC_IT_WUT) || \ - ((IT) == RTC_IT_TAMP2) || ((IT) == RTC_IT_TAMP3)) - -#define IS_RTC_CLEAR_IT(IT) (((IT) != (uint32_t)RESET) && (((IT) & 0xFFF12FFF) == (uint32_t)RESET)) - -/** - * @} - */ - -/** - * @} - */ - - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -/* Function used to set the RTC configuration to the default reset state *****/ -ErrorStatus RTC_DeInit(void); - - -/* Initialization and Configuration functions *********************************/ -ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct); -void RTC_StructInit(RTC_InitTypeDef* RTC_InitStruct); -void RTC_WriteProtectionCmd(FunctionalState NewState); -ErrorStatus RTC_EnterInitMode(void); -void RTC_ExitInitMode(void); -ErrorStatus RTC_WaitForSynchro(void); -ErrorStatus RTC_RefClockCmd(FunctionalState NewState); -void RTC_BypassShadowCmd(FunctionalState NewState); - -/* Time and Date configuration functions **************************************/ -ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct); -void RTC_TimeStructInit(RTC_TimeTypeDef* RTC_TimeStruct); -void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct); -uint32_t RTC_GetSubSecond(void); -ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct); -void RTC_DateStructInit(RTC_DateTypeDef* RTC_DateStruct); -void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct); - -/* Alarms (Alarm A) configuration functions **********************************/ -void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct); -void RTC_AlarmStructInit(RTC_AlarmTypeDef* RTC_AlarmStruct); -void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct); -ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState); -void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, uint8_t RTC_AlarmSubSecondMask); -uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm); - -/* WakeUp Timer configuration functions ***************************************/ -void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock); /*!< available only for STM32F072 devices */ -void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter); /*!< available only for STM32F072 devices */ -uint32_t RTC_GetWakeUpCounter(void); /*!< available only for STM32F072 devices */ -ErrorStatus RTC_WakeUpCmd(FunctionalState NewState); /*!< available only for STM32F072 devices */ - -/* Daylight Saving configuration functions ************************************/ -void RTC_DayLightSavingConfig(uint32_t RTC_DayLightSaving, uint32_t RTC_StoreOperation); -uint32_t RTC_GetStoreOperation(void); - -/* Output pin Configuration function ******************************************/ -void RTC_OutputConfig(uint32_t RTC_Output, uint32_t RTC_OutputPolarity); - -/* Digital Calibration configuration functions ********************************/ -void RTC_CalibOutputCmd(FunctionalState NewState); -void RTC_CalibOutputConfig(uint32_t RTC_CalibOutput); -ErrorStatus RTC_SmoothCalibConfig(uint32_t RTC_SmoothCalibPeriod, - uint32_t RTC_SmoothCalibPlusPulses, - uint32_t RTC_SmouthCalibMinusPulsesValue); - -/* TimeStamp configuration functions ******************************************/ -void RTC_TimeStampCmd(uint32_t RTC_TimeStampEdge, FunctionalState NewState); -void RTC_GetTimeStamp(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_StampTimeStruct, RTC_DateTypeDef* RTC_StampDateStruct); -uint32_t RTC_GetTimeStampSubSecond(void); - -/* Tampers configuration functions ********************************************/ -void RTC_TamperTriggerConfig(uint32_t RTC_Tamper, uint32_t RTC_TamperTrigger); -void RTC_TamperCmd(uint32_t RTC_Tamper, FunctionalState NewState); -void RTC_TamperFilterConfig(uint32_t RTC_TamperFilter); -void RTC_TamperSamplingFreqConfig(uint32_t RTC_TamperSamplingFreq); -void RTC_TamperPinsPrechargeDuration(uint32_t RTC_TamperPrechargeDuration); -void RTC_TimeStampOnTamperDetectionCmd(FunctionalState NewState); -void RTC_TamperPullUpCmd(FunctionalState NewState); - -/* Backup Data Registers configuration functions ******************************/ -void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data); -uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR); - -/* Output Type Config configuration functions *********************************/ -void RTC_OutputTypeConfig(uint32_t RTC_OutputType); - -/* RTC_Shift_control_synchonisation_functions *********************************/ -ErrorStatus RTC_SynchroShiftConfig(uint32_t RTC_ShiftAdd1S, uint32_t RTC_ShiftSubFS); - -/* Interrupts and flags management functions **********************************/ -void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState); -FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG); -void RTC_ClearFlag(uint32_t RTC_FLAG); -ITStatus RTC_GetITStatus(uint32_t RTC_IT); -void RTC_ClearITPendingBit(uint32_t RTC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F0XX_RTC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_spi.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_spi.h deleted file mode 100644 index 7b95f83..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_spi.h +++ /dev/null @@ -1,588 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_spi.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the SPI - * firmware library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_SPI_H -#define __STM32F0XX_SPI_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup SPI - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief SPI Init structure definition - */ - -typedef struct -{ - uint16_t SPI_Direction; /*!< Specifies the SPI unidirectional or bidirectional data mode. - This parameter can be a value of @ref SPI_data_direction */ - - uint16_t SPI_Mode; /*!< Specifies the SPI mode (Master/Slave). - This parameter can be a value of @ref SPI_mode */ - - uint16_t SPI_DataSize; /*!< Specifies the SPI data size. - This parameter can be a value of @ref SPI_data_size */ - - uint16_t SPI_CPOL; /*!< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_Clock_Polarity */ - - uint16_t SPI_CPHA; /*!< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_Clock_Phase */ - - uint16_t SPI_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_Slave_Select_management */ - - uint16_t SPI_BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will be - used to configure the transmit and receive SCK clock. - This parameter can be a value of @ref SPI_BaudRate_Prescaler - @note The communication clock is derived from the master - clock. The slave clock does not need to be set. */ - - uint16_t SPI_FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. - This parameter can be a value of @ref SPI_MSB_LSB_transmission */ - - uint16_t SPI_CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. */ -}SPI_InitTypeDef; - - -/** - * @brief I2S Init structure definition - * @note These parameters are not available for STM32F030 devices. - */ - -typedef struct -{ - uint16_t I2S_Mode; /*!< Specifies the I2S operating mode. - This parameter can be a value of @ref SPI_I2S_Mode */ - - uint16_t I2S_Standard; /*!< Specifies the standard used for the I2S communication. - This parameter can be a value of @ref SPI_I2S_Standard */ - - uint16_t I2S_DataFormat; /*!< Specifies the data format for the I2S communication. - This parameter can be a value of @ref SPI_I2S_Data_Format */ - - uint16_t I2S_MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. - This parameter can be a value of @ref SPI_I2S_MCLK_Output */ - - uint32_t I2S_AudioFreq; /*!< Specifies the frequency selected for the I2S communication. - This parameter can be a value of @ref SPI_I2S_Audio_Frequency */ - - uint16_t I2S_CPOL; /*!< Specifies the idle state of the I2S clock. - This parameter can be a value of @ref SPI_I2S_Clock_Polarity */ -}I2S_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup SPI_Exported_Constants - * @{ - */ - -#define IS_SPI_ALL_PERIPH(PERIPH) (((PERIPH) == SPI1) || \ - ((PERIPH) == SPI2)) - -#define IS_SPI_1_PERIPH(PERIPH) (((PERIPH) == SPI1)) - -/** @defgroup SPI_data_direction - * @{ - */ - -#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000) -#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400) -#define SPI_Direction_1Line_Rx ((uint16_t)0x8000) -#define SPI_Direction_1Line_Tx ((uint16_t)0xC000) -#define IS_SPI_DIRECTION_MODE(MODE) (((MODE) == SPI_Direction_2Lines_FullDuplex) || \ - ((MODE) == SPI_Direction_2Lines_RxOnly) || \ - ((MODE) == SPI_Direction_1Line_Rx) || \ - ((MODE) == SPI_Direction_1Line_Tx)) -/** - * @} - */ - -/** @defgroup SPI_mode - * @{ - */ - -#define SPI_Mode_Master ((uint16_t)0x0104) -#define SPI_Mode_Slave ((uint16_t)0x0000) -#define IS_SPI_MODE(MODE) (((MODE) == SPI_Mode_Master) || \ - ((MODE) == SPI_Mode_Slave)) -/** - * @} - */ - -/** @defgroup SPI_data_size - * @{ - */ - -#define SPI_DataSize_4b ((uint16_t)0x0300) -#define SPI_DataSize_5b ((uint16_t)0x0400) -#define SPI_DataSize_6b ((uint16_t)0x0500) -#define SPI_DataSize_7b ((uint16_t)0x0600) -#define SPI_DataSize_8b ((uint16_t)0x0700) -#define SPI_DataSize_9b ((uint16_t)0x0800) -#define SPI_DataSize_10b ((uint16_t)0x0900) -#define SPI_DataSize_11b ((uint16_t)0x0A00) -#define SPI_DataSize_12b ((uint16_t)0x0B00) -#define SPI_DataSize_13b ((uint16_t)0x0C00) -#define SPI_DataSize_14b ((uint16_t)0x0D00) -#define SPI_DataSize_15b ((uint16_t)0x0E00) -#define SPI_DataSize_16b ((uint16_t)0x0F00) -#define IS_SPI_DATA_SIZE(SIZE) (((SIZE) == SPI_DataSize_4b) || \ - ((SIZE) == SPI_DataSize_5b) || \ - ((SIZE) == SPI_DataSize_6b) || \ - ((SIZE) == SPI_DataSize_7b) || \ - ((SIZE) == SPI_DataSize_8b) || \ - ((SIZE) == SPI_DataSize_9b) || \ - ((SIZE) == SPI_DataSize_10b) || \ - ((SIZE) == SPI_DataSize_11b) || \ - ((SIZE) == SPI_DataSize_12b) || \ - ((SIZE) == SPI_DataSize_13b) || \ - ((SIZE) == SPI_DataSize_14b) || \ - ((SIZE) == SPI_DataSize_15b) || \ - ((SIZE) == SPI_DataSize_16b)) -/** - * @} - */ - -/** @defgroup SPI_CRC_length - * @{ - */ - -#define SPI_CRCLength_8b ((uint16_t)0x0000) -#define SPI_CRCLength_16b SPI_CR1_CRCL -#define IS_SPI_CRC_LENGTH(LENGTH) (((LENGTH) == SPI_CRCLength_8b) || \ - ((LENGTH) == SPI_CRCLength_16b)) -/** - * @} - */ - -/** @defgroup SPI_Clock_Polarity - * @{ - */ - -#define SPI_CPOL_Low ((uint16_t)0x0000) -#define SPI_CPOL_High SPI_CR1_CPOL -#define IS_SPI_CPOL(CPOL) (((CPOL) == SPI_CPOL_Low) || \ - ((CPOL) == SPI_CPOL_High)) -/** - * @} - */ - -/** @defgroup SPI_Clock_Phase - * @{ - */ - -#define SPI_CPHA_1Edge ((uint16_t)0x0000) -#define SPI_CPHA_2Edge SPI_CR1_CPHA -#define IS_SPI_CPHA(CPHA) (((CPHA) == SPI_CPHA_1Edge) || \ - ((CPHA) == SPI_CPHA_2Edge)) -/** - * @} - */ - -/** @defgroup SPI_Slave_Select_management - * @{ - */ - -#define SPI_NSS_Soft SPI_CR1_SSM -#define SPI_NSS_Hard ((uint16_t)0x0000) -#define IS_SPI_NSS(NSS) (((NSS) == SPI_NSS_Soft) || \ - ((NSS) == SPI_NSS_Hard)) -/** - * @} - */ - -/** @defgroup SPI_BaudRate_Prescaler - * @{ - */ - -#define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) -#define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) -#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) -#define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) -#define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) -#define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) -#define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) -#define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) -#define IS_SPI_BAUDRATE_PRESCALER(PRESCALER) (((PRESCALER) == SPI_BaudRatePrescaler_2) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_4) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_8) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_16) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_32) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_64) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_128) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_256)) -/** - * @} - */ - -/** @defgroup SPI_MSB_LSB_transmission - * @{ - */ - -#define SPI_FirstBit_MSB ((uint16_t)0x0000) -#define SPI_FirstBit_LSB SPI_CR1_LSBFIRST -#define IS_SPI_FIRST_BIT(BIT) (((BIT) == SPI_FirstBit_MSB) || \ - ((BIT) == SPI_FirstBit_LSB)) -/** - * @} - */ - -/** @defgroup SPI_I2S_Mode - * @{ - */ - -#define I2S_Mode_SlaveTx ((uint16_t)0x0000) -#define I2S_Mode_SlaveRx ((uint16_t)0x0100) -#define I2S_Mode_MasterTx ((uint16_t)0x0200) -#define I2S_Mode_MasterRx ((uint16_t)0x0300) -#define IS_I2S_MODE(MODE) (((MODE) == I2S_Mode_SlaveTx) || \ - ((MODE) == I2S_Mode_SlaveRx) || \ - ((MODE) == I2S_Mode_MasterTx)|| \ - ((MODE) == I2S_Mode_MasterRx)) -/** - * @} - */ - -/** @defgroup SPI_I2S_Standard - * @{ - */ - -#define I2S_Standard_Phillips ((uint16_t)0x0000) -#define I2S_Standard_MSB ((uint16_t)0x0010) -#define I2S_Standard_LSB ((uint16_t)0x0020) -#define I2S_Standard_PCMShort ((uint16_t)0x0030) -#define I2S_Standard_PCMLong ((uint16_t)0x00B0) -#define IS_I2S_STANDARD(STANDARD) (((STANDARD) == I2S_Standard_Phillips) || \ - ((STANDARD) == I2S_Standard_MSB) || \ - ((STANDARD) == I2S_Standard_LSB) || \ - ((STANDARD) == I2S_Standard_PCMShort) || \ - ((STANDARD) == I2S_Standard_PCMLong)) -/** - * @} - */ - -/** @defgroup SPI_I2S_Data_Format - * @{ - */ - -#define I2S_DataFormat_16b ((uint16_t)0x0000) -#define I2S_DataFormat_16bextended ((uint16_t)0x0001) -#define I2S_DataFormat_24b ((uint16_t)0x0003) -#define I2S_DataFormat_32b ((uint16_t)0x0005) -#define IS_I2S_DATA_FORMAT(FORMAT) (((FORMAT) == I2S_DataFormat_16b) || \ - ((FORMAT) == I2S_DataFormat_16bextended) || \ - ((FORMAT) == I2S_DataFormat_24b) || \ - ((FORMAT) == I2S_DataFormat_32b)) -/** - * @} - */ - -/** @defgroup SPI_I2S_MCLK_Output - * @{ - */ - -#define I2S_MCLKOutput_Enable SPI_I2SPR_MCKOE -#define I2S_MCLKOutput_Disable ((uint16_t)0x0000) -#define IS_I2S_MCLK_OUTPUT(OUTPUT) (((OUTPUT) == I2S_MCLKOutput_Enable) || \ - ((OUTPUT) == I2S_MCLKOutput_Disable)) -/** - * @} - */ - -/** @defgroup SPI_I2S_Audio_Frequency - * @{ - */ - -#define I2S_AudioFreq_192k ((uint32_t)192000) -#define I2S_AudioFreq_96k ((uint32_t)96000) -#define I2S_AudioFreq_48k ((uint32_t)48000) -#define I2S_AudioFreq_44k ((uint32_t)44100) -#define I2S_AudioFreq_32k ((uint32_t)32000) -#define I2S_AudioFreq_22k ((uint32_t)22050) -#define I2S_AudioFreq_16k ((uint32_t)16000) -#define I2S_AudioFreq_11k ((uint32_t)11025) -#define I2S_AudioFreq_8k ((uint32_t)8000) -#define I2S_AudioFreq_Default ((uint32_t)2) - -#define IS_I2S_AUDIO_FREQ(FREQ) ((((FREQ) >= I2S_AudioFreq_8k) && \ - ((FREQ) <= I2S_AudioFreq_192k)) || \ - ((FREQ) == I2S_AudioFreq_Default)) -/** - * @} - */ - -/** @defgroup SPI_I2S_Clock_Polarity - * @{ - */ - -#define I2S_CPOL_Low ((uint16_t)0x0000) -#define I2S_CPOL_High SPI_I2SCFGR_CKPOL -#define IS_I2S_CPOL(CPOL) (((CPOL) == I2S_CPOL_Low) || \ - ((CPOL) == I2S_CPOL_High)) -/** - * @} - */ - -/** @defgroup SPI_FIFO_reception_threshold - * @{ - */ - -#define SPI_RxFIFOThreshold_HF ((uint16_t)0x0000) -#define SPI_RxFIFOThreshold_QF SPI_CR2_FRXTH -#define IS_SPI_RX_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == SPI_RxFIFOThreshold_HF) || \ - ((THRESHOLD) == SPI_RxFIFOThreshold_QF)) -/** - * @} - */ - -/** @defgroup SPI_I2S_DMA_transfer_requests - * @{ - */ - -#define SPI_I2S_DMAReq_Tx SPI_CR2_TXDMAEN -#define SPI_I2S_DMAReq_Rx SPI_CR2_RXDMAEN -#define IS_SPI_I2S_DMA_REQ(REQ) ((((REQ) & (uint16_t)0xFFFC) == 0x00) && ((REQ) != 0x00)) -/** - * @} - */ - -/** @defgroup SPI_last_DMA_transfers - * @{ - */ - -#define SPI_LastDMATransfer_TxEvenRxEven ((uint16_t)0x0000) -#define SPI_LastDMATransfer_TxOddRxEven ((uint16_t)0x4000) -#define SPI_LastDMATransfer_TxEvenRxOdd ((uint16_t)0x2000) -#define SPI_LastDMATransfer_TxOddRxOdd ((uint16_t)0x6000) -#define IS_SPI_LAST_DMA_TRANSFER(TRANSFER) (((TRANSFER) == SPI_LastDMATransfer_TxEvenRxEven) || \ - ((TRANSFER) == SPI_LastDMATransfer_TxOddRxEven) || \ - ((TRANSFER) == SPI_LastDMATransfer_TxEvenRxOdd) || \ - ((TRANSFER) == SPI_LastDMATransfer_TxOddRxOdd)) -/** - * @} - */ -/** @defgroup SPI_NSS_internal_software_management - * @{ - */ - -#define SPI_NSSInternalSoft_Set SPI_CR1_SSI -#define SPI_NSSInternalSoft_Reset ((uint16_t)0xFEFF) -#define IS_SPI_NSS_INTERNAL(INTERNAL) (((INTERNAL) == SPI_NSSInternalSoft_Set) || \ - ((INTERNAL) == SPI_NSSInternalSoft_Reset)) -/** - * @} - */ - -/** @defgroup SPI_CRC_Transmit_Receive - * @{ - */ - -#define SPI_CRC_Tx ((uint8_t)0x00) -#define SPI_CRC_Rx ((uint8_t)0x01) -#define IS_SPI_CRC(CRC) (((CRC) == SPI_CRC_Tx) || ((CRC) == SPI_CRC_Rx)) -/** - * @} - */ - -/** @defgroup SPI_direction_transmit_receive - * @{ - */ - -#define SPI_Direction_Rx ((uint16_t)0xBFFF) -#define SPI_Direction_Tx ((uint16_t)0x4000) -#define IS_SPI_DIRECTION(DIRECTION) (((DIRECTION) == SPI_Direction_Rx) || \ - ((DIRECTION) == SPI_Direction_Tx)) -/** - * @} - */ - -/** @defgroup SPI_I2S_interrupts_definition - * @{ - */ - -#define SPI_I2S_IT_TXE ((uint8_t)0x71) -#define SPI_I2S_IT_RXNE ((uint8_t)0x60) -#define SPI_I2S_IT_ERR ((uint8_t)0x50) - -#define IS_SPI_I2S_CONFIG_IT(IT) (((IT) == SPI_I2S_IT_TXE) || \ - ((IT) == SPI_I2S_IT_RXNE) || \ - ((IT) == SPI_I2S_IT_ERR)) - -#define I2S_IT_UDR ((uint8_t)0x53) -#define SPI_IT_MODF ((uint8_t)0x55) -#define SPI_I2S_IT_OVR ((uint8_t)0x56) -#define SPI_I2S_IT_FRE ((uint8_t)0x58) - -#define IS_SPI_I2S_GET_IT(IT) (((IT) == SPI_I2S_IT_RXNE) || ((IT) == SPI_I2S_IT_TXE) || \ - ((IT) == SPI_I2S_IT_OVR) || ((IT) == SPI_IT_MODF) || \ - ((IT) == SPI_I2S_IT_FRE)|| ((IT) == I2S_IT_UDR)) -/** - * @} - */ - - -/** @defgroup SPI_transmission_fifo_status_level - * @{ - */ - -#define SPI_TransmissionFIFOStatus_Empty ((uint16_t)0x0000) -#define SPI_TransmissionFIFOStatus_1QuarterFull ((uint16_t)0x0800) -#define SPI_TransmissionFIFOStatus_HalfFull ((uint16_t)0x1000) -#define SPI_TransmissionFIFOStatus_Full ((uint16_t)0x1800) - -/** - * @} - */ - -/** @defgroup SPI_reception_fifo_status_level - * @{ - */ -#define SPI_ReceptionFIFOStatus_Empty ((uint16_t)0x0000) -#define SPI_ReceptionFIFOStatus_1QuarterFull ((uint16_t)0x0200) -#define SPI_ReceptionFIFOStatus_HalfFull ((uint16_t)0x0400) -#define SPI_ReceptionFIFOStatus_Full ((uint16_t)0x0600) - -/** - * @} - */ - - -/** @defgroup SPI_I2S_flags_definition - * @{ - */ - -#define SPI_I2S_FLAG_RXNE SPI_SR_RXNE -#define SPI_I2S_FLAG_TXE SPI_SR_TXE -#define I2S_FLAG_CHSIDE SPI_SR_CHSIDE -#define I2S_FLAG_UDR SPI_SR_UDR -#define SPI_FLAG_CRCERR SPI_SR_CRCERR -#define SPI_FLAG_MODF SPI_SR_MODF -#define SPI_I2S_FLAG_OVR SPI_SR_OVR -#define SPI_I2S_FLAG_BSY SPI_SR_BSY -#define SPI_I2S_FLAG_FRE SPI_SR_FRE - - - -#define IS_SPI_CLEAR_FLAG(FLAG) (((FLAG) == SPI_FLAG_CRCERR)) -#define IS_SPI_I2S_GET_FLAG(FLAG) (((FLAG) == SPI_I2S_FLAG_BSY) || ((FLAG) == SPI_I2S_FLAG_OVR) || \ - ((FLAG) == SPI_FLAG_MODF) || ((FLAG) == SPI_FLAG_CRCERR) || \ - ((FLAG) == SPI_I2S_FLAG_TXE) || ((FLAG) == SPI_I2S_FLAG_RXNE)|| \ - ((FLAG) == SPI_I2S_FLAG_FRE)|| ((FLAG) == I2S_FLAG_CHSIDE)|| \ - ((FLAG) == I2S_FLAG_UDR)) -/** - * @} - */ - -/** @defgroup SPI_CRC_polynomial - * @{ - */ - -#define IS_SPI_CRC_POLYNOMIAL(POLYNOMIAL) ((POLYNOMIAL) >= 0x1) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Initialization and Configuration functions *********************************/ -void SPI_I2S_DeInit(SPI_TypeDef* SPIx); -void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct); -void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); /*!< Not applicable for STM32F030 devices */ -void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct); -void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct); /*!< Not applicable for STM32F030 devices */ -void SPI_TIModeCmd(SPI_TypeDef* SPIx, FunctionalState NewState); -void SPI_NSSPulseModeCmd(SPI_TypeDef* SPIx, FunctionalState NewState); -void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); -void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); /*!< Not applicable for STM32F030 devices */ -void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize); -void SPI_RxFIFOThresholdConfig(SPI_TypeDef* SPIx, uint16_t SPI_RxFIFOThreshold); -void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction); -void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft); -void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState); - -/* Data transfers functions ***************************************************/ -void SPI_SendData8(SPI_TypeDef* SPIx, uint8_t Data); -void SPI_I2S_SendData16(SPI_TypeDef* SPIx, uint16_t Data); -uint8_t SPI_ReceiveData8(SPI_TypeDef* SPIx); -uint16_t SPI_I2S_ReceiveData16(SPI_TypeDef* SPIx); - -/* Hardware CRC Calculation functions *****************************************/ -void SPI_CRCLengthConfig(SPI_TypeDef* SPIx, uint16_t SPI_CRCLength); -void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState); -void SPI_TransmitCRC(SPI_TypeDef* SPIx); -uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC); -uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx); - -/* DMA transfers management functions *****************************************/ -void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState); -void SPI_LastDMATransferCmd(SPI_TypeDef* SPIx, uint16_t SPI_LastDMATransfer); - -/* Interrupts and flags management functions **********************************/ -void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); -uint16_t SPI_GetTransmissionFIFOStatus(SPI_TypeDef* SPIx); -uint16_t SPI_GetReceptionFIFOStatus(SPI_TypeDef* SPIx); -FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); -void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); -ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F0XX_SPI_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_syscfg.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_syscfg.h deleted file mode 100644 index 1a1d566..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_syscfg.h +++ /dev/null @@ -1,262 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_syscfg.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the SYSCFG firmware - * library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/*!< Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_SYSCFG_H -#define __STM32F0XX_SYSCFG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/*!< Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup SYSCFG - * @{ - */ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup SYSCFG_Exported_Constants - * @{ - */ - -/** @defgroup SYSCFG_EXTI_Port_Sources - * @{ - */ -#define EXTI_PortSourceGPIOA ((uint8_t)0x00) -#define EXTI_PortSourceGPIOB ((uint8_t)0x01) -#define EXTI_PortSourceGPIOC ((uint8_t)0x02) -#define EXTI_PortSourceGPIOD ((uint8_t)0x03) /*!< not available for STM32F031 devices */ -#define EXTI_PortSourceGPIOE ((uint8_t)0x04) /*!< only available for STM32F072 devices */ -#define EXTI_PortSourceGPIOF ((uint8_t)0x05) - -#define IS_EXTI_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == EXTI_PortSourceGPIOA) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOB) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOC) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOD) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOE) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOF)) -/** - * @} - */ - -/** @defgroup SYSCFG_EXTI_Pin_sources - * @{ - */ -#define EXTI_PinSource0 ((uint8_t)0x00) -#define EXTI_PinSource1 ((uint8_t)0x01) -#define EXTI_PinSource2 ((uint8_t)0x02) -#define EXTI_PinSource3 ((uint8_t)0x03) -#define EXTI_PinSource4 ((uint8_t)0x04) -#define EXTI_PinSource5 ((uint8_t)0x05) -#define EXTI_PinSource6 ((uint8_t)0x06) -#define EXTI_PinSource7 ((uint8_t)0x07) -#define EXTI_PinSource8 ((uint8_t)0x08) -#define EXTI_PinSource9 ((uint8_t)0x09) -#define EXTI_PinSource10 ((uint8_t)0x0A) -#define EXTI_PinSource11 ((uint8_t)0x0B) -#define EXTI_PinSource12 ((uint8_t)0x0C) -#define EXTI_PinSource13 ((uint8_t)0x0D) -#define EXTI_PinSource14 ((uint8_t)0x0E) -#define EXTI_PinSource15 ((uint8_t)0x0F) - -#define IS_EXTI_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == EXTI_PinSource0) || \ - ((PINSOURCE) == EXTI_PinSource1) || \ - ((PINSOURCE) == EXTI_PinSource2) || \ - ((PINSOURCE) == EXTI_PinSource3) || \ - ((PINSOURCE) == EXTI_PinSource4) || \ - ((PINSOURCE) == EXTI_PinSource5) || \ - ((PINSOURCE) == EXTI_PinSource6) || \ - ((PINSOURCE) == EXTI_PinSource7) || \ - ((PINSOURCE) == EXTI_PinSource8) || \ - ((PINSOURCE) == EXTI_PinSource9) || \ - ((PINSOURCE) == EXTI_PinSource10) || \ - ((PINSOURCE) == EXTI_PinSource11) || \ - ((PINSOURCE) == EXTI_PinSource12) || \ - ((PINSOURCE) == EXTI_PinSource13) || \ - ((PINSOURCE) == EXTI_PinSource14) || \ - ((PINSOURCE) == EXTI_PinSource15)) -/** - * @} - */ - -/** @defgroup SYSCFG_Memory_Remap_Config - * @{ - */ -#define SYSCFG_MemoryRemap_Flash ((uint8_t)0x00) -#define SYSCFG_MemoryRemap_SystemMemory ((uint8_t)0x01) -#define SYSCFG_MemoryRemap_SRAM ((uint8_t)0x03) - - -#define IS_SYSCFG_MEMORY_REMAP(REMAP) (((REMAP) == SYSCFG_MemoryRemap_Flash) || \ - ((REMAP) == SYSCFG_MemoryRemap_SystemMemory) || \ - ((REMAP) == SYSCFG_MemoryRemap_SRAM)) - -/** - * @} - */ - -/** @defgroup SYSCFG_DMA_Remap_Config - * @{ - */ -#define SYSCFG_DMARemap_TIM3 SYSCFG_CFGR1_TIM3_DMA_RMP /* Remap TIM3 DMA requests from channel4 to channel6, - available only for STM32F072 devices */ -#define SYSCFG_DMARemap_TIM2 SYSCFG_CFGR1_TIM2_DMA_RMP /* Remap TIM2 DMA requests from channel3/4 to channel7, - available only for STM32F072 devices */ -#define SYSCFG_DMARemap_TIM1 SYSCFG_CFGR1_TIM1_DMA_RMP /* Remap TIM1 DMA requests from channel2/3/4 to channel6, - available only for STM32F072 devices */ -#define SYSCFG_DMARemap_I2C1 SYSCFG_CFGR1_I2C1_DMA_RMP /* Remap I2C1 DMA requests from channel3/2 to channel7/6, - available only for STM32F072 devices */ -#define SYSCFG_DMARemap_USART3 SYSCFG_CFGR1_USART3_DMA_RMP /* Remap USART3 DMA requests from channel6/7 to channel3/2, - available only for STM32F072 devices */ -#define SYSCFG_DMARemap_USART2 SYSCFG_CFGR1_USART2_DMA_RMP /* Remap USART2 DMA requests from channel4/5 to channel6/7, - available only for STM32F072 devices */ -#define SYSCFG_DMARemap_SPI2 SYSCFG_CFGR1_SPI2_DMA_RMP /* Remap SPI2 DMA requests from channel4/5 to channel6/7, - available only for STM32F072 devices */ -#define SYSCFG_DMARemap_TIM17_2 SYSCFG_CFGR1_TIM17_DMA_RMP2 /* Remap TIM17 DMA requests from channel1/2 to channel7, - available only for STM32F072 devices */ -#define SYSCFG_DMARemap_TIM16_2 SYSCFG_CFGR1_TIM16_DMA_RMP2 /* Remap TIM16 DMA requests from channel3/4 to channel6, - available only for STM32F072 devices */ -#define SYSCFG_DMARemap_TIM17 SYSCFG_CFGR1_TIM17_DMA_RMP /* Remap TIM17 DMA requests from channel1 to channel2 */ -#define SYSCFG_DMARemap_TIM16 SYSCFG_CFGR1_TIM16_DMA_RMP /* Remap TIM16 DMA requests from channel3 to channel4 */ -#define SYSCFG_DMARemap_USART1Rx SYSCFG_CFGR1_USART1RX_DMA_RMP /* Remap USART1 Rx DMA requests from channel3 to channel5 */ -#define SYSCFG_DMARemap_USART1Tx SYSCFG_CFGR1_USART1TX_DMA_RMP /* Remap USART1 Tx DMA requests from channel2 to channel4 */ -#define SYSCFG_DMARemap_ADC1 SYSCFG_CFGR1_ADC_DMA_RMP /* Remap ADC1 DMA requests from channel1 to channel2 */ - -#define IS_SYSCFG_DMA_REMAP(REMAP) (((REMAP) == SYSCFG_DMARemap_TIM17) || \ - ((REMAP) == SYSCFG_DMARemap_TIM16) || \ - ((REMAP) == SYSCFG_DMARemap_USART1Rx) || \ - ((REMAP) == SYSCFG_DMARemap_USART1Tx) || \ - ((REMAP) == SYSCFG_CFGR1_TIM3_DMA_RMP) || \ - ((REMAP) == SYSCFG_CFGR1_TIM2_DMA_RMP) || \ - ((REMAP) == SYSCFG_CFGR1_TIM1_DMA_RMP) || \ - ((REMAP) == SYSCFG_CFGR1_I2C1_DMA_RMP) || \ - ((REMAP) == SYSCFG_CFGR1_USART3_DMA_RMP) || \ - ((REMAP) == SYSCFG_CFGR1_USART2_DMA_RMP) || \ - ((REMAP) == SYSCFG_CFGR1_SPI2_DMA_RMP) || \ - ((REMAP) == SYSCFG_CFGR1_TIM17_DMA_RMP2) || \ - ((REMAP) == SYSCFG_CFGR1_TIM16_DMA_RMP2) || \ - ((REMAP) == SYSCFG_DMARemap_ADC1)) - -/** - * @} - */ - -/** @defgroup SYSCFG_I2C_FastModePlus_Config - * @{ - */ -#define SYSCFG_I2CFastModePlus_PB6 SYSCFG_CFGR1_I2C_FMP_PB6 /* Enable Fast Mode Plus on PB6 */ -#define SYSCFG_I2CFastModePlus_PB7 SYSCFG_CFGR1_I2C_FMP_PB7 /* Enable Fast Mode Plus on PB7 */ -#define SYSCFG_I2CFastModePlus_PB8 SYSCFG_CFGR1_I2C_FMP_PB8 /* Enable Fast Mode Plus on PB8 */ -#define SYSCFG_I2CFastModePlus_PB9 SYSCFG_CFGR1_I2C_FMP_PB9 /* Enable Fast Mode Plus on PB9 */ -#define SYSCFG_I2CFastModePlus_I2C1 SYSCFG_CFGR1_I2C_FMP_I2C1 /* Enable Fast Mode Plus on PB10, PB11, PF6 and PF7(only for STM32F0031 and STM32F030 devices) */ -#define SYSCFG_I2CFastModePlus_I2C2 SYSCFG_CFGR1_I2C_FMP_I2C2 /* Enable Fast Mode Plus on I2C2 pins, available only for STM32F072 devices */ -#define SYSCFG_I2CFastModePlus_PA9 SYSCFG_CFGR1_I2C_FMP_PA9 /* Enable Fast Mode Plus on PA9 (only for STM32F031 and STM32F030 devices) */ -#define SYSCFG_I2CFastModePlus_PA10 SYSCFG_CFGR1_I2C_FMP_PA10/* Enable Fast Mode Plus on PA10(only for STM32F031 and STM32F030 devices) */ - -#define IS_SYSCFG_I2C_FMP(PIN) (((PIN) == SYSCFG_I2CFastModePlus_PB6) || \ - ((PIN) == SYSCFG_I2CFastModePlus_PB7) || \ - ((PIN) == SYSCFG_I2CFastModePlus_PB8) || \ - ((PIN) == SYSCFG_I2CFastModePlus_PB9) || \ - ((PIN) == SYSCFG_I2CFastModePlus_I2C1) || \ - ((PIN) == SYSCFG_I2CFastModePlus_I2C2) || \ - ((PIN) == SYSCFG_I2CFastModePlus_PA9) || \ - ((PIN) == SYSCFG_I2CFastModePlus_PA10)) - - -/** - * @} - */ - -/** @defgroup SYSCFG_Lock_Config - * @{ - */ -#define SYSCFG_Break_PVD SYSCFG_CFGR2_PVD_LOCK /*!< Connects the PVD event to the Break Input of TIM1, not available for STM32F030 devices */ -#define SYSCFG_Break_SRAMParity SYSCFG_CFGR2_SRAM_PARITY_LOCK /*!< Connects the SRAM_PARITY error signal to the Break Input of TIM1 */ -#define SYSCFG_Break_Lockup SYSCFG_CFGR2_LOCKUP_LOCK /*!< Connects Lockup output of CortexM0 to the break input of TIM1 */ - -#define IS_SYSCFG_LOCK_CONFIG(CONFIG) (((CONFIG) == SYSCFG_Break_PVD) || \ - ((CONFIG) == SYSCFG_Break_SRAMParity) || \ - ((CONFIG) == SYSCFG_Break_Lockup)) - -/** - * @} - */ - -/** @defgroup SYSCFG_flags_definition - * @{ - */ - -#define SYSCFG_FLAG_PE SYSCFG_CFGR2_SRAM_PE - -#define IS_SYSCFG_FLAG(FLAG) (((FLAG) == SYSCFG_FLAG_PE)) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Function used to set the SYSCFG configuration to the default reset state **/ -void SYSCFG_DeInit(void); - -/* SYSCFG configuration functions *********************************************/ -void SYSCFG_MemoryRemapConfig(uint32_t SYSCFG_MemoryRemap); -void SYSCFG_DMAChannelRemapConfig(uint32_t SYSCFG_DMARemap, FunctionalState NewState); -void SYSCFG_I2CFastModePlusConfig(uint32_t SYSCFG_I2CFastModePlus, FunctionalState NewState); -void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex); -void SYSCFG_BreakConfig(uint32_t SYSCFG_Break); -FlagStatus SYSCFG_GetFlagStatus(uint32_t SYSCFG_Flag); -void SYSCFG_ClearFlag(uint32_t SYSCFG_Flag); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F0XX_SYSCFG_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_tim.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_tim.h deleted file mode 100644 index 1b7c745..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_tim.h +++ /dev/null @@ -1,1186 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_tim.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the TIM - * firmware library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_TIM_H -#define __STM32F0XX_TIM_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup TIM - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief TIM Time Base Init structure definition - * @note This sturcture is used with all TIMx. - */ - -typedef struct -{ - uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. - This parameter can be a number between 0x0000 and 0xFFFF */ - - uint16_t TIM_CounterMode; /*!< Specifies the counter mode. - This parameter can be a value of @ref TIM_Counter_Mode */ - - uint32_t TIM_Period; /*!< Specifies the period value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter must be a number between 0x0000 and 0xFFFF. */ - - uint16_t TIM_ClockDivision; /*!< Specifies the clock division. - This parameter can be a value of @ref TIM_Clock_Division_CKD */ - - uint8_t TIM_RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter - reaches zero, an update event is generated and counting restarts - from the RCR value (N). - This means in PWM mode that (N+1) corresponds to: - - the number of PWM periods in edge-aligned mode - - the number of half PWM period in center-aligned mode - This parameter must be a number between 0x00 and 0xFF. - @note This parameter is valid only for TIM1. */ -} TIM_TimeBaseInitTypeDef; - -/** - * @brief TIM Output Compare Init structure definition - */ - -typedef struct -{ - uint16_t TIM_OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint16_t TIM_OutputState; /*!< Specifies the TIM Output Compare state. - This parameter can be a value of @ref TIM_Output_Compare_state */ - - uint16_t TIM_OutputNState; /*!< Specifies the TIM complementary Output Compare state. - This parameter can be a value of @ref TIM_Output_Compare_N_state - @note This parameter is valid only for TIM1. */ - - uint32_t TIM_Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between 0x0000 and 0xFFFF ( or 0xFFFFFFFF - for TIM2) */ - - uint16_t TIM_OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint16_t TIM_OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for TIM1. */ - - uint16_t TIM_OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for TIM1. */ - - uint16_t TIM_OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for TIM1. */ -} TIM_OCInitTypeDef; - -/** - * @brief TIM Input Capture Init structure definition - */ - -typedef struct -{ - - uint16_t TIM_Channel; /*!< Specifies the TIM channel. - This parameter can be a value of @ref TIM_Channel */ - - uint16_t TIM_ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint16_t TIM_ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint16_t TIM_ICPrescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint16_t TIM_ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between 0x0 and 0xF */ -} TIM_ICInitTypeDef; - -/** - * @brief TIM_BDTR structure definition - * @note This sturcture is used only with TIM1. - */ - -typedef struct -{ - - uint16_t TIM_OSSRState; /*!< Specifies the Off-State selection used in Run mode. - This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ - - uint16_t TIM_OSSIState; /*!< Specifies the Off-State used in Idle state. - This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ - - uint16_t TIM_LOCKLevel; /*!< Specifies the LOCK level parameters. - This parameter can be a value of @ref TIM_Lock_level */ - - uint16_t TIM_DeadTime; /*!< Specifies the delay time between the switching-off and the - switching-on of the outputs. - This parameter can be a number between 0x00 and 0xFF */ - - uint16_t TIM_Break; /*!< Specifies whether the TIM Break input is enabled or not. - This parameter can be a value of @ref TIM_Break_Input_enable_disable */ - - uint16_t TIM_BreakPolarity; /*!< Specifies the TIM Break Input pin polarity. - This parameter can be a value of @ref TIM_Break_Polarity */ - - uint16_t TIM_AutomaticOutput; /*!< Specifies whether the TIM Automatic Output feature is enabled or not. - This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ -} TIM_BDTRInitTypeDef; - -/** - * @brief TIM Input Capture Init structure definition - */ - -/* Exported constants --------------------------------------------------------*/ - - -/** @defgroup TIM_Exported_constants - * @{ - */ - -#define IS_TIM_ALL_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM6) || \ - ((PERIPH) == TIM7) || \ - ((PERIPH) == TIM14)|| \ - ((PERIPH) == TIM15)|| \ - ((PERIPH) == TIM16)|| \ - ((PERIPH) == TIM17)) - -/* LIST1: TIM 1 */ -#define IS_TIM_LIST1_PERIPH(PERIPH) ((PERIPH) == TIM1) - -/* LIST2: TIM 1, 15, 16 and 17 */ -#define IS_TIM_LIST2_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM15)|| \ - ((PERIPH) == TIM16)|| \ - ((PERIPH) == TIM17)) - -/* LIST3: TIM 1, 2 and 3 */ -#define IS_TIM_LIST3_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3)) - -/* LIST4: TIM 1, 2, 3, 14, 15, 16 and 17 */ -#define IS_TIM_LIST4_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM14) || \ - ((PERIPH) == TIM15)|| \ - ((PERIPH) == TIM16)|| \ - ((PERIPH) == TIM17)) - -/* LIST5: TIM 1, 2, 3, 15, 16 and 17 */ -#define IS_TIM_LIST5_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM15)|| \ - ((PERIPH) == TIM16)|| \ - ((PERIPH) == TIM17)) - -/* LIST6: TIM 1, 2, 3 and 15 */ -#define IS_TIM_LIST6_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM15)) - -/* LIST7: TIM 1, 2, 3, 6, 7 and 14 */ -#define IS_TIM_LIST7_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM6) || \ - ((PERIPH) == TIM7) || \ - ((PERIPH) == TIM14)) - -/* LIST8: TIM 1, 2, 3 and 14 */ -#define IS_TIM_LIST8_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM14)) - -/* LIST9: TIM 1, 2, 3, 6, 7 and 15 */ -#define IS_TIM_LIST9_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM6) || \ - ((PERIPH) == TIM7) || \ - ((PERIPH) == TIM15)) - -/* LIST10: TIM 1, 2, 3, 6, 7, 15, 16 and 17 */ -#define IS_TIM_LIST10_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM6) || \ - ((PERIPH) == TIM7) || \ - ((PERIPH) == TIM15)|| \ - ((PERIPH) == TIM16)|| \ - ((PERIPH) == TIM17)) - -/* LIST1: TIM 11 */ -#define IS_TIM_LIST11_PERIPH(PERIPH) ((PERIPH) == TIM14) - - -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_and_PWM_modes - * @{ - */ - -#define TIM_OCMode_Timing ((uint16_t)0x0000) -#define TIM_OCMode_Active ((uint16_t)0x0010) -#define TIM_OCMode_Inactive ((uint16_t)0x0020) -#define TIM_OCMode_Toggle ((uint16_t)0x0030) -#define TIM_OCMode_PWM1 ((uint16_t)0x0060) -#define TIM_OCMode_PWM2 ((uint16_t)0x0070) -#define IS_TIM_OC_MODE(MODE) (((MODE) == TIM_OCMode_Timing) || \ - ((MODE) == TIM_OCMode_Active) || \ - ((MODE) == TIM_OCMode_Inactive) || \ - ((MODE) == TIM_OCMode_Toggle)|| \ - ((MODE) == TIM_OCMode_PWM1) || \ - ((MODE) == TIM_OCMode_PWM2)) -#define IS_TIM_OCM(MODE) (((MODE) == TIM_OCMode_Timing) || \ - ((MODE) == TIM_OCMode_Active) || \ - ((MODE) == TIM_OCMode_Inactive) || \ - ((MODE) == TIM_OCMode_Toggle)|| \ - ((MODE) == TIM_OCMode_PWM1) || \ - ((MODE) == TIM_OCMode_PWM2) || \ - ((MODE) == TIM_ForcedAction_Active) || \ - ((MODE) == TIM_ForcedAction_InActive)) -/** - * @} - */ - -/** @defgroup TIM_One_Pulse_Mode - * @{ - */ - -#define TIM_OPMode_Single ((uint16_t)0x0008) -#define TIM_OPMode_Repetitive ((uint16_t)0x0000) -#define IS_TIM_OPM_MODE(MODE) (((MODE) == TIM_OPMode_Single) || \ - ((MODE) == TIM_OPMode_Repetitive)) -/** - * @} - */ - -/** @defgroup TIM_Channel - * @{ - */ - -#define TIM_Channel_1 ((uint16_t)0x0000) -#define TIM_Channel_2 ((uint16_t)0x0004) -#define TIM_Channel_3 ((uint16_t)0x0008) -#define TIM_Channel_4 ((uint16_t)0x000C) - -#define IS_TIM_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ - ((CHANNEL) == TIM_Channel_2) || \ - ((CHANNEL) == TIM_Channel_3) || \ - ((CHANNEL) == TIM_Channel_4)) -#define IS_TIM_COMPLEMENTARY_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ - ((CHANNEL) == TIM_Channel_2) || \ - ((CHANNEL) == TIM_Channel_3)) -#define IS_TIM_PWMI_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ - ((CHANNEL) == TIM_Channel_2)) - -/** - * @} - */ - -/** @defgroup TIM_Clock_Division_CKD - * @{ - */ - -#define TIM_CKD_DIV1 ((uint16_t)0x0000) -#define TIM_CKD_DIV2 ((uint16_t)0x0100) -#define TIM_CKD_DIV4 ((uint16_t)0x0200) -#define IS_TIM_CKD_DIV(DIV) (((DIV) == TIM_CKD_DIV1) || \ - ((DIV) == TIM_CKD_DIV2) || \ - ((DIV) == TIM_CKD_DIV4)) -/** - * @} - */ - -/** @defgroup TIM_Counter_Mode - * @{ - */ - -#define TIM_CounterMode_Up ((uint16_t)0x0000) -#define TIM_CounterMode_Down ((uint16_t)0x0010) -#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) -#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) -#define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) -#define IS_TIM_COUNTER_MODE(MODE) (((MODE) == TIM_CounterMode_Up) || \ - ((MODE) == TIM_CounterMode_Down) || \ - ((MODE) == TIM_CounterMode_CenterAligned1) || \ - ((MODE) == TIM_CounterMode_CenterAligned2) || \ - ((MODE) == TIM_CounterMode_CenterAligned3)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Polarity - * @{ - */ - -#define TIM_OCPolarity_High ((uint16_t)0x0000) -#define TIM_OCPolarity_Low ((uint16_t)0x0002) -#define IS_TIM_OC_POLARITY(POLARITY) (((POLARITY) == TIM_OCPolarity_High) || \ - ((POLARITY) == TIM_OCPolarity_Low)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Polarity - * @{ - */ - -#define TIM_OCNPolarity_High ((uint16_t)0x0000) -#define TIM_OCNPolarity_Low ((uint16_t)0x0008) -#define IS_TIM_OCN_POLARITY(POLARITY) (((POLARITY) == TIM_OCNPolarity_High) || \ - ((POLARITY) == TIM_OCNPolarity_Low)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_state - * @{ - */ - -#define TIM_OutputState_Disable ((uint16_t)0x0000) -#define TIM_OutputState_Enable ((uint16_t)0x0001) -#define IS_TIM_OUTPUT_STATE(STATE) (((STATE) == TIM_OutputState_Disable) || \ - ((STATE) == TIM_OutputState_Enable)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_state - * @{ - */ - -#define TIM_OutputNState_Disable ((uint16_t)0x0000) -#define TIM_OutputNState_Enable ((uint16_t)0x0004) -#define IS_TIM_OUTPUTN_STATE(STATE) (((STATE) == TIM_OutputNState_Disable) || \ - ((STATE) == TIM_OutputNState_Enable)) -/** - * @} - */ - -/** @defgroup TIM_Capture_Compare_state - * @{ - */ - -#define TIM_CCx_Enable ((uint16_t)0x0001) -#define TIM_CCx_Disable ((uint16_t)0x0000) -#define IS_TIM_CCX(CCX) (((CCX) == TIM_CCx_Enable) || \ - ((CCX) == TIM_CCx_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Capture_Compare_N_state - * @{ - */ - -#define TIM_CCxN_Enable ((uint16_t)0x0004) -#define TIM_CCxN_Disable ((uint16_t)0x0000) -#define IS_TIM_CCXN(CCXN) (((CCXN) == TIM_CCxN_Enable) || \ - ((CCXN) == TIM_CCxN_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Break_Input_enable_disable - * @{ - */ - -#define TIM_Break_Enable ((uint16_t)0x1000) -#define TIM_Break_Disable ((uint16_t)0x0000) -#define IS_TIM_BREAK_STATE(STATE) (((STATE) == TIM_Break_Enable) || \ - ((STATE) == TIM_Break_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Break_Polarity - * @{ - */ - -#define TIM_BreakPolarity_Low ((uint16_t)0x0000) -#define TIM_BreakPolarity_High ((uint16_t)0x2000) -#define IS_TIM_BREAK_POLARITY(POLARITY) (((POLARITY) == TIM_BreakPolarity_Low) || \ - ((POLARITY) == TIM_BreakPolarity_High)) -/** - * @} - */ - -/** @defgroup TIM_AOE_Bit_Set_Reset - * @{ - */ - -#define TIM_AutomaticOutput_Enable ((uint16_t)0x4000) -#define TIM_AutomaticOutput_Disable ((uint16_t)0x0000) -#define IS_TIM_AUTOMATIC_OUTPUT_STATE(STATE) (((STATE) == TIM_AutomaticOutput_Enable) || \ - ((STATE) == TIM_AutomaticOutput_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Lock_level - * @{ - */ - -#define TIM_LOCKLevel_OFF ((uint16_t)0x0000) -#define TIM_LOCKLevel_1 ((uint16_t)0x0100) -#define TIM_LOCKLevel_2 ((uint16_t)0x0200) -#define TIM_LOCKLevel_3 ((uint16_t)0x0300) -#define IS_TIM_LOCK_LEVEL(LEVEL) (((LEVEL) == TIM_LOCKLevel_OFF) || \ - ((LEVEL) == TIM_LOCKLevel_1) || \ - ((LEVEL) == TIM_LOCKLevel_2) || \ - ((LEVEL) == TIM_LOCKLevel_3)) -/** - * @} - */ - -/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state - * @{ - */ - -#define TIM_OSSIState_Enable ((uint16_t)0x0400) -#define TIM_OSSIState_Disable ((uint16_t)0x0000) -#define IS_TIM_OSSI_STATE(STATE) (((STATE) == TIM_OSSIState_Enable) || \ - ((STATE) == TIM_OSSIState_Disable)) -/** - * @} - */ - -/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state - * @{ - */ - -#define TIM_OSSRState_Enable ((uint16_t)0x0800) -#define TIM_OSSRState_Disable ((uint16_t)0x0000) -#define IS_TIM_OSSR_STATE(STATE) (((STATE) == TIM_OSSRState_Enable) || \ - ((STATE) == TIM_OSSRState_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Idle_State - * @{ - */ - -#define TIM_OCIdleState_Set ((uint16_t)0x0100) -#define TIM_OCIdleState_Reset ((uint16_t)0x0000) -#define IS_TIM_OCIDLE_STATE(STATE) (((STATE) == TIM_OCIdleState_Set) || \ - ((STATE) == TIM_OCIdleState_Reset)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Idle_State - * @{ - */ - -#define TIM_OCNIdleState_Set ((uint16_t)0x0200) -#define TIM_OCNIdleState_Reset ((uint16_t)0x0000) -#define IS_TIM_OCNIDLE_STATE(STATE) (((STATE) == TIM_OCNIdleState_Set) || \ - ((STATE) == TIM_OCNIdleState_Reset)) -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Polarity - * @{ - */ - -#define TIM_ICPolarity_Rising ((uint16_t)0x0000) -#define TIM_ICPolarity_Falling ((uint16_t)0x0002) -#define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) -#define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || \ - ((POLARITY) == TIM_ICPolarity_Falling)|| \ - ((POLARITY) == TIM_ICPolarity_BothEdge)) -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Selection - * @{ - */ - -#define TIM_ICSelection_DirectTI ((uint16_t)0x0001) /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC1, IC2, IC3 or IC4, respectively */ -#define TIM_ICSelection_IndirectTI ((uint16_t)0x0002) /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC2, IC1, IC4 or IC3, respectively. */ -#define TIM_ICSelection_TRC ((uint16_t)0x0003) /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */ -#define IS_TIM_IC_SELECTION(SELECTION) (((SELECTION) == TIM_ICSelection_DirectTI) || \ - ((SELECTION) == TIM_ICSelection_IndirectTI) || \ - ((SELECTION) == TIM_ICSelection_TRC)) -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Prescaler - * @{ - */ - -#define TIM_ICPSC_DIV1 ((uint16_t)0x0000) /*!< Capture performed each time an edge is detected on the capture input. */ -#define TIM_ICPSC_DIV2 ((uint16_t)0x0004) /*!< Capture performed once every 2 events. */ -#define TIM_ICPSC_DIV4 ((uint16_t)0x0008) /*!< Capture performed once every 4 events. */ -#define TIM_ICPSC_DIV8 ((uint16_t)0x000C) /*!< Capture performed once every 8 events. */ -#define IS_TIM_IC_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ICPSC_DIV1) || \ - ((PRESCALER) == TIM_ICPSC_DIV2) || \ - ((PRESCALER) == TIM_ICPSC_DIV4) || \ - ((PRESCALER) == TIM_ICPSC_DIV8)) -/** - * @} - */ - -/** @defgroup TIM_interrupt_sources - * @{ - */ - -#define TIM_IT_Update ((uint16_t)0x0001) -#define TIM_IT_CC1 ((uint16_t)0x0002) -#define TIM_IT_CC2 ((uint16_t)0x0004) -#define TIM_IT_CC3 ((uint16_t)0x0008) -#define TIM_IT_CC4 ((uint16_t)0x0010) -#define TIM_IT_COM ((uint16_t)0x0020) -#define TIM_IT_Trigger ((uint16_t)0x0040) -#define TIM_IT_Break ((uint16_t)0x0080) -#define IS_TIM_IT(IT) ((((IT) & (uint16_t)0xFF00) == 0x0000) && ((IT) != 0x0000)) - -#define IS_TIM_GET_IT(IT) (((IT) == TIM_IT_Update) || \ - ((IT) == TIM_IT_CC1) || \ - ((IT) == TIM_IT_CC2) || \ - ((IT) == TIM_IT_CC3) || \ - ((IT) == TIM_IT_CC4) || \ - ((IT) == TIM_IT_COM) || \ - ((IT) == TIM_IT_Trigger) || \ - ((IT) == TIM_IT_Break)) -/** - * @} - */ - -/** @defgroup TIM_DMA_Base_address - * @{ - */ - -#define TIM_DMABase_CR1 ((uint16_t)0x0000) -#define TIM_DMABase_CR2 ((uint16_t)0x0001) -#define TIM_DMABase_SMCR ((uint16_t)0x0002) -#define TIM_DMABase_DIER ((uint16_t)0x0003) -#define TIM_DMABase_SR ((uint16_t)0x0004) -#define TIM_DMABase_EGR ((uint16_t)0x0005) -#define TIM_DMABase_CCMR1 ((uint16_t)0x0006) -#define TIM_DMABase_CCMR2 ((uint16_t)0x0007) -#define TIM_DMABase_CCER ((uint16_t)0x0008) -#define TIM_DMABase_CNT ((uint16_t)0x0009) -#define TIM_DMABase_PSC ((uint16_t)0x000A) -#define TIM_DMABase_ARR ((uint16_t)0x000B) -#define TIM_DMABase_RCR ((uint16_t)0x000C) -#define TIM_DMABase_CCR1 ((uint16_t)0x000D) -#define TIM_DMABase_CCR2 ((uint16_t)0x000E) -#define TIM_DMABase_CCR3 ((uint16_t)0x000F) -#define TIM_DMABase_CCR4 ((uint16_t)0x0010) -#define TIM_DMABase_BDTR ((uint16_t)0x0011) -#define TIM_DMABase_DCR ((uint16_t)0x0012) -#define TIM_DMABase_OR ((uint16_t)0x0013) -#define IS_TIM_DMA_BASE(BASE) (((BASE) == TIM_DMABase_CR1) || \ - ((BASE) == TIM_DMABase_CR2) || \ - ((BASE) == TIM_DMABase_SMCR) || \ - ((BASE) == TIM_DMABase_DIER) || \ - ((BASE) == TIM_DMABase_SR) || \ - ((BASE) == TIM_DMABase_EGR) || \ - ((BASE) == TIM_DMABase_CCMR1) || \ - ((BASE) == TIM_DMABase_CCMR2) || \ - ((BASE) == TIM_DMABase_CCER) || \ - ((BASE) == TIM_DMABase_CNT) || \ - ((BASE) == TIM_DMABase_PSC) || \ - ((BASE) == TIM_DMABase_ARR) || \ - ((BASE) == TIM_DMABase_RCR) || \ - ((BASE) == TIM_DMABase_CCR1) || \ - ((BASE) == TIM_DMABase_CCR2) || \ - ((BASE) == TIM_DMABase_CCR3) || \ - ((BASE) == TIM_DMABase_CCR4) || \ - ((BASE) == TIM_DMABase_BDTR) || \ - ((BASE) == TIM_DMABase_DCR) || \ - ((BASE) == TIM_DMABase_OR)) -/** - * @} - */ - - -/** @defgroup TIM_DMA_Burst_Length - * @{ - */ - -#define TIM_DMABurstLength_1Transfer ((uint16_t)0x0000) -#define TIM_DMABurstLength_2Transfers ((uint16_t)0x0100) -#define TIM_DMABurstLength_3Transfers ((uint16_t)0x0200) -#define TIM_DMABurstLength_4Transfers ((uint16_t)0x0300) -#define TIM_DMABurstLength_5Transfers ((uint16_t)0x0400) -#define TIM_DMABurstLength_6Transfers ((uint16_t)0x0500) -#define TIM_DMABurstLength_7Transfers ((uint16_t)0x0600) -#define TIM_DMABurstLength_8Transfers ((uint16_t)0x0700) -#define TIM_DMABurstLength_9Transfers ((uint16_t)0x0800) -#define TIM_DMABurstLength_10Transfers ((uint16_t)0x0900) -#define TIM_DMABurstLength_11Transfers ((uint16_t)0x0A00) -#define TIM_DMABurstLength_12Transfers ((uint16_t)0x0B00) -#define TIM_DMABurstLength_13Transfers ((uint16_t)0x0C00) -#define TIM_DMABurstLength_14Transfers ((uint16_t)0x0D00) -#define TIM_DMABurstLength_15Transfers ((uint16_t)0x0E00) -#define TIM_DMABurstLength_16Transfers ((uint16_t)0x0F00) -#define TIM_DMABurstLength_17Transfers ((uint16_t)0x1000) -#define TIM_DMABurstLength_18Transfers ((uint16_t)0x1100) -#define IS_TIM_DMA_LENGTH(LENGTH) (((LENGTH) == TIM_DMABurstLength_1Transfer) || \ - ((LENGTH) == TIM_DMABurstLength_2Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_3Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_4Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_5Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_6Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_7Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_8Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_9Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_10Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_11Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_12Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_13Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_14Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_15Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_16Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_17Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_18Transfers)) -/** - * @} - */ - -/** @defgroup TIM_DMA_sources - * @{ - */ - -#define TIM_DMA_Update ((uint16_t)0x0100) -#define TIM_DMA_CC1 ((uint16_t)0x0200) -#define TIM_DMA_CC2 ((uint16_t)0x0400) -#define TIM_DMA_CC3 ((uint16_t)0x0800) -#define TIM_DMA_CC4 ((uint16_t)0x1000) -#define TIM_DMA_COM ((uint16_t)0x2000) -#define TIM_DMA_Trigger ((uint16_t)0x4000) -#define IS_TIM_DMA_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0x80FF) == 0x0000) && ((SOURCE) != 0x0000)) - -/** - * @} - */ - -/** @defgroup TIM_External_Trigger_Prescaler - * @{ - */ - -#define TIM_ExtTRGPSC_OFF ((uint16_t)0x0000) -#define TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000) -#define TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000) -#define TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000) -#define IS_TIM_EXT_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ExtTRGPSC_OFF) || \ - ((PRESCALER) == TIM_ExtTRGPSC_DIV2) || \ - ((PRESCALER) == TIM_ExtTRGPSC_DIV4) || \ - ((PRESCALER) == TIM_ExtTRGPSC_DIV8)) -/** - * @} - */ - -/** @defgroup TIM_Internal_Trigger_Selection - * @{ - */ - -#define TIM_TS_ITR0 ((uint16_t)0x0000) -#define TIM_TS_ITR1 ((uint16_t)0x0010) -#define TIM_TS_ITR2 ((uint16_t)0x0020) -#define TIM_TS_ITR3 ((uint16_t)0x0030) -#define TIM_TS_TI1F_ED ((uint16_t)0x0040) -#define TIM_TS_TI1FP1 ((uint16_t)0x0050) -#define TIM_TS_TI2FP2 ((uint16_t)0x0060) -#define TIM_TS_ETRF ((uint16_t)0x0070) -#define IS_TIM_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ - ((SELECTION) == TIM_TS_ITR1) || \ - ((SELECTION) == TIM_TS_ITR2) || \ - ((SELECTION) == TIM_TS_ITR3) || \ - ((SELECTION) == TIM_TS_TI1F_ED) || \ - ((SELECTION) == TIM_TS_TI1FP1) || \ - ((SELECTION) == TIM_TS_TI2FP2) || \ - ((SELECTION) == TIM_TS_ETRF)) -#define IS_TIM_INTERNAL_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ - ((SELECTION) == TIM_TS_ITR1) || \ - ((SELECTION) == TIM_TS_ITR2) || \ - ((SELECTION) == TIM_TS_ITR3)) -/** - * @} - */ - -/** @defgroup TIM_TIx_External_Clock_Source - * @{ - */ - -#define TIM_TIxExternalCLK1Source_TI1 ((uint16_t)0x0050) -#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060) -#define TIM_TIxExternalCLK1Source_TI1ED ((uint16_t)0x0040) - -/** - * @} - */ - -/** @defgroup TIM_External_Trigger_Polarity - * @{ - */ -#define TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000) -#define TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000) -#define IS_TIM_EXT_POLARITY(POLARITY) (((POLARITY) == TIM_ExtTRGPolarity_Inverted) || \ - ((POLARITY) == TIM_ExtTRGPolarity_NonInverted)) -/** - * @} - */ - -/** @defgroup TIM_Prescaler_Reload_Mode - * @{ - */ - -#define TIM_PSCReloadMode_Update ((uint16_t)0x0000) -#define TIM_PSCReloadMode_Immediate ((uint16_t)0x0001) -#define IS_TIM_PRESCALER_RELOAD(RELOAD) (((RELOAD) == TIM_PSCReloadMode_Update) || \ - ((RELOAD) == TIM_PSCReloadMode_Immediate)) -/** - * @} - */ - -/** @defgroup TIM_Forced_Action - * @{ - */ - -#define TIM_ForcedAction_Active ((uint16_t)0x0050) -#define TIM_ForcedAction_InActive ((uint16_t)0x0040) -#define IS_TIM_FORCED_ACTION(ACTION) (((ACTION) == TIM_ForcedAction_Active) || \ - ((ACTION) == TIM_ForcedAction_InActive)) -/** - * @} - */ - -/** @defgroup TIM_Encoder_Mode - * @{ - */ - -#define TIM_EncoderMode_TI1 ((uint16_t)0x0001) -#define TIM_EncoderMode_TI2 ((uint16_t)0x0002) -#define TIM_EncoderMode_TI12 ((uint16_t)0x0003) -#define IS_TIM_ENCODER_MODE(MODE) (((MODE) == TIM_EncoderMode_TI1) || \ - ((MODE) == TIM_EncoderMode_TI2) || \ - ((MODE) == TIM_EncoderMode_TI12)) -/** - * @} - */ - - -/** @defgroup TIM_Event_Source - * @{ - */ - -#define TIM_EventSource_Update ((uint16_t)0x0001) -#define TIM_EventSource_CC1 ((uint16_t)0x0002) -#define TIM_EventSource_CC2 ((uint16_t)0x0004) -#define TIM_EventSource_CC3 ((uint16_t)0x0008) -#define TIM_EventSource_CC4 ((uint16_t)0x0010) -#define TIM_EventSource_COM ((uint16_t)0x0020) -#define TIM_EventSource_Trigger ((uint16_t)0x0040) -#define TIM_EventSource_Break ((uint16_t)0x0080) -#define IS_TIM_EVENT_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0xFF00) == 0x0000) && ((SOURCE) != 0x0000)) - -/** - * @} - */ - -/** @defgroup TIM_Update_Source - * @{ - */ - -#define TIM_UpdateSource_Global ((uint16_t)0x0000) /*!< Source of update is the counter overflow/underflow - or the setting of UG bit, or an update generation - through the slave mode controller. */ -#define TIM_UpdateSource_Regular ((uint16_t)0x0001) /*!< Source of update is counter overflow/underflow. */ -#define IS_TIM_UPDATE_SOURCE(SOURCE) (((SOURCE) == TIM_UpdateSource_Global) || \ - ((SOURCE) == TIM_UpdateSource_Regular)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Preload_State - * @{ - */ - -#define TIM_OCPreload_Enable ((uint16_t)0x0008) -#define TIM_OCPreload_Disable ((uint16_t)0x0000) -#define IS_TIM_OCPRELOAD_STATE(STATE) (((STATE) == TIM_OCPreload_Enable) || \ - ((STATE) == TIM_OCPreload_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Fast_State - * @{ - */ - -#define TIM_OCFast_Enable ((uint16_t)0x0004) -#define TIM_OCFast_Disable ((uint16_t)0x0000) -#define IS_TIM_OCFAST_STATE(STATE) (((STATE) == TIM_OCFast_Enable) || \ - ((STATE) == TIM_OCFast_Disable)) - -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Clear_State - * @{ - */ - -#define TIM_OCClear_Enable ((uint16_t)0x0080) -#define TIM_OCClear_Disable ((uint16_t)0x0000) -#define IS_TIM_OCCLEAR_STATE(STATE) (((STATE) == TIM_OCClear_Enable) || \ - ((STATE) == TIM_OCClear_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Trigger_Output_Source - * @{ - */ - -#define TIM_TRGOSource_Reset ((uint16_t)0x0000) -#define TIM_TRGOSource_Enable ((uint16_t)0x0010) -#define TIM_TRGOSource_Update ((uint16_t)0x0020) -#define TIM_TRGOSource_OC1 ((uint16_t)0x0030) -#define TIM_TRGOSource_OC1Ref ((uint16_t)0x0040) -#define TIM_TRGOSource_OC2Ref ((uint16_t)0x0050) -#define TIM_TRGOSource_OC3Ref ((uint16_t)0x0060) -#define TIM_TRGOSource_OC4Ref ((uint16_t)0x0070) -#define IS_TIM_TRGO_SOURCE(SOURCE) (((SOURCE) == TIM_TRGOSource_Reset) || \ - ((SOURCE) == TIM_TRGOSource_Enable) || \ - ((SOURCE) == TIM_TRGOSource_Update) || \ - ((SOURCE) == TIM_TRGOSource_OC1) || \ - ((SOURCE) == TIM_TRGOSource_OC1Ref) || \ - ((SOURCE) == TIM_TRGOSource_OC2Ref) || \ - ((SOURCE) == TIM_TRGOSource_OC3Ref) || \ - ((SOURCE) == TIM_TRGOSource_OC4Ref)) -/** - * @} - */ - -/** @defgroup TIM_Slave_Mode - * @{ - */ - -#define TIM_SlaveMode_Reset ((uint16_t)0x0004) -#define TIM_SlaveMode_Gated ((uint16_t)0x0005) -#define TIM_SlaveMode_Trigger ((uint16_t)0x0006) -#define TIM_SlaveMode_External1 ((uint16_t)0x0007) -#define IS_TIM_SLAVE_MODE(MODE) (((MODE) == TIM_SlaveMode_Reset) || \ - ((MODE) == TIM_SlaveMode_Gated) || \ - ((MODE) == TIM_SlaveMode_Trigger) || \ - ((MODE) == TIM_SlaveMode_External1)) -/** - * @} - */ - -/** @defgroup TIM_Master_Slave_Mode - * @{ - */ - -#define TIM_MasterSlaveMode_Enable ((uint16_t)0x0080) -#define TIM_MasterSlaveMode_Disable ((uint16_t)0x0000) -#define IS_TIM_MSM_STATE(STATE) (((STATE) == TIM_MasterSlaveMode_Enable) || \ - ((STATE) == TIM_MasterSlaveMode_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Flags - * @{ - */ - -#define TIM_FLAG_Update ((uint16_t)0x0001) -#define TIM_FLAG_CC1 ((uint16_t)0x0002) -#define TIM_FLAG_CC2 ((uint16_t)0x0004) -#define TIM_FLAG_CC3 ((uint16_t)0x0008) -#define TIM_FLAG_CC4 ((uint16_t)0x0010) -#define TIM_FLAG_COM ((uint16_t)0x0020) -#define TIM_FLAG_Trigger ((uint16_t)0x0040) -#define TIM_FLAG_Break ((uint16_t)0x0080) -#define TIM_FLAG_CC1OF ((uint16_t)0x0200) -#define TIM_FLAG_CC2OF ((uint16_t)0x0400) -#define TIM_FLAG_CC3OF ((uint16_t)0x0800) -#define TIM_FLAG_CC4OF ((uint16_t)0x1000) -#define IS_TIM_GET_FLAG(FLAG) (((FLAG) == TIM_FLAG_Update) || \ - ((FLAG) == TIM_FLAG_CC1) || \ - ((FLAG) == TIM_FLAG_CC2) || \ - ((FLAG) == TIM_FLAG_CC3) || \ - ((FLAG) == TIM_FLAG_CC4) || \ - ((FLAG) == TIM_FLAG_COM) || \ - ((FLAG) == TIM_FLAG_Trigger) || \ - ((FLAG) == TIM_FLAG_Break) || \ - ((FLAG) == TIM_FLAG_CC1OF) || \ - ((FLAG) == TIM_FLAG_CC2OF) || \ - ((FLAG) == TIM_FLAG_CC3OF) || \ - ((FLAG) == TIM_FLAG_CC4OF)) - - -#define IS_TIM_CLEAR_FLAG(TIM_FLAG) ((((TIM_FLAG) & (uint16_t)0xE100) == 0x0000) && ((TIM_FLAG) != 0x0000)) -/** - * @} - */ - - -/** @defgroup TIM_Input_Capture_Filer_Value - * @{ - */ - -#define IS_TIM_IC_FILTER(ICFILTER) ((ICFILTER) <= 0xF) -/** - * @} - */ - -/** @defgroup TIM_External_Trigger_Filter - * @{ - */ - -#define IS_TIM_EXT_FILTER(EXTFILTER) ((EXTFILTER) <= 0xF) -/** - * @} - */ - -/** @defgroup TIM_OCReferenceClear - * @{ - */ -#define TIM_OCReferenceClear_ETRF ((uint16_t)0x0008) -#define TIM_OCReferenceClear_OCREFCLR ((uint16_t)0x0000) -#define TIM_OCREFERENCECECLEAR_SOURCE(SOURCE) (((SOURCE) == TIM_OCReferenceClear_ETRF) || \ - ((SOURCE) == TIM_OCReferenceClear_OCREFCLR)) - -/** - * @} - */ -/** @defgroup TIM_Remap - * @{ - */ -#define TIM14_GPIO ((uint16_t)0x0000) -#define TIM14_RTC_CLK ((uint16_t)0x0001) -#define TIM14_HSEDiv32 ((uint16_t)0x0002) -#define TIM14_MCO ((uint16_t)0x0003) - -#define IS_TIM_REMAP(TIM_REMAP) (((TIM_REMAP) == TIM14_GPIO)|| \ - ((TIM_REMAP) == TIM14_RTC_CLK) || \ - ((TIM_REMAP) == TIM14_HSEDiv32) || \ - ((TIM_REMAP) == TIM14_MCO)) -/** - * @} - */ - -/** @defgroup TIM_Legacy - * @{ - */ - -#define TIM_DMABurstLength_1Byte TIM_DMABurstLength_1Transfer -#define TIM_DMABurstLength_2Bytes TIM_DMABurstLength_2Transfers -#define TIM_DMABurstLength_3Bytes TIM_DMABurstLength_3Transfers -#define TIM_DMABurstLength_4Bytes TIM_DMABurstLength_4Transfers -#define TIM_DMABurstLength_5Bytes TIM_DMABurstLength_5Transfers -#define TIM_DMABurstLength_6Bytes TIM_DMABurstLength_6Transfers -#define TIM_DMABurstLength_7Bytes TIM_DMABurstLength_7Transfers -#define TIM_DMABurstLength_8Bytes TIM_DMABurstLength_8Transfers -#define TIM_DMABurstLength_9Bytes TIM_DMABurstLength_9Transfers -#define TIM_DMABurstLength_10Bytes TIM_DMABurstLength_10Transfers -#define TIM_DMABurstLength_11Bytes TIM_DMABurstLength_11Transfers -#define TIM_DMABurstLength_12Bytes TIM_DMABurstLength_12Transfers -#define TIM_DMABurstLength_13Bytes TIM_DMABurstLength_13Transfers -#define TIM_DMABurstLength_14Bytes TIM_DMABurstLength_14Transfers -#define TIM_DMABurstLength_15Bytes TIM_DMABurstLength_15Transfers -#define TIM_DMABurstLength_16Bytes TIM_DMABurstLength_16Transfers -#define TIM_DMABurstLength_17Bytes TIM_DMABurstLength_17Transfers -#define TIM_DMABurstLength_18Bytes TIM_DMABurstLength_18Transfers -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* TimeBase management ********************************************************/ -void TIM_DeInit(TIM_TypeDef* TIMx); -void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); -void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); -void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode); -void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode); -void TIM_SetCounter(TIM_TypeDef* TIMx, uint32_t Counter); -void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint32_t Autoreload); -uint32_t TIM_GetCounter(TIM_TypeDef* TIMx); -uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx); -void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource); -void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode); -void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD); -void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); - -/* Advanced-control timers (TIM1) specific features*******************/ -void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct); -void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct); -void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState); - -/* Output Compare management **************************************************/ -void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode); -void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1); -void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare2); -void TIM_SetCompare3(TIM_TypeDef* TIMx, uint32_t Compare3); -void TIM_SetCompare4(TIM_TypeDef* TIMx, uint32_t Compare4); -void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); -void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); -void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); -void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_SelectOCREFClear(TIM_TypeDef* TIMx, uint16_t TIM_OCReferenceClear); -void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx); -void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN); -void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState); - -/* Input Capture management ***************************************************/ -void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); -void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct); -void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); -uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx); -uint32_t TIM_GetCapture2(TIM_TypeDef* TIMx); -uint32_t TIM_GetCapture3(TIM_TypeDef* TIMx); -uint32_t TIM_GetCapture4(TIM_TypeDef* TIMx); -void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); -void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); -void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); -void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); - -/* Interrupts, DMA and flags management ***************************************/ -void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); -void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource); -FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); -void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); -ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT); -void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT); -void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength); -void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState); -void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState); - -/* Clocks management **********************************************************/ -void TIM_InternalClockConfig(TIM_TypeDef* TIMx); -void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); -void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, - uint16_t TIM_ICPolarity, uint16_t ICFilter); -void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, - uint16_t ExtTRGFilter); -void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, - uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter); - - -/* Synchronization management *************************************************/ -void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); -void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource); -void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); -void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode); -void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, - uint16_t ExtTRGFilter); - -/* Specific interface management **********************************************/ -void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, - uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity); -void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState); - -/* Specific remapping management **********************************************/ -void TIM_RemapConfig(TIM_TypeDef* TIMx, uint16_t TIM_Remap); - - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F0XX_TIM_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_usart.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_usart.h deleted file mode 100644 index c9d170a..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_usart.h +++ /dev/null @@ -1,599 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_usart.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the USART - * firmware library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_USART_H -#define __STM32F0XX_USART_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup USART - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - - - -/** - * @brief USART Init Structure definition - */ - -typedef struct -{ - uint32_t USART_BaudRate; /*!< This member configures the USART communication baud rate. - The baud rate is computed using the following formula: - - IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate))) - - FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 16) + 0.5 */ - - uint32_t USART_WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. - This parameter can be a value of @ref USART_Word_Length */ - - uint32_t USART_StopBits; /*!< Specifies the number of stop bits transmitted. - This parameter can be a value of @ref USART_Stop_Bits */ - - uint32_t USART_Parity; /*!< Specifies the parity mode. - This parameter can be a value of @ref USART_Parity - @note When parity is enabled, the computed parity is inserted - at the MSB position of the transmitted data (9th bit when - the word length is set to 9 data bits; 8th bit when the - word length is set to 8 data bits). */ - - uint32_t USART_Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or disabled. - This parameter can be a value of @ref USART_Mode */ - - uint32_t USART_HardwareFlowControl; /*!< Specifies wether the hardware flow control mode is enabled - or disabled. - This parameter can be a value of @ref USART_Hardware_Flow_Control*/ -} USART_InitTypeDef; - -/** - * @brief USART Clock Init Structure definition - */ - -typedef struct -{ - uint32_t USART_Clock; /*!< Specifies whether the USART clock is enabled or disabled. - This parameter can be a value of @ref USART_Clock */ - - uint32_t USART_CPOL; /*!< Specifies the steady state of the serial clock. - This parameter can be a value of @ref USART_Clock_Polarity */ - - uint32_t USART_CPHA; /*!< Specifies the clock transition on which the bit capture is made. - This parameter can be a value of @ref USART_Clock_Phase */ - - uint32_t USART_LastBit; /*!< Specifies whether the clock pulse corresponding to the last transmitted - data bit (MSB) has to be output on the SCLK pin in synchronous mode. - This parameter can be a value of @ref USART_Last_Bit */ -} USART_ClockInitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup USART_Exported_Constants - * @{ - */ - -#define IS_USART_ALL_PERIPH(PERIPH) (((PERIPH) == USART1) || \ - ((PERIPH) == USART2) || \ - ((PERIPH) == USART3) || \ - ((PERIPH) == USART4)) - -#define IS_USART_12_PERIPH(PERIPH) (((PERIPH) == USART1) || \ - ((PERIPH) == USART2)) - -/** @defgroup USART_Word_Length - * @{ - */ - -#define USART_WordLength_8b ((uint32_t)0x00000000) -#define USART_WordLength_9b USART_CR1_M /* should be ((uint32_t)0x00001000) */ -#define USART_WordLength_7b ((uint32_t)0x10001000) /*!< only available for STM32F072 and STM32F030 devices */ -#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == USART_WordLength_8b) || \ - ((LENGTH) == USART_WordLength_9b) || \ - ((LENGTH) == USART_WordLength_7b)) -/** - * @} - */ - -/** @defgroup USART_Stop_Bits - * @{ - */ - -#define USART_StopBits_1 ((uint32_t)0x00000000) -#define USART_StopBits_2 USART_CR2_STOP_1 -#define USART_StopBits_1_5 (USART_CR2_STOP_0 | USART_CR2_STOP_1) -#define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == USART_StopBits_1) || \ - ((STOPBITS) == USART_StopBits_2) || \ - ((STOPBITS) == USART_StopBits_1_5)) -/** - * @} - */ - -/** @defgroup USART_Parity - * @{ - */ - -#define USART_Parity_No ((uint32_t)0x00000000) -#define USART_Parity_Even USART_CR1_PCE -#define USART_Parity_Odd (USART_CR1_PCE | USART_CR1_PS) -#define IS_USART_PARITY(PARITY) (((PARITY) == USART_Parity_No) || \ - ((PARITY) == USART_Parity_Even) || \ - ((PARITY) == USART_Parity_Odd)) -/** - * @} - */ - -/** @defgroup USART_Mode - * @{ - */ - -#define USART_Mode_Rx USART_CR1_RE -#define USART_Mode_Tx USART_CR1_TE -#define IS_USART_MODE(MODE) ((((MODE) & (uint32_t)0xFFFFFFF3) == 0x00) && \ - ((MODE) != (uint32_t)0x00)) -/** - * @} - */ - -/** @defgroup USART_Hardware_Flow_Control - * @{ - */ - -#define USART_HardwareFlowControl_None ((uint32_t)0x00000000) -#define USART_HardwareFlowControl_RTS USART_CR3_RTSE -#define USART_HardwareFlowControl_CTS USART_CR3_CTSE -#define USART_HardwareFlowControl_RTS_CTS (USART_CR3_RTSE | USART_CR3_CTSE) -#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\ - (((CONTROL) == USART_HardwareFlowControl_None) || \ - ((CONTROL) == USART_HardwareFlowControl_RTS) || \ - ((CONTROL) == USART_HardwareFlowControl_CTS) || \ - ((CONTROL) == USART_HardwareFlowControl_RTS_CTS)) -/** - * @} - */ - -/** @defgroup USART_Clock - * @{ - */ - -#define USART_Clock_Disable ((uint32_t)0x00000000) -#define USART_Clock_Enable USART_CR2_CLKEN -#define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_Clock_Disable) || \ - ((CLOCK) == USART_Clock_Enable)) -/** - * @} - */ - -/** @defgroup USART_Clock_Polarity - * @{ - */ - -#define USART_CPOL_Low ((uint32_t)0x00000000) -#define USART_CPOL_High USART_CR2_CPOL -#define IS_USART_CPOL(CPOL) (((CPOL) == USART_CPOL_Low) || ((CPOL) == USART_CPOL_High)) - -/** - * @} - */ - -/** @defgroup USART_Clock_Phase - * @{ - */ - -#define USART_CPHA_1Edge ((uint32_t)0x00000000) -#define USART_CPHA_2Edge USART_CR2_CPHA -#define IS_USART_CPHA(CPHA) (((CPHA) == USART_CPHA_1Edge) || ((CPHA) == USART_CPHA_2Edge)) - -/** - * @} - */ - -/** @defgroup USART_Last_Bit - * @{ - */ - -#define USART_LastBit_Disable ((uint32_t)0x00000000) -#define USART_LastBit_Enable USART_CR2_LBCL -#define IS_USART_LASTBIT(LASTBIT) (((LASTBIT) == USART_LastBit_Disable) || \ - ((LASTBIT) == USART_LastBit_Enable)) -/** - * @} - */ - -/** @defgroup USART_DMA_Requests - * @{ - */ - -#define USART_DMAReq_Tx USART_CR3_DMAT -#define USART_DMAReq_Rx USART_CR3_DMAR -#define IS_USART_DMAREQ(DMAREQ) ((((DMAREQ) & (uint32_t)0xFFFFFF3F) == 0x00) && \ - ((DMAREQ) != (uint32_t)0x00)) - -/** - * @} - */ - -/** @defgroup USART_DMA_Recception_Error - * @{ - */ - -#define USART_DMAOnError_Enable ((uint32_t)0x00000000) -#define USART_DMAOnError_Disable USART_CR3_DDRE -#define IS_USART_DMAONERROR(DMAERROR) (((DMAERROR) == USART_DMAOnError_Disable)|| \ - ((DMAERROR) == USART_DMAOnError_Enable)) -/** - * @} - */ - -/** @defgroup USART_MuteMode_WakeUp_methods - * @{ - */ - -#define USART_WakeUp_IdleLine ((uint32_t)0x00000000) -#define USART_WakeUp_AddressMark USART_CR1_WAKE -#define IS_USART_MUTEMODE_WAKEUP(WAKEUP) (((WAKEUP) == USART_WakeUp_IdleLine) || \ - ((WAKEUP) == USART_WakeUp_AddressMark)) -/** - * @} - */ - -/** @defgroup USART_Address_Detection - * @{ - */ - -#define USART_AddressLength_4b ((uint32_t)0x00000000) -#define USART_AddressLength_7b USART_CR2_ADDM7 -#define IS_USART_ADDRESS_DETECTION(ADDRESS) (((ADDRESS) == USART_AddressLength_4b) || \ - ((ADDRESS) == USART_AddressLength_7b)) -/** - * @} - */ - -/** @defgroup USART_StopMode_WakeUp_methods - * @note These parameters are only available for STM32F051 and STM32F072 devices - * @{ - */ - -#define USART_WakeUpSource_AddressMatch ((uint32_t)0x00000000) -#define USART_WakeUpSource_StartBit USART_CR3_WUS_1 -#define USART_WakeUpSource_RXNE (USART_CR3_WUS_0 | USART_CR3_WUS_1) -#define IS_USART_STOPMODE_WAKEUPSOURCE(SOURCE) (((SOURCE) == USART_WakeUpSource_AddressMatch) || \ - ((SOURCE) == USART_WakeUpSource_StartBit) || \ - ((SOURCE) == USART_WakeUpSource_RXNE)) -/** - * @} - */ - -/** @defgroup USART_LIN_Break_Detection_Length - * @{ - */ - -#define USART_LINBreakDetectLength_10b ((uint32_t)0x00000000) -#define USART_LINBreakDetectLength_11b USART_CR2_LBDL -#define IS_USART_LIN_BREAK_DETECT_LENGTH(LENGTH) \ - (((LENGTH) == USART_LINBreakDetectLength_10b) || \ - ((LENGTH) == USART_LINBreakDetectLength_11b)) -/** - * @} - */ - -/** @defgroup USART_IrDA_Low_Power - * @{ - */ - -#define USART_IrDAMode_LowPower USART_CR3_IRLP -#define USART_IrDAMode_Normal ((uint32_t)0x00000000) -#define IS_USART_IRDA_MODE(MODE) (((MODE) == USART_IrDAMode_LowPower) || \ - ((MODE) == USART_IrDAMode_Normal)) -/** - * @} - */ - -/** @defgroup USART_DE_Polarity - * @{ - */ - -#define USART_DEPolarity_High ((uint32_t)0x00000000) -#define USART_DEPolarity_Low USART_CR3_DEP -#define IS_USART_DE_POLARITY(POLARITY) (((POLARITY) == USART_DEPolarity_Low) || \ - ((POLARITY) == USART_DEPolarity_High)) -/** - * @} - */ - -/** @defgroup USART_Inversion_Pins - * @{ - */ - -#define USART_InvPin_Tx USART_CR2_TXINV -#define USART_InvPin_Rx USART_CR2_RXINV -#define IS_USART_INVERSTION_PIN(PIN) ((((PIN) & (uint32_t)0xFFFCFFFF) == 0x00) && \ - ((PIN) != (uint32_t)0x00)) - -/** - * @} - */ - -/** @defgroup USART_AutoBaudRate_Mode - * @{ - */ - -#define USART_AutoBaudRate_StartBit ((uint32_t)0x00000000) -#define USART_AutoBaudRate_FallingEdge USART_CR2_ABRMODE_0 -#define IS_USART_AUTOBAUDRATE_MODE(MODE) (((MODE) == USART_AutoBaudRate_StartBit) || \ - ((MODE) == USART_AutoBaudRate_FallingEdge)) -/** - * @} - */ - -/** @defgroup USART_OVR_DETECTION - * @{ - */ - -#define USART_OVRDetection_Enable ((uint32_t)0x00000000) -#define USART_OVRDetection_Disable USART_CR3_OVRDIS -#define IS_USART_OVRDETECTION(OVR) (((OVR) == USART_OVRDetection_Enable)|| \ - ((OVR) == USART_OVRDetection_Disable)) -/** - * @} - */ -/** @defgroup USART_Request - * @{ - */ - -#define USART_Request_ABRRQ USART_RQR_ABRRQ -#define USART_Request_SBKRQ USART_RQR_SBKRQ -#define USART_Request_MMRQ USART_RQR_MMRQ -#define USART_Request_RXFRQ USART_RQR_RXFRQ -#define USART_Request_TXFRQ USART_RQR_TXFRQ - -#define IS_USART_REQUEST(REQUEST) (((REQUEST) == USART_Request_TXFRQ) || \ - ((REQUEST) == USART_Request_RXFRQ) || \ - ((REQUEST) == USART_Request_MMRQ) || \ - ((REQUEST) == USART_Request_SBKRQ) || \ - ((REQUEST) == USART_Request_ABRRQ)) -/** - * @} - */ - -/** @defgroup USART_Flags - * @{ - */ -#define USART_FLAG_REACK USART_ISR_REACK -#define USART_FLAG_TEACK USART_ISR_TEACK -#define USART_FLAG_WU USART_ISR_WUF /*!< Not available for STM32F030 devices */ -#define USART_FLAG_RWU USART_ISR_RWU /*!< Not available for STM32F030 devices */ -#define USART_FLAG_SBK USART_ISR_SBKF -#define USART_FLAG_CM USART_ISR_CMF -#define USART_FLAG_BUSY USART_ISR_BUSY -#define USART_FLAG_ABRF USART_ISR_ABRF -#define USART_FLAG_ABRE USART_ISR_ABRE -#define USART_FLAG_EOB USART_ISR_EOBF /*!< Not available for STM32F030 devices */ -#define USART_FLAG_RTO USART_ISR_RTOF -#define USART_FLAG_nCTSS USART_ISR_CTS -#define USART_FLAG_CTS USART_ISR_CTSIF -#define USART_FLAG_LBD USART_ISR_LBD /*!< Not available for STM32F030 devices */ -#define USART_FLAG_TXE USART_ISR_TXE -#define USART_FLAG_TC USART_ISR_TC -#define USART_FLAG_RXNE USART_ISR_RXNE -#define USART_FLAG_IDLE USART_ISR_IDLE -#define USART_FLAG_ORE USART_ISR_ORE -#define USART_FLAG_NE USART_ISR_NE -#define USART_FLAG_FE USART_ISR_FE -#define USART_FLAG_PE USART_ISR_PE -#define IS_USART_FLAG(FLAG) (((FLAG) == USART_FLAG_PE) || ((FLAG) == USART_FLAG_TXE) || \ - ((FLAG) == USART_FLAG_TC) || ((FLAG) == USART_FLAG_RXNE) || \ - ((FLAG) == USART_FLAG_IDLE) || ((FLAG) == USART_FLAG_LBD) || \ - ((FLAG) == USART_FLAG_CTS) || ((FLAG) == USART_FLAG_ORE) || \ - ((FLAG) == USART_FLAG_NE) || ((FLAG) == USART_FLAG_FE) || \ - ((FLAG) == USART_FLAG_nCTSS) || ((FLAG) == USART_FLAG_RTO) || \ - ((FLAG) == USART_FLAG_EOB) || ((FLAG) == USART_FLAG_ABRE) || \ - ((FLAG) == USART_FLAG_ABRF) || ((FLAG) == USART_FLAG_BUSY) || \ - ((FLAG) == USART_FLAG_CM) || ((FLAG) == USART_FLAG_SBK) || \ - ((FLAG) == USART_FLAG_RWU) || ((FLAG) == USART_FLAG_WU) || \ - ((FLAG) == USART_FLAG_TEACK)|| ((FLAG) == USART_FLAG_REACK)) - -#define IS_USART_CLEAR_FLAG(FLAG) (((FLAG) == USART_FLAG_WU) || ((FLAG) == USART_FLAG_TC) || \ - ((FLAG) == USART_FLAG_IDLE) || ((FLAG) == USART_FLAG_ORE) || \ - ((FLAG) == USART_FLAG_NE) || ((FLAG) == USART_FLAG_FE) || \ - ((FLAG) == USART_FLAG_LBD) || ((FLAG) == USART_FLAG_CTS) || \ - ((FLAG) == USART_FLAG_RTO) || ((FLAG) == USART_FLAG_EOB) || \ - ((FLAG) == USART_FLAG_CM) || ((FLAG) == USART_FLAG_PE)) -/** - * @} - */ - -/** @defgroup USART_Interrupt_definition - * @brief USART Interrupt definition - * USART_IT possible values - * Elements values convention: 0xZZZZYYXX - * XX: Position of the corresponding Interrupt - * YY: Register index - * ZZZZ: Flag position - * @{ - */ - -#define USART_IT_WU ((uint32_t)0x00140316) /*!< Not available for STM32F030 devices */ -#define USART_IT_CM ((uint32_t)0x0011010E) -#define USART_IT_EOB ((uint32_t)0x000C011B) /*!< Not available for STM32F030 devices */ -#define USART_IT_RTO ((uint32_t)0x000B011A) -#define USART_IT_PE ((uint32_t)0x00000108) -#define USART_IT_TXE ((uint32_t)0x00070107) -#define USART_IT_TC ((uint32_t)0x00060106) -#define USART_IT_RXNE ((uint32_t)0x00050105) -#define USART_IT_IDLE ((uint32_t)0x00040104) -#define USART_IT_LBD ((uint32_t)0x00080206) /*!< Not available for STM32F030 devices */ -#define USART_IT_CTS ((uint32_t)0x0009030A) -#define USART_IT_ERR ((uint32_t)0x00000300) -#define USART_IT_ORE ((uint32_t)0x00030300) -#define USART_IT_NE ((uint32_t)0x00020300) -#define USART_IT_FE ((uint32_t)0x00010300) - -#define IS_USART_CONFIG_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ - ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ - ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ - ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ERR) || \ - ((IT) == USART_IT_RTO) || ((IT) == USART_IT_EOB) || \ - ((IT) == USART_IT_CM) || ((IT) == USART_IT_WU)) - -#define IS_USART_GET_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ - ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ - ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ - ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ORE) || \ - ((IT) == USART_IT_NE) || ((IT) == USART_IT_FE) || \ - ((IT) == USART_IT_RTO) || ((IT) == USART_IT_EOB) || \ - ((IT) == USART_IT_CM) || ((IT) == USART_IT_WU)) - -#define IS_USART_CLEAR_IT(IT) (((IT) == USART_IT_TC) || ((IT) == USART_IT_PE) || \ - ((IT) == USART_IT_FE) || ((IT) == USART_IT_NE) || \ - ((IT) == USART_IT_ORE) || ((IT) == USART_IT_IDLE) || \ - ((IT) == USART_IT_LBD) || ((IT) == USART_IT_CTS) || \ - ((IT) == USART_IT_RTO) || ((IT) == USART_IT_EOB) || \ - ((IT) == USART_IT_CM) || ((IT) == USART_IT_WU)) -/** - * @} - */ - -/** @defgroup USART_Global_definition - * @{ - */ - -#define IS_USART_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0) && ((BAUDRATE) < 0x005B8D81)) -#define IS_USART_DE_ASSERTION_DEASSERTION_TIME(TIME) ((TIME) <= 0x1F) -#define IS_USART_AUTO_RETRY_COUNTER(COUNTER) ((COUNTER) <= 0x7) -#define IS_USART_TIMEOUT(TIMEOUT) ((TIMEOUT) <= 0x00FFFFFF) -#define IS_USART_DATA(DATA) ((DATA) <= 0x1FF) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Initialization and Configuration functions *********************************/ -void USART_DeInit(USART_TypeDef* USARTx); -void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); -void USART_StructInit(USART_InitTypeDef* USART_InitStruct); -void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct); -void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct); -void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_DirectionModeCmd(USART_TypeDef* USARTx, uint32_t USART_DirectionMode, FunctionalState NewState); -void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler); /* Not available for STM32F030 devices */ -void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_MSBFirstCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_DataInvCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_InvPinCmd(USART_TypeDef* USARTx, uint32_t USART_InvPin, FunctionalState NewState); -void USART_SWAPPinCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_ReceiverTimeOutCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_SetReceiverTimeOut(USART_TypeDef* USARTx, uint32_t USART_ReceiverTimeOut); - -/* STOP Mode functions ********************************************************/ -void USART_STOPModeCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_StopModeWakeUpSourceConfig(USART_TypeDef* USARTx, uint32_t USART_WakeUpSource); /* Not available for STM32F030 devices */ - -/* AutoBaudRate functions *****************************************************/ -void USART_AutoBaudRateCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_AutoBaudRateConfig(USART_TypeDef* USARTx, uint32_t USART_AutoBaudRate); - -/* Data transfers functions ***************************************************/ -void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); -uint16_t USART_ReceiveData(USART_TypeDef* USARTx); - -/* Multi-Processor Communication functions ************************************/ -void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address); -void USART_MuteModeWakeUpConfig(USART_TypeDef* USARTx, uint32_t USART_WakeUp); -void USART_MuteModeCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_AddressDetectionConfig(USART_TypeDef* USARTx, uint32_t USART_AddressLength); - -/* LIN mode functions *********************************************************/ -void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint32_t USART_LINBreakDetectLength); /* Not available for STM32F030 devices */ -void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState); /* Not available for STM32F030 devices */ - -/* Half-duplex mode function **************************************************/ -void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState); - -/* Smartcard mode functions ***************************************************/ -void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState); /* Not available for STM32F030 devices */ -void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState); /* Not available for STM32F030 devices */ -void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime); /* Not available for STM32F030 devices */ -void USART_SetAutoRetryCount(USART_TypeDef* USARTx, uint8_t USART_AutoCount); /* Not available for STM32F030 devices */ -void USART_SetBlockLength(USART_TypeDef* USARTx, uint8_t USART_BlockLength); /* Not available for STM32F030 devices */ - -/* IrDA mode functions ********************************************************/ -void USART_IrDAConfig(USART_TypeDef* USARTx, uint32_t USART_IrDAMode); /* Not available for STM32F030 devices */ -void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState); /* Not available for STM32F030 devices */ - -/* RS485 mode functions *******************************************************/ -void USART_DECmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_DEPolarityConfig(USART_TypeDef* USARTx, uint32_t USART_DEPolarity); -void USART_SetDEAssertionTime(USART_TypeDef* USARTx, uint32_t USART_DEAssertionTime); -void USART_SetDEDeassertionTime(USART_TypeDef* USARTx, uint32_t USART_DEDeassertionTime); - -/* DMA transfers management functions *****************************************/ -void USART_DMACmd(USART_TypeDef* USARTx, uint32_t USART_DMAReq, FunctionalState NewState); -void USART_DMAReceptionErrorConfig(USART_TypeDef* USARTx, uint32_t USART_DMAOnError); - -/* Interrupts and flags management functions **********************************/ -void USART_ITConfig(USART_TypeDef* USARTx, uint32_t USART_IT, FunctionalState NewState); -void USART_RequestCmd(USART_TypeDef* USARTx, uint32_t USART_Request, FunctionalState NewState); -void USART_OverrunDetectionConfig(USART_TypeDef* USARTx, uint32_t USART_OVRDetection); -FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint32_t USART_FLAG); -void USART_ClearFlag(USART_TypeDef* USARTx, uint32_t USART_FLAG); -ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint32_t USART_IT); -void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint32_t USART_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_USART_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_wwdg.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_wwdg.h deleted file mode 100644 index 49defe5..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/inc/stm32f0xx_wwdg.h +++ /dev/null @@ -1,109 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_wwdg.h - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file contains all the functions prototypes for the WWDG - * firmware library. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_WWDG_H -#define __STM32F0XX_WWDG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup WWDG - * @{ - */ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup WWDG_Exported_Constants - * @{ - */ - -/** @defgroup WWDG_Prescaler - * @{ - */ - -#define WWDG_Prescaler_1 ((uint32_t)0x00000000) -#define WWDG_Prescaler_2 ((uint32_t)0x00000080) -#define WWDG_Prescaler_4 ((uint32_t)0x00000100) -#define WWDG_Prescaler_8 ((uint32_t)0x00000180) -#define IS_WWDG_PRESCALER(PRESCALER) (((PRESCALER) == WWDG_Prescaler_1) || \ - ((PRESCALER) == WWDG_Prescaler_2) || \ - ((PRESCALER) == WWDG_Prescaler_4) || \ - ((PRESCALER) == WWDG_Prescaler_8)) -#define IS_WWDG_WINDOW_VALUE(VALUE) ((VALUE) <= 0x7F) -#define IS_WWDG_COUNTER(COUNTER) (((COUNTER) >= 0x40) && ((COUNTER) <= 0x7F)) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -/* Function used to set the WWDG configuration to the default reset state ****/ -void WWDG_DeInit(void); - -/* Prescaler, Refresh window and Counter configuration functions **************/ -void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); -void WWDG_SetWindowValue(uint8_t WindowValue); -void WWDG_EnableIT(void); -void WWDG_SetCounter(uint8_t Counter); - -/* WWDG activation functions **************************************************/ -void WWDG_Enable(uint8_t Counter); - -/* Interrupts and flags management functions **********************************/ -FlagStatus WWDG_GetFlagStatus(void); -void WWDG_ClearFlag(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F0XX_WWDG_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_adc.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_adc.c deleted file mode 100644 index 0a8c56d..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_adc.c +++ /dev/null @@ -1,1240 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_adc.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Analog to Digital Convertor (ADC) peripheral: - * + Initialization and Configuration - * + Power saving - * + Analog Watchdog configuration - * + Temperature Sensor, Vrefint (Internal Reference Voltage) and - * Vbat (Voltage battery) management - * + ADC Channels Configuration - * + ADC Channels DMA Configuration - * + Interrupts and flags management - * - * @verbatim -================================================================================ - ##### How to use this driver ##### -================================================================================ - [..] - (#) Enable the ADC interface clock using - RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); - (#) ADC pins configuration - (++) Enable the clock for the ADC GPIOs using the following function: - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOx, ENABLE); - (++) Configure these ADC pins in analog mode using GPIO_Init(); - (#) Configure the ADC conversion resolution, data alignment, external - trigger and edge, scan direction and Enable/Disable the continuous mode - using the ADC_Init() function. - (#) Activate the ADC peripheral using ADC_Cmd() function. - - *** ADC channels group configuration *** - ============================================ - [..] - (+) To configure the ADC channels features, use ADC_Init() and - ADC_ChannelConfig() functions. - (+) To activate the continuous mode, use the ADC_ContinuousModeCmd() - function. - (+) To activate the Discontinuous mode, use the ADC_DiscModeCmd() functions. - (+) To activate the overrun mode, use the ADC_OverrunModeCmd() functions. - (+) To activate the calibration mode, use the ADC_GetCalibrationFactor() functions. - (+) To read the ADC converted values, use the ADC_GetConversionValue() - function. - - *** DMA for ADC channels features configuration *** - ============================================================= - [..] - (+) To enable the DMA mode for ADC channels group, use the ADC_DMACmd() function. - (+) To configure the DMA transfer request, use ADC_DMARequestModeConfig() function. - - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_adc.h" -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup ADC - * @brief ADC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* ADC CFGR mask */ -#define CFGR1_CLEAR_MASK ((uint32_t)0xFFFFD203) - -/* Calibration time out */ -#define CALIBRATION_TIMEOUT ((uint32_t)0x0000F000) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup ADC_Private_Functions - * @{ - */ - -/** @defgroup ADC_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize and configure the ADC Prescaler - (+) ADC Conversion Resolution (12bit..6bit) - (+) ADC Continuous Conversion Mode (Continuous or Single conversion) - (+) External trigger Edge and source - (+) Converted data alignment (left or right) - (+) The direction in which the channels will be scanned in the sequence - (+) Enable or disable the ADC peripheral - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes ADC1 peripheral registers to their default reset values. - * @param ADCx: where x can be 1 to select the ADC peripheral. - * @retval None - */ -void ADC_DeInit(ADC_TypeDef* ADCx) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - - if(ADCx == ADC1) - { - /* Enable ADC1 reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE); - - /* Release ADC1 from reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE); - } -} - -/** - * @brief Initializes the ADCx peripheral according to the specified parameters - * in the ADC_InitStruct. - * @note This function is used to configure the global features of the ADC ( - * Resolution, Data Alignment, continuous mode activation, External - * trigger source and edge, Sequence Scan Direction). - * @param ADCx: where x can be 1 to select the ADC peripheral. - * @param ADC_InitStruct: pointer to an ADC_InitTypeDef structure that contains - * the configuration information for the specified ADC peripheral. - * @retval None - */ -void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_RESOLUTION(ADC_InitStruct->ADC_Resolution)); - assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode)); - assert_param(IS_ADC_EXT_TRIG_EDGE(ADC_InitStruct->ADC_ExternalTrigConvEdge)); - assert_param(IS_ADC_EXTERNAL_TRIG_CONV(ADC_InitStruct->ADC_ExternalTrigConv)); - assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign)); - assert_param(IS_ADC_SCAN_DIRECTION(ADC_InitStruct->ADC_ScanDirection)); - - /* Get the ADCx CFGR value */ - tmpreg = ADCx->CFGR1; - - /* Clear SCANDIR, RES[1:0], ALIGN, EXTSEL[2:0], EXTEN[1:0] and CONT bits */ - tmpreg &= CFGR1_CLEAR_MASK; - - /*---------------------------- ADCx CFGR Configuration ---------------------*/ - - /* Set RES[1:0] bits according to ADC_Resolution value */ - /* Set CONT bit according to ADC_ContinuousConvMode value */ - /* Set EXTEN[1:0] bits according to ADC_ExternalTrigConvEdge value */ - /* Set EXTSEL[2:0] bits according to ADC_ExternalTrigConv value */ - /* Set ALIGN bit according to ADC_DataAlign value */ - /* Set SCANDIR bit according to ADC_ScanDirection value */ - - tmpreg |= (uint32_t)(ADC_InitStruct->ADC_Resolution | ((uint32_t)(ADC_InitStruct->ADC_ContinuousConvMode) << 13) | - ADC_InitStruct->ADC_ExternalTrigConvEdge | ADC_InitStruct->ADC_ExternalTrigConv | - ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ScanDirection); - - /* Write to ADCx CFGR */ - ADCx->CFGR1 = tmpreg; -} - -/** - * @brief Fills each ADC_InitStruct member with its default value. - * @note This function is used to initialize the global features of the ADC ( - * Resolution, Data Alignment, continuous mode activation, External - * trigger source and edge, Sequence Scan Direction). - * @param ADC_InitStruct: pointer to an ADC_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct) -{ - /* Reset ADC init structure parameters values */ - /* Initialize the ADC_Resolution member */ - ADC_InitStruct->ADC_Resolution = ADC_Resolution_12b; - - /* Initialize the ADC_ContinuousConvMode member */ - ADC_InitStruct->ADC_ContinuousConvMode = DISABLE; - - /* Initialize the ADC_ExternalTrigConvEdge member */ - ADC_InitStruct->ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; - - /* Initialize the ADC_ExternalTrigConv member */ - ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO; - - /* Initialize the ADC_DataAlign member */ - ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right; - - /* Initialize the ADC_ScanDirection member */ - ADC_InitStruct->ADC_ScanDirection = ADC_ScanDirection_Upward; -} - -/** - * @brief Enables or disables the specified ADC peripheral. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param NewState: new state of the ADCx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Set the ADEN bit to Enable the ADC peripheral */ - ADCx->CR |= (uint32_t)ADC_CR_ADEN; - } - else - { - /* Set the ADDIS to Disable the ADC peripheral */ - ADCx->CR |= (uint32_t)ADC_CR_ADDIS; - } -} - -/** - * @brief Configure the ADC to either be clocked by the asynchronous clock(which is - * independent, the dedicated 14MHz clock) or the synchronous clock derived from - * the APB clock of the ADC bus interface divided by 2 or 4 - * @note This function can be called only when ADC is disabled. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param ADC_ClockMode: This parameter can be : - * @arg ADC_ClockMode_AsynClk: ADC clocked by the dedicated 14MHz clock - * @arg ADC_ClockMode_SynClkDiv2: ADC clocked by PCLK/2 - * @arg ADC_ClockMode_SynClkDiv4: ADC clocked by PCLK/4 - * @retval None - */ -void ADC_ClockModeConfig(ADC_TypeDef* ADCx, uint32_t ADC_ClockMode) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CLOCKMODE(ADC_ClockMode)); - - /* Configure the ADC Clock mode according to ADC_ClockMode */ - ADCx->CFGR2 = (uint32_t)ADC_ClockMode; - -} - -/** - * @brief Enables or disables the jitter when the ADC is clocked by PCLK div2 - * or div4 - * @note This function is obsolete and maintained for legacy purpose only. ADC_ClockModeConfig() - * function should be used instead. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param ADC_JitterOff: This parameter can be : - * @arg ADC_JitterOff_PCLKDiv2: Remove jitter when ADC is clocked by PLCK divided by 2 - * @arg ADC_JitterOff_PCLKDiv4: Remove jitter when ADC is clocked by PLCK divided by 4 - * @param NewState: new state of the ADCx jitter. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_JitterCmd(ADC_TypeDef* ADCx, uint32_t ADC_JitterOff, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_JITTEROFF(ADC_JitterOff)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Disable Jitter */ - ADCx->CFGR2 |= (uint32_t)ADC_JitterOff; - } - else - { - /* Enable Jitter */ - ADCx->CFGR2 &= (uint32_t)(~ADC_JitterOff); - } -} - -/** - * @} - */ - -/** @defgroup ADC_Group2 Power saving functions - * @brief Power saving functions - * -@verbatim - =============================================================================== - ##### Power saving functions ##### - =============================================================================== - [..] This section provides functions allowing to reduce power consumption. - [..] The two function must be combined to get the maximal benefits: - When the ADC frequency is higher than the CPU one, it is recommended to - (#) Enable the Auto Delayed Conversion mode : - ==> using ADC_WaitModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); - (#) Enable the power off in Delay phases : - ==> using ADC_AutoPowerOffCmd(ADC_TypeDef* ADCx, FunctionalState NewState); - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the ADC Power Off. - * @note ADC power-on and power-off can be managed by hardware to cut the - * consumption when the ADC is not converting. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @note The ADC can be powered down: - * - During the Auto delay phase: The ADC is powered on again at the end - * of the delay (until the previous data is read from the ADC data register). - * - During the ADC is waiting for a trigger event: The ADC is powered up - * at the next trigger event (when the conversion is started). - * @param NewState: new state of the ADCx power Off. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_AutoPowerOffCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the ADC Automatic Power-Off */ - ADCx->CFGR1 |= ADC_CFGR1_AUTOFF; - } - else - { - /* Disable the ADC Automatic Power-Off */ - ADCx->CFGR1 &= (uint32_t)~ADC_CFGR1_AUTOFF; - } -} - -/** - * @brief Enables or disables the Wait conversion mode. - * @note When the CPU clock is not fast enough to manage the data rate, a - * Hardware delay can be introduced between ADC conversions to reduce - * this data rate. - * @note The Hardware delay is inserted after each conversions and until the - * previous data is read from the ADC data register - * @note This is a way to automatically adapt the speed of the ADC to the speed - * of the system which will read the data. - * @note Any hardware triggers wich occur while a conversion is on going or - * while the automatic Delay is applied are ignored - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param NewState: new state of the ADCx Auto-Delay. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_WaitModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the ADC Automatic Delayed conversion */ - ADCx->CFGR1 |= ADC_CFGR1_WAIT; - } - else - { - /* Disable the ADC Automatic Delayed conversion */ - ADCx->CFGR1 &= (uint32_t)~ADC_CFGR1_WAIT; - } -} - -/** - * @} - */ - -/** @defgroup ADC_Group3 Analog Watchdog configuration functions - * @brief Analog Watchdog configuration functions - * -@verbatim - =============================================================================== - ##### Analog Watchdog configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to configure the Analog Watchdog - (AWD) feature in the ADC. - [..] A typical configuration Analog Watchdog is done following these steps : - (#) the ADC guarded channel(s) is (are) selected using the - ADC_AnalogWatchdogSingleChannelConfig() function. - (#) The Analog watchdog lower and higher threshold are configured using the - ADC_AnalogWatchdogThresholdsConfig() function. - (#) The Analog watchdog is enabled and configured to enable the check, on one - or more channels, using the ADC_AnalogWatchdogCmd() function. - (#) Enable the analog watchdog on the selected channel using - ADC_AnalogWatchdogSingleChannelCmd() function - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the analog watchdog - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param NewState: new state of the ADCx Analog Watchdog. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the ADC Analog Watchdog */ - ADCx->CFGR1 |= ADC_CFGR1_AWDEN; - } - else - { - /* Disable the ADC Analog Watchdog */ - ADCx->CFGR1 &= (uint32_t)~ADC_CFGR1_AWDEN; - } -} - -/** - * @brief Configures the high and low thresholds of the analog watchdog. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param HighThreshold: the ADC analog watchdog High threshold value. - * This parameter must be a 12bit value. - * @param LowThreshold: the ADC analog watchdog Low threshold value. - * This parameter must be a 12bit value. - * @retval None - */ -void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, - uint16_t LowThreshold) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_THRESHOLD(HighThreshold)); - assert_param(IS_ADC_THRESHOLD(LowThreshold)); - - /* Set the ADCx high and low threshold */ - ADCx->TR = LowThreshold | ((uint32_t)HighThreshold << 16); - -} - -/** - * @brief Configures the analog watchdog guarded single channel - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param ADC_AnalogWatchdog_Channel: the ADC channel to configure for the analog watchdog. - * This parameter can be one of the following values: - * @arg ADC_AnalogWatchdog_Channel_0: ADC Channel0 selected - * @arg ADC_AnalogWatchdog_Channel_1: ADC Channel1 selected - * @arg ADC_AnalogWatchdog_Channel_2: ADC Channel2 selected - * @arg ADC_AnalogWatchdog_Channel_3: ADC Channel3 selected - * @arg ADC_AnalogWatchdog_Channel_4: ADC Channel4 selected - * @arg ADC_AnalogWatchdog_Channel_5: ADC Channel5 selected - * @arg ADC_AnalogWatchdog_Channel_6: ADC Channel6 selected - * @arg ADC_AnalogWatchdog_Channel_7: ADC Channel7 selected - * @arg ADC_AnalogWatchdog_Channel_8: ADC Channel8 selected - * @arg ADC_AnalogWatchdog_Channel_9: ADC Channel9 selected - * @arg ADC_AnalogWatchdog_Channel_10: ADC Channel10 selected, not available for STM32F031 devices - * @arg ADC_AnalogWatchdog_Channel_11: ADC Channel11 selected, not available for STM32F031 devices - * @arg ADC_AnalogWatchdog_Channel_12: ADC Channel12 selected, not available for STM32F031 devices - * @arg ADC_AnalogWatchdog_Channel_13: ADC Channel13 selected, not available for STM32F031 devices - * @arg ADC_AnalogWatchdog_Channel_14: ADC Channel14 selected, not available for STM32F031 devices - * @arg ADC_AnalogWatchdog_Channel_15: ADC Channel15 selected, not available for STM32F031 devices - * @arg ADC_AnalogWatchdog_Channel_16: ADC Channel16 selected - * @arg ADC_AnalogWatchdog_Channel_17: ADC Channel17 selected - * @arg ADC_AnalogWatchdog_Channel_18: ADC Channel18 selected, not available for STM32F030 devices - * @note The channel selected on the AWDCH must be also set into the CHSELR - * register - * @retval None - */ -void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog_Channel) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_ANALOG_WATCHDOG_CHANNEL(ADC_AnalogWatchdog_Channel)); - - /* Get the old register value */ - tmpreg = ADCx->CFGR1; - - /* Clear the Analog watchdog channel select bits */ - tmpreg &= ~ADC_CFGR1_AWDCH; - - /* Set the Analog watchdog channel */ - tmpreg |= ADC_AnalogWatchdog_Channel; - - /* Store the new register value */ - ADCx->CFGR1 = tmpreg; -} - -/** - * @brief Enables or disables the ADC Analog Watchdog Single Channel. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param NewState: new state of the ADCx ADC Analog Watchdog Single Channel. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_AnalogWatchdogSingleChannelCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the ADC Analog Watchdog Single Channel */ - ADCx->CFGR1 |= ADC_CFGR1_AWDSGL; - } - else - { - /* Disable the ADC Analog Watchdog Single Channel */ - ADCx->CFGR1 &= (uint32_t)~ADC_CFGR1_AWDSGL; - } -} - -/** - * @} - */ - -/** @defgroup ADC_Group4 Temperature Sensor, Vrefint and Vbat management functions - * @brief Temperature Sensor, Vrefint and Vbat management functions - * -@verbatim - =============================================================================== - ##### Temperature Sensor, Vrefint and Vbat management function ##### - =============================================================================== - [..] This section provides a function allowing to enable/disable the internal - connections between the ADC and the Temperature Sensor, the Vrefint and - Vbat source. - - [..] A typical configuration to get the Temperature sensor, Vrefint and Vbat channels - voltages is done following these steps : - (#) Enable the internal connection of Temperature sensor, Vrefint or Vbat sources - with the ADC channels using ADC_TempSensorCmd(), ADC_VrefintCmd() or ADC_VbatCmd() - functions. - (#) select the ADC_Channel_16(Temperature sensor), ADC_Channel_17(Vrefint) - or ADC_Channel_18(Voltage battery) using ADC_ChannelConfig() function - (#) Get the voltage values, using ADC_GetConversionValue() function - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the temperature sensor channel. - * @param NewState: new state of the temperature sensor input channel. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_TempSensorCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the temperature sensor channel*/ - ADC->CCR |= (uint32_t)ADC_CCR_TSEN; - } - else - { - /* Disable the temperature sensor channel*/ - ADC->CCR &= (uint32_t)(~ADC_CCR_TSEN); - } -} - -/** - * @brief Enables or disables the Vrefint channel. - * @param NewState: new state of the Vref input channel. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_VrefintCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Vrefint channel*/ - ADC->CCR |= (uint32_t)ADC_CCR_VREFEN; - } - else - { - /* Disable the Vrefint channel*/ - ADC->CCR &= (uint32_t)(~ADC_CCR_VREFEN); - } -} - -/** - * @brief Enables or disables the Vbat channel. - * @note This feature is not applicable for STM32F030 devices. - * @param NewState: new state of the Vbat input channel. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_VbatCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Vbat channel*/ - ADC->CCR |= (uint32_t)ADC_CCR_VBATEN; - } - else - { - /* Disable the Vbat channel*/ - ADC->CCR &= (uint32_t)(~ADC_CCR_VBATEN); - } -} - -/** - * @} - */ - -/** @defgroup ADC_Group5 Channels Configuration functions - * @brief Channels Configuration functions - * -@verbatim - =============================================================================== - ##### Channels Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to manage the ADC channels, - it is composed of 3 sub sections : - (#) Configuration and management functions for ADC channels: This subsection - provides functions allowing to configure the ADC channels : - (++) Select the ADC channels - (++) Activate ADC Calibration - (++) Activate the Overrun Mode. - (++) Activate the Discontinuous Mode - (++) Activate the Continuous Mode. - (++) Configure the sampling time for each channel - (++) Select the conversion Trigger and Edge for ADC channels - (++) Select the scan direction. - -@@- Please Note that the following features for ADC channels are configurated - using the ADC_Init() function : - (+@@) Activate the Continuous Mode (can be also activated by ADC_OverrunModeCmd(). - (+@@) Select the conversion Trigger and Edge for ADC channels - (+@@) Select the scan direction. - (#) Control the ADC peripheral : This subsection permits to command the ADC: - (++) Stop or discard an on-going conversion (ADSTP command) - (++) Start the ADC conversion . - (#) Get the conversion data: This subsection provides an important function in - the ADC peripheral since it returns the converted data of the current - ADC channel. When the Conversion value is read, the EOC Flag is - automatically cleared. - -@endverbatim - * @{ - */ - -/** - * @brief Configures for the selected ADC and its sampling time. - * @param ADCx: where x can be 1 to select the ADC peripheral. - * @param ADC_Channel: the ADC channel to configure. - * This parameter can be any combination of the following values: - * @arg ADC_Channel_0: ADC Channel0 selected - * @arg ADC_Channel_1: ADC Channel1 selected - * @arg ADC_Channel_2: ADC Channel2 selected - * @arg ADC_Channel_3: ADC Channel3 selected - * @arg ADC_Channel_4: ADC Channel4 selected - * @arg ADC_Channel_5: ADC Channel5 selected - * @arg ADC_Channel_6: ADC Channel6 selected - * @arg ADC_Channel_7: ADC Channel7 selected - * @arg ADC_Channel_8: ADC Channel8 selected - * @arg ADC_Channel_9: ADC Channel9 selected - * @arg ADC_Channel_10: ADC Channel10 selected, not available for STM32F031 devices - * @arg ADC_Channel_11: ADC Channel11 selected, not available for STM32F031 devices - * @arg ADC_Channel_12: ADC Channel12 selected, not available for STM32F031 devices - * @arg ADC_Channel_13: ADC Channel13 selected, not available for STM32F031 devices - * @arg ADC_Channel_14: ADC Channel14 selected, not available for STM32F031 devices - * @arg ADC_Channel_15: ADC Channel15 selected, not available for STM32F031 devices - * @arg ADC_Channel_16: ADC Channel16 selected - * @arg ADC_Channel_17: ADC Channel17 selected - * @arg ADC_Channel_18: ADC Channel18 selected, not available for STM32F030 devices - * @param ADC_SampleTime: The sample time value to be set for the selected channel. - * This parameter can be one of the following values: - * @arg ADC_SampleTime_1_5Cycles: Sample time equal to 1.5 cycles - * @arg ADC_SampleTime_7_5Cycles: Sample time equal to 7.5 cycles - * @arg ADC_SampleTime_13_5Cycles: Sample time equal to 13.5 cycles - * @arg ADC_SampleTime_28_5Cycles: Sample time equal to 28.5 cycles - * @arg ADC_SampleTime_41_5Cycles: Sample time equal to 41.5 cycles - * @arg ADC_SampleTime_55_5Cycles: Sample time equal to 55.5 cycles - * @arg ADC_SampleTime_71_5Cycles: Sample time equal to 71.5 cycles - * @arg ADC_SampleTime_239_5Cycles: Sample time equal to 239.5 cycles - * @retval None - */ -void ADC_ChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_Channel, uint32_t ADC_SampleTime) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CHANNEL(ADC_Channel)); - assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); - - /* Configure the ADC Channel */ - ADCx->CHSELR |= (uint32_t)ADC_Channel; - - /* Clear the Sampling time Selection bits */ - tmpreg &= ~ADC_SMPR1_SMPR; - - /* Set the ADC Sampling Time register */ - tmpreg |= (uint32_t)ADC_SampleTime; - - /* Configure the ADC Sample time register */ - ADCx->SMPR = tmpreg ; -} - -/** - * @brief Enable the Continuous mode for the selected ADCx channels. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param NewState: new state of the Continuous mode. - * This parameter can be: ENABLE or DISABLE. - * @note It is not possible to have both discontinuous mode and continuous mode - * enabled. In this case (If DISCEN and CONT are Set), the ADC behaves - * as if continuous mode was disabled - * @retval None - */ -void ADC_ContinuousModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Continuous mode*/ - ADCx->CFGR1 |= (uint32_t)ADC_CFGR1_CONT; - } - else - { - /* Disable the Continuous mode */ - ADCx->CFGR1 &= (uint32_t)(~ADC_CFGR1_CONT); - } -} - -/** - * @brief Enable the discontinuous mode for the selected ADC channels. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param NewState: new state of the discontinuous mode. - * This parameter can be: ENABLE or DISABLE. - * @note It is not possible to have both discontinuous mode and continuous mode - * enabled. In this case (If DISCEN and CONT are Set), the ADC behaves - * as if continuous mode was disabled - * @retval None - */ -void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Discontinuous mode */ - ADCx->CFGR1 |= (uint32_t)ADC_CFGR1_DISCEN; - } - else - { - /* Disable the Discontinuous mode */ - ADCx->CFGR1 &= (uint32_t)(~ADC_CFGR1_DISCEN); - } -} - -/** - * @brief Enable the Overrun mode for the selected ADC channels. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param NewState: new state of the Overrun mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_OverrunModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Overrun mode */ - ADCx->CFGR1 |= (uint32_t)ADC_CFGR1_OVRMOD; - } - else - { - /* Disable the Overrun mode */ - ADCx->CFGR1 &= (uint32_t)(~ADC_CFGR1_OVRMOD); - } -} - -/** - * @brief Active the Calibration operation for the selected ADC. - * @note The Calibration can be initiated only when ADC is still in the - * reset configuration (ADEN must be equal to 0). - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @retval ADC Calibration factor - */ -uint32_t ADC_GetCalibrationFactor(ADC_TypeDef* ADCx) -{ - uint32_t tmpreg = 0, calibrationcounter = 0, calibrationstatus = 0; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - - /* Set the ADC calibartion */ - ADCx->CR |= (uint32_t)ADC_CR_ADCAL; - - /* Wait until no ADC calibration is completed */ - do - { - calibrationstatus = ADCx->CR & ADC_CR_ADCAL; - calibrationcounter++; - } while((calibrationcounter != CALIBRATION_TIMEOUT) && (calibrationstatus != 0x00)); - - if((uint32_t)(ADCx->CR & ADC_CR_ADCAL) == RESET) - { - /*Get the calibration factor from the ADC data register */ - tmpreg = ADCx->DR; - } - else - { - /* Error factor */ - tmpreg = 0x00000000; - } - return tmpreg; -} - -/** - * @brief Stop the on going conversions for the selected ADC. - * @note When ADSTP is set, any on going conversion is aborted, and the ADC - * data register is not updated with current conversion. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @retval None - */ -void ADC_StopOfConversion(ADC_TypeDef* ADCx) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - - ADCx->CR |= (uint32_t)ADC_CR_ADSTP; -} - -/** - * @brief Start Conversion for the selected ADC channels. - * @note In continuous mode, ADSTART is not cleared by hardware with the - * assertion of EOSEQ because the sequence is automatic relaunched - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @retval None - */ -void ADC_StartOfConversion(ADC_TypeDef* ADCx) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - - ADCx->CR |= (uint32_t)ADC_CR_ADSTART; -} - -/** - * @brief Returns the last ADCx conversion result data for ADC channel. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @retval The Data conversion value. - */ -uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - - /* Return the selected ADC conversion value */ - return (uint16_t) ADCx->DR; -} - -/** - * @} - */ - -/** @defgroup ADC_Group6 DMA Configuration functions - * @brief Regular Channels DMA Configuration functions - * -@verbatim - =============================================================================== - ##### DMA Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to configure the DMA for ADC hannels. - Since converted channel values are stored into a unique data register, - it is useful to use DMA for conversion of more than one channel. This - avoids the loss of the data already stored in the ADC Data register. - When the DMA mode is enabled (using the ADC_DMACmd() function), after each - conversion of a channel, a DMA request is generated. - - [..] Depending on the "DMA disable selection" configuration (using the - ADC_DMARequestModeConfig() function), at the end of the last DMA - transfer, two possibilities are allowed: - (+) No new DMA request is issued to the DMA controller (One Shot Mode) - (+) Requests can continue to be generated (Circular Mode). - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified ADC DMA request. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param NewState: new state of the selected ADC DMA transfer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected ADC DMA request */ - ADCx->CFGR1 |= (uint32_t)ADC_CFGR1_DMAEN; - } - else - { - /* Disable the selected ADC DMA request */ - ADCx->CFGR1 &= (uint32_t)(~ADC_CFGR1_DMAEN); - } -} - -/** - * @brief Enables or disables the ADC DMA request after last transfer (Single-ADC mode) - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param ADC_DMARequestMode: the ADC channel to configure. - * This parameter can be one of the following values: - * @arg ADC_DMAMode_OneShot: DMA One Shot Mode - * @arg ADC_DMAMode_Circular: DMA Circular Mode - * @retval None - */ -void ADC_DMARequestModeConfig(ADC_TypeDef* ADCx, uint32_t ADC_DMARequestMode) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - - ADCx->CFGR1 &= (uint32_t)~ADC_CFGR1_DMACFG; - ADCx->CFGR1 |= (uint32_t)ADC_DMARequestMode; -} - -/** - * @} - */ - -/** @defgroup ADC_Group7 Interrupts and flags management functions - * @brief Interrupts and flags management functions. - * -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== - [..] This section provides functions allowing to configure the ADC Interrupts - and get the status and clear flags and Interrupts pending bits. - - [..] The ADC provide 6 Interrupts sources and 11 Flags which can be divided into - 3 groups: - - *** Flags for ADC status *** - ====================================================== - [..] - (+)Flags : - (##) ADC_FLAG_ADRDY : This flag is set after the ADC has been enabled (bit ADEN=1) - and when the ADC reaches a state where it is ready to accept conversion requests - (##) ADC_FLAG_ADEN : This flag is set by software to enable the ADC. - The ADC will be effectively ready to operate once the ADRDY flag has been set. - (##) ADC_FLAG_ADDIS : This flag is cleared once the ADC is effectively - disabled. - (##) ADC_FLAG_ADSTART : This flag is cleared after the execution of - ADC_StopOfConversion() function, at the same time as the ADSTP bit is - cleared by hardware - (##) ADC_FLAG_ADSTP : This flag is cleared by hardware when the conversion - is effectively discarded and the ADC is ready to accept a new start conversion - (##) ADC_FLAG_ADCAL : This flag is set once the calibration is complete. - - (+)Interrupts - (##) ADC_IT_ADRDY : specifies the interrupt source for ADC ready event. - - *** Flags and Interrupts for ADC channel conversion *** - ===================================================== - [..] - (+)Flags : - (##) ADC_FLAG_EOC : This flag is set by hardware at the end of each conversion - of a channel when a new data result is available in the data register - (##) ADC_FLAG_EOSEQ : This bit is set by hardware at the end of the conversion - of a sequence of channels selected by ADC_ChannelConfig() function. - (##) ADC_FLAG_EOSMP : This bit is set by hardware at the end of the sampling phase. - (##) ADC_FLAG_OVR : This flag is set by hardware when an overrun occurs, - meaning that a new conversion has complete while the EOC flag was already set. - - (+)Interrupts : - (##) ADC_IT_EOC : specifies the interrupt source for end of conversion event. - (##) ADC_IT_EOSEQ : specifies the interrupt source for end of sequence event. - (##) ADC_IT_EOSMP : specifies the interrupt source for end of sampling event. - (##) ADC_IT_OVR : specifies the interrupt source for Overrun detection - event. - - *** Flags and Interrupts for the Analog Watchdog *** - ================================================ - [..] - (+)Flags : - (##) ADC_FLAG_AWD: This flag is set by hardware when the converted - voltage crosses the values programmed thrsholds - - (+)Interrupts : - (##) ADC_IT_AWD : specifies the interrupt source for Analog watchdog - event. - - [..] The user should identify which mode will be used in his application to - manage the ADC controller events: Polling mode or Interrupt mode. - - [..] In the Polling Mode it is advised to use the following functions: - (+) ADC_GetFlagStatus() : to check if flags events occur. - (+) ADC_ClearFlag() : to clear the flags events. - - [..] In the Interrupt Mode it is advised to use the following functions: - (+) ADC_ITConfig() : to enable or disable the interrupt source. - (+) ADC_GetITStatus() : to check if Interrupt occurs. - (+) ADC_ClearITPendingBit() : to clear the Interrupt pending Bit - (corresponding Flag). - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified ADC interrupts. - * @param ADCx: where x can be 1 to select the ADC peripheral. - * @param ADC_IT: specifies the ADC interrupt sources to be enabled or disabled. - * This parameter can be one of the following values: - * @arg ADC_IT_ADRDY: ADC ready interrupt - * @arg ADC_IT_EOSMP: End of sampling interrupt - * @arg ADC_IT_EOC: End of conversion interrupt - * @arg ADC_IT_EOSEQ: End of sequence of conversion interrupt - * @arg ADC_IT_OVR: overrun interrupt - * @arg ADC_IT_AWD: Analog watchdog interrupt - * @param NewState: new state of the specified ADC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_ITConfig(ADC_TypeDef* ADCx, uint32_t ADC_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_ADC_CONFIG_IT(ADC_IT)); - - if (NewState != DISABLE) - { - /* Enable the selected ADC interrupts */ - ADCx->IER |= ADC_IT; - } - else - { - /* Disable the selected ADC interrupts */ - ADCx->IER &= (~(uint32_t)ADC_IT); - } -} - -/** - * @brief Checks whether the specified ADC flag is set or not. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param ADC_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg ADC_FLAG_AWD: Analog watchdog flag - * @arg ADC_FLAG_OVR: Overrun flag - * @arg ADC_FLAG_EOSEQ: End of Sequence flag - * @arg ADC_FLAG_EOC: End of conversion flag - * @arg ADC_FLAG_EOSMP: End of sampling flag - * @arg ADC_FLAG_ADRDY: ADC Ready flag - * @arg ADC_FLAG_ADEN: ADC enable flag - * @arg ADC_FLAG_ADDIS: ADC disable flag - * @arg ADC_FLAG_ADSTART: ADC start flag - * @arg ADC_FLAG_ADSTP: ADC stop flag - * @arg ADC_FLAG_ADCAL: ADC Calibration flag - * @retval The new state of ADC_FLAG (SET or RESET). - */ -FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint32_t ADC_FLAG) -{ - FlagStatus bitstatus = RESET; - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_GET_FLAG(ADC_FLAG)); - - if((uint32_t)(ADC_FLAG & 0x01000000)) - { - tmpreg = ADCx->CR & 0xFEFFFFFF; - } - else - { - tmpreg = ADCx->ISR; - } - - /* Check the status of the specified ADC flag */ - if ((tmpreg & ADC_FLAG) != (uint32_t)RESET) - { - /* ADC_FLAG is set */ - bitstatus = SET; - } - else - { - /* ADC_FLAG is reset */ - bitstatus = RESET; - } - /* Return the ADC_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the ADCx's pending flags. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param ADC_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg ADC_FLAG_AWD: Analog watchdog flag - * @arg ADC_FLAG_EOC: End of conversion flag - * @arg ADC_FLAG_ADRDY: ADC Ready flag - * @arg ADC_FLAG_EOSMP: End of sampling flag - * @arg ADC_FLAG_EOSEQ: End of Sequence flag - * @arg ADC_FLAG_OVR: Overrun flag - * @retval None - */ -void ADC_ClearFlag(ADC_TypeDef* ADCx, uint32_t ADC_FLAG) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CLEAR_FLAG(ADC_FLAG)); - - /* Clear the selected ADC flags */ - ADCx->ISR = (uint32_t)ADC_FLAG; -} - -/** - * @brief Checks whether the specified ADC interrupt has occurred or not. - * @param ADCx: where x can be 1 to select the ADC1 peripheral - * @param ADC_IT: specifies the ADC interrupt source to check. - * This parameter can be one of the following values: - * @arg ADC_IT_ADRDY: ADC ready interrupt - * @arg ADC_IT_EOSMP: End of sampling interrupt - * @arg ADC_IT_EOC: End of conversion interrupt - * @arg ADC_IT_EOSEQ: End of sequence of conversion interrupt - * @arg ADC_IT_OVR: overrun interrupt - * @arg ADC_IT_AWD: Analog watchdog interrupt - * @retval The new state of ADC_IT (SET or RESET). - */ -ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint32_t ADC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_GET_IT(ADC_IT)); - - /* Get the ADC_IT enable bit status */ - enablestatus = (uint32_t)(ADCx->IER & ADC_IT); - - /* Check the status of the specified ADC interrupt */ - if (((uint32_t)(ADCx->ISR & ADC_IT) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) - { - /* ADC_IT is set */ - bitstatus = SET; - } - else - { - /* ADC_IT is reset */ - bitstatus = RESET; - } - /* Return the ADC_IT status */ - return bitstatus; -} - -/** - * @brief Clears the ADCx's interrupt pending bits. - * @param ADCx: where x can be 1 to select the ADC1 peripheral. - * @param ADC_IT: specifies the ADC interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg ADC_IT_ADRDY: ADC ready interrupt - * @arg ADC_IT_EOSMP: End of sampling interrupt - * @arg ADC_IT_EOC: End of conversion interrupt - * @arg ADC_IT_EOSEQ: End of sequence of conversion interrupt - * @arg ADC_IT_OVR: overrun interrupt - * @arg ADC_IT_AWD: Analog watchdog interrupt - * @retval None - */ -void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint32_t ADC_IT) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CLEAR_IT(ADC_IT)); - - /* Clear the selected ADC interrupt pending bits */ - ADCx->ISR = (uint32_t)ADC_IT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_can.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_can.c deleted file mode 100644 index 7dcae51..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_can.c +++ /dev/null @@ -1,1631 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_can.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Controller area network (CAN) peripheral and - * applicable only for STM32F072 devices : - * + Initialization and Configuration - * + CAN Frames Transmission - * + CAN Frames Reception - * + Operation modes switch - * + Error management - * + Interrupts and flags - * - @verbatim - - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - (#) Enable the CAN controller interface clock using - RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE); - (#) CAN pins configuration: - (++) Enable the clock for the CAN GPIOs using the following function: - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOx, ENABLE); - (++) Connect the involved CAN pins to AF0 using the following function - GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_CANx); - (++) Configure these CAN pins in alternate function mode by calling - the function GPIO_Init(); - (#) Initialise and configure the CAN using CAN_Init() and - CAN_FilterInit() functions. - (#) Transmit the desired CAN frame using CAN_Transmit() function. - (#) Check the transmission of a CAN frame using CAN_TransmitStatus() function. - (#) Cancel the transmission of a CAN frame using CAN_CancelTransmit() function. - (#) Receive a CAN frame using CAN_Recieve() function. - (#) Release the receive FIFOs using CAN_FIFORelease() function. - (#) Return the number of pending received frames using CAN_MessagePending() function. - (#) To control CAN events you can use one of the following two methods: - (++) Check on CAN flags using the CAN_GetFlagStatus() function. - (++) Use CAN interrupts through the function CAN_ITConfig() at initialization - phase and CAN_GetITStatus() function into interrupt routines to check - if the event has occurred or not. - After checking on a flag you should clear it using CAN_ClearFlag() - function. And after checking on an interrupt event you should clear it - using CAN_ClearITPendingBit() function. - - @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_can.h" -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup CAN - * @brief CAN driver modules - * @{ - */ -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* CAN Master Control Register bits */ -#define MCR_DBF ((uint32_t)0x00010000) /* software master reset */ - -/* CAN Mailbox Transmit Request */ -#define TMIDxR_TXRQ ((uint32_t)0x00000001) /* Transmit mailbox request */ - -/* CAN Filter Master Register bits */ -#define FMR_FINIT ((uint32_t)0x00000001) /* Filter init mode */ - -/* Time out for INAK bit */ -#define INAK_TIMEOUT ((uint32_t)0x00FFFFFF) -/* Time out for SLAK bit */ -#define SLAK_TIMEOUT ((uint32_t)0x00FFFFFF) - -/* Flags in TSR register */ -#define CAN_FLAGS_TSR ((uint32_t)0x08000000) -/* Flags in RF1R register */ -#define CAN_FLAGS_RF1R ((uint32_t)0x04000000) -/* Flags in RF0R register */ -#define CAN_FLAGS_RF0R ((uint32_t)0x02000000) -/* Flags in MSR register */ -#define CAN_FLAGS_MSR ((uint32_t)0x01000000) -/* Flags in ESR register */ -#define CAN_FLAGS_ESR ((uint32_t)0x00F00000) - -/* Mailboxes definition */ -#define CAN_TXMAILBOX_0 ((uint8_t)0x00) -#define CAN_TXMAILBOX_1 ((uint8_t)0x01) -#define CAN_TXMAILBOX_2 ((uint8_t)0x02) - -#define CAN_MODE_MASK ((uint32_t) 0x00000003) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit); - -/** @defgroup CAN_Private_Functions - * @{ - */ - -/** @defgroup CAN_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize the CAN peripherals : Prescaler, operating mode, the maximum - number of time quanta to perform resynchronization, the number of time - quanta in Bit Segment 1 and 2 and many other modes. - (+) Configure the CAN reception filter. - (+) Select the start bank filter for slave CAN. - (+) Enable or disable the Debug Freeze mode for CAN. - (+) Enable or disable the CAN Time Trigger Operation communication mode. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the CAN peripheral registers to their default reset values. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @retval None. - */ -void CAN_DeInit(CAN_TypeDef* CANx) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Enable CAN reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN, ENABLE); - /* Release CAN from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN, DISABLE); -} - -/** - * @brief Initializes the CAN peripheral according to the specified - * parameters in the CAN_InitStruct. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure that contains - * the configuration information for the CAN peripheral. - * @retval Constant indicates initialization succeed which will be - * CAN_InitStatus_Failed or CAN_InitStatus_Success. - */ -uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct) -{ - uint8_t InitStatus = CAN_InitStatus_Failed; - uint32_t wait_ack = 0x00000000; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TTCM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_ABOM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_AWUM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_NART)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_RFLM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TXFP)); - assert_param(IS_CAN_MODE(CAN_InitStruct->CAN_Mode)); - assert_param(IS_CAN_SJW(CAN_InitStruct->CAN_SJW)); - assert_param(IS_CAN_BS1(CAN_InitStruct->CAN_BS1)); - assert_param(IS_CAN_BS2(CAN_InitStruct->CAN_BS2)); - assert_param(IS_CAN_PRESCALER(CAN_InitStruct->CAN_Prescaler)); - - /* Exit from sleep mode */ - CANx->MCR &= (~(uint32_t)CAN_MCR_SLEEP); - - /* Request initialisation */ - CANx->MCR |= CAN_MCR_INRQ ; - - /* Wait the acknowledge */ - while (((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT)) - { - wait_ack++; - } - - /* Check acknowledge */ - if ((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) - { - InitStatus = CAN_InitStatus_Failed; - } - else - { - /* Set the time triggered communication mode */ - if (CAN_InitStruct->CAN_TTCM == ENABLE) - { - CANx->MCR |= CAN_MCR_TTCM; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_TTCM; - } - - /* Set the automatic bus-off management */ - if (CAN_InitStruct->CAN_ABOM == ENABLE) - { - CANx->MCR |= CAN_MCR_ABOM; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_ABOM; - } - - /* Set the automatic wake-up mode */ - if (CAN_InitStruct->CAN_AWUM == ENABLE) - { - CANx->MCR |= CAN_MCR_AWUM; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_AWUM; - } - - /* Set the no automatic retransmission */ - if (CAN_InitStruct->CAN_NART == ENABLE) - { - CANx->MCR |= CAN_MCR_NART; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_NART; - } - - /* Set the receive FIFO locked mode */ - if (CAN_InitStruct->CAN_RFLM == ENABLE) - { - CANx->MCR |= CAN_MCR_RFLM; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_RFLM; - } - - /* Set the transmit FIFO priority */ - if (CAN_InitStruct->CAN_TXFP == ENABLE) - { - CANx->MCR |= CAN_MCR_TXFP; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_TXFP; - } - - /* Set the bit timing register */ - CANx->BTR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | \ - ((uint32_t)CAN_InitStruct->CAN_SJW << 24) | \ - ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | \ - ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) | \ - ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1); - - /* Request leave initialisation */ - CANx->MCR &= ~(uint32_t)CAN_MCR_INRQ; - - /* Wait the acknowledge */ - wait_ack = 0; - - while (((CANx->MSR & CAN_MSR_INAK) == (uint16_t)CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT)) - { - wait_ack++; - } - - /* ...and check acknowledged */ - if ((CANx->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) - { - InitStatus = CAN_InitStatus_Failed; - } - else - { - InitStatus = CAN_InitStatus_Success ; - } - } - - /* At this step, return the status of initialization */ - return InitStatus; -} - -/** - * @brief Configures the CAN reception filter according to the specified - * parameters in the CAN_FilterInitStruct. - * @param CAN_FilterInitStruct: pointer to a CAN_FilterInitTypeDef structure that - * contains the configuration information. - * @retval None - */ -void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct) -{ - uint32_t filter_number_bit_pos = 0; - /* Check the parameters */ - assert_param(IS_CAN_FILTER_NUMBER(CAN_FilterInitStruct->CAN_FilterNumber)); - assert_param(IS_CAN_FILTER_MODE(CAN_FilterInitStruct->CAN_FilterMode)); - assert_param(IS_CAN_FILTER_SCALE(CAN_FilterInitStruct->CAN_FilterScale)); - assert_param(IS_CAN_FILTER_FIFO(CAN_FilterInitStruct->CAN_FilterFIFOAssignment)); - assert_param(IS_FUNCTIONAL_STATE(CAN_FilterInitStruct->CAN_FilterActivation)); - - filter_number_bit_pos = ((uint32_t)1) << CAN_FilterInitStruct->CAN_FilterNumber; - - /* Initialisation mode for the filter */ - CAN->FMR |= FMR_FINIT; - - /* Filter Deactivation */ - CAN->FA1R &= ~(uint32_t)filter_number_bit_pos; - - /* Filter Scale */ - if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_16bit) - { - /* 16-bit scale for the filter */ - CAN->FS1R &= ~(uint32_t)filter_number_bit_pos; - - /* First 16-bit identifier and First 16-bit mask */ - /* Or First 16-bit identifier and Second 16-bit identifier */ - CAN->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); - - /* Second 16-bit identifier and Second 16-bit mask */ - /* Or Third 16-bit identifier and Fourth 16-bit identifier */ - CAN->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh); - } - - if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_32bit) - { - /* 32-bit scale for the filter */ - CAN->FS1R |= filter_number_bit_pos; - /* 32-bit identifier or First 32-bit identifier */ - CAN->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); - /* 32-bit mask or Second 32-bit identifier */ - CAN->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow); - } - - /* Filter Mode */ - if (CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdMask) - { - /*Id/Mask mode for the filter*/ - CAN->FM1R &= ~(uint32_t)filter_number_bit_pos; - } - else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */ - { - /*Identifier list mode for the filter*/ - CAN->FM1R |= (uint32_t)filter_number_bit_pos; - } - - /* Filter FIFO assignment */ - if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO0) - { - /* FIFO 0 assignation for the filter */ - CAN->FFA1R &= ~(uint32_t)filter_number_bit_pos; - } - - if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO1) - { - /* FIFO 1 assignation for the filter */ - CAN->FFA1R |= (uint32_t)filter_number_bit_pos; - } - - /* Filter activation */ - if (CAN_FilterInitStruct->CAN_FilterActivation == ENABLE) - { - CAN->FA1R |= filter_number_bit_pos; - } - - /* Leave the initialisation mode for the filter */ - CAN->FMR &= ~FMR_FINIT; -} - -/** - * @brief Fills each CAN_InitStruct member with its default value. - * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure which ill be initialized. - * @retval None - */ -void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct) -{ - /* Reset CAN init structure parameters values */ - - /* Initialize the time triggered communication mode */ - CAN_InitStruct->CAN_TTCM = DISABLE; - - /* Initialize the automatic bus-off management */ - CAN_InitStruct->CAN_ABOM = DISABLE; - - /* Initialize the automatic wake-up mode */ - CAN_InitStruct->CAN_AWUM = DISABLE; - - /* Initialize the no automatic retransmission */ - CAN_InitStruct->CAN_NART = DISABLE; - - /* Initialize the receive FIFO locked mode */ - CAN_InitStruct->CAN_RFLM = DISABLE; - - /* Initialize the transmit FIFO priority */ - CAN_InitStruct->CAN_TXFP = DISABLE; - - /* Initialize the CAN_Mode member */ - CAN_InitStruct->CAN_Mode = CAN_Mode_Normal; - - /* Initialize the CAN_SJW member */ - CAN_InitStruct->CAN_SJW = CAN_SJW_1tq; - - /* Initialize the CAN_BS1 member */ - CAN_InitStruct->CAN_BS1 = CAN_BS1_4tq; - - /* Initialize the CAN_BS2 member */ - CAN_InitStruct->CAN_BS2 = CAN_BS2_3tq; - - /* Initialize the CAN_Prescaler member */ - CAN_InitStruct->CAN_Prescaler = 1; -} - -/** - * @brief Select the start bank filter for slave CAN. - * @param CAN_BankNumber: Select the start slave bank filter from 1..27. - * @retval None - */ -void CAN_SlaveStartBank(uint8_t CAN_BankNumber) -{ - /* Check the parameters */ - assert_param(IS_CAN_BANKNUMBER(CAN_BankNumber)); - - /* Enter Initialisation mode for the filter */ - CAN->FMR |= FMR_FINIT; - - /* Select the start slave bank */ - CAN->FMR &= (uint32_t)0xFFFFC0F1 ; - CAN->FMR |= (uint32_t)(CAN_BankNumber)<<8; - - /* Leave Initialisation mode for the filter */ - CAN->FMR &= ~FMR_FINIT; -} - -/** - * @brief Enables or disables the DBG Freeze for CAN. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param NewState: new state of the CAN peripheral. - * This parameter can be: ENABLE (CAN reception/transmission is frozen - * during debug. Reception FIFOs can still be accessed/controlled normally) - * or DISABLE (CAN is working during debug). - * @retval None - */ -void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable Debug Freeze */ - CANx->MCR |= MCR_DBF; - } - else - { - /* Disable Debug Freeze */ - CANx->MCR &= ~MCR_DBF; - } -} - -/** - * @brief Enables or disables the CAN Time TriggerOperation communication mode. - * @note DLC must be programmed as 8 in order Time Stamp (2 bytes) to be - * sent over the CAN bus. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param NewState: Mode new state. This parameter can be: ENABLE or DISABLE. - * When enabled, Time stamp (TIME[15:0]) value is sent in the last two - * data bytes of the 8-byte message: TIME[7:0] in data byte 6 and TIME[15:8] - * in data byte 7. - * @retval None - */ -void CAN_TTComModeCmd(CAN_TypeDef* CANx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the TTCM mode */ - CANx->MCR |= CAN_MCR_TTCM; - - /* Set TGT bits */ - CANx->sTxMailBox[0].TDTR |= ((uint32_t)CAN_TDT0R_TGT); - CANx->sTxMailBox[1].TDTR |= ((uint32_t)CAN_TDT1R_TGT); - CANx->sTxMailBox[2].TDTR |= ((uint32_t)CAN_TDT2R_TGT); - } - else - { - /* Disable the TTCM mode */ - CANx->MCR &= (uint32_t)(~(uint32_t)CAN_MCR_TTCM); - - /* Reset TGT bits */ - CANx->sTxMailBox[0].TDTR &= ((uint32_t)~CAN_TDT0R_TGT); - CANx->sTxMailBox[1].TDTR &= ((uint32_t)~CAN_TDT1R_TGT); - CANx->sTxMailBox[2].TDTR &= ((uint32_t)~CAN_TDT2R_TGT); - } -} -/** - * @} - */ - - -/** @defgroup CAN_Group2 CAN Frames Transmission functions - * @brief CAN Frames Transmission functions - * -@verbatim - =============================================================================== - ##### CAN Frames Transmission functions ##### - =============================================================================== - [..] This section provides functions allowing to - (+) Initiate and transmit a CAN frame message (if there is an empty mailbox). - (+) Check the transmission status of a CAN Frame. - (+) Cancel a transmit request. - -@endverbatim - * @{ - */ - -/** - * @brief Initiates and transmits a CAN frame message. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param TxMessage: pointer to a structure which contains CAN Id, CAN DLC and CAN data. - * @retval The number of the mailbox that is used for transmission or - * CAN_TxStatus_NoMailBox if there is no empty mailbox. - */ -uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage) -{ - uint8_t transmit_mailbox = 0; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_IDTYPE(TxMessage->IDE)); - assert_param(IS_CAN_RTR(TxMessage->RTR)); - assert_param(IS_CAN_DLC(TxMessage->DLC)); - - /* Select one empty transmit mailbox */ - if ((CANx->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) - { - transmit_mailbox = 0; - } - else if ((CANx->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) - { - transmit_mailbox = 1; - } - else if ((CANx->TSR&CAN_TSR_TME2) == CAN_TSR_TME2) - { - transmit_mailbox = 2; - } - else - { - transmit_mailbox = CAN_TxStatus_NoMailBox; - } - - if (transmit_mailbox != CAN_TxStatus_NoMailBox) - { - /* Set up the Id */ - CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ; - if (TxMessage->IDE == CAN_Id_Standard) - { - assert_param(IS_CAN_STDID(TxMessage->StdId)); - CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | \ - TxMessage->RTR); - } - else - { - assert_param(IS_CAN_EXTID(TxMessage->ExtId)); - CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId << 3) | \ - TxMessage->IDE | \ - TxMessage->RTR); - } - - /* Set up the DLC */ - TxMessage->DLC &= (uint8_t)0x0000000F; - CANx->sTxMailBox[transmit_mailbox].TDTR &= (uint32_t)0xFFFFFFF0; - CANx->sTxMailBox[transmit_mailbox].TDTR |= TxMessage->DLC; - - /* Set up the data field */ - CANx->sTxMailBox[transmit_mailbox].TDLR = (((uint32_t)TxMessage->Data[3] << 24) | - ((uint32_t)TxMessage->Data[2] << 16) | - ((uint32_t)TxMessage->Data[1] << 8) | - ((uint32_t)TxMessage->Data[0])); - CANx->sTxMailBox[transmit_mailbox].TDHR = (((uint32_t)TxMessage->Data[7] << 24) | - ((uint32_t)TxMessage->Data[6] << 16) | - ((uint32_t)TxMessage->Data[5] << 8) | - ((uint32_t)TxMessage->Data[4])); - /* Request transmission */ - CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ; - } - return transmit_mailbox; -} - -/** - * @brief Checks the transmission status of a CAN Frame. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param TransmitMailbox: the number of the mailbox that is used for transmission. - * @retval CAN_TxStatus_Ok if the CAN driver transmits the message, - * CAN_TxStatus_Failed in an other case. - */ -uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox) -{ - uint32_t state = 0; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_TRANSMITMAILBOX(TransmitMailbox)); - - switch (TransmitMailbox) - { - case (CAN_TXMAILBOX_0): - state = CANx->TSR & (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0); - break; - case (CAN_TXMAILBOX_1): - state = CANx->TSR & (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1); - break; - case (CAN_TXMAILBOX_2): - state = CANx->TSR & (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2); - break; - default: - state = CAN_TxStatus_Failed; - break; - } - switch (state) - { - /* transmit pending */ - case (0x0): state = CAN_TxStatus_Pending; - break; - /* transmit failed */ - case (CAN_TSR_RQCP0 | CAN_TSR_TME0): state = CAN_TxStatus_Failed; - break; - case (CAN_TSR_RQCP1 | CAN_TSR_TME1): state = CAN_TxStatus_Failed; - break; - case (CAN_TSR_RQCP2 | CAN_TSR_TME2): state = CAN_TxStatus_Failed; - break; - /* transmit succeeded */ - case (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0):state = CAN_TxStatus_Ok; - break; - case (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1):state = CAN_TxStatus_Ok; - break; - case (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2):state = CAN_TxStatus_Ok; - break; - default: state = CAN_TxStatus_Failed; - break; - } - return (uint8_t) state; -} - -/** - * @brief Cancels a transmit request. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param Mailbox: Mailbox number. - * @retval None - */ -void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_TRANSMITMAILBOX(Mailbox)); - /* abort transmission */ - switch (Mailbox) - { - case (CAN_TXMAILBOX_0): CANx->TSR |= CAN_TSR_ABRQ0; - break; - case (CAN_TXMAILBOX_1): CANx->TSR |= CAN_TSR_ABRQ1; - break; - case (CAN_TXMAILBOX_2): CANx->TSR |= CAN_TSR_ABRQ2; - break; - default: - break; - } -} -/** - * @} - */ - - -/** @defgroup CAN_Group3 CAN Frames Reception functions - * @brief CAN Frames Reception functions - * -@verbatim - =============================================================================== - ##### CAN Frames Reception functions ##### - =============================================================================== - [..] This section provides functions allowing to - (+) Receive a correct CAN frame. - (+) Release a specified receive FIFO (2 FIFOs are available). - (+) Return the number of the pending received CAN frames. - -@endverbatim - * @{ - */ - -/** - * @brief Receives a correct CAN frame. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1. - * @param RxMessage: pointer to a structure receive frame which contains CAN Id, - * CAN DLC, CAN data and FMI number. - * @retval None - */ -void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_FIFO(FIFONumber)); - /* Get the Id */ - RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RIR; - if (RxMessage->IDE == CAN_Id_Standard) - { - RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 21); - } - else - { - RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 3); - } - - RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RIR; - /* Get the DLC */ - RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RDTR; - /* Get the FMI */ - RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDTR >> 8); - /* Get the data field */ - RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDLR; - RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 8); - RxMessage->Data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 16); - RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 24); - RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDHR; - RxMessage->Data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 8); - RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 16); - RxMessage->Data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 24); - /* Release the FIFO */ - /* Release FIFO0 */ - if (FIFONumber == CAN_FIFO0) - { - CANx->RF0R |= CAN_RF0R_RFOM0; - } - /* Release FIFO1 */ - else /* FIFONumber == CAN_FIFO1 */ - { - CANx->RF1R |= CAN_RF1R_RFOM1; - } -} - -/** - * @brief Releases the specified receive FIFO. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param FIFONumber: FIFO to release, CAN_FIFO0 or CAN_FIFO1. - * @retval None - */ -void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_FIFO(FIFONumber)); - /* Release FIFO0 */ - if (FIFONumber == CAN_FIFO0) - { - CANx->RF0R |= CAN_RF0R_RFOM0; - } - /* Release FIFO1 */ - else /* FIFONumber == CAN_FIFO1 */ - { - CANx->RF1R |= CAN_RF1R_RFOM1; - } -} - -/** - * @brief Returns the number of pending received messages. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1. - * @retval NbMessage : which is the number of pending message. - */ -uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber) -{ - uint8_t message_pending=0; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_FIFO(FIFONumber)); - if (FIFONumber == CAN_FIFO0) - { - message_pending = (uint8_t)(CANx->RF0R&(uint32_t)0x03); - } - else if (FIFONumber == CAN_FIFO1) - { - message_pending = (uint8_t)(CANx->RF1R&(uint32_t)0x03); - } - else - { - message_pending = 0; - } - return message_pending; -} -/** - * @} - */ - - -/** @defgroup CAN_Group4 CAN Operation modes functions - * @brief CAN Operation modes functions - * -@verbatim - =============================================================================== - ##### CAN Operation modes functions ##### - =============================================================================== - [..] This section provides functions allowing to select the CAN Operation modes: - (+) sleep mode. - (+) normal mode. - (+) initialization mode. - -@endverbatim - * @{ - */ - - -/** - * @brief Selects the CAN Operation mode. - * @param CAN_OperatingMode: CAN Operating Mode. - * This parameter can be one of @ref CAN_OperatingMode_TypeDef enumeration. - * @retval status of the requested mode which can be: - * - CAN_ModeStatus_Failed: CAN failed entering the specific mode - * - CAN_ModeStatus_Success: CAN Succeed entering the specific mode - */ -uint8_t CAN_OperatingModeRequest(CAN_TypeDef* CANx, uint8_t CAN_OperatingMode) -{ - uint8_t status = CAN_ModeStatus_Failed; - - /* Timeout for INAK or also for SLAK bits*/ - uint32_t timeout = INAK_TIMEOUT; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_OPERATING_MODE(CAN_OperatingMode)); - - if (CAN_OperatingMode == CAN_OperatingMode_Initialization) - { - /* Request initialisation */ - CANx->MCR = (uint32_t)((CANx->MCR & (uint32_t)(~(uint32_t)CAN_MCR_SLEEP)) | CAN_MCR_INRQ); - - /* Wait the acknowledge */ - while (((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_INAK) && (timeout != 0)) - { - timeout--; - } - if ((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_INAK) - { - status = CAN_ModeStatus_Failed; - } - else - { - status = CAN_ModeStatus_Success; - } - } - else if (CAN_OperatingMode == CAN_OperatingMode_Normal) - { - /* Request leave initialisation and sleep mode and enter Normal mode */ - CANx->MCR &= (uint32_t)(~(CAN_MCR_SLEEP|CAN_MCR_INRQ)); - - /* Wait the acknowledge */ - while (((CANx->MSR & CAN_MODE_MASK) != 0) && (timeout!=0)) - { - timeout--; - } - if ((CANx->MSR & CAN_MODE_MASK) != 0) - { - status = CAN_ModeStatus_Failed; - } - else - { - status = CAN_ModeStatus_Success; - } - } - else if (CAN_OperatingMode == CAN_OperatingMode_Sleep) - { - /* Request Sleep mode */ - CANx->MCR = (uint32_t)((CANx->MCR & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP); - - /* Wait the acknowledge */ - while (((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_SLAK) && (timeout!=0)) - { - timeout--; - } - if ((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_SLAK) - { - status = CAN_ModeStatus_Failed; - } - else - { - status = CAN_ModeStatus_Success; - } - } - else - { - status = CAN_ModeStatus_Failed; - } - - return (uint8_t) status; -} - -/** - * @brief Enters the Sleep (low power) mode. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @retval CAN_Sleep_Ok if sleep entered, CAN_Sleep_Failed otherwise. - */ -uint8_t CAN_Sleep(CAN_TypeDef* CANx) -{ - uint8_t sleepstatus = CAN_Sleep_Failed; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Request Sleep mode */ - CANx->MCR = (((CANx->MCR) & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP); - - /* Sleep mode status */ - if ((CANx->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) == CAN_MSR_SLAK) - { - /* Sleep mode not entered */ - sleepstatus = CAN_Sleep_Ok; - } - /* return sleep mode status */ - return (uint8_t)sleepstatus; -} - -/** - * @brief Wakes up the CAN peripheral from sleep mode . - * @param CANx: where x can be 1 to select the CAN peripheral. - * @retval CAN_WakeUp_Ok if sleep mode left, CAN_WakeUp_Failed otherwise. - */ -uint8_t CAN_WakeUp(CAN_TypeDef* CANx) -{ - uint32_t wait_slak = SLAK_TIMEOUT; - uint8_t wakeupstatus = CAN_WakeUp_Failed; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Wake up request */ - CANx->MCR &= ~(uint32_t)CAN_MCR_SLEEP; - - /* Sleep mode status */ - while(((CANx->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK)&&(wait_slak!=0x00)) - { - wait_slak--; - } - if((CANx->MSR & CAN_MSR_SLAK) != CAN_MSR_SLAK) - { - /* wake up done : Sleep mode exited */ - wakeupstatus = CAN_WakeUp_Ok; - } - /* return wakeup status */ - return (uint8_t)wakeupstatus; -} -/** - * @} - */ - - -/** @defgroup CAN_Group5 CAN Bus Error management functions - * @brief CAN Bus Error management functions - * -@verbatim - =============================================================================== - ##### CAN Bus Error management functions ##### - =============================================================================== - [..] This section provides functions allowing to - (+) Return the CANx's last error code (LEC). - (+) Return the CANx Receive Error Counter (REC). - (+) Return the LSB of the 9-bit CANx Transmit Error Counter(TEC). - [..] - (@) If TEC is greater than 255, The CAN is in bus-off state. - (@) If REC or TEC are greater than 96, an Error warning flag occurs. - (@) If REC or TEC are greater than 127, an Error Passive Flag occurs. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the CANx's last error code (LEC). - * @param CANx: where x can be 1 to select the CAN peripheral. - * @retval Error code: - * - CAN_ERRORCODE_NoErr: No Error - * - CAN_ERRORCODE_StuffErr: Stuff Error - * - CAN_ERRORCODE_FormErr: Form Error - * - CAN_ERRORCODE_ACKErr : Acknowledgment Error - * - CAN_ERRORCODE_BitRecessiveErr: Bit Recessive Error - * - CAN_ERRORCODE_BitDominantErr: Bit Dominant Error - * - CAN_ERRORCODE_CRCErr: CRC Error - * - CAN_ERRORCODE_SoftwareSetErr: Software Set Error - */ -uint8_t CAN_GetLastErrorCode(CAN_TypeDef* CANx) -{ - uint8_t errorcode=0; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Get the error code*/ - errorcode = (((uint8_t)CANx->ESR) & (uint8_t)CAN_ESR_LEC); - - /* Return the error code*/ - return errorcode; -} - -/** - * @brief Returns the CANx Receive Error Counter (REC). - * @note In case of an error during reception, this counter is incremented - * by 1 or by 8 depending on the error condition as defined by the CAN - * standard. After every successful reception, the counter is - * decremented by 1 or reset to 120 if its value was higher than 128. - * When the counter value exceeds 127, the CAN controller enters the - * error passive state. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @retval CAN Receive Error Counter. - */ -uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef* CANx) -{ - uint8_t counter=0; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Get the Receive Error Counter*/ - counter = (uint8_t)((CANx->ESR & CAN_ESR_REC)>> 24); - - /* Return the Receive Error Counter*/ - return counter; -} - - -/** - * @brief Returns the LSB of the 9-bit CANx Transmit Error Counter(TEC). - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @retval LSB of the 9-bit CAN Transmit Error Counter. - */ -uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef* CANx) -{ - uint8_t counter=0; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Get the LSB of the 9-bit CANx Transmit Error Counter(TEC) */ - counter = (uint8_t)((CANx->ESR & CAN_ESR_TEC)>> 16); - - /* Return the LSB of the 9-bit CANx Transmit Error Counter(TEC) */ - return counter; -} -/** - * @} - */ - -/** @defgroup CAN_Group6 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== - [..] This section provides functions allowing to configure the CAN Interrupts - and to get the status and clear flags and Interrupts pending bits. - [..] The CAN provides 14 Interrupts sources and 15 Flags: - - *** Flags *** - ============= - [..] The 15 flags can be divided on 4 groups: - (+) Transmit Flags: - (++) CAN_FLAG_RQCP0. - (++) CAN_FLAG_RQCP1. - (++) CAN_FLAG_RQCP2: Request completed MailBoxes 0, 1 and 2 Flags - Set when when the last request (transmit or abort) has - been performed. - (+) Receive Flags: - (++) CAN_FLAG_FMP0. - (++) CAN_FLAG_FMP1: FIFO 0 and 1 Message Pending Flags; - Set to signal that messages are pending in the receive FIFO. - These Flags are cleared only by hardware. - (++) CAN_FLAG_FF0. - (++) CAN_FLAG_FF1: FIFO 0 and 1 Full Flags; - Set when three messages are stored in the selected FIFO. - (++) CAN_FLAG_FOV0. - (++) CAN_FLAG_FOV1: FIFO 0 and 1 Overrun Flags; - Set when a new message has been received and passed the filter - while the FIFO was full. - (+) Operating Mode Flags: - (++) CAN_FLAG_WKU: Wake up Flag; - Set to signal that a SOF bit has been detected while the CAN - hardware was in Sleep mode. - (++) CAN_FLAG_SLAK: Sleep acknowledge Flag; - Set to signal that the CAN has entered Sleep Mode. - (+) Error Flags: - (++) CAN_FLAG_EWG: Error Warning Flag; - Set when the warning limit has been reached (Receive Error Counter - or Transmit Error Counter greater than 96). - This Flag is cleared only by hardware. - (++) CAN_FLAG_EPV: Error Passive Flag; - Set when the Error Passive limit has been reached (Receive Error - Counter or Transmit Error Counter greater than 127). - This Flag is cleared only by hardware. - (++) CAN_FLAG_BOF: Bus-Off Flag; - Set when CAN enters the bus-off state. The bus-off state is - entered on TEC overflow, greater than 255. - This Flag is cleared only by hardware. - (++) CAN_FLAG_LEC: Last error code Flag; - Set If a message has been transferred (reception or transmission) - with error, and the error code is hold. - - *** Interrupts *** - ================== - [..] The 14 interrupts can be divided on 4 groups: - (+) Transmit interrupt: - (++) CAN_IT_TME: Transmit mailbox empty Interrupt; - If enabled, this interrupt source is pending when no transmit - request are pending for Tx mailboxes. - (+) Receive Interrupts: - (++) CAN_IT_FMP0. - (++) CAN_IT_FMP1: FIFO 0 and FIFO1 message pending Interrupts; - If enabled, these interrupt sources are pending when messages - are pending in the receive FIFO. - The corresponding interrupt pending bits are cleared only by hardware. - (++) CAN_IT_FF0. - (++) CAN_IT_FF1: FIFO 0 and FIFO1 full Interrupts; - If enabled, these interrupt sources are pending when three messages - are stored in the selected FIFO. - (++) CAN_IT_FOV0. - (++) CAN_IT_FOV1: FIFO 0 and FIFO1 overrun Interrupts; - If enabled, these interrupt sources are pending when a new message - has been received and passed the filter while the FIFO was full. - (+) Operating Mode Interrupts: - (++) CAN_IT_WKU: Wake-up Interrupt; - If enabled, this interrupt source is pending when a SOF bit has - been detected while the CAN hardware was in Sleep mode. - (++) CAN_IT_SLK: Sleep acknowledge Interrupt: - If enabled, this interrupt source is pending when the CAN has - entered Sleep Mode. - (+) Error Interrupts: - (++) CAN_IT_EWG: Error warning Interrupt; - If enabled, this interrupt source is pending when the warning limit - has been reached (Receive Error Counter or Transmit Error Counter=96). - (++) CAN_IT_EPV: Error passive Interrupt; - If enabled, this interrupt source is pending when the Error Passive - limit has been reached (Receive Error Counter or Transmit Error Counter>127). - (++) CAN_IT_BOF: Bus-off Interrupt; - If enabled, this interrupt source is pending when CAN enters - the bus-off state. The bus-off state is entered on TEC overflow, - greater than 255. - This Flag is cleared only by hardware. - (++) CAN_IT_LEC: Last error code Interrupt; - If enabled, this interrupt source is pending when a message has - been transferred (reception or transmission) with error and the - error code is hold. - (++) CAN_IT_ERR: Error Interrupt; - If enabled, this interrupt source is pending when an error condition - is pending. - [..] Managing the CAN controller events: - The user should identify which mode will be used in his application to manage - the CAN controller events: Polling mode or Interrupt mode. - (+) In the Polling Mode it is advised to use the following functions: - (++) CAN_GetFlagStatus() : to check if flags events occur. - (++) CAN_ClearFlag() : to clear the flags events. - (+) In the Interrupt Mode it is advised to use the following functions: - (++) CAN_ITConfig() : to enable or disable the interrupt source. - (++) CAN_GetITStatus() : to check if Interrupt occurs. - (++) CAN_ClearITPendingBit() : to clear the Interrupt pending Bit - (corresponding Flag). - This function has no impact on CAN_IT_FMP0 and CAN_IT_FMP1 Interrupts - pending bits since there are cleared only by hardware. - -@endverbatim - * @{ - */ -/** - * @brief Enables or disables the specified CANx interrupts. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_IT: specifies the CAN interrupt sources to be enabled or disabled. - * This parameter can be: - * @arg CAN_IT_TME: Transmit mailbox empty Interrupt - * @arg CAN_IT_FMP0: FIFO 0 message pending Interrupt - * @arg CAN_IT_FF0: FIFO 0 full Interrupt - * @arg CAN_IT_FOV0: FIFO 0 overrun Interrupt - * @arg CAN_IT_FMP1: FIFO 1 message pending Interrupt - * @arg CAN_IT_FF1: FIFO 1 full Interrupt - * @arg CAN_IT_FOV1: FIFO 1 overrun Interrupt - * @arg CAN_IT_WKU: Wake-up Interrupt - * @arg CAN_IT_SLK: Sleep acknowledge Interrupt - * @arg CAN_IT_EWG: Error warning Interrupt - * @arg CAN_IT_EPV: Error passive Interrupt - * @arg CAN_IT_BOF: Bus-off Interrupt - * @arg CAN_IT_LEC: Last error code Interrupt - * @arg CAN_IT_ERR: Error Interrupt - * @param NewState: new state of the CAN interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_IT(CAN_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected CANx interrupt */ - CANx->IER |= CAN_IT; - } - else - { - /* Disable the selected CANx interrupt */ - CANx->IER &= ~CAN_IT; - } -} -/** - * @brief Checks whether the specified CAN flag is set or not. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg CAN_FLAG_RQCP0: Request MailBox0 Flag - * @arg CAN_FLAG_RQCP1: Request MailBox1 Flag - * @arg CAN_FLAG_RQCP2: Request MailBox2 Flag - * @arg CAN_FLAG_FMP0: FIFO 0 Message Pending Flag - * @arg CAN_FLAG_FF0: FIFO 0 Full Flag - * @arg CAN_FLAG_FOV0: FIFO 0 Overrun Flag - * @arg CAN_FLAG_FMP1: FIFO 1 Message Pending Flag - * @arg CAN_FLAG_FF1: FIFO 1 Full Flag - * @arg CAN_FLAG_FOV1: FIFO 1 Overrun Flag - * @arg CAN_FLAG_WKU: Wake up Flag - * @arg CAN_FLAG_SLAK: Sleep acknowledge Flag - * @arg CAN_FLAG_EWG: Error Warning Flag - * @arg CAN_FLAG_EPV: Error Passive Flag - * @arg CAN_FLAG_BOF: Bus-Off Flag - * @arg CAN_FLAG_LEC: Last error code Flag - * @retval The new state of CAN_FLAG (SET or RESET). - */ -FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG) -{ - FlagStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_GET_FLAG(CAN_FLAG)); - - - if((CAN_FLAG & CAN_FLAGS_ESR) != (uint32_t)RESET) - { - /* Check the status of the specified CAN flag */ - if ((CANx->ESR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) - { - /* CAN_FLAG is set */ - bitstatus = SET; - } - else - { - /* CAN_FLAG is reset */ - bitstatus = RESET; - } - } - else if((CAN_FLAG & CAN_FLAGS_MSR) != (uint32_t)RESET) - { - /* Check the status of the specified CAN flag */ - if ((CANx->MSR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) - { - /* CAN_FLAG is set */ - bitstatus = SET; - } - else - { - /* CAN_FLAG is reset */ - bitstatus = RESET; - } - } - else if((CAN_FLAG & CAN_FLAGS_TSR) != (uint32_t)RESET) - { - /* Check the status of the specified CAN flag */ - if ((CANx->TSR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) - { - /* CAN_FLAG is set */ - bitstatus = SET; - } - else - { - /* CAN_FLAG is reset */ - bitstatus = RESET; - } - } - else if((CAN_FLAG & CAN_FLAGS_RF0R) != (uint32_t)RESET) - { - /* Check the status of the specified CAN flag */ - if ((CANx->RF0R & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) - { - /* CAN_FLAG is set */ - bitstatus = SET; - } - else - { - /* CAN_FLAG is reset */ - bitstatus = RESET; - } - } - else /* If(CAN_FLAG & CAN_FLAGS_RF1R != (uint32_t)RESET) */ - { - /* Check the status of the specified CAN flag */ - if ((uint32_t)(CANx->RF1R & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) - { - /* CAN_FLAG is set */ - bitstatus = SET; - } - else - { - /* CAN_FLAG is reset */ - bitstatus = RESET; - } - } - /* Return the CAN_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the CAN's pending flags. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_FLAG: specifies the flag to clear. - * This parameter can be one of the following values: - * @arg CAN_FLAG_RQCP0: Request MailBox0 Flag - * @arg CAN_FLAG_RQCP1: Request MailBox1 Flag - * @arg CAN_FLAG_RQCP2: Request MailBox2 Flag - * @arg CAN_FLAG_FF0: FIFO 0 Full Flag - * @arg CAN_FLAG_FOV0: FIFO 0 Overrun Flag - * @arg CAN_FLAG_FF1: FIFO 1 Full Flag - * @arg CAN_FLAG_FOV1: FIFO 1 Overrun Flag - * @arg CAN_FLAG_WKU: Wake up Flag - * @arg CAN_FLAG_SLAK: Sleep acknowledge Flag - * @arg CAN_FLAG_LEC: Last error code Flag - * @retval None - */ -void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG) -{ - uint32_t flagtmp=0; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_CLEAR_FLAG(CAN_FLAG)); - - if (CAN_FLAG == CAN_FLAG_LEC) /* ESR register */ - { - /* Clear the selected CAN flags */ - CANx->ESR = (uint32_t)RESET; - } - else /* MSR or TSR or RF0R or RF1R */ - { - flagtmp = CAN_FLAG & 0x000FFFFF; - - if ((CAN_FLAG & CAN_FLAGS_RF0R)!=(uint32_t)RESET) - { - /* Receive Flags */ - CANx->RF0R = (uint32_t)(flagtmp); - } - else if ((CAN_FLAG & CAN_FLAGS_RF1R)!=(uint32_t)RESET) - { - /* Receive Flags */ - CANx->RF1R = (uint32_t)(flagtmp); - } - else if ((CAN_FLAG & CAN_FLAGS_TSR)!=(uint32_t)RESET) - { - /* Transmit Flags */ - CANx->TSR = (uint32_t)(flagtmp); - } - else /* If((CAN_FLAG & CAN_FLAGS_MSR)!=(uint32_t)RESET) */ - { - /* Operating mode Flags */ - CANx->MSR = (uint32_t)(flagtmp); - } - } -} - -/** - * @brief Checks whether the specified CANx interrupt has occurred or not. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_IT: specifies the CAN interrupt source to check. - * This parameter can be one of the following values: - * @arg CAN_IT_TME: Transmit mailbox empty Interrupt - * @arg CAN_IT_FMP0: FIFO 0 message pending Interrupt - * @arg CAN_IT_FF0: FIFO 0 full Interrupt - * @arg CAN_IT_FOV0: FIFO 0 overrun Interrupt - * @arg CAN_IT_FMP1: FIFO 1 message pending Interrupt - * @arg CAN_IT_FF1: FIFO 1 full Interrupt - * @arg CAN_IT_FOV1: FIFO 1 overrun Interrupt - * @arg CAN_IT_WKU: Wake-up Interrupt - * @arg CAN_IT_SLK: Sleep acknowledge Interrupt - * @arg CAN_IT_EWG: Error warning Interrupt - * @arg CAN_IT_EPV: Error passive Interrupt - * @arg CAN_IT_BOF: Bus-off Interrupt - * @arg CAN_IT_LEC: Last error code Interrupt - * @arg CAN_IT_ERR: Error Interrupt - * @retval The current state of CAN_IT (SET or RESET). - */ -ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT) -{ - ITStatus itstatus = RESET; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_IT(CAN_IT)); - - /* check the interrupt enable bit */ - if((CANx->IER & CAN_IT) != RESET) - { - /* in case the Interrupt is enabled, .... */ - switch (CAN_IT) - { - case CAN_IT_TME: - /* Check CAN_TSR_RQCPx bits */ - itstatus = CheckITStatus(CANx->TSR, CAN_TSR_RQCP0|CAN_TSR_RQCP1|CAN_TSR_RQCP2); - break; - case CAN_IT_FMP0: - /* Check CAN_RF0R_FMP0 bit */ - itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FMP0); - break; - case CAN_IT_FF0: - /* Check CAN_RF0R_FULL0 bit */ - itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FULL0); - break; - case CAN_IT_FOV0: - /* Check CAN_RF0R_FOVR0 bit */ - itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FOVR0); - break; - case CAN_IT_FMP1: - /* Check CAN_RF1R_FMP1 bit */ - itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FMP1); - break; - case CAN_IT_FF1: - /* Check CAN_RF1R_FULL1 bit */ - itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FULL1); - break; - case CAN_IT_FOV1: - /* Check CAN_RF1R_FOVR1 bit */ - itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FOVR1); - break; - case CAN_IT_WKU: - /* Check CAN_MSR_WKUI bit */ - itstatus = CheckITStatus(CANx->MSR, CAN_MSR_WKUI); - break; - case CAN_IT_SLK: - /* Check CAN_MSR_SLAKI bit */ - itstatus = CheckITStatus(CANx->MSR, CAN_MSR_SLAKI); - break; - case CAN_IT_EWG: - /* Check CAN_ESR_EWGF bit */ - itstatus = CheckITStatus(CANx->ESR, CAN_ESR_EWGF); - break; - case CAN_IT_EPV: - /* Check CAN_ESR_EPVF bit */ - itstatus = CheckITStatus(CANx->ESR, CAN_ESR_EPVF); - break; - case CAN_IT_BOF: - /* Check CAN_ESR_BOFF bit */ - itstatus = CheckITStatus(CANx->ESR, CAN_ESR_BOFF); - break; - case CAN_IT_LEC: - /* Check CAN_ESR_LEC bit */ - itstatus = CheckITStatus(CANx->ESR, CAN_ESR_LEC); - break; - case CAN_IT_ERR: - /* Check CAN_MSR_ERRI bit */ - itstatus = CheckITStatus(CANx->MSR, CAN_MSR_ERRI); - break; - default: - /* in case of error, return RESET */ - itstatus = RESET; - break; - } - } - else - { - /* in case the Interrupt is not enabled, return RESET */ - itstatus = RESET; - } - - /* Return the CAN_IT status */ - return itstatus; -} - -/** - * @brief Clears the CANx's interrupt pending bits. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_IT: specifies the interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg CAN_IT_TME: Transmit mailbox empty Interrupt - * @arg CAN_IT_FF0: FIFO 0 full Interrupt - * @arg CAN_IT_FOV0: FIFO 0 overrun Interrupt - * @arg CAN_IT_FF1: FIFO 1 full Interrupt - * @arg CAN_IT_FOV1: FIFO 1 overrun Interrupt - * @arg CAN_IT_WKU: Wake-up Interrupt - * @arg CAN_IT_SLK: Sleep acknowledge Interrupt - * @arg CAN_IT_EWG: Error warning Interrupt - * @arg CAN_IT_EPV: Error passive Interrupt - * @arg CAN_IT_BOF: Bus-off Interrupt - * @arg CAN_IT_LEC: Last error code Interrupt - * @arg CAN_IT_ERR: Error Interrupt - * @retval None - */ -void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_CLEAR_IT(CAN_IT)); - - switch (CAN_IT) - { - case CAN_IT_TME: - /* Clear CAN_TSR_RQCPx (rc_w1)*/ - CANx->TSR = CAN_TSR_RQCP0|CAN_TSR_RQCP1|CAN_TSR_RQCP2; - break; - case CAN_IT_FF0: - /* Clear CAN_RF0R_FULL0 (rc_w1)*/ - CANx->RF0R = CAN_RF0R_FULL0; - break; - case CAN_IT_FOV0: - /* Clear CAN_RF0R_FOVR0 (rc_w1)*/ - CANx->RF0R = CAN_RF0R_FOVR0; - break; - case CAN_IT_FF1: - /* Clear CAN_RF1R_FULL1 (rc_w1)*/ - CANx->RF1R = CAN_RF1R_FULL1; - break; - case CAN_IT_FOV1: - /* Clear CAN_RF1R_FOVR1 (rc_w1)*/ - CANx->RF1R = CAN_RF1R_FOVR1; - break; - case CAN_IT_WKU: - /* Clear CAN_MSR_WKUI (rc_w1)*/ - CANx->MSR = CAN_MSR_WKUI; - break; - case CAN_IT_SLK: - /* Clear CAN_MSR_SLAKI (rc_w1)*/ - CANx->MSR = CAN_MSR_SLAKI; - break; - case CAN_IT_EWG: - /* Clear CAN_MSR_ERRI (rc_w1) */ - CANx->MSR = CAN_MSR_ERRI; - /* @note the corresponding Flag is cleared by hardware depending on the CAN Bus status*/ - break; - case CAN_IT_EPV: - /* Clear CAN_MSR_ERRI (rc_w1) */ - CANx->MSR = CAN_MSR_ERRI; - /* @note the corresponding Flag is cleared by hardware depending on the CAN Bus status*/ - break; - case CAN_IT_BOF: - /* Clear CAN_MSR_ERRI (rc_w1) */ - CANx->MSR = CAN_MSR_ERRI; - /* @note the corresponding Flag is cleared by hardware depending on the CAN Bus status*/ - break; - case CAN_IT_LEC: - /* Clear LEC bits */ - CANx->ESR = RESET; - /* Clear CAN_MSR_ERRI (rc_w1) */ - CANx->MSR = CAN_MSR_ERRI; - break; - case CAN_IT_ERR: - /*Clear LEC bits */ - CANx->ESR = RESET; - /* Clear CAN_MSR_ERRI (rc_w1) */ - CANx->MSR = CAN_MSR_ERRI; - /* @note BOFF, EPVF and EWGF Flags are cleared by hardware depending on the CAN Bus status*/ - break; - default: - break; - } -} - /** - * @} - */ - -/** - * @brief Checks whether the CAN interrupt has occurred or not. - * @param CAN_Reg: specifies the CAN interrupt register to check. - * @param It_Bit: specifies the interrupt source bit to check. - * @retval The new state of the CAN Interrupt (SET or RESET). - */ -static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit) -{ - ITStatus pendingbitstatus = RESET; - - if ((CAN_Reg & It_Bit) != (uint32_t)RESET) - { - /* CAN_IT is set */ - pendingbitstatus = SET; - } - else - { - /* CAN_IT is reset */ - pendingbitstatus = RESET; - } - return pendingbitstatus; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_cec.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_cec.c deleted file mode 100644 index f6b4294..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_cec.c +++ /dev/null @@ -1,607 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_cec.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Consumer Electronics Control (CEC) peripheral - * applicable only on STM32F051, STM32F042 and STM32F072 devices: - * + Initialization and Configuration - * + Data transfers functions - * + Interrupts and flags management - * - * @verbatim - ============================================================================== - ##### CEC features ##### - ============================================================================== - [..] This device provides some features: - (#) Supports HDMI-CEC specification 1.4. - (#) Supports two source clocks(HSI/244 or LSE). - (#) Works in stop mode(without APB clock, but with CEC clock 32KHz). - It can genarate an interrupt in the CEC clock domain that the CPU - wakes up from the low power mode. - (#) Configurable Signal Free Time before of transmission start. The - number of nominal data bit periods waited before transmission can be - ruled by Hardware or Software. - (#) Configurable Peripheral Address (multi-addressing configuration). - (#) Supports listen mode.The CEC Messages addressed to different destination - can be received without interfering with CEC bus when Listen mode option is enabled. - (#) Configurable Rx-Tolerance(Standard and Extended tolerance margin). - (#) Error detection with configurable error bit generation. - (#) Arbitration lost error in the case of two CEC devices starting at the same time. - - ##### How to use this driver ##### - ============================================================================== - [..] This driver provides functions to configure and program the CEC device, - follow steps below: - (#) The source clock can be configured using: - (++) RCC_CECCLKConfig(RCC_CECCLK_HSI_Div244) for HSI(Default) - (++) RCC_CECCLKConfig(RCC_CECCLK_LSE) for LSE. - (#) Enable CEC peripheral clock using RCC_APBPeriphClockCmd(RCC_APBPeriph_CEC, ENABLE). - (#) Peripherals alternate function. - (++) Connect the pin to the desired peripherals' Alternate Function (AF) using - GPIO_PinAFConfig() function. - (++) Configure the desired pin in alternate function by: - GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF. - (++) Select the type open-drain and output speed via GPIO_OType - and GPIO_Speed members. - (++) Call GPIO_Init() function. - (#) Configure the Signal Free Time, Rx Tolerance, Stop reception generation - and Bit error generation using the CEC_Init() function. - The function CEC_Init() must be called when the CEC peripheral is disabled. - (#) Configure the CEC own address by calling the fuction CEC_OwnAddressConfig(). - (#) Optionally, you can configure the Listen mode using the function CEC_ListenModeCmd(). - (#) Enable the NVIC and the corresponding interrupt using the function - CEC_ITConfig() if you need to use interrupt mode. - CEC_ITConfig() must be called before enabling the CEC peripheral. - (#) Enable the CEC using the CEC_Cmd() function. - (#) Charge the first data byte in the TXDR register using CEC_SendDataByte(). - (#) Enable the transmission of the Byte of a CEC message using CEC_StartOfMessage() - (#) Transmit single data through the CEC peripheral using CEC_SendDataByte() - and Receive the last transmitted byte using CEC_ReceiveDataByte(). - (#) Enable the CEC_EndOfMessage() in order to indicate the last byte of the message. - [..] - (@) If the listen mode is enabled, Stop reception generation and Bit error generation - must be in reset state. - (@) If the CEC message consists of only 1 byte, the function CEC_EndOfMessage() - must be called before CEC_StartOfMessage(). - - @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_cec.h" -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup CEC - * @brief CEC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define BROADCAST_ADDRESS ((uint32_t)0x0000F) -#define CFGR_CLEAR_MASK ((uint32_t)0x7000FE00) /* CFGR register Mask */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup CEC_Private_Functions - * @{ - */ - -/** @defgroup CEC_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to initialize: - (+) CEC own addresses - (+) CEC Signal Free Time - (+) CEC Rx Tolerance - (+) CEC Stop Reception - (+) CEC Bit Rising Error - (+) CEC Long Bit Period Error - [..] This section provides also a function to configure the CEC peripheral in Listen Mode. - Messages addressed to different destination can be received when Listen mode is - enabled without interfering with CEC bus. -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the CEC peripheral registers to their default reset values. - * @param None - * @retval None - */ -void CEC_DeInit(void) -{ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CEC, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CEC, DISABLE); -} - -/** - * @brief Initializes the CEC peripheral according to the specified parameters - * in the CEC_InitStruct. - * @note The CEC parameters must be configured before enabling the CEC peripheral. - * @param CEC_InitStruct: pointer to an CEC_InitTypeDef structure that contains - * the configuration information for the specified CEC peripheral. - * @retval None - */ -void CEC_Init(CEC_InitTypeDef* CEC_InitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_CEC_SIGNAL_FREE_TIME(CEC_InitStruct->CEC_SignalFreeTime)); - assert_param(IS_CEC_RX_TOLERANCE(CEC_InitStruct->CEC_RxTolerance)); - assert_param(IS_CEC_STOP_RECEPTION(CEC_InitStruct->CEC_StopReception)); - assert_param(IS_CEC_BIT_RISING_ERROR(CEC_InitStruct->CEC_BitRisingError)); - assert_param(IS_CEC_LONG_BIT_PERIOD_ERROR(CEC_InitStruct->CEC_LongBitPeriodError)); - assert_param(IS_CEC_BDR_NO_GEN_ERROR(CEC_InitStruct->CEC_BRDNoGen)); - assert_param(IS_CEC_SFT_OPTION(CEC_InitStruct->CEC_SFTOption)); - - /* Get the CEC CFGR value */ - tmpreg = CEC->CFGR; - - /* Clear CFGR bits */ - tmpreg &= CFGR_CLEAR_MASK; - - /* Configure the CEC peripheral */ - tmpreg |= (CEC_InitStruct->CEC_SignalFreeTime | CEC_InitStruct->CEC_RxTolerance | - CEC_InitStruct->CEC_StopReception | CEC_InitStruct->CEC_BitRisingError | - CEC_InitStruct->CEC_LongBitPeriodError| CEC_InitStruct->CEC_BRDNoGen | - CEC_InitStruct->CEC_SFTOption); - - /* Write to CEC CFGR register */ - CEC->CFGR = tmpreg; -} - -/** - * @brief Fills each CEC_InitStruct member with its default value. - * @param CEC_InitStruct: pointer to a CEC_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void CEC_StructInit(CEC_InitTypeDef* CEC_InitStruct) -{ - CEC_InitStruct->CEC_SignalFreeTime = CEC_SignalFreeTime_Standard; - CEC_InitStruct->CEC_RxTolerance = CEC_RxTolerance_Standard; - CEC_InitStruct->CEC_StopReception = CEC_StopReception_Off; - CEC_InitStruct->CEC_BitRisingError = CEC_BitRisingError_Off; - CEC_InitStruct->CEC_LongBitPeriodError = CEC_LongBitPeriodError_Off; - CEC_InitStruct->CEC_BRDNoGen = CEC_BRDNoGen_Off; - CEC_InitStruct->CEC_SFTOption = CEC_SFTOption_Off; -} - -/** - * @brief Enables or disables the CEC peripheral. - * @param NewState: new state of the CEC peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CEC_Cmd(FunctionalState NewState) -{ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the CEC peripheral */ - CEC->CR |= CEC_CR_CECEN; - } - else - { - /* Disable the CEC peripheral */ - CEC->CR &= ~CEC_CR_CECEN; - } -} - -/** - * @brief Enables or disables the CEC Listen Mode. - * @param NewState: new state of the Listen Mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CEC_ListenModeCmd(FunctionalState NewState) -{ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Listen Mode */ - CEC->CFGR |= CEC_CFGR_LSTN; - } - else - { - /* Disable the Listen Mode */ - CEC->CFGR &= ~CEC_CFGR_LSTN; - } -} - -/** - * @brief Defines the Own Address of the CEC device. - * @param CEC_OwnAddress: The CEC own address. - * @retval None - */ -void CEC_OwnAddressConfig(uint8_t CEC_OwnAddress) -{ - uint32_t tmp =0x00; - /* Check the parameters */ - assert_param(IS_CEC_ADDRESS(CEC_OwnAddress)); - tmp = 1 <<(CEC_OwnAddress + 16); - /* Set the CEC own address */ - CEC->CFGR |= tmp; -} - -/** - * @brief Clears the Own Address of the CEC device. - * @param CEC_OwnAddress: The CEC own address. - * @retval None - */ -void CEC_OwnAddressClear(void) -{ - /* Set the CEC own address */ - CEC->CFGR = 0x0; -} - -/** - * @} - */ - -/** @defgroup CEC_Group2 Data transfers functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### Data transfers functions ##### - =============================================================================== - [..] This section provides functions allowing the CEC data transfers.The read - access of the CEC_RXDR register can be done using the CEC_ReceiveData()function - and returns the Rx buffered value. Whereas a write access to the CEC_TXDR can be - done using CEC_SendData() function. -@endverbatim - * @{ - */ - -/** - * @brief Transmits single data through the CEC peripheral. - * @param Data: the data to transmit. - * @retval None - */ -void CEC_SendData(uint8_t Data) -{ - /* Transmit Data */ - CEC->TXDR = Data; -} - -/** - * @brief Returns the most recent received data by the CEC peripheral. - * @param None - * @retval The received data. - */ -uint8_t CEC_ReceiveData(void) -{ - /* Receive Data */ - return (uint8_t)(CEC->RXDR); -} - -/** - * @brief Starts a new message. - * @param None - * @retval None - */ -void CEC_StartOfMessage(void) -{ - /* Starts of new message */ - CEC->CR |= CEC_CR_TXSOM; -} - -/** - * @brief Transmits message with an EOM bit. - * @param None - * @retval None - */ -void CEC_EndOfMessage(void) -{ - /* The data byte will be transmitted with an EOM bit */ - CEC->CR |= CEC_CR_TXEOM; -} - -/** - * @} - */ - -/** @defgroup CEC_Group3 Interrupts and flags management functions - * @brief Interrupts and flags management functions -* -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== - [..] This section provides functions allowing to configure the CEC Interrupts - sources and check or clear the flags or pending bits status. - [..] The user should identify which mode will be used in his application to manage - the communication: Polling mode or Interrupt mode. - - [..] In polling mode, the CEC can be managed by the following flags: - (+) CEC_FLAG_TXACKE : to indicate a missing acknowledge in transmission mode. - (+) CEC_FLAG_TXERR : to indicate an error occurs during transmission mode. - The initiator detects low impedance in the CEC line. - (+) CEC_FLAG_TXUDR : to indicate if an underrun error occurs in transmission mode. - The transmission is enabled while the software has not yet - loaded any value into the TXDR register. - (+) CEC_FLAG_TXEND : to indicate the end of successful transmission. - (+) CEC_FLAG_TXBR : to indicate the next transmission data has to be written to TXDR. - (+) CEC_FLAG_ARBLST : to indicate arbitration lost in the case of two CEC devices - starting at the same time. - (+) CEC_FLAG_RXACKE : to indicate a missing acknowledge in receive mode. - (+) CEC_FLAG_LBPE : to indicate a long bit period error generated during receive mode. - (+) CEC_FLAG_SBPE : to indicate a short bit period error generated during receive mode. - (+) CEC_FLAG_BRE : to indicate a bit rising error generated during receive mode. - (+) CEC_FLAG_RXOVR : to indicate if an overrun error occur while receiving a CEC message. - A byte is not yet received while a new byte is stored in the RXDR register. - (+) CEC_FLAG_RXEND : to indicate the end Of reception - (+) CEC_FLAG_RXBR : to indicate a new byte has been received from the CEC line and - stored into the RXDR buffer. - [..] - (@)In this Mode, it is advised to use the following functions: - FlagStatus CEC_GetFlagStatus(uint16_t CEC_FLAG); - void CEC_ClearFlag(uint16_t CEC_FLAG); - - [..] In Interrupt mode, the CEC can be managed by the following interrupt sources: - (+) CEC_IT_TXACKE : to indicate a TX Missing acknowledge - (+) CEC_IT_TXACKE : to indicate a missing acknowledge in transmission mode. - (+) CEC_IT_TXERR : to indicate an error occurs during transmission mode. - The initiator detects low impedance in the CEC line. - (+) CEC_IT_TXUDR : to indicate if an underrun error occurs in transmission mode. - The transmission is enabled while the software has not yet - loaded any value into the TXDR register. - (+) CEC_IT_TXEND : to indicate the end of successful transmission. - (+) CEC_IT_TXBR : to indicate the next transmission data has to be written to TXDR register. - (+) CEC_IT_ARBLST : to indicate arbitration lost in the case of two CEC devices - starting at the same time. - (+) CEC_IT_RXACKE : to indicate a missing acknowledge in receive mode. - (+) CEC_IT_LBPE : to indicate a long bit period error generated during receive mode. - (+) CEC_IT_SBPE : to indicate a short bit period error generated during receive mode. - (+) CEC_IT_BRE : to indicate a bit rising error generated during receive mode. - (+) CEC_IT_RXOVR : to indicate if an overrun error occur while receiving a CEC message. - A byte is not yet received while a new byte is stored in the RXDR register. - (+) CEC_IT_RXEND : to indicate the end Of reception - (+) CEC_IT_RXBR : to indicate a new byte has been received from the CEC line and - stored into the RXDR buffer. - [..] - (@)In this Mode it is advised to use the following functions: - void CEC_ITConfig( uint16_t CEC_IT, FunctionalState NewState); - ITStatus CEC_GetITStatus(uint16_t CEC_IT); - void CEC_ClearITPendingBit(uint16_t CEC_IT); - - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the selected CEC interrupts. - * @param CEC_IT: specifies the CEC interrupt source to be enabled. - * This parameter can be any combination of the following values: - * @arg CEC_IT_TXACKE: Tx Missing acknowledge Error - * @arg CEC_IT_TXERR: Tx Error. - * @arg CEC_IT_TXUDR: Tx-Buffer Underrun. - * @arg CEC_IT_TXEND: End of Transmission (successful transmission of the last byte). - * @arg CEC_IT_TXBR: Tx-Byte Request. - * @arg CEC_IT_ARBLST: Arbitration Lost - * @arg CEC_IT_RXACKE: Rx-Missing Acknowledge - * @arg CEC_IT_LBPE: Rx Long period Error - * @arg CEC_IT_SBPE: Rx Short period Error - * @arg CEC_IT_BRE: Rx Bit Rising Error - * @arg CEC_IT_RXOVR: Rx Overrun. - * @arg CEC_IT_RXEND: End Of Reception - * @arg CEC_IT_RXBR: Rx-Byte Received - * @param NewState: new state of the selected CEC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CEC_ITConfig(uint16_t CEC_IT, FunctionalState NewState) -{ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_CEC_IT(CEC_IT)); - - if (NewState != DISABLE) - { - /* Enable the selected CEC interrupt */ - CEC->IER |= CEC_IT; - } - else - { - CEC_IT =~CEC_IT; - /* Disable the selected CEC interrupt */ - CEC->IER &= CEC_IT; - } -} - -/** - * @brief Gets the CEC flag status. - * @param CEC_FLAG: specifies the CEC flag to check. - * This parameter can be one of the following values: - * @arg CEC_FLAG_TXACKE: Tx Missing acknowledge Error - * @arg CEC_FLAG_TXERR: Tx Error. - * @arg CEC_FLAG_TXUDR: Tx-Buffer Underrun. - * @arg CEC_FLAG_TXEND: End of transmission (successful transmission of the last byte). - * @arg CEC_FLAG_TXBR: Tx-Byte Request. - * @arg CEC_FLAG_ARBLST: Arbitration Lost - * @arg CEC_FLAG_RXACKE: Rx-Missing Acknowledge - * @arg CEC_FLAG_LBPE: Rx Long period Error - * @arg CEC_FLAG_SBPE: Rx Short period Error - * @arg CEC_FLAG_BRE: Rx Bit Rissing Error - * @arg CEC_FLAG_RXOVR: Rx Overrun. - * @arg CEC_FLAG_RXEND: End Of Reception. - * @arg CEC_FLAG_RXBR: Rx-Byte Received. - * @retval The new state of CEC_FLAG (SET or RESET) - */ -FlagStatus CEC_GetFlagStatus(uint16_t CEC_FLAG) -{ - FlagStatus bitstatus = RESET; - - assert_param(IS_CEC_GET_FLAG(CEC_FLAG)); - - /* Check the status of the specified CEC flag */ - if ((CEC->ISR & CEC_FLAG) != (uint16_t)RESET) - { - /* CEC flag is set */ - bitstatus = SET; - } - else - { - /* CEC flag is reset */ - bitstatus = RESET; - } - - /* Return the CEC flag status */ - return bitstatus; -} - -/** - * @brief Clears the CEC's pending flags. - * @param CEC_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg CEC_FLAG_TXACKE: Tx Missing acknowledge Error - * @arg CEC_FLAG_TXERR: Tx Error - * @arg CEC_FLAG_TXUDR: Tx-Buffer Underrun - * @arg CEC_FLAG_TXEND: End of transmission (successful transmission of the last byte). - * @arg CEC_FLAG_TXBR: Tx-Byte Request - * @arg CEC_FLAG_ARBLST: Arbitration Lost - * @arg CEC_FLAG_RXACKE: Rx Missing Acknowledge - * @arg CEC_FLAG_LBPE: Rx Long period Error - * @arg CEC_FLAG_SBPE: Rx Short period Error - * @arg CEC_FLAG_BRE: Rx Bit Rising Error - * @arg CEC_FLAG_RXOVR: Rx Overrun - * @arg CEC_FLAG_RXEND: End Of Reception - * @arg CEC_FLAG_RXBR: Rx-Byte Received - * @retval None - */ -void CEC_ClearFlag(uint32_t CEC_FLAG) -{ - assert_param(IS_CEC_CLEAR_FLAG(CEC_FLAG)); - - /* Clear the selected CEC flag */ - CEC->ISR = CEC_FLAG; -} - -/** - * @brief Checks whether the specified CEC interrupt has occurred or not. - * @param CEC_IT: specifies the CEC interrupt source to check. - * This parameter can be one of the following values: - * @arg CEC_IT_TXACKE: Tx Missing acknowledge Error - * @arg CEC_IT_TXERR: Tx Error. - * @arg CEC_IT_TXUDR: Tx-Buffer Underrun. - * @arg CEC_IT_TXEND: End of transmission (successful transmission of the last byte). - * @arg CEC_IT_TXBR: Tx-Byte Request. - * @arg CEC_IT_ARBLST: Arbitration Lost. - * @arg CEC_IT_RXACKE: Rx-Missing Acknowledge. - * @arg CEC_IT_LBPE: Rx Long period Error. - * @arg CEC_IT_SBPE: Rx Short period Error. - * @arg CEC_IT_BRE: Rx Bit Rising Error. - * @arg CEC_IT_RXOVR: Rx Overrun. - * @arg CEC_IT_RXEND: End Of Reception. - * @arg CEC_IT_RXBR: Rx-Byte Received - * @retval The new state of CEC_IT (SET or RESET). - */ -ITStatus CEC_GetITStatus(uint16_t CEC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_CEC_GET_IT(CEC_IT)); - - /* Get the CEC IT enable bit status */ - enablestatus = (CEC->IER & CEC_IT); - - /* Check the status of the specified CEC interrupt */ - if (((CEC->ISR & CEC_IT) != (uint32_t)RESET) && enablestatus) - { - /* CEC interrupt is set */ - bitstatus = SET; - } - else - { - /* CEC interrupt is reset */ - bitstatus = RESET; - } - - /* Return the CEC interrupt status */ - return bitstatus; -} - -/** - * @brief Clears the CEC's interrupt pending bits. - * @param CEC_IT: specifies the CEC interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg CEC_IT_TXACKE: Tx Missing acknowledge Error - * @arg CEC_IT_TXERR: Tx Error - * @arg CEC_IT_TXUDR: Tx-Buffer Underrun - * @arg CEC_IT_TXEND: End of Transmission - * @arg CEC_IT_TXBR: Tx-Byte Request - * @arg CEC_IT_ARBLST: Arbitration Lost - * @arg CEC_IT_RXACKE: Rx-Missing Acknowledge - * @arg CEC_IT_LBPE: Rx Long period Error - * @arg CEC_IT_SBPE: Rx Short period Error - * @arg CEC_IT_BRE: Rx Bit Rising Error - * @arg CEC_IT_RXOVR: Rx Overrun - * @arg CEC_IT_RXEND: End Of Reception - * @arg CEC_IT_RXBR: Rx-Byte Received - * @retval None - */ -void CEC_ClearITPendingBit(uint16_t CEC_IT) -{ - assert_param(IS_CEC_IT(CEC_IT)); - - /* Clear the selected CEC interrupt pending bits */ - CEC->ISR = CEC_IT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_comp.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_comp.c deleted file mode 100644 index f4b279c..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_comp.c +++ /dev/null @@ -1,408 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_comp.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the comparators (COMP1 and COMP2) peripheral - * applicable only on STM32F051 and STM32F072 devices: - * + Comparators configuration - * + Window mode control - * - * @verbatim - * - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - - The device integrates two analog comparators COMP1 and COMP2: - (+) The non inverting input is set to PA1 for COMP1 and to PA3 - for COMP2. - - (+) The inverting input can be selected among: DAC1_OUT, DAC2_OUT - 1/4 VREFINT, 1/2 VERFINT, 3/4 VREFINT, VREFINT, - I/O (PA0 for COMP1 and PA2 for COMP2) - - (+) The COMP output is internally is available using COMP_GetOutputLevel() - and can be set on GPIO pins: PA0, PA6, PA11 for COMP1 - and PA2, PA7, PA12 for COMP2 - - (+) The COMP output can be redirected to embedded timers (TIM1, TIM2 - and TIM3) - - (+) The two comparators COMP1 and COMP2 can be combined in window - mode and only COMP1 non inverting (PA1) can be used as non- - inverting input. - - (+) The two comparators COMP1 and COMP2 have interrupt capability - with wake-up from Sleep and Stop modes (through the EXTI controller). - COMP1 and COMP2 outputs are internally connected to EXTI Line 21 - and EXTI Line 22 respectively. - - - ##### How to configure the comparator ##### - =============================================================================== - [..] - This driver provides functions to configure and program the Comparators - of all STM32F0xx devices. - - [..] To use the comparator, perform the following steps: - - (#) Enable the SYSCFG APB clock to get write access to comparator - register using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); - - (#) Configure the comparator input in analog mode using GPIO_Init() - - (#) Configure the comparator output in alternate function mode - using GPIO_Init() and use GPIO_PinAFConfig() function to map the - comparator output to the GPIO pin - - (#) Configure the comparator using COMP_Init() function: - (++) Select the inverting input - (++) Select the output polarity - (++) Select the output redirection - (++) Select the hysteresis level - (++) Select the power mode - - (#) Enable the comparator using COMP_Cmd() function - - (#) If required enable the COMP interrupt by configuring and enabling - EXTI line in Interrupt mode and selecting the desired sensitivity - level using EXTI_Init() function. After that enable the comparator - interrupt vector using NVIC_Init() function. - - @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_comp.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup COMP - * @brief COMP driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* CSR register Mask */ -#define COMP_CSR_CLEAR_MASK ((uint32_t)0x00003FFE) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup COMP_Private_Functions - * @{ - */ - -/** @defgroup COMP_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes COMP peripheral registers to their default reset values. - * @note Deinitialization can't be performed if the COMP configuration is locked. - * To unlock the configuration, perform a system reset. - * @param None - * @retval None - */ -void COMP_DeInit(void) -{ - COMP->CSR = ((uint32_t)0x00000000); /*!< Set COMP_CSR register to reset value */ -} - -/** - * @brief Initializes the COMP peripheral according to the specified parameters - * in COMP_InitStruct - * @note If the selected comparator is locked, initialization can't be performed. - * To unlock the configuration, perform a system reset. - * @note By default, PA1 is selected as COMP1 non inverting input. - * To use PA4 as COMP1 non inverting input call COMP_SwitchCmd() after COMP_Init() - * @param COMP_Selection: the selected comparator. - * This parameter can be one of the following values: - * @arg COMP_Selection_COMP1: COMP1 selected - * @arg COMP_Selection_COMP2: COMP2 selected - * @param COMP_InitStruct: pointer to an COMP_InitTypeDef structure that contains - * the configuration information for the specified COMP peripheral. - * @retval None - */ -void COMP_Init(uint32_t COMP_Selection, COMP_InitTypeDef* COMP_InitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_COMP_ALL_PERIPH(COMP_Selection)); - assert_param(IS_COMP_INVERTING_INPUT(COMP_InitStruct->COMP_InvertingInput)); - assert_param(IS_COMP_OUTPUT(COMP_InitStruct->COMP_Output)); - assert_param(IS_COMP_OUTPUT_POL(COMP_InitStruct->COMP_OutputPol)); - assert_param(IS_COMP_HYSTERESIS(COMP_InitStruct->COMP_Hysteresis)); - assert_param(IS_COMP_MODE(COMP_InitStruct->COMP_Mode)); - - /*!< Get the COMP_CSR register value */ - tmpreg = COMP->CSR; - - /*!< Clear the COMP1SW1, COMPx_IN_SEL, COMPx_OUT_TIM_SEL, COMPx_POL, COMPx_HYST and COMPx_PWR_MODE bits */ - tmpreg &= (uint32_t) ~(COMP_CSR_CLEAR_MASK<<COMP_Selection); - - /*!< Configure COMP: inverting input, output redirection, hysteresis value and power mode */ - /*!< Set COMPxINSEL bits according to COMP_InitStruct->COMP_InvertingInput value */ - /*!< Set COMPxOUTSEL bits according to COMP_InitStruct->COMP_Output value */ - /*!< Set COMPxPOL bit according to COMP_InitStruct->COMP_OutputPol value */ - /*!< Set COMPxHYST bits according to COMP_InitStruct->COMP_Hysteresis value */ - /*!< Set COMPxMODE bits according to COMP_InitStruct->COMP_Mode value */ - tmpreg |= (uint32_t)((COMP_InitStruct->COMP_InvertingInput | COMP_InitStruct->COMP_Output | - COMP_InitStruct->COMP_OutputPol | COMP_InitStruct->COMP_Hysteresis | - COMP_InitStruct->COMP_Mode)<<COMP_Selection); - - /*!< Write to COMP_CSR register */ - COMP->CSR = tmpreg; -} - -/** - * @brief Fills each COMP_InitStruct member with its default value. - * @param COMP_InitStruct: pointer to an COMP_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void COMP_StructInit(COMP_InitTypeDef* COMP_InitStruct) -{ - COMP_InitStruct->COMP_InvertingInput = COMP_InvertingInput_1_4VREFINT; - COMP_InitStruct->COMP_Output = COMP_Output_None; - COMP_InitStruct->COMP_OutputPol = COMP_OutputPol_NonInverted; - COMP_InitStruct->COMP_Hysteresis = COMP_Hysteresis_No; - COMP_InitStruct->COMP_Mode = COMP_Mode_UltraLowPower; -} - -/** - * @brief Enable or disable the COMP peripheral. - * @note If the selected comparator is locked, enable/disable can't be performed. - * To unlock the configuration, perform a system reset. - * @param COMP_Selection: the selected comparator. - * This parameter can be one of the following values: - * @arg COMP_Selection_COMP1: COMP1 selected - * @arg COMP_Selection_COMP2: COMP2 selected - * @param NewState: new state of the COMP peripheral. - * This parameter can be: ENABLE or DISABLE. - * @note When enabled, the comparator compares the non inverting input with - * the inverting input and the comparison result is available on comparator output. - * @note When disabled, the comparator doesn't perform comparison and the - * output level is low. - * @retval None - */ -void COMP_Cmd(uint32_t COMP_Selection, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_COMP_ALL_PERIPH(COMP_Selection)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected COMP peripheral */ - COMP->CSR |= (uint32_t) (1<<COMP_Selection); - } - else - { - /* Disable the selected COMP peripheral */ - COMP->CSR &= (uint32_t)(~((uint32_t)1<<COMP_Selection)); - } -} - -/** - * @brief Close or Open the SW1 switch. - * @note This switch is solely intended to redirect signals onto high - * impedance input, such as COMP1 non-inverting input (highly resistive switch) - * @param NewState: New state of the analog switch. - * This parameter can be: ENABLE or DISABLE. - * @note When enabled, the SW1 is closed; PA1 is connected to PA4 - * @note When disabled, the SW1 switch is open; PA1 is disconnected from PA4 - * @retval None - */ -void COMP_SwitchCmd(FunctionalState NewState) -{ - /* Check the parameter */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Close SW1 switch */ - COMP->CSR |= (uint32_t) (COMP_CSR_COMP1SW1); - } - else - { - /* Open SW1 switch */ - COMP->CSR &= (uint32_t)(~COMP_CSR_COMP1SW1); - } -} - -/** - * @brief Return the output level (high or low) of the selected comparator. - * @note The output level depends on the selected polarity. - * @note If the polarity is not inverted: - * - Comparator output is low when the non-inverting input is at a lower - * voltage than the inverting input - * - Comparator output is high when the non-inverting input is at a higher - * voltage than the inverting input - * @note If the polarity is inverted: - * - Comparator output is high when the non-inverting input is at a lower - * voltage than the inverting input - * - Comparator output is low when the non-inverting input is at a higher - * voltage than the inverting input - * @param COMP_Selection: the selected comparator. - * This parameter can be one of the following values: - * @arg COMP_Selection_COMP1: COMP1 selected - * @arg COMP_Selection_COMP2: COMP2 selected - * @retval Returns the selected comparator output level: low or high. - * - */ -uint32_t COMP_GetOutputLevel(uint32_t COMP_Selection) -{ - uint32_t compout = 0x0; - - /* Check the parameters */ - assert_param(IS_COMP_ALL_PERIPH(COMP_Selection)); - - /* Check if selected comparator output is high */ - if ((COMP->CSR & (COMP_CSR_COMP1OUT<<COMP_Selection)) != 0) - { - compout = COMP_OutputLevel_High; - } - else - { - compout = COMP_OutputLevel_Low; - } - - /* Return the comparator output level */ - return (uint32_t)(compout); -} - -/** - * @} - */ - -/** @defgroup COMP_Group2 Window mode control function - * @brief Window mode control function - * -@verbatim - =============================================================================== - ##### Window mode control function ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the window mode. - * @note In window mode, COMP1 and COMP2 non inverting inputs are connected - * together and only COMP1 non inverting input (PA1) can be used. - * @param NewState: new state of the window mode. - * This parameter can be : - * @arg ENABLE: COMP1 and COMP2 non inverting inputs are connected together. - * @arg DISABLE: OMP1 and COMP2 non inverting inputs are disconnected. - * @retval None - */ -void COMP_WindowCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the window mode */ - COMP->CSR |= (uint32_t) COMP_CSR_WNDWEN; - } - else - { - /* Disable the window mode */ - COMP->CSR &= (uint32_t)(~COMP_CSR_WNDWEN); - } -} - -/** - * @} - */ - -/** @defgroup COMP_Group3 COMP configuration locking function - * @brief COMP1 and COMP2 configuration locking function - * COMP1 and COMP2 configuration can be locked each separately. - * Unlocking is performed by system reset. - * -@verbatim - =============================================================================== - ##### Configuration Lock function ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Lock the selected comparator (COMP1/COMP2) configuration. - * @note Locking the configuration means that all control bits are read-only. - * To unlock the comparator configuration, perform a system reset. - * @param COMP_Selection: selects the comparator to be locked - * This parameter can be a value of the following values: - * @arg COMP_Selection_COMP1: COMP1 configuration is locked. - * @arg COMP_Selection_COMP2: COMP2 configuration is locked. - * @retval None - */ -void COMP_LockConfig(uint32_t COMP_Selection) -{ - /* Check the parameter */ - assert_param(IS_COMP_ALL_PERIPH(COMP_Selection)); - - /* Set the lock bit corresponding to selected comparator */ - COMP->CSR |= (uint32_t) (COMP_CSR_COMP1LOCK<<COMP_Selection); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_crc.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_crc.c deleted file mode 100644 index 05e1bf1..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_crc.c +++ /dev/null @@ -1,361 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_crc.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of CRC computation unit peripheral: - * + Configuration of the CRC computation unit - * + CRC computation of one/many 32-bit data - * + CRC Independent register (IDR) access - * - * @verbatim - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - - (+) Enable CRC AHB clock using RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE) - function - (+) If required, select the reverse operation on input data - using CRC_ReverseInputDataSelect() - (+) If required, enable the reverse operation on output data - using CRC_ReverseOutputDataCmd(Enable) - (+) use CRC_CalcCRC() function to compute the CRC of a 32-bit data - or use CRC_CalcBlockCRC() function to compute the CRC if a 32-bit - data buffer - (@) To compute the CRC of a new data use CRC_ResetDR() to reset - the CRC computation unit before starting the computation - otherwise you can get wrong CRC values. - - @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_crc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup CRC - * @brief CRC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup CRC_Private_Functions - * @{ - */ - -/** @defgroup CRC_Group1 Configuration of the CRC computation unit functions - * @brief Configuration of the CRC computation unit functions - * -@verbatim - =============================================================================== - ##### CRC configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes CRC peripheral registers to their default reset values. - * @param None - * @retval None - */ -void CRC_DeInit(void) -{ - /* Set DR register to reset value */ - CRC->DR = 0xFFFFFFFF; - - /* Set the POL register to the reset value: 0x04C11DB7 */ - CRC->POL = 0x04C11DB7; - - /* Reset IDR register */ - CRC->IDR = 0x00; - - /* Set INIT register to reset value */ - CRC->INIT = 0xFFFFFFFF; - - /* Reset the CRC calculation unit */ - CRC->CR = CRC_CR_RESET; -} - -/** - * @brief Resets the CRC calculation unit and sets INIT register content in DR register. - * @param None - * @retval None - */ -void CRC_ResetDR(void) -{ - /* Reset CRC generator */ - CRC->CR |= CRC_CR_RESET; -} - -/** - * @brief Selects the polynomial size. This function is only applicable for - * STM32F072 devices. - * @param CRC_PolSize: Specifies the polynomial size. - * This parameter can be: - * @arg CRC_PolSize_7: 7-bit polynomial for CRC calculation - * @arg CRC_PolSize_8: 8-bit polynomial for CRC calculation - * @arg CRC_PolSize_16: 16-bit polynomial for CRC calculation - * @arg CRC_PolSize_32: 32-bit polynomial for CRC calculation - * @retval None - */ -void CRC_PolynomialSizeSelect(uint32_t CRC_PolSize) -{ - uint32_t tmpcr = 0; - - /* Check the parameter */ - assert_param(IS_CRC_POL_SIZE(CRC_PolSize)); - - /* Get CR register value */ - tmpcr = CRC->CR; - - /* Reset POL_SIZE bits */ - tmpcr &= (uint32_t)~((uint32_t)CRC_CR_POLSIZE); - /* Set the polynomial size */ - tmpcr |= (uint32_t)CRC_PolSize; - - /* Write to CR register */ - CRC->CR = (uint32_t)tmpcr; -} - -/** - * @brief Selects the reverse operation to be performed on input data. - * @param CRC_ReverseInputData: Specifies the reverse operation on input data. - * This parameter can be: - * @arg CRC_ReverseInputData_No: No reverse operation is performed - * @arg CRC_ReverseInputData_8bits: reverse operation performed on 8 bits - * @arg CRC_ReverseInputData_16bits: reverse operation performed on 16 bits - * @arg CRC_ReverseInputData_32bits: reverse operation performed on 32 bits - * @retval None - */ -void CRC_ReverseInputDataSelect(uint32_t CRC_ReverseInputData) -{ - uint32_t tmpcr = 0; - - /* Check the parameter */ - assert_param(IS_CRC_REVERSE_INPUT_DATA(CRC_ReverseInputData)); - - /* Get CR register value */ - tmpcr = CRC->CR; - - /* Reset REV_IN bits */ - tmpcr &= (uint32_t)~((uint32_t)CRC_CR_REV_IN); - /* Set the reverse operation */ - tmpcr |= (uint32_t)CRC_ReverseInputData; - - /* Write to CR register */ - CRC->CR = (uint32_t)tmpcr; -} - -/** - * @brief Enables or disable the reverse operation on output data. - * The reverse operation on output data is performed on 32-bit. - * @param NewState: new state of the reverse operation on output data. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CRC_ReverseOutputDataCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable reverse operation on output data */ - CRC->CR |= CRC_CR_REV_OUT; - } - else - { - /* Disable reverse operation on output data */ - CRC->CR &= (uint32_t)~((uint32_t)CRC_CR_REV_OUT); - } -} - -/** - * @brief Initializes the INIT register. - * @note After resetting CRC calculation unit, CRC_InitValue is stored in DR register - * @param CRC_InitValue: Programmable initial CRC value - * @retval None - */ -void CRC_SetInitRegister(uint32_t CRC_InitValue) -{ - CRC->INIT = CRC_InitValue; -} - -/** - * @brief Initializes the polynomail coefficients. This function is only - * applicable for STM32F072 devices. - * @param CRC_Pol: Polynomial to be used for CRC calculation. - * @retval None - */ -void CRC_SetPolynomial(uint32_t CRC_Pol) -{ - CRC->POL = CRC_Pol; -} - -/** - * @} - */ - -/** @defgroup CRC_Group2 CRC computation of one/many 32-bit data functions - * @brief CRC computation of one/many 32-bit data functions - * -@verbatim - =============================================================================== - ##### CRC computation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Computes the 32-bit CRC of a given data word(32-bit). - * @param CRC_Data: data word(32-bit) to compute its CRC - * @retval 32-bit CRC - */ -uint32_t CRC_CalcCRC(uint32_t CRC_Data) -{ - CRC->DR = CRC_Data; - - return (CRC->DR); -} - -/** - * @brief Computes the 16-bit CRC of a given 16-bit data. This function is only - * applicable for STM32F072 devices. - * @param CRC_Data: data half-word(16-bit) to compute its CRC - * @retval 16-bit CRC - */ -uint32_t CRC_CalcCRC16bits(uint16_t CRC_Data) -{ - *(uint16_t*)(CRC_BASE) = (uint16_t) CRC_Data; - - return (CRC->DR); -} - -/** - * @brief Computes the 8-bit CRC of a given 8-bit data. This function is only - * applicable for STM32F072 devices. - * @param CRC_Data: 8-bit data to compute its CRC - * @retval 8-bit CRC - */ -uint32_t CRC_CalcCRC8bits(uint8_t CRC_Data) -{ - *(uint8_t*)(CRC_BASE) = (uint8_t) CRC_Data; - - return (CRC->DR); -} - -/** - * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). - * @param pBuffer: pointer to the buffer containing the data to be computed - * @param BufferLength: length of the buffer to be computed - * @retval 32-bit CRC - */ -uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength) -{ - uint32_t index = 0; - - for(index = 0; index < BufferLength; index++) - { - CRC->DR = pBuffer[index]; - } - return (CRC->DR); -} - -/** - * @brief Returns the current CRC value. - * @param None - * @retval 32-bit CRC - */ -uint32_t CRC_GetCRC(void) -{ - return (CRC->DR); -} - -/** - * @} - */ - -/** @defgroup CRC_Group3 CRC Independent Register (IDR) access functions - * @brief CRC Independent Register (IDR) access (write/read) functions - * -@verbatim - =============================================================================== - ##### CRC Independent Register (IDR) access functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Stores an 8-bit data in the Independent Data(ID) register. - * @param CRC_IDValue: 8-bit value to be stored in the ID register - * @retval None - */ -void CRC_SetIDRegister(uint8_t CRC_IDValue) -{ - CRC->IDR = CRC_IDValue; -} - -/** - * @brief Returns the 8-bit data stored in the Independent Data(ID) register - * @param None - * @retval 8-bit value of the ID register - */ -uint8_t CRC_GetIDRegister(void) -{ - return (CRC->IDR); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_crs.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_crs.c deleted file mode 100644 index 3d35149..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_crs.c +++ /dev/null @@ -1,466 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_crs.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of CRS peripheral applicable only on STM32F042 and - * STM32F072 devices: - * + Configuration of the CRS peripheral - * + Interrupts and flags management - * - * - * @verbatim - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - - (+) Enable CRS AHB clock using RCC_APB1eriphClockCmd(RCC_APB1Periph_CRS, ENABLE) - function - - - @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_crs.h" -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup CRS - * @brief CRS driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* CRS Flag Mask */ -#define FLAG_MASK ((uint32_t)0x700) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup CRS_Private_Functions - * @{ - */ - -/** @defgroup CRS_Group1 Configuration of the CRS functions - * @brief Configuration of the CRS functions - * -@verbatim - =============================================================================== - ##### CRS configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes CRS peripheral registers to their default reset values. - * @param None - * @retval None - */ -void CRS_DeInit(void) -{ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CRS, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CRS, DISABLE); -} - -/** - * @brief Adjusts the Internal High Speed 48 oscillator (HSI 48) calibration value. - * @note The calibration is used to compensate for the variations in voltage - * and temperature that influence the frequency of the internal HSI48 RC. - * @note This function can be called only when the AUTOTRIMEN bit is reset. - * @param CRS_HSI48CalibrationValue: - * @retval None - */ -void CRS_AdjustHSI48CalibrationValue(uint8_t CRS_HSI48CalibrationValue) -{ - /* Clear TRIM[5:0] bits */ - CRS->CR &= ~CRS_CR_TRIM; - - /* Set the TRIM[5:0] bits according to CRS_HSI48CalibrationValue value */ - CRS->CR |= (uint32_t)((uint32_t)CRS_HSI48CalibrationValue << 8); - -} - -/** - * @brief Enables or disables the oscillator clock for frequency error counter. - * @note when the CEN bit is set the CRS_CFGR register becomes write-protected. - * @param NewState: new state of the frequency error counter. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CRS_FrequencyErrorCounterCmd(FunctionalState NewState) -{ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - CRS->CR |= CRS_CR_CEN; - } - else - { - CRS->CR &= ~CRS_CR_CEN; - } -} - -/** - * @brief Enables or disables the automatic hardware adjustement of TRIM bits. - * @note When the AUTOTRIMEN bit is set the CRS_CFGR register becomes write-protected. - * @param NewState: new state of the automatic trimming. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CRS_AutomaticCalibrationCmd(FunctionalState NewState) -{ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - CRS->CR |= CRS_CR_AUTOTRIMEN; - } -else - { - CRS->CR &= ~CRS_CR_AUTOTRIMEN; - } -} - -/** - * @brief Generate the software synchronization event - * @param None - * @retval None - */ -void CRS_SoftwareSynchronizationGenerate(void) -{ - CRS->CR |= CRS_CR_SWSYNC; -} - -/** - * @brief Adjusts the Internal High Speed 48 oscillator (HSI 48) calibration value. - * @note The calibration is used to compensate for the variations in voltage - * and temperature that influence the frequency of the internal HSI48 RC. - * @note This function can be called only when the CEN bit is reset. - * @param CRS_ReloadValue: specifies the HSI calibration trimming value. - * This parameter must be a number between 0 and . - * @retval None - */ -void CRS_FrequencyErrorCounterReload(uint32_t CRS_ReloadValue) -{ - - /* Clear RELOAD[15:0] bits */ - CRS->CFGR &= ~CRS_CFGR_RELOAD; - - /* Set the RELOAD[15:0] bits according to CRS_ReloadValue value */ - CRS->CFGR |= (uint32_t)CRS_ReloadValue; - -} - -/** - * @brief - * @note This function can be called only when the CEN bit is reset. - * @param CRS_ErrorLimitValue: specifies the HSI calibration trimming value. - * This parameter must be a number between 0 and . - * @retval None - */ -void CRS_FrequencyErrorLimitConfig(uint8_t CRS_ErrorLimitValue) -{ - /* Clear FELIM[7:0] bits */ - CRS->CFGR &= ~CRS_CFGR_FELIM; - - /* Set the FELIM[7:0] bits according to CRS_ErrorLimitValue value */ - CRS->CFGR |= (uint32_t)CRS_ErrorLimitValue; -} - -/** - * @brief - * @note This function can be called only when the CEN bit is reset. - * @param CRS_Prescaler: specifies the HSI calibration trimming value. - * This parameter can be one of the following values: - * @arg CRS_SYNC_Div1: - * @arg CRS_SYNC_Div2: - * @arg CRS_SYNC_Div4: - * @arg CRS_SYNC_Div8: - * @arg CRS_SYNC_Div16: - * @arg CRS_SYNC_Div32: - * @arg CRS_SYNC_Div64: - * @arg CRS_SYNC_Div128: - * @retval None - */ -void CRS_SynchronizationPrescalerConfig(uint32_t CRS_Prescaler) -{ - /* Check the parameters */ - assert_param(IS_CRS_SYNC_DIV(CRS_Prescaler)); - - /* Clear SYNCDIV[2:0] bits */ - CRS->CFGR &= ~CRS_CFGR_SYNCDIV; - - /* Set the CRS_CFGR_SYNCDIV[2:0] bits according to CRS_Prescaler value */ - CRS->CFGR |= CRS_Prescaler; -} - -/** - * @brief - * @note This function can be called only when the CEN bit is reset. - * @param CRS_Source: . - * This parameter can be one of the following values: - * @arg CRS_SYNCSource_GPIO: - * @arg CRS_SYNCSource_LSE: - * @arg CRS_SYNCSource_USB: - * @retval None - */ -void CRS_SynchronizationSourceConfig(uint32_t CRS_Source) -{ - /* Check the parameters */ - assert_param(IS_CRS_SYNC_SOURCE(CRS_Source)); - - /* Clear SYNCSRC[1:0] bits */ - CRS->CFGR &= ~CRS_CFGR_SYNCSRC; - - /* Set the SYNCSRC[1:0] bits according to CRS_Source value */ - CRS->CFGR |= CRS_Source; -} - -/** - * @brief - * @note This function can be called only when the CEN bit is reset. - * @param CRS_Polarity: . - * This parameter can be one of the following values: - * @arg CRS_SYNCPolarity_Rising: - * @arg CRS_SYNCPolarity_Falling: - * @retval None - */ -void CRS_SynchronizationPolarityConfig(uint32_t CRS_Polarity) -{ - /* Check the parameters */ - assert_param(IS_CRS_SYNC_POLARITY(CRS_Polarity)); - - /* Clear SYNCSPOL bit */ - CRS->CFGR &= ~CRS_CFGR_SYNCPOL; - - /* Set the SYNCSPOL bits according to CRS_Polarity value */ - CRS->CFGR |= CRS_Polarity; -} - -/** - * @brief Returns the Relaod value. - * @param None - * @retval The reload value - */ -uint32_t CRS_GetReloadValue(void) -{ - return ((uint32_t)(CRS->CFGR & CRS_CFGR_RELOAD)); -} - -/** - * @brief Returns the HSI48 Calibration value. - * @param None - * @retval The reload value - */ -uint32_t CRS_GetHSI48CalibrationValue(void) -{ - return (((uint32_t)(CRS->CR & CRS_CR_TRIM)) >> 8); -} - -/** - * @brief Returns the frequency error capture. - * @param None - * @retval The frequency error capture value - */ -uint32_t CRS_GetFrequencyErrorValue(void) -{ - return ((uint32_t)(CRS->ISR & CRS_ISR_FECAP)); -} - -/** - * @brief Returns the frequency error direction. - * @param None - * @retval The frequency error direction. The returned value can be one - * of the following values: - * - 0x00: Up counting - * - 0x8000: Down counting - */ -uint32_t CRS_GetFrequencyErrorDirection(void) -{ - return ((uint32_t)(CRS->ISR & CRS_ISR_FEDIR)); -} - -/** @defgroup CRS_Group2 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== -@endverbatim - * @{ - */ -/** - * @brief Enables or disables the specified CRS interrupts. - * @param CRS_IT: specifies the RCC interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg CRS_IT_SYNCOK: - * @arg CRS_IT_SYNCWARN: - * @arg CRS_IT_ERR: - * @arg CRS_IT_ESYNC: - * @param NewState: new state of the specified CRS interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CRS_ITConfig(uint32_t CRS_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_CRS_IT(CRS_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - CRS->CR |= CRS_IT; - } - else - { - CRS->CR &= ~CRS_IT; - } -} - -/** - * @brief Checks whether the specified CRS flag is set or not. - * @param CRS_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg CRS_FLAG_SYNCOK: - * @arg CRS_FLAG_SYNCWARN: - * @arg CRS_FLAG_ERR: - * @arg CRS_FLAG_ESYNC: - * @arg CRS_FLAG_TRIMOVF: - * @arg CRS_FLAG_SYNCERR: - * @arg CRS_FLAG_SYNCMISS: - * @retval The new state of CRS_FLAG (SET or RESET). - */ -FlagStatus CRS_GetFlagStatus(uint32_t CRS_FLAG) -{ - /* Check the parameters */ - assert_param(IS_CRS_FLAG(CRS_FLAG)); - - return ((FlagStatus)(CRS->ISR & CRS_FLAG)); -} - -/** - * @brief Clears the CRS specified FLAG. - * @param CRS_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg CRS_FLAG_SYNCOK: - * @arg CRS_FLAG_SYNCWARN: - * @arg CRS_FLAG_ERR: - * @arg CRS_FLAG_ESYNC: - * @arg CRS_FLAG_TRIMOVF: - * @arg CRS_FLAG_SYNCERR: - * @arg CRS_FLAG_SYNCMISS: - * @retval None - */ -void CRS_ClearFlag(uint32_t CRS_FLAG) -{ - /* Check the parameters */ - assert_param(IS_CRS_FLAG(CRS_FLAG)); - - if ((CRS_FLAG & FLAG_MASK)!= 0) - { - CRS->ICR |= CRS_ICR_ERRC; - } - else - { - CRS->ICR |= CRS_FLAG; - } -} - -/** - * @brief Checks whether the specified CRS IT pending bit is set or not. - * @param CRS_IT: specifies the IT pending bit to check. - * This parameter can be one of the following values: - * @arg CRS_IT_SYNCOK: - * @arg CRS_IT_SYNCWARN: - * @arg CRS_IT_ERR: - * @arg CRS_IT_ESYNC: - * @arg CRS_IT_TRIMOVF: - * @arg CRS_IT_SYNCERR: - * @arg CRS_IT_SYNCMISS: - * @retval The new state of CRS_IT (SET or RESET). - */ -ITStatus CRS_GetITStatus(uint32_t CRS_IT) -{ - /* Check the parameters */ - assert_param(IS_CRS_GET_IT(CRS_IT)); - - return ((ITStatus)(CRS->ISR & CRS_IT)); -} - -/** - * @brief Clears the CRS specified IT pending bi. - * @param CRS_FLAG: specifies the IT pending bi to clear. - * This parameter can be one of the following values: - * @arg CRS_IT_SYNCOK: - * @arg CRS_IT_SYNCWARN: - * @arg CRS_IT_ERR: - * @arg CRS_IT_ESYNC: - * @arg CRS_IT_TRIMOVF: - * @arg CRS_IT_SYNCERR: - * @arg CRS_IT_SYNCMISS: - * @retval None - */ -void CRS_ClearITPendingBit(uint32_t CRS_IT) -{ - /* Check the parameters */ - assert_param(IS_CRS_CLEAR_IT(CRS_IT)); - - if ((CRS_IT & FLAG_MASK)!= 0) - { - CRS->ICR |= CRS_ICR_ERRC; - } - else - { - CRS->ICR |= CRS_IT; - } -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dac.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dac.c deleted file mode 100644 index e6f34ad..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dac.c +++ /dev/null @@ -1,692 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_dac.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Digital-to-Analog Converter (DAC) peripheral - * applicable only on STM32F051 and STM32F072 devices: - * + DAC channel configuration: trigger, output buffer, data format - * + DMA management - * + Interrupts and flags management - * - * @verbatim - * - =============================================================================== - ##### DAC Peripheral features ##### - =============================================================================== - [..] The device integrates two 12-bit Digital Analog Converters refered as - DAC channel1 with DAC_OUT1 (PA4) and DAC_OUT2 (PA5) as outputs. - - [..] Digital to Analog conversion can be non-triggered using DAC_Trigger_None - and DAC_OUTx is available once writing to DHRx register using - DAC_SetChannel1Data() or DAC_SetChannel2Data() - - [..] Digital to Analog conversion can be triggered by: - (#) External event: EXTI Line 9 (any GPIOx_Pin9) using DAC_Trigger_Ext_IT9. - The used pin (GPIOx_Pin9) must be configured in input mode. - - (#) Timers TRGO: TIM2, TIM3,TIM7, TIM6 and TIM15 - (DAC_Trigger_T2_TRGO, DAC_Trigger_T3_TRGO...) - The timer TRGO event should be selected using TIM_SelectOutputTrigger() - - (#) Software using DAC_Trigger_Software - - [..] Each DAC integrates an output buffer that can be used to - reduce the output impedance, and to drive external loads directly - without having to add an external operational amplifier. - To enable the output buffer use - DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; - - [..] Refer to the device datasheet for more details about output impedance - value with and without output buffer. - - [..] DAC wave generation feature - Both DAC channels can be used to generate - 1- Noise wave using DAC_WaveGeneration_Noise - 2- Triangle wave using DAC_WaveGeneration_Triangle - - [..] The DAC data format can be: - (#) 8-bit right alignment using DAC_Align_8b_R - (#) 12-bit left alignment using DAC_Align_12b_L - (#) 12-bit right alignment using DAC_Align_12b_R - - [..] The analog output voltage on each DAC channel pin is determined - by the following equation: DAC_OUTx = VREF+ * DOR / 4095 - with DOR is the Data Output Register - VEF+ is the input voltage reference (refer to the device datasheet) - e.g. To set DAC_OUT1 to 0.7V, use - DAC_SetChannel1Data(DAC_Align_12b_R, 868); - Assuming that VREF+ = 3.3, DAC_OUT1 = (3.3 * 868) / 4095 = 0.7V - - [..] A DMA1 request can be generated when an external trigger (but not - a software trigger) occurs if DMA1 requests are enabled using - DAC_DMACmd() - DMA1 requests are mapped as following: - (+) DAC channel1 is mapped on DMA1 channel3 which must be already - configured - (+) DAC channel2 is mapped on DMA1 channel4 which must be already - configured - - ##### How to use this driver ##### - =============================================================================== - [..] - (+) Enable DAC APB1 clock to get write access to DAC registers - using RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE) - - (+) Configure DAC_OUTx (DAC_OUT1: PA4, DAC_OUT2: PA5) in analog mode - using GPIO_Init() function - - (+) Configure the DAC channel using DAC_Init() - - (+) Enable the DAC channel using DAC_Cmd() - - @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_dac.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup DAC - * @brief DAC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* CR register Mask */ -#define CR_CLEAR_MASK ((uint32_t)0x00000FFE) /* check the value of the mask */ - -/* DAC Dual Channels SWTRIG masks */ -#define DUAL_SWTRIG_SET ((uint32_t)0x00000003) /*!< Only applicable for STM32F072 devices */ -#define DUAL_SWTRIG_RESET ((uint32_t)0xFFFFFFFC) /*!< Only applicable for STM32F072 devices */ - -/* DHR registers offsets */ -#define DHR12R1_OFFSET ((uint32_t)0x00000008) -#define DHR12R2_OFFSET ((uint32_t)0x00000014) /*!< Only applicable for STM32F072 devices */ -#define DHR12RD_OFFSET ((uint32_t)0x00000020) /*!< Only applicable for STM32F072 devices */ - -/* DOR register offset */ -#define DOR_OFFSET ((uint32_t)0x0000002C) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup DAC_Private_Functions - * @{ - */ - -/** @defgroup DAC_Group1 DAC channels configuration - * @brief DAC channels configuration: trigger, output buffer, data format - * -@verbatim - =============================================================================== - ##### DAC channels configuration: trigger, output buffer, data format ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the DAC peripheral registers to their default reset values. - * @param None - * @retval None - */ -void DAC_DeInit(void) -{ - /* Enable DAC reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, ENABLE); - /* Release DAC from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, DISABLE); -} - -/** - * @brief Initializes the DAC peripheral according to the specified parameters - * in the DAC_InitStruct. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected, applicable only for STM32F072 devices - * @param DAC_InitStruct: pointer to a DAC_InitTypeDef structure that contains - * the configuration information for the specified DAC channel. - * @retval None - */ -void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct) -{ - uint32_t tmpreg1 = 0, tmpreg2 = 0; - - /* Check the DAC parameters */ - assert_param(IS_DAC_TRIGGER(DAC_InitStruct->DAC_Trigger)); - assert_param(IS_DAC_GENERATE_WAVE(DAC_InitStruct->DAC_WaveGeneration)); - assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude)); - assert_param(IS_DAC_OUTPUT_BUFFER_STATE(DAC_InitStruct->DAC_OutputBuffer)); - -/*---------------------------- DAC CR Configuration --------------------------*/ - /* Get the DAC CR value */ - tmpreg1 = DAC->CR; - /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */ - tmpreg1 &= ~(CR_CLEAR_MASK << DAC_Channel); - /* Configure for the selected DAC channel: buffer output, trigger, - wave generation, mask/amplitude for wave generation */ - /* Set TSELx and TENx bits according to DAC_Trigger value */ - /* Set WAVEx bits according to DAC_WaveGeneration value */ - /* Set MAMPx bits according to DAC_LFSRUnmask_TriangleAmplitude value */ - /* Set BOFFx bit according to DAC_OutputBuffer value */ - tmpreg2 = (DAC_InitStruct->DAC_Trigger | DAC_InitStruct->DAC_WaveGeneration | - DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude | \ - DAC_InitStruct->DAC_OutputBuffer); - /* Calculate CR register value depending on DAC_Channel */ - tmpreg1 |= tmpreg2 << DAC_Channel; - /* Write to DAC CR */ - DAC->CR = tmpreg1; -} - -/** - * @brief Fills each DAC_InitStruct member with its default value. - * @param DAC_InitStruct: pointer to a DAC_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct) -{ -/*--------------- Reset DAC init structure parameters values -----------------*/ - /* Initialize the DAC_Trigger member */ - DAC_InitStruct->DAC_Trigger = DAC_Trigger_None; - - /* Initialize the DAC_WaveGeneration member */ - DAC_InitStruct->DAC_WaveGeneration = DAC_WaveGeneration_None; - - /* Initialize the DAC_LFSRUnmask_TriangleAmplitude member */ - DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; - - /* Initialize the DAC_OutputBuffer member */ - DAC_InitStruct->DAC_OutputBuffer = DAC_OutputBuffer_Enable; -} - -/** - * @brief Enables or disables the specified DAC channel. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected, applicable only for STM32F072 devices - * @param NewState: new state of the DAC channel. - * This parameter can be: ENABLE or DISABLE. - * @note When the DAC channel is enabled the trigger source can no more be modified. - * @retval None - */ -void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected DAC channel */ - DAC->CR |= (DAC_CR_EN1 << DAC_Channel); - } - else - { - /* Disable the selected DAC channel */ - DAC->CR &= (~(DAC_CR_EN1 << DAC_Channel)); - } -} - -/** - * @brief Enables or disables the selected DAC channel software trigger. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected, applicable only for STM32F072 devices - * @param NewState: new state of the selected DAC channel software trigger. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable software trigger for the selected DAC channel */ - DAC->SWTRIGR |= (uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4); - } - else - { - /* Disable software trigger for the selected DAC channel */ - DAC->SWTRIGR &= ~((uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4)); - } -} - -/** - * @brief Enables or disables simultaneously the two DAC channels software triggers. - * This function is applicable only for STM32F072 devices. - * @param NewState: new state of the DAC channels software triggers. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_DualSoftwareTriggerCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable software trigger for both DAC channels */ - DAC->SWTRIGR |= DUAL_SWTRIG_SET; - } - else - { - /* Disable software trigger for both DAC channels */ - DAC->SWTRIGR &= DUAL_SWTRIG_RESET; - } -} - -/** - * @brief Enables or disables the selected DAC channel wave generation. - * This function is applicable only for STM32F072 devices. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_Wave: specifies the wave type to enable or disable. - * This parameter can be: - * @arg DAC_Wave_Noise: noise wave generation - * @arg DAC_Wave_Triangle: triangle wave generation - * @param NewState: new state of the selected DAC channel wave generation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_WAVE(DAC_Wave)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected wave generation for the selected DAC channel */ - DAC->CR |= DAC_Wave << DAC_Channel; - } - else - { - /* Disable the selected wave generation for the selected DAC channel */ - DAC->CR &= ~(DAC_Wave << DAC_Channel); - } -} - -/** - * @brief Set the specified data holding register value for DAC channel1. - * @param DAC_Align: Specifies the data alignment for DAC channel1. - * This parameter can be one of the following values: - * @arg DAC_Align_8b_R: 8bit right data alignment selected - * @arg DAC_Align_12b_L: 12bit left data alignment selected - * @arg DAC_Align_12b_R: 12bit right data alignment selected - * @param Data: Data to be loaded in the selected data holding register. - * @retval None - */ -void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_ALIGN(DAC_Align)); - assert_param(IS_DAC_DATA(Data)); - - tmp = (uint32_t)DAC_BASE; - tmp += DHR12R1_OFFSET + DAC_Align; - - /* Set the DAC channel1 selected data holding register */ - *(__IO uint32_t *) tmp = Data; -} - -/** - * @brief Sets the specified data holding register value for DAC channel2. - * This function is applicable only for STM32F072 devices. - * @param DAC_Align: Specifies the data alignment for DAC channel2. - * This parameter can be: - * @arg DAC_Align_8b_R: 8bit right data alignment selected - * @arg DAC_Align_12b_L: 12bit left data alignment selected - * @arg DAC_Align_12b_R: 12bit right data alignment selected - * @param Data: Data to be loaded in the selected data holding register. - * @retval None - */ -void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_ALIGN(DAC_Align)); - assert_param(IS_DAC_DATA(Data)); - - tmp = (uint32_t)DAC_BASE; - tmp += DHR12R2_OFFSET + DAC_Align; - - /* Set the DAC channel2 selected data holding register */ - *(__IO uint32_t *)tmp = Data; -} - -/** - * @brief Sets the specified data holding register value for dual channel DAC. - * This function is applicable only for STM32F072 devices. - * @param DAC_Align: Specifies the data alignment for dual channel DAC. - * This parameter can be: - * @arg DAC_Align_8b_R: 8bit right data alignment selected - * @arg DAC_Align_12b_L: 12bit left data alignment selected - * @arg DAC_Align_12b_R: 12bit right data alignment selected - * @param Data2: Data for DAC Channel2 to be loaded in the selected data holding register. - * @param Data1: Data for DAC Channel1 to be loaded in the selected data holding register. - * @note In dual mode, a unique register access is required to write in both - * DAC channels at the same time. - * @retval None - */ -void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1) -{ - uint32_t data = 0, tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_ALIGN(DAC_Align)); - assert_param(IS_DAC_DATA(Data1)); - assert_param(IS_DAC_DATA(Data2)); - - /* Calculate and set dual DAC data holding register value */ - if (DAC_Align == DAC_Align_8b_R) - { - data = ((uint32_t)Data2 << 8) | Data1; - } - else - { - data = ((uint32_t)Data2 << 16) | Data1; - } - - tmp = (uint32_t)DAC_BASE; - tmp += DHR12RD_OFFSET + DAC_Align; - - /* Set the dual DAC selected data holding register */ - *(__IO uint32_t *)tmp = data; -} - -/** - * @brief Returns the last data output value of the selected DAC channel. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected, applicable only for STM32F072 devices - * @retval The selected DAC channel data output value. - */ -uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - - tmp = (uint32_t) DAC_BASE ; - tmp += DOR_OFFSET + ((uint32_t)DAC_Channel >> 2); - - /* Returns the DAC channel data output register value */ - return (uint16_t) (*(__IO uint32_t*) tmp); -} - -/** - * @} - */ - -/** @defgroup DAC_Group2 DMA management functions - * @brief DMA management functions - * -@verbatim - =============================================================================== - ##### DMA management functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified DAC channel DMA request. - * When enabled DMA1 is generated when an external trigger (EXTI Line9, - * TIM2, TIM3, TIM6 or TIM15 but not a software trigger) occurs - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected, applicable only for STM32F072 devices - * @param NewState: new state of the selected DAC channel DMA request. - * This parameter can be: ENABLE or DISABLE. - * @note The DAC channel1 is mapped on DMA1 channel3 which must be already configured. - * @note The DAC channel2 is mapped on DMA1 channel4 which must be already configured. - * @retval None - */ -void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected DAC channel DMA request */ - DAC->CR |= (DAC_CR_DMAEN1 << DAC_Channel); - } - else - { - /* Disable the selected DAC channel DMA request */ - DAC->CR &= (~(DAC_CR_DMAEN1 << DAC_Channel)); - } -} - -/** - * @} - */ - -/** @defgroup DAC_Group3 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified DAC interrupts. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected, applicable only for STM32F072 devices - * @param DAC_IT: specifies the DAC interrupt sources to be enabled or disabled. - * This parameter can be the following values: - * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask - * @note The DMA underrun occurs when a second external trigger arrives before the - * acknowledgement for the first external trigger is received (first request). - * @param NewState: new state of the specified DAC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_DAC_IT(DAC_IT)); - - if (NewState != DISABLE) - { - /* Enable the selected DAC interrupts */ - DAC->CR |= (DAC_IT << DAC_Channel); - } - else - { - /* Disable the selected DAC interrupts */ - DAC->CR &= (~(uint32_t)(DAC_IT << DAC_Channel)); - } -} - -/** - * @brief Checks whether the specified DAC flag is set or not. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected, applicable only for STM32F072 devices - * @param DAC_FLAG: specifies the flag to check. - * This parameter can be only of the following value: - * @arg DAC_FLAG_DMAUDR: DMA underrun flag - * @note The DMA underrun occurs when a second external trigger arrives before the - * acknowledgement for the first external trigger is received (first request). - * @retval The new state of DAC_FLAG (SET or RESET). - */ -FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_FLAG(DAC_FLAG)); - - /* Check the status of the specified DAC flag */ - if ((DAC->SR & (DAC_FLAG << DAC_Channel)) != (uint8_t)RESET) - { - /* DAC_FLAG is set */ - bitstatus = SET; - } - else - { - /* DAC_FLAG is reset */ - bitstatus = RESET; - } - /* Return the DAC_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the DAC channel's pending flags. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected, applicable only for STM32F072 devices - * @param DAC_FLAG: specifies the flag to clear. - * This parameter can be of the following value: - * @arg DAC_FLAG_DMAUDR: DMA underrun flag - * @retval None - */ -void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_FLAG(DAC_FLAG)); - - /* Clear the selected DAC flags */ - DAC->SR = (DAC_FLAG << DAC_Channel); -} - -/** - * @brief Checks whether the specified DAC interrupt has occurred or not. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected, applicable only for STM32F072 devices - * @param DAC_IT: specifies the DAC interrupt source to check. - * This parameter can be the following values: - * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask - * @note The DMA underrun occurs when a second external trigger arrives before the - * acknowledgement for the first external trigger is received (first request). - * @retval The new state of DAC_IT (SET or RESET). - */ -ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_IT(DAC_IT)); - - /* Get the DAC_IT enable bit status */ - enablestatus = (DAC->CR & (DAC_IT << DAC_Channel)) ; - - /* Check the status of the specified DAC interrupt */ - if (((DAC->SR & (DAC_IT << DAC_Channel)) != (uint32_t)RESET) && enablestatus) - { - /* DAC_IT is set */ - bitstatus = SET; - } - else - { - /* DAC_IT is reset */ - bitstatus = RESET; - } - /* Return the DAC_IT status */ - return bitstatus; -} - -/** - * @brief Clears the DAC channel's interrupt pending bits. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected, applicable only for STM32F072 devices - * @param DAC_IT: specifies the DAC interrupt pending bit to clear. - * This parameter can be the following values: - * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask - * @retval None - */ -void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_IT(DAC_IT)); - - /* Clear the selected DAC interrupt pending bits */ - DAC->SR = (DAC_IT << DAC_Channel); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dbgmcu.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dbgmcu.c deleted file mode 100644 index 3965733..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dbgmcu.c +++ /dev/null @@ -1,218 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_dbgmcu.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Debug MCU (DBGMCU) peripheral: - * + Device and Revision ID management - * + Peripherals Configuration - * @verbatim - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_dbgmcu.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup DBGMCU - * @brief DBGMCU driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define IDCODE_DEVID_MASK ((uint32_t)0x00000FFF) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup DBGMCU_Private_Functions - * @{ - */ - - -/** @defgroup DBGMCU_Group1 Device and Revision ID management functions - * @brief Device and Revision ID management functions - * -@verbatim - ============================================================================== - ##### Device and Revision ID management functions ##### - ============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Returns the device revision identifier. - * @param None - * @retval Device revision identifier - */ -uint32_t DBGMCU_GetREVID(void) -{ - return(DBGMCU->IDCODE >> 16); -} - -/** - * @brief Returns the device identifier. - * @param None - * @retval Device identifier - */ -uint32_t DBGMCU_GetDEVID(void) -{ - return(DBGMCU->IDCODE & IDCODE_DEVID_MASK); -} - -/** - * @} - */ - -/** @defgroup DBGMCU_Group2 Peripherals Configuration functions - * @brief Peripherals Configuration - * -@verbatim - ============================================================================== - ##### Peripherals Configuration functions ##### - ============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures low power mode behavior when the MCU is in Debug mode. - * @param DBGMCU_Periph: specifies the low power mode. - * This parameter can be any combination of the following values: - * @arg DBGMCU_STOP: Keep debugger connection during STOP mode - * @arg DBGMCU_STANDBY: Keep debugger connection during STANDBY mode - * @param NewState: new state of the specified low power mode in Debug mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DBGMCU_PERIPH(DBGMCU_Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - DBGMCU->CR |= DBGMCU_Periph; - } - else - { - DBGMCU->CR &= ~DBGMCU_Periph; - } -} - - -/** - * @brief Configures APB1 peripheral behavior when the MCU is in Debug mode. - * @param DBGMCU_Periph: specifies the APB1 peripheral. - * This parameter can be any combination of the following values: - * @arg DBGMCU_TIM2_STOP: TIM2 counter stopped when Core is halted, - * not applicable for STM32F030 devices - * @arg DBGMCU_TIM3_STOP: TIM3 counter stopped when Core is halted - * @arg DBGMCU_TIM6_STOP: TIM6 counter stopped when Core is halted - * @arg DBGMCU_TIM7_STOP: TIM7 counter stopped when Core is halted, - * applicable only for STM32F072 devices - * @arg DBGMCU_TIM14_STOP: TIM14 counter stopped when Core is halted - * @arg DBGMCU_RTC_STOP: RTC Calendar and Wakeup counter stopped - * when Core is halted. - * @arg DBGMCU_WWDG_STOP: Debug WWDG stopped when Core is halted - * @arg DBGMCU_IWDG_STOP: Debug IWDG stopped when Core is halted - * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped - * when Core is halted - * @arg DBGMCU_CAN1_STOP: Debug CAN1 stopped when Core is halted, - * applicable only for STM32F042 and STM32F072 devices - * @param NewState: new state of the specified APB1 peripheral in Debug mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DBGMCU_APB1PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DBGMCU_APB1PERIPH(DBGMCU_Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - DBGMCU->APB1FZ |= DBGMCU_Periph; - } - else - { - DBGMCU->APB1FZ &= ~DBGMCU_Periph; - } -} - -/** - * @brief Configures APB2 peripheral behavior when the MCU is in Debug mode. - * @param DBGMCU_Periph: specifies the APB2 peripheral. - * This parameter can be any combination of the following values: - * @arg DBGMCU_TIM1_STOP: TIM1 counter stopped when Core is halted - * @arg DBGMCU_TIM15_STOP: TIM15 counter stopped when Core is halted - * @arg DBGMCU_TIM16_STOP: TIM16 counter stopped when Core is halted - * @arg DBGMCU_TIM17_STOP: TIM17 counter stopped when Core is halted - * @param NewState: new state of the specified APB2 peripheral in Debug mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DBGMCU_APB2PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DBGMCU_APB2PERIPH(DBGMCU_Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - DBGMCU->APB2FZ |= DBGMCU_Periph; - } - else - { - DBGMCU->APB2FZ &= ~DBGMCU_Periph; - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dma.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dma.c deleted file mode 100644 index 73492c5..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dma.c +++ /dev/null @@ -1,705 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_dma.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Direct Memory Access controller (DMA): - * + Initialization and Configuration - * + Data Counter - * + Interrupts and flags management - * - * @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable The DMA controller clock using - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE) function for DMA1. - (#) Enable and configure the peripheral to be connected to the DMA channel - (except for internal SRAM / FLASH memories: no initialization is necessary). - (#) For a given Channel, program the Source and Destination addresses, - the transfer Direction, the Buffer Size, the Peripheral and Memory - Incrementation mode and Data Size, the Circular or Normal mode, - the channel transfer Priority and the Memory-to-Memory transfer - mode (if needed) using the DMA_Init() function. - (#) Enable the NVIC and the corresponding interrupt(s) using the function - DMA_ITConfig() if you need to use DMA interrupts. - (#) Enable the DMA channel using the DMA_Cmd() function. - (#) Activate the needed channel Request using PPP_DMACmd() function for - any PPP peripheral except internal SRAM and FLASH (ie. SPI, USART ...) - The function allowing this operation is provided in each PPP peripheral - driver (ie. SPI_DMACmd for SPI peripheral). - (#) Optionally, you can configure the number of data to be transferred - when the channel is disabled (ie. after each Transfer Complete event - or when a Transfer Error occurs) using the function DMA_SetCurrDataCounter(). - And you can get the number of remaining data to be transferred using - the function DMA_GetCurrDataCounter() at run time (when the DMA channel is - enabled and running). - (#) To control DMA events you can use one of the following two methods: - (##) Check on DMA channel flags using the function DMA_GetFlagStatus(). - (##) Use DMA interrupts through the function DMA_ITConfig() at initialization - phase and DMA_GetITStatus() function into interrupt routines in - communication phase. - After checking on a flag you should clear it using DMA_ClearFlag() - function. And after checking on an interrupt event you should - clear it using DMA_ClearITPendingBit() function. - @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_dma.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup DMA - * @brief DMA driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define CCR_CLEAR_MASK ((uint32_t)0xFFFF800F) /* DMA Channel config registers Masks */ - -/* DMA1 Channelx interrupt pending bit masks */ -#define DMA1_CHANNEL1_IT_MASK ((uint32_t)(DMA_ISR_GIF1 | DMA_ISR_TCIF1 | DMA_ISR_HTIF1 | DMA_ISR_TEIF1)) -#define DMA1_CHANNEL2_IT_MASK ((uint32_t)(DMA_ISR_GIF2 | DMA_ISR_TCIF2 | DMA_ISR_HTIF2 | DMA_ISR_TEIF2)) -#define DMA1_CHANNEL3_IT_MASK ((uint32_t)(DMA_ISR_GIF3 | DMA_ISR_TCIF3 | DMA_ISR_HTIF3 | DMA_ISR_TEIF3)) -#define DMA1_CHANNEL4_IT_MASK ((uint32_t)(DMA_ISR_GIF4 | DMA_ISR_TCIF4 | DMA_ISR_HTIF4 | DMA_ISR_TEIF4)) -#define DMA1_CHANNEL5_IT_MASK ((uint32_t)(DMA_ISR_GIF5 | DMA_ISR_TCIF5 | DMA_ISR_HTIF5 | DMA_ISR_TEIF5)) -#define DMA1_CHANNEL6_IT_MASK ((uint32_t)(DMA_ISR_GIF6 | DMA_ISR_TCIF6 | DMA_ISR_HTIF6 | DMA_ISR_TEIF6)) /*!< Only applicable for STM32F072 devices */ -#define DMA1_CHANNEL7_IT_MASK ((uint32_t)(DMA_ISR_GIF7 | DMA_ISR_TCIF7 | DMA_ISR_HTIF7 | DMA_ISR_TEIF7)) /*!< Only applicable for STM32F072 devices */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup DMA_Private_Functions - * @{ - */ - -/** @defgroup DMA_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This subsection provides functions allowing to initialize the DMA channel - source and destination addresses, incrementation and data sizes, transfer - direction, buffer size, circular/normal mode selection, memory-to-memory - mode selection and channel priority value. - [..] The DMA_Init() function follows the DMA configuration procedures as described - in reference manual (RM0091). -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the DMAy Channelx registers to their default reset - * values. - * @param DMAy_Channelx: where y can be 1 to select the DMA and - * x can be 1 to 7 for DMA1 to select the DMA Channel. - * @note Channel 6 and 7 are available only for STM32F072 devices. - * @retval None - */ -void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); - - /* Disable the selected DMAy Channelx */ - DMAy_Channelx->CCR &= (uint16_t)(~DMA_CCR_EN); - - /* Reset DMAy Channelx control register */ - DMAy_Channelx->CCR = 0; - - /* Reset DMAy Channelx remaining bytes register */ - DMAy_Channelx->CNDTR = 0; - - /* Reset DMAy Channelx peripheral address register */ - DMAy_Channelx->CPAR = 0; - - /* Reset DMAy Channelx memory address register */ - DMAy_Channelx->CMAR = 0; - - if (DMAy_Channelx == DMA1_Channel1) - { - /* Reset interrupt pending bits for DMA1 Channel1 */ - DMA1->IFCR |= DMA1_CHANNEL1_IT_MASK; - } - else if (DMAy_Channelx == DMA1_Channel2) - { - /* Reset interrupt pending bits for DMA1 Channel2 */ - DMA1->IFCR |= DMA1_CHANNEL2_IT_MASK; - } - else if (DMAy_Channelx == DMA1_Channel3) - { - /* Reset interrupt pending bits for DMA1 Channel3 */ - DMA1->IFCR |= DMA1_CHANNEL3_IT_MASK; - } - else if (DMAy_Channelx == DMA1_Channel4) - { - /* Reset interrupt pending bits for DMA1 Channel4 */ - DMA1->IFCR |= DMA1_CHANNEL4_IT_MASK; - } - else if (DMAy_Channelx == DMA1_Channel5) - { - /* Reset interrupt pending bits for DMA1 Channel5 */ - DMA1->IFCR |= DMA1_CHANNEL5_IT_MASK; - } - else if (DMAy_Channelx == DMA1_Channel6) - { - /* Reset interrupt pending bits for DMA1 Channel6 */ - DMA1->IFCR |= DMA1_CHANNEL6_IT_MASK; - } - else - { - if (DMAy_Channelx == DMA1_Channel7) - { - /* Reset interrupt pending bits for DMA1 Channel7 */ - DMA1->IFCR |= DMA1_CHANNEL7_IT_MASK; - } - } -} - -/** - * @brief Initializes the DMAy Channelx according to the specified parameters - * in the DMA_InitStruct. - * @param DMAy_Channelx: where y can be 1 to select the DMA and x can be 1 to 7 - * for DMA1 to select the DMA Channel. - * @note Channel 6 and 7 are available only for STM32F072 devices. - * @param DMA_InitStruct: pointer to a DMA_InitTypeDef structure that contains - * the configuration information for the specified DMA Channel. - * @retval None - */ -void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); - assert_param(IS_DMA_DIR(DMA_InitStruct->DMA_DIR)); - assert_param(IS_DMA_BUFFER_SIZE(DMA_InitStruct->DMA_BufferSize)); - assert_param(IS_DMA_PERIPHERAL_INC_STATE(DMA_InitStruct->DMA_PeripheralInc)); - assert_param(IS_DMA_MEMORY_INC_STATE(DMA_InitStruct->DMA_MemoryInc)); - assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(DMA_InitStruct->DMA_PeripheralDataSize)); - assert_param(IS_DMA_MEMORY_DATA_SIZE(DMA_InitStruct->DMA_MemoryDataSize)); - assert_param(IS_DMA_MODE(DMA_InitStruct->DMA_Mode)); - assert_param(IS_DMA_PRIORITY(DMA_InitStruct->DMA_Priority)); - assert_param(IS_DMA_M2M_STATE(DMA_InitStruct->DMA_M2M)); - -/*--------------------------- DMAy Channelx CCR Configuration ----------------*/ - /* Get the DMAy_Channelx CCR value */ - tmpreg = DMAy_Channelx->CCR; - - /* Clear MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC and DIR bits */ - tmpreg &= CCR_CLEAR_MASK; - - /* Configure DMAy Channelx: data transfer, data size, priority level and mode */ - /* Set DIR bit according to DMA_DIR value */ - /* Set CIRC bit according to DMA_Mode value */ - /* Set PINC bit according to DMA_PeripheralInc value */ - /* Set MINC bit according to DMA_MemoryInc value */ - /* Set PSIZE bits according to DMA_PeripheralDataSize value */ - /* Set MSIZE bits according to DMA_MemoryDataSize value */ - /* Set PL bits according to DMA_Priority value */ - /* Set the MEM2MEM bit according to DMA_M2M value */ - tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode | - DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc | - DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize | - DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M; - - /* Write to DMAy Channelx CCR */ - DMAy_Channelx->CCR = tmpreg; - -/*--------------------------- DMAy Channelx CNDTR Configuration --------------*/ - /* Write to DMAy Channelx CNDTR */ - DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize; - -/*--------------------------- DMAy Channelx CPAR Configuration ---------------*/ - /* Write to DMAy Channelx CPAR */ - DMAy_Channelx->CPAR = DMA_InitStruct->DMA_PeripheralBaseAddr; - -/*--------------------------- DMAy Channelx CMAR Configuration ---------------*/ - /* Write to DMAy Channelx CMAR */ - DMAy_Channelx->CMAR = DMA_InitStruct->DMA_MemoryBaseAddr; -} - -/** - * @brief Fills each DMA_InitStruct member with its default value. - * @param DMA_InitStruct: pointer to a DMA_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct) -{ -/*-------------- Reset DMA init structure parameters values ------------------*/ - /* Initialize the DMA_PeripheralBaseAddr member */ - DMA_InitStruct->DMA_PeripheralBaseAddr = 0; - /* Initialize the DMA_MemoryBaseAddr member */ - DMA_InitStruct->DMA_MemoryBaseAddr = 0; - /* Initialize the DMA_DIR member */ - DMA_InitStruct->DMA_DIR = DMA_DIR_PeripheralSRC; - /* Initialize the DMA_BufferSize member */ - DMA_InitStruct->DMA_BufferSize = 0; - /* Initialize the DMA_PeripheralInc member */ - DMA_InitStruct->DMA_PeripheralInc = DMA_PeripheralInc_Disable; - /* Initialize the DMA_MemoryInc member */ - DMA_InitStruct->DMA_MemoryInc = DMA_MemoryInc_Disable; - /* Initialize the DMA_PeripheralDataSize member */ - DMA_InitStruct->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - /* Initialize the DMA_MemoryDataSize member */ - DMA_InitStruct->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - /* Initialize the DMA_Mode member */ - DMA_InitStruct->DMA_Mode = DMA_Mode_Normal; - /* Initialize the DMA_Priority member */ - DMA_InitStruct->DMA_Priority = DMA_Priority_Low; - /* Initialize the DMA_M2M member */ - DMA_InitStruct->DMA_M2M = DMA_M2M_Disable; -} - -/** - * @brief Enables or disables the specified DMAy Channelx. - * @param DMAy_Channelx: where y can be 1 to select the DMA and - * x can be 1 to 7 for DMA1 to select the DMA Channel. - * @note Channel 6 and 7 are available only for STM32F072 devices. - * @param NewState: new state of the DMAy Channelx. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected DMAy Channelx */ - DMAy_Channelx->CCR |= DMA_CCR_EN; - } - else - { - /* Disable the selected DMAy Channelx */ - DMAy_Channelx->CCR &= (uint16_t)(~DMA_CCR_EN); - } -} - -/** - * @} - */ - -/** @defgroup DMA_Group2 Data Counter functions - * @brief Data Counter functions - * -@verbatim - =============================================================================== - ##### Data Counter functions ##### - =============================================================================== - [..] This subsection provides function allowing to configure and read the buffer - size (number of data to be transferred).The DMA data counter can be written - only when the DMA channel is disabled (ie. after transfer complete event). - [..] The following function can be used to write the Channel data counter value: - (+) void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t - DataNumber). - -@- It is advised to use this function rather than DMA_Init() in situations - where only the Data buffer needs to be reloaded. - [..] The DMA data counter can be read to indicate the number of remaining transfers - for the relative DMA channel. This counter is decremented at the end of each - data transfer and when the transfer is complete: - (+) If Normal mode is selected: the counter is set to 0. - (+) If Circular mode is selected: the counter is reloaded with the initial - value(configured before enabling the DMA channel). - [..] The following function can be used to read the Channel data counter value: - (+) uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx). - -@endverbatim - * @{ - */ - -/** - * @brief Sets the number of data units in the current DMAy Channelx transfer. - * @param DMAy_Channelx: where y can be 1 to select the DMA and x can be - * 1 to 7 for DMA1 to select the DMA Channel. - * @note Channel 6 and 7 are available only for STM32F072 devices. - * @param DataNumber: The number of data units in the current DMAy Channelx - * transfer. - * @note This function can only be used when the DMAy_Channelx is disabled. - * @retval None. - */ -void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); - -/*--------------------------- DMAy Channelx CNDTR Configuration --------------*/ - /* Write to DMAy Channelx CNDTR */ - DMAy_Channelx->CNDTR = DataNumber; -} - -/** - * @brief Returns the number of remaining data units in the current - * DMAy Channelx transfer. - * @param DMAy_Channelx: where y can be 1 to select the DMA and - * x can be 1 to 7 for DMA1 to select the DMA Channel. - * @note Channel 6 and 7 are available only for STM32F072 devices. - * @retval The number of remaining data units in the current DMAy Channelx - * transfer. - */ -uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); - /* Return the number of remaining data units for DMAy Channelx */ - return ((uint16_t)(DMAy_Channelx->CNDTR)); -} - -/** - * @} - */ - -/** @defgroup DMA_Group3 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== - [..] This subsection provides functions allowing to configure the DMA Interrupts - sources and check or clear the flags or pending bits status. - The user should identify which mode will be used in his application to manage - the DMA controller events: Polling mode or Interrupt mode. - *** Polling Mode *** - ==================== - [..] Each DMA channel can be managed through 4 event Flags:(y : DMA Controller - number x : DMA channel number ). - (#) DMAy_FLAG_TCx : to indicate that a Transfer Complete event occurred. - (#) DMAy_FLAG_HTx : to indicate that a Half-Transfer Complete event occurred. - (#) DMAy_FLAG_TEx : to indicate that a Transfer Error occurred. - (#) DMAy_FLAG_GLx : to indicate that at least one of the events described - above occurred. - -@- Clearing DMAy_FLAG_GLx results in clearing all other pending flags of the - same channel (DMAy_FLAG_TCx, DMAy_FLAG_HTx and DMAy_FLAG_TEx). - [..]In this Mode it is advised to use the following functions: - (+) FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG); - (+) void DMA_ClearFlag(uint32_t DMA_FLAG); - - *** Interrupt Mode *** - ====================== - [..] Each DMA channel can be managed through 4 Interrupts: - (+) Interrupt Source - (##) DMA_IT_TC: specifies the interrupt source for the Transfer Complete - event. - (##) DMA_IT_HT : specifies the interrupt source for the Half-transfer Complete - event. - (##) DMA_IT_TE : specifies the interrupt source for the transfer errors event. - (##) DMA_IT_GL : to indicate that at least one of the interrupts described - above occurred. - -@@- Clearing DMA_IT_GL interrupt results in clearing all other interrupts of - the same channel (DMA_IT_TCx, DMA_IT_HT and DMA_IT_TE). - [..]In this Mode it is advised to use the following functions: - (+) void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, - FunctionalState NewState); - (+) ITStatus DMA_GetITStatus(uint32_t DMA_IT); - (+) void DMA_ClearITPendingBit(uint32_t DMA_IT); - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified DMAy Channelx interrupts. - * @param DMAy_Channelx: where y can be 1 to select the DMA and - * x can be 1 to 7 for DMA1 to select the DMA Channel. - * @note Channel 6 and 7 are available only for STM32F072 devices. - * @param DMA_IT: specifies the DMA interrupts sources to be enabled - * or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask - * @arg DMA_IT_HT: Half transfer interrupt mask - * @arg DMA_IT_TE: Transfer error interrupt mask - * @param NewState: new state of the specified DMA interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); - assert_param(IS_DMA_CONFIG_IT(DMA_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected DMA interrupts */ - DMAy_Channelx->CCR |= DMA_IT; - } - else - { - /* Disable the selected DMA interrupts */ - DMAy_Channelx->CCR &= ~DMA_IT; - } -} - -/** - * @brief Checks whether the specified DMAy Channelx flag is set or not. - * @param DMA_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag. - * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag. - * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag. - * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag. - * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag. - * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. - * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. - * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag. - * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag. - * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. - * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. - * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag. - * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag. - * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. - * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. - * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag. - * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag. - * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. - * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. - * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag. - * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag, applicable only for STM32F072 devices. - * @note The Global flag (DMAy_FLAG_GLx) is set whenever any of the other flags - * relative to the same channel is set (Transfer Complete, Half-transfer - * Complete or Transfer Error flags: DMAy_FLAG_TCx, DMAy_FLAG_HTx or - * DMAy_FLAG_TEx). - * - * @retval The new state of DMA_FLAG (SET or RESET). - */ -FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG) -{ - FlagStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_DMA_GET_FLAG(DMA_FLAG)); - - /* Check the status of the specified DMA flag */ - if ((DMA1->ISR & DMA_FLAG) != (uint32_t)RESET) - { - /* DMA_FLAG is set */ - bitstatus = SET; - } - else - { - /* DMA_FLAG is reset */ - bitstatus = RESET; - } - - /* Return the DMA_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the DMAy Channelx's pending flags. - * @param DMA_FLAG: specifies the flag to clear. - * This parameter can be any combination (for the same DMA) of the following values: - * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag. - * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag. - * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag. - * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag. - * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag. - * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. - * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. - * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag. - * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag. - * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. - * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. - * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag. - * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag. - * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. - * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. - * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag. - * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag. - * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. - * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. - * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag. - * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag, applicable only for STM32F072 devices. - * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag, applicable only for STM32F072 devices. - * - * @note Clearing the Global flag (DMAy_FLAG_GLx) results in clearing all other flags - * relative to the same channel (Transfer Complete, Half-transfer Complete and - * Transfer Error flags: DMAy_FLAG_TCx, DMAy_FLAG_HTx and DMAy_FLAG_TEx). - * - * @retval None - */ -void DMA_ClearFlag(uint32_t DMA_FLAG) -{ - /* Check the parameters */ - assert_param(IS_DMA_CLEAR_FLAG(DMA_FLAG)); - - /* Clear the selected DMA flags */ - DMA1->IFCR = DMA_FLAG; -} - -/** - * @brief Checks whether the specified DMAy Channelx interrupt has occurred or not. - * @param DMA_IT: specifies the DMA interrupt source to check. - * This parameter can be one of the following values: - * @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt. - * @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt. - * @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt. - * @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt. - * @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt. - * @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt. - * @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt. - * @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt. - * @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt. - * @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt. - * @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt. - * @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt. - * @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt. - * @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt. - * @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt. - * @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt. - * @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt. - * @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt. - * @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt. - * @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt. - * @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt, applicable only for STM32F072 devices. - * - * @note The Global interrupt (DMAy_FLAG_GLx) is set whenever any of the other - * interrupts relative to the same channel is set (Transfer Complete, - * Half-transfer Complete or Transfer Error interrupts: DMAy_IT_TCx, - * DMAy_IT_HTx or DMAy_IT_TEx). - * - * @retval The new state of DMA_IT (SET or RESET). - */ -ITStatus DMA_GetITStatus(uint32_t DMA_IT) -{ - ITStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_DMA_GET_IT(DMA_IT)); - - /* Check the status of the specified DMA interrupt */ - if ((DMA1->ISR & DMA_IT) != (uint32_t)RESET) - { - /* DMA_IT is set */ - bitstatus = SET; - } - else - { - /* DMA_IT is reset */ - bitstatus = RESET; - } - /* Return the DMA_IT status */ - return bitstatus; -} - -/** - * @brief Clears the DMAy Channelx's interrupt pending bits. - * @param DMA_IT: specifies the DMA interrupt pending bit to clear. - * This parameter can be any combination (for the same DMA) of the following values: - * @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt. - * @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt. - * @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt. - * @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt. - * @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt. - * @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt. - * @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt. - * @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt. - * @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt. - * @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt. - * @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt. - * @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt. - * @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt. - * @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt. - * @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt. - * @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt. - * @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt. - * @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt. - * @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt. - * @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt. - * @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt, applicable only for STM32F072 devices. - * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt, applicable only for STM32F072 devices. - * - * @note Clearing the Global interrupt (DMAy_IT_GLx) results in clearing all other - * interrupts relative to the same channel (Transfer Complete, Half-transfer - * Complete and Transfer Error interrupts: DMAy_IT_TCx, DMAy_IT_HTx and - * DMAy_IT_TEx). - * - * @retval None - */ -void DMA_ClearITPendingBit(uint32_t DMA_IT) -{ - /* Check the parameters */ - assert_param(IS_DMA_CLEAR_IT(DMA_IT)); - - /* Clear the selected DMA interrupt pending bits */ - DMA1->IFCR = DMA_IT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_exti.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_exti.c deleted file mode 100644 index 684a7de..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_exti.c +++ /dev/null @@ -1,314 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_exti.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the EXTI peripheral: - * + Initialization and Configuration - * + Interrupts and flags management - * - * @verbatim - ============================================================================== - ##### EXTI features ##### - ============================================================================== - [..] External interrupt/event lines are mapped as following: - (#) All available GPIO pins are connected to the 16 external - interrupt/event lines from EXTI0 to EXTI15. - (#) EXTI line 16 is connected to the PVD output, not applicable for STM32F030 devices. - (#) EXTI line 17 is connected to the RTC Alarm event. - (#) EXTI line 18 is connected to the RTC Alarm event, applicable only for STM32F072 devices. - (#) EXTI line 19 is connected to the RTC Tamper and TimeStamp events. - (#) EXTI line 20 is connected to the RTC wakeup event, applicable only for STM32F072 devices. - (#) EXTI line 21 is connected to the Comparator 1 wakeup event, applicable only for STM32F051 and STM32F072 devices. - (#) EXTI line 22 is connected to the Comparator 2 wakeup event, applicable only for STM32F051 and STM32F072 devices. - (#) EXTI line 23 is connected to the I2C1 wakeup event, not applicable for STM32F030 devices. - (#) EXTI line 25 is connected to the USART1 wakeup event, not applicable for STM32F030 devices. - (#) EXTI line 26 is connected to the USART2 wakeup event, applicable only for STM32F072 devices. - (#) EXTI line 27 is connected to the CEC wakeup event, applicable only for STM32F051 and STM32F072 devices. - (#) EXTI line 31 is connected to the VDD USB monitor event, applicable only for STM32F072 devices. - - ##### How to use this driver ##### - ============================================================================== - [..] In order to use an I/O pin as an external interrupt source, follow - steps below: - (#) Configure the I/O in input mode using GPIO_Init() - (#) Select the input source pin for the EXTI line using - SYSCFG_EXTILineConfig(). - (#) Select the mode(interrupt, event) and configure the trigger selection - (Rising, falling or both) using EXTI_Init(). For the internal interrupt, - the trigger selection is not needed( the active edge is always the rising one). - (#) Configure NVIC IRQ channel mapped to the EXTI line using NVIC_Init(). - (#) Optionally, you can generate a software interrupt using the function EXTI_GenerateSWInterrupt(). - [..] - (@) SYSCFG APB clock must be enabled to get write access to SYSCFG_EXTICRx - registers using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); - @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_exti.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup EXTI - * @brief EXTI driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define EXTI_LINENONE ((uint32_t)0x00000) /* No interrupt selected */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup EXTI_Private_Functions - * @{ - */ - -/** @defgroup EXTI_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and Configuration functions ##### - ============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the EXTI peripheral registers to their default reset - * values. - * @param None - * @retval None - */ -void EXTI_DeInit(void) -{ - EXTI->IMR = 0x0F940000; - EXTI->EMR = 0x00000000; - EXTI->RTSR = 0x00000000; - EXTI->FTSR = 0x00000000; - EXTI->PR = 0x006BFFFF; -} - -/** - * @brief Initializes the EXTI peripheral according to the specified - * parameters in the EXTI_InitStruct. - * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure that - * contains the configuration information for the EXTI peripheral. - * @retval None - */ -void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) -{ - uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode)); - assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger)); - assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line)); - assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd)); - - tmp = (uint32_t)EXTI_BASE; - - if (EXTI_InitStruct->EXTI_LineCmd != DISABLE) - { - /* Clear EXTI line configuration */ - EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line; - EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line; - - tmp += EXTI_InitStruct->EXTI_Mode; - - *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line; - EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line; - - /* Select the trigger for the selected interrupts */ - if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) - { - /* Rising Falling edge */ - EXTI->RTSR |= EXTI_InitStruct->EXTI_Line; - EXTI->FTSR |= EXTI_InitStruct->EXTI_Line; - } - else - { - tmp = (uint32_t)EXTI_BASE; - tmp += EXTI_InitStruct->EXTI_Trigger; - - *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; - } - } - else - { - tmp += EXTI_InitStruct->EXTI_Mode; - - /* Disable the selected external lines */ - *(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line; - } -} - -/** - * @brief Fills each EXTI_InitStruct member with its reset value. - * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) -{ - EXTI_InitStruct->EXTI_Line = EXTI_LINENONE; - EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling; - EXTI_InitStruct->EXTI_LineCmd = DISABLE; -} - -/** - * @brief Generates a Software interrupt on selected EXTI line. - * @param EXTI_Line: specifies the EXTI line on which the software interrupt - * will be generated. - * This parameter can be any combination of EXTI_Linex where x can be (0..27). - * @retval None - */ -void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(EXTI_Line)); - - EXTI->SWIER |= EXTI_Line; -} - -/** - * @} - */ - -/** @defgroup EXTI_Group2 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - ============================================================================== - ##### Interrupts and flags management functions ##### - ============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Checks whether the specified EXTI line flag is set or not. - * @param EXTI_Line: specifies the EXTI line flag to check. - * This parameter can be EXTI_Linex where x can be (0..27). - * @retval The new state of EXTI_Line (SET or RESET). - */ -FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_GET_EXTI_LINE(EXTI_Line)); - - if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the EXTI's line pending flags. - * @param EXTI_Line: specifies the EXTI lines flags to clear. - * This parameter can be any combination of EXTI_Linex where x can be (0..27). - * @retval None - */ -void EXTI_ClearFlag(uint32_t EXTI_Line) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(EXTI_Line)); - - EXTI->PR = EXTI_Line; -} - -/** - * @brief Checks whether the specified EXTI line is asserted or not. - * @param EXTI_Line: specifies the EXTI line to check. - * This parameter can be EXTI_Linex where x can be (0..27). - * @retval The new state of EXTI_Line (SET or RESET). - */ -ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) -{ - ITStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_GET_EXTI_LINE(EXTI_Line)); - - if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the EXTI's line pending bits. - * @param EXTI_Line: specifies the EXTI lines to clear. - * This parameter can be any combination of EXTI_Linex where x can be (0..27). - * @retval None - */ -void EXTI_ClearITPendingBit(uint32_t EXTI_Line) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(EXTI_Line)); - - EXTI->PR = EXTI_Line; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_flash.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_flash.c deleted file mode 100644 index e548c44..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_flash.c +++ /dev/null @@ -1,1256 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_flash.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the FLASH peripheral: - * - FLASH Interface configuration - * - FLASH Memory Programming - * - Option Bytes Programming - * - Interrupts and flags management - * - * @verbatim - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] This driver provides functions to configure and program the Flash - memory of all STM32F0xx devices. These functions are split in 4 groups - (#) FLASH Interface configuration functions: this group includes the - management of following features: - (++) Set the latency - (++) Enable/Disable the prefetch buffer - - (#) FLASH Memory Programming functions: this group includes all needed - functions to erase and program the main memory: - (++) Lock and Unlock the Flash interface. - (++) Erase function: Erase Page, erase all pages. - (++) Program functions: Half Word and Word write. - - (#) FLASH Option Bytes Programming functions: this group includes all - needed functions to: - (++) Lock and Unlock the Flash Option bytes. - (++) Launch the Option Bytes loader - (++) Erase the Option Bytes - (++)Set/Reset the write protection - (++) Set the Read protection Level - (++) Program the user option Bytes - (++) Set/Reset the BOOT1 bit - (++) Enable/Disable the VDDA Analog Monitoring - (++) Get the user option bytes - (++) Get the Write protection - (++) Get the read protection status - - (#) FLASH Interrupts and flag management functions: this group includes - all needed functions to: - (++) Enable/Disable the flash interrupt sources - (++) Get flags status - (++) Clear flags - (++) Get Flash operation status - (++) Wait for last flash operation - - @endverbatim - - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_flash.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup FLASH - * @brief FLASH driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup FLASH_Private_Functions - * @{ - */ - -/** @defgroup FLASH_Group1 FLASH Interface configuration functions - * @brief FLASH Interface configuration functions - * -@verbatim - =============================================================================== - ##### FLASH Interface configuration functions ##### - =============================================================================== - - [..] FLASH_Interface configuration_Functions, includes the following functions: - (+) void FLASH_SetLatency(uint32_t FLASH_Latency): - [..] To correctly read data from Flash memory, the number of wait states (LATENCY) - must be correctly programmed according to the frequency of the CPU clock (HCLK) - [..] - +--------------------------------------------- + - | Wait states | HCLK clock frequency (MHz) | - |---------------|------------------------------| - |0WS(1CPU cycle)| 0 < HCLK <= 24 | - |---------------|------------------------------| - |1WS(2CPU cycle)| 24 < HCLK <= 48 | - +----------------------------------------------+ - [..] - (+) void FLASH_PrefetchBufferCmd(FunctionalState NewState); - [..] - All these functions don't need the unlock sequence. - -@endverbatim - * @{ - */ - -/** - * @brief Sets the code latency value. - * @param FLASH_Latency: specifies the FLASH Latency value. - * This parameter can be one of the following values: - * @arg FLASH_Latency_0: FLASH Zero Latency cycle - * @arg FLASH_Latency_1: FLASH One Latency cycle - * @retval None - */ -void FLASH_SetLatency(uint32_t FLASH_Latency) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_FLASH_LATENCY(FLASH_Latency)); - - /* Read the ACR register */ - tmpreg = FLASH->ACR; - - /* Sets the Latency value */ - tmpreg &= (uint32_t) (~((uint32_t)FLASH_ACR_LATENCY)); - tmpreg |= FLASH_Latency; - - /* Write the ACR register */ - FLASH->ACR = tmpreg; -} - -/** - * @brief Enables or disables the Prefetch Buffer. - * @param NewState: new state of the FLASH prefetch buffer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FLASH_PrefetchBufferCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if(NewState != DISABLE) - { - FLASH->ACR |= FLASH_ACR_PRFTBE; - } - else - { - FLASH->ACR &= (uint32_t)(~((uint32_t)FLASH_ACR_PRFTBE)); - } -} - -/** - * @brief Checks whether the FLASH Prefetch Buffer status is set or not. - * @param None - * @retval FLASH Prefetch Buffer Status (SET or RESET). - */ -FlagStatus FLASH_GetPrefetchBufferStatus(void) -{ - FlagStatus bitstatus = RESET; - - if ((FLASH->ACR & FLASH_ACR_PRFTBS) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the new state of FLASH Prefetch Buffer Status (SET or RESET) */ - return bitstatus; -} - -/** - * @} - */ - -/** @defgroup FLASH_Group2 FLASH Memory Programming functions - * @brief FLASH Memory Programming functions - * -@verbatim - =============================================================================== - ##### FLASH Memory Programming functions ##### - =============================================================================== - - [..] The FLASH Memory Programming functions, includes the following functions: - (+) void FLASH_Unlock(void); - (+) void FLASH_Lock(void); - (+) FLASH_Status FLASH_ErasePage(uint32_t Page_Address); - (+) FLASH_Status FLASH_EraseAllPages(void); - (+) FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); - (+) FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); - - [..] Any operation of erase or program should follow these steps: - - (#) Call the FLASH_Unlock() function to enable the flash control register and - program memory access - (#) Call the desired function to erase page or program data - (#) Call the FLASH_Lock() to disable the flash program memory access - (recommended to protect the FLASH memory against possible unwanted operation) - -@endverbatim - * @{ - */ - -/** - * @brief Unlocks the FLASH control register and program memory access. - * @param None - * @retval None - */ -void FLASH_Unlock(void) -{ - if((FLASH->CR & FLASH_CR_LOCK) != RESET) - { - /* Unlocking the program memory access */ - FLASH->KEYR = FLASH_FKEY1; - FLASH->KEYR = FLASH_FKEY2; - } -} - -/** - * @brief Locks the Program memory access. - * @param None - * @retval None - */ -void FLASH_Lock(void) -{ - /* Set the LOCK Bit to lock the FLASH control register and program memory access */ - FLASH->CR |= FLASH_CR_LOCK; -} - -/** - * @brief Erases a specified page in program memory. - * @note To correctly run this function, the FLASH_Unlock() function must be called before. - * @note Call the FLASH_Lock() to disable the flash memory access (recommended - * to protect the FLASH memory against possible unwanted operation) - * @param Page_Address: The page address in program memory to be erased. - * @note A Page is erased in the Program memory only if the address to load - * is the start address of a page (multiple of 1024 bytes). - * @retval FLASH Status: The returned value can be: - * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_ErasePage(uint32_t Page_Address) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_FLASH_PROGRAM_ADDRESS(Page_Address)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* If the previous operation is completed, proceed to erase the page */ - FLASH->CR |= FLASH_CR_PER; - FLASH->AR = Page_Address; - FLASH->CR |= FLASH_CR_STRT; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - /* Disable the PER Bit */ - FLASH->CR &= ~FLASH_CR_PER; - } - - /* Return the Erase Status */ - return status; -} - -/** - * @brief Erases all FLASH pages. - * @note To correctly run this function, the FLASH_Unlock() function must be called before. - * @note Call the FLASH_Lock() to disable the flash memory access (recommended - * to protect the FLASH memory against possible unwanted operation) - * @param None - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_EraseAllPages(void) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to erase all pages */ - FLASH->CR |= FLASH_CR_MER; - FLASH->CR |= FLASH_CR_STRT; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - /* Disable the MER Bit */ - FLASH->CR &= ~FLASH_CR_MER; - } - - /* Return the Erase Status */ - return status; -} - -/** - * @brief Programs a word at a specified address. - * @note To correctly run this function, the FLASH_Unlock() function must be called before. - * @note Call the FLASH_Lock() to disable the flash memory access (recommended - * to protect the FLASH memory against possible unwanted operation) - * @param Address: specifies the address to be programmed. - * @param Data: specifies the data to be programmed. - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) -{ - FLASH_Status status = FLASH_COMPLETE; - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* If the previous operation is completed, proceed to program the new first - half word */ - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint16_t*)Address = (uint16_t)Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* If the previous operation is completed, proceed to program the new second - half word */ - tmp = Address + 2; - - *(__IO uint16_t*) tmp = Data >> 16; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - /* Disable the PG Bit */ - FLASH->CR &= ~FLASH_CR_PG; - } - else - { - /* Disable the PG Bit */ - FLASH->CR &= ~FLASH_CR_PG; - } - } - - /* Return the Program Status */ - return status; -} - -/** - * @brief Programs a half word at a specified address. - * @note To correctly run this function, the FLASH_Unlock() function must be called before. - * @note Call the FLASH_Lock() to disable the flash memory access (recommended - * to protect the FLASH memory against possible unwanted operation) - * @param Address: specifies the address to be programmed. - * @param Data: specifies the data to be programmed. - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* If the previous operation is completed, proceed to program the new data */ - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint16_t*)Address = Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - /* Disable the PG Bit */ - FLASH->CR &= ~FLASH_CR_PG; - } - - /* Return the Program Status */ - return status; -} - -/** - * @} - */ - -/** @defgroup FLASH_Group3 Option Bytes Programming functions - * @brief Option Bytes Programming functions - * -@verbatim - =============================================================================== - ##### Option Bytes Programming functions ##### - =============================================================================== - - [..] The FLASH_Option Bytes Programming_functions, includes the following functions: - (+) void FLASH_OB_Unlock(void); - (+) void FLASH_OB_Lock(void); - (+) void FLASH_OB_Launch(void); - (+) FLASH_Status FLASH_OB_Erase(void); - (+) FLASH_Status FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState); - (+) FLASH_Status FLASH_OB_RDPConfig(uint8_t OB_RDP); - (+) FLASH_Status FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY); - (+) FLASH_Status FLASH_OB_BOOTConfig(uint8_t OB_BOOT1); - (+) FLASH_Status FLASH_OB_VDDAConfig(uint8_t OB_VDDA_ANALOG); - (+) FLASH_Status FLASH_OB_WriteUser(uint8_t OB_USER); - (+) FLASH_OB_ProgramData(uint32_t Address, uint8_t Data); - (+) uint8_t FLASH_OB_GetUser(void); - (+) uint32_t FLASH_OB_GetWRP(void); - (+) FlagStatus FLASH_OB_GetRDP(void); - - [..] Any operation of erase or program should follow these steps: - - (#) Call the FLASH_OB_Unlock() function to enable the Option Bytes registers access - - (#) Call one or several functions to program the desired option bytes - (++) FLASH_Status FLASH_OB_RDPConfig(uint8_t OB_RDP) => to set the desired read Protection Level - (++) FLASH_Status FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) - => to Enable/Disable the desired sector write protection - (++) FLASH_Status FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) - => to configure the user option Bytes: IWDG, STOP and the Standby. - (++) FLASH_Status FLASH_OB_BOOTConfig(uint8_t OB_BOOT1) - => to set or reset BOOT1 - (++) FLASH_Status FLASH_OB_VDDAConfig(uint8_t OB_VDDA_ANALOG) - => to enable or disable the VDDA Analog Monitoring - (++) You can write all User Options bytes at once using a single function - by calling FLASH_Status FLASH_OB_WriteUser(uint8_t OB_USER) - (++) FLASH_OB_ProgramData(uint32_t Address, uint8_t Data) to program the - two half word in the option bytes - - (#) Once all needed option bytes to be programmed are correctly written, call the - FLASH_OB_Launch(void) function to launch the Option Bytes programming process. - - (#) Call the FLASH_OB_Lock() to disable the Option Bytes registers access (recommended - to protect the option Bytes against possible unwanted operations) - -@endverbatim - * @{ - */ - -/** - * @brief Unlocks the option bytes block access. - * @param None - * @retval None - */ -void FLASH_OB_Unlock(void) -{ - if((FLASH->CR & FLASH_CR_OPTWRE) == RESET) - { - /* Unlocking the option bytes block access */ - FLASH->OPTKEYR = FLASH_OPTKEY1; - FLASH->OPTKEYR = FLASH_OPTKEY2; - } -} - -/** - * @brief Locks the option bytes block access. - * @param None - * @retval None - */ -void FLASH_OB_Lock(void) -{ - /* Set the OPTWREN Bit to lock the option bytes block access */ - FLASH->CR &= ~FLASH_CR_OPTWRE; -} - -/** - * @brief Launch the option byte loading. - * @param None - * @retval None - */ -void FLASH_OB_Launch(void) -{ - /* Set the OBL_Launch bit to launch the option byte loading */ - FLASH->CR |= FLASH_CR_OBL_LAUNCH; -} - -/** - * @brief Erases the FLASH option bytes. - * @note To correctly run this function, the FLASH_OB_Unlock() function must be called before. - * @note Call the FLASH_OB_Lock() to disable the flash control register access and the option - * bytes (recommended to protect the FLASH memory against possible unwanted operation) - * @note This functions erases all option bytes except the Read protection (RDP). - * @param None - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_OB_Erase(void) -{ - uint16_t rdptmp = OB_RDP_Level_0; - - FLASH_Status status = FLASH_COMPLETE; - - /* Get the actual read protection Option Byte value */ - if(FLASH_OB_GetRDP() != RESET) - { - rdptmp = 0x00; - } - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* If the previous operation is completed, proceed to erase the option bytes */ - FLASH->CR |= FLASH_CR_OPTER; - FLASH->CR |= FLASH_CR_STRT; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* If the erase operation is completed, disable the OPTER Bit */ - FLASH->CR &= ~FLASH_CR_OPTER; - - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= FLASH_CR_OPTPG; - - /* Restore the last read protection Option Byte value */ - OB->RDP = (uint16_t)rdptmp; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status != FLASH_TIMEOUT) - { - /* if the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - else - { - if (status != FLASH_TIMEOUT) - { - /* Disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - } - /* Return the erase status */ - return status; -} - -/** - * @brief Write protects the desired pages - * @note To correctly run this function, the FLASH_OB_Unlock() function must be called before. - * @note Call the FLASH_OB_Lock() to disable the flash control register access and the option - * bytes (recommended to protect the FLASH memory against possible unwanted operation) - * @param OB_WRP: specifies the address of the pages to be write protected. - * This parameter can be: - * @arg OB_WRP_Pages0to3..OB_WRP_Pages60to63 - * @arg OB_WRP_AllPages - * @retval FLASH Status: The returned value can be: - * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_OB_EnableWRP(uint32_t OB_WRP) -{ - uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF; - - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_WRP(OB_WRP)); - - OB_WRP = (uint32_t)(~OB_WRP); - WRP0_Data = (uint16_t)(OB_WRP & OB_WRP0_WRP0); - WRP1_Data = (uint16_t)((OB_WRP >> 8) & OB_WRP0_WRP0); - WRP2_Data = (uint16_t)((OB_WRP >> 16) & OB_WRP0_WRP0) ; - WRP3_Data = (uint16_t)((OB_WRP >> 24) & OB_WRP0_WRP0) ; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - FLASH->CR |= FLASH_CR_OPTPG; - - if(WRP0_Data != 0xFF) - { - OB->WRP0 = WRP0_Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - } - if((status == FLASH_COMPLETE) && (WRP1_Data != 0xFF)) - { - OB->WRP1 = WRP1_Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - } - if((status == FLASH_COMPLETE) && (WRP2_Data != 0xFF)) - { - OB->WRP2 = WRP2_Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - } - if((status == FLASH_COMPLETE) && (WRP3_Data != 0xFF)) - { - OB->WRP3 = WRP3_Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - } - if(status != FLASH_TIMEOUT) - { - /* if the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - /* Return the write protection operation Status */ - return status; -} - -/** - * @brief Enables or disables the read out protection. - * @note To correctly run this function, the FLASH_OB_Unlock() function must be called before. - * @note Call the FLASH_OB_Lock() to disable the flash control register access and the option - * bytes (recommended to protect the FLASH memory against possible unwanted operation) - * @param FLASH_ReadProtection_Level: specifies the read protection level. - * This parameter can be: - * @arg OB_RDP_Level_0: No protection - * @arg OB_RDP_Level_1: Read protection of the memory - * @arg OB_RDP_Level_2: Chip protection - * @note When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0 - * @retval FLASH Status: The returned value can be: - * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_OB_RDPConfig(uint8_t OB_RDP) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_RDP(OB_RDP)); - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - FLASH->CR |= FLASH_CR_OPTER; - FLASH->CR |= FLASH_CR_STRT; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* If the erase operation is completed, disable the OPTER Bit */ - FLASH->CR &= ~FLASH_CR_OPTER; - - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= FLASH_CR_OPTPG; - - OB->RDP = OB_RDP; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status != FLASH_TIMEOUT) - { - /* if the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - else - { - if(status != FLASH_TIMEOUT) - { - /* Disable the OPTER Bit */ - FLASH->CR &= ~FLASH_CR_OPTER; - } - } - } - /* Return the protection operation Status */ - return status; -} - -/** - * @brief Programs the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. - * @note To correctly run this function, the FLASH_OB_Unlock() function must be called before. - * @note Call the FLASH_OB_Lock() to disable the flash control register access and the option - * bytes (recommended to protect the FLASH memory against possible unwanted operation) - * @param OB_IWDG: Selects the WDG mode - * This parameter can be one of the following values: - * @arg OB_IWDG_SW: Software WDG selected - * @arg OB_IWDG_HW: Hardware WDG selected - * @param OB_STOP: Reset event when entering STOP mode. - * This parameter can be one of the following values: - * @arg OB_STOP_NoRST: No reset generated when entering in STOP - * @arg OB_STOP_RST: Reset generated when entering in STOP - * @param OB_STDBY: Reset event when entering Standby mode. - * This parameter can be one of the following values: - * @arg OB_STDBY_NoRST: No reset generated when entering in STANDBY - * @arg OB_STDBY_RST: Reset generated when entering in STANDBY - * @retval FLASH Status: The returned value can be: - * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_IWDG_SOURCE(OB_IWDG)); - assert_param(IS_OB_STOP_SOURCE(OB_STOP)); - assert_param(IS_OB_STDBY_SOURCE(OB_STDBY)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= FLASH_CR_OPTPG; - - OB->USER = (uint16_t)((uint16_t)(OB_IWDG | OB_STOP) | (uint16_t)(OB_STDBY | 0xF8)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status != FLASH_TIMEOUT) - { - /* If the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - /* Return the Option Byte program Status */ - return status; -} - -/** - * @brief Sets or resets the BOOT1 option bit. - * @param OB_BOOT1: Set or Reset the BOOT1 option bit. - * This parameter can be one of the following values: - * @arg OB_BOOT1_RESET: BOOT1 option bit reset - * @arg OB_BOOT1_SET: BOOT1 option bit set - * @retval None - */ -FLASH_Status FLASH_OB_BOOTConfig(uint8_t OB_BOOT1) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_BOOT1(OB_BOOT1)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= FLASH_CR_OPTPG; - - OB->USER = OB_BOOT1 | 0xEF; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status != FLASH_TIMEOUT) - { - /* If the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - /* Return the Option Byte program Status */ - return status; -} - -/** - * @brief Sets or resets the BOOT0 option bit. - * @note This function is applicable only for the STM32F042 devices. - * @param OB_BOOT0: Set or Reset the BOOT0 option bit. - * This parameter can be one of the following values: - * @arg OB_BOOT0_RESET: BOOT0 option bit reset - * @arg OB_BOOT0_SET: BOOT0 option bit set - * @retval None - */ -FLASH_Status FLASH_OB_BOOT0Config(uint8_t OB_BOOT0) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_BOOT0(OB_BOOT0)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= FLASH_CR_OPTPG; - - OB->USER = OB_BOOT0 | 0xF7; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status != FLASH_TIMEOUT) - { - /* If the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - /* Return the Option Byte program Status */ - return status; -} - -/** - * @brief Sets or resets the BOOT0SW option bit. - * @note This function is applicable only for the STM32F042 devices. - * @param OB_BOOT0SW: Set or Reset the BOOT0_SW option bit. - * This parameter can be one of the following values: - * @arg OB_BOOT0_SW: BOOT0_SW option bit reset - * @arg OB_BOOT0_HW: BOOT0_SW option bit set - * @retval None - */ -FLASH_Status FLASH_OB_BOOT0SWConfig(uint8_t OB_BOOT0SW) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_BOOT0SW(OB_BOOT0SW)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= FLASH_CR_OPTPG; - - OB->USER = OB_BOOT0SW | 0x7F; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status != FLASH_TIMEOUT) - { - /* If the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - /* Return the Option Byte program Status */ - return status; -} - -/** - * @brief Sets or resets the analogue monitoring on VDDA Power source. - * @param OB_VDDA_ANALOG: Selects the analog monitoring on VDDA Power source. - * This parameter can be one of the following values: - * @arg OB_VDDA_ANALOG_ON: Analog monitoring on VDDA Power source ON - * @arg OB_VDDA_ANALOG_OFF: Analog monitoring on VDDA Power source OFF - * @retval None - */ -FLASH_Status FLASH_OB_VDDAConfig(uint8_t OB_VDDA_ANALOG) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_VDDA_ANALOG(OB_VDDA_ANALOG)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= FLASH_CR_OPTPG; - - OB->USER = OB_VDDA_ANALOG | 0xDF; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status != FLASH_TIMEOUT) - { - /* if the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - /* Return the Option Byte program Status */ - return status; -} - -/** - * @brief Sets or resets the SRAM parity. - * @param OB_SRAM_Parity: Set or Reset the SRAM parity enable bit. - * This parameter can be one of the following values: - * @arg OB_SRAM_PARITY_SET: Set SRAM parity. - * @arg OB_SRAM_PARITY_RESET: Reset SRAM parity. - * @retval None - */ -FLASH_Status FLASH_OB_SRAMParityConfig(uint8_t OB_SRAM_Parity) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_SRAM_PARITY(OB_SRAM_Parity)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= FLASH_CR_OPTPG; - - OB->USER = OB_SRAM_Parity | 0xBF; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status != FLASH_TIMEOUT) - { - /* if the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - /* Return the Option Byte program Status */ - return status; -} - -/** - * @brief Programs the FLASH User Option Byte: IWDG_SW, RST_STOP, RST_STDBY, - * BOOT1 and VDDA ANALOG monitoring. - * @note To correctly run this function, the FLASH_OB_Unlock() function must be called before. - * @note Call the FLASH_OB_Lock() to disable the flash control register access and the option - * bytes (recommended to protect the FLASH memory against possible unwanted operation) - * @param OB_USER: Selects all user option bytes - * This parameter is a combination of the following values: - * @arg OB_IWDG_SW / OB_IWDG_HW: Software / Hardware WDG selected - * @arg OB_STOP_NoRST / OB_STOP_RST: No reset / Reset generated when entering in STOP - * @arg OB_STDBY_NoRST / OB_STDBY_RST: No reset / Reset generated when entering in STANDBY - * @arg OB_BOOT1_RESET / OB_BOOT1_SET: BOOT1 Reset / Set - * @arg OB_VDDA_ANALOG_ON / OB_VDDA_ANALOG_OFF: Analog monitoring on VDDA Power source ON / OFF - * @arg OB_SRAM_PARITY_SET / OB_SRAM_PARITY_RESET: SRAM Parity SET / RESET - * @arg OB_BOOT0_RESET / OB_BOOT0_SET: BOOT0 Reset / Set - * @arg OB_BOOT0_SW / OB_BOOT0_SW: BOOT0 pin disabled / BOOT0 pin bonded with GPIO - * @retval FLASH Status: The returned value can be: - * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_OB_WriteUser(uint8_t OB_USER) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= FLASH_CR_OPTPG; - - OB->USER = OB_USER; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status != FLASH_TIMEOUT) - { - /* If the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - /* Return the Option Byte program Status */ - return status; - -} - -/** - * @brief Programs a half word at a specified Option Byte Data address. - * @note To correctly run this function, the FLASH_OB_Unlock() function must be called before. - * @note Call the FLASH_OB_Lock() to disable the flash control register access and the option - * bytes (recommended to protect the FLASH memory against possible unwanted operation) - * @param Address: specifies the address to be programmed. - * This parameter can be 0x1FFFF804 or 0x1FFFF806. - * @param Data: specifies the data to be programmed. - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_OB_ProgramData(uint32_t Address, uint8_t Data) -{ - FLASH_Status status = FLASH_COMPLETE; - /* Check the parameters */ - assert_param(IS_OB_DATA_ADDRESS(Address)); - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status == FLASH_COMPLETE) - { - /* Enables the Option Bytes Programming operation */ - FLASH->CR |= FLASH_CR_OPTPG; - *(__IO uint16_t*)Address = Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); - - if(status != FLASH_TIMEOUT) - { - /* If the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= ~FLASH_CR_OPTPG; - } - } - /* Return the Option Byte Data Program Status */ - return status; -} - -/** - * @brief Returns the FLASH User Option Bytes values. - * @param None - * @retval The FLASH User Option Bytes . - */ -uint8_t FLASH_OB_GetUser(void) -{ - /* Return the User Option Byte */ - return (uint8_t)(FLASH->OBR >> 8); -} - -/** - * @brief Returns the FLASH Write Protection Option Bytes value. - * @param None - * @retval The FLASH Write Protection Option Bytes value - */ -uint32_t FLASH_OB_GetWRP(void) -{ - /* Return the FLASH write protection Register value */ - return (uint32_t)(FLASH->WRPR); -} - -/** - * @brief Checks whether the FLASH Read out Protection Status is set or not. - * @param None - * @retval FLASH ReadOut Protection Status(SET or RESET) - */ -FlagStatus FLASH_OB_GetRDP(void) -{ - FlagStatus readstatus = RESET; - - if ((uint8_t)(FLASH->OBR & (FLASH_OBR_RDPRT1 | FLASH_OBR_RDPRT2)) != RESET) - { - readstatus = SET; - } - else - { - readstatus = RESET; - } - return readstatus; -} - -/** - * @} - */ - -/** @defgroup FLASH_Group4 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified FLASH interrupts. - * @param FLASH_IT: specifies the FLASH interrupt sources to be enabled or - * disabled. - * This parameter can be any combination of the following values: - * @arg FLASH_IT_EOP: FLASH end of programming Interrupt - * @arg FLASH_IT_ERR: FLASH Error Interrupt - * @retval None - */ -void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FLASH_IT(FLASH_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if(NewState != DISABLE) - { - /* Enable the interrupt sources */ - FLASH->CR |= FLASH_IT; - } - else - { - /* Disable the interrupt sources */ - FLASH->CR &= ~(uint32_t)FLASH_IT; - } -} - -/** - * @brief Checks whether the specified FLASH flag is set or not. - * @param FLASH_FLAG: specifies the FLASH flag to check. - * This parameter can be one of the following values: - * @arg FLASH_FLAG_BSY: FLASH write/erase operations in progress flag - * @arg FLASH_FLAG_PGERR: FLASH Programming error flag flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_EOP: FLASH End of Programming flag - * @retval The new state of FLASH_FLAG (SET or RESET). - */ -FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG) -{ - FlagStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)); - - if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the new state of FLASH_FLAG (SET or RESET) */ - return bitstatus; -} - -/** - * @brief Clears the FLASH's pending flags. - * @param FLASH_FLAG: specifies the FLASH flags to clear. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_PGERR: FLASH Programming error flag flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_EOP: FLASH End of Programming flag - * @retval None - */ -void FLASH_ClearFlag(uint32_t FLASH_FLAG) -{ - /* Check the parameters */ - assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)); - - /* Clear the flags */ - FLASH->SR = FLASH_FLAG; -} - -/** - * @brief Returns the FLASH Status. - * @param None - * @retval FLASH Status: The returned value can be: - * FLASH_BUSY, FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP or FLASH_COMPLETE. - */ -FLASH_Status FLASH_GetStatus(void) -{ - FLASH_Status FLASHstatus = FLASH_COMPLETE; - - if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY) - { - FLASHstatus = FLASH_BUSY; - } - else - { - if((FLASH->SR & (uint32_t)FLASH_FLAG_WRPERR)!= (uint32_t)0x00) - { - FLASHstatus = FLASH_ERROR_WRP; - } - else - { - if((FLASH->SR & (uint32_t)(FLASH_SR_PGERR)) != (uint32_t)0x00) - { - FLASHstatus = FLASH_ERROR_PROGRAM; - } - else - { - FLASHstatus = FLASH_COMPLETE; - } - } - } - /* Return the FLASH Status */ - return FLASHstatus; -} - - -/** - * @brief Waits for a FLASH operation to complete or a TIMEOUT to occur. - * @param Timeout: FLASH programming Timeout - * @retval FLASH Status: The returned value can be: FLASH_BUSY, - * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check for the FLASH Status */ - status = FLASH_GetStatus(); - - /* Wait for a FLASH operation to complete or a TIMEOUT to occur */ - while((status == FLASH_BUSY) && (Timeout != 0x00)) - { - status = FLASH_GetStatus(); - Timeout--; - } - - if(Timeout == 0x00 ) - { - status = FLASH_TIMEOUT; - } - /* Return the operation status */ - return status; -} - -/** - * @} - */ - -/** - * @} - */ - - /** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_gpio.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_gpio.c deleted file mode 100644 index 880508c..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_gpio.c +++ /dev/null @@ -1,540 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_gpio.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the GPIO peripheral: - * + Initialization and Configuration functions - * + GPIO Read and Write functions - * + GPIO Alternate functions configuration functions - * - * @verbatim - * - * - =========================================================================== - ##### How to use this driver ##### - =========================================================================== - [..] - (#) Enable the GPIO AHB clock using RCC_AHBPeriphClockCmd() - (#) Configure the GPIO pin(s) using GPIO_Init() - Four possible configuration are available for each pin: - (++) Input: Floating, Pull-up, Pull-down. - (++) Output: Push-Pull (Pull-up, Pull-down or no Pull) - Open Drain (Pull-up, Pull-down or no Pull). - In output mode, the speed is configurable: Low, Medium, Fast or High. - (++) Alternate Function: Push-Pull (Pull-up, Pull-down or no Pull) - Open Drain (Pull-up, Pull-down or no Pull). - (++) Analog: required mode when a pin is to be used as ADC channel, - DAC output or comparator input. - (#) Peripherals alternate function: - (++) For ADC, DAC and comparators, configure the desired pin in analog - mode using GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AN - (++) For other peripherals (TIM, USART...): - (+++) Connect the pin to the desired peripherals' Alternate - Function (AF) using GPIO_PinAFConfig() function. For PortC, - PortD and PortF, no configuration is needed. - (+++) Configure the desired pin in alternate function mode using - GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF - (+++) Select the type, pull-up/pull-down and output speed via - GPIO_PuPd, GPIO_OType and GPIO_Speed members - (+++) Call GPIO_Init() function - (#) To get the level of a pin configured in input mode use GPIO_ReadInputDataBit() - (#) To set/reset the level of a pin configured in output mode use - GPIO_SetBits()/GPIO_ResetBits() - (#) During and just after reset, the alternate functions are not active and - the GPIO pins are configured in input floating mode (except JTAG pins). - (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as - general-purpose (PC14 and PC15, respectively) when the LSE oscillator - is off. The LSE has priority over the GPIO function. - (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as general-purpose - PD0 and PD1, respectively, when the HSE oscillator is off. The HSE has - priority over the GPIO function. - @endverbatim - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_gpio.h" -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup GPIO - * @brief GPIO driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup GPIO_Private_Functions - * @{ - */ - -/** @defgroup GPIO_Group1 Initialization and Configuration - * @brief Initialization and Configuration - * -@verbatim - =============================================================================== - ##### Initialization and Configuration ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the GPIOx peripheral registers to their default reset - * values. - * @param GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral. - * @note GPIOE is available only for STM32F072. - * @note GPIOD is not available for STM32F031. - * @retval None - */ -void GPIO_DeInit(GPIO_TypeDef* GPIOx) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - if(GPIOx == GPIOA) - { - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOA, ENABLE); - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOA, DISABLE); - } - else if(GPIOx == GPIOB) - { - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOB, ENABLE); - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOB, DISABLE); - } - else if(GPIOx == GPIOC) - { - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOC, ENABLE); - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOC, DISABLE); - } - else if(GPIOx == GPIOD) - { - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOD, ENABLE); - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOD, DISABLE); - } - else if(GPIOx == GPIOE) - { - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOE, ENABLE); - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOE, DISABLE); - } - else - { - if(GPIOx == GPIOF) - { - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOF, ENABLE); - RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOF, DISABLE); - } - } -} - -/** - * @brief Initializes the GPIOx peripheral according to the specified - * parameters in the GPIO_InitStruct. - * @param GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral. - * @note GPIOE is available only for STM32F072. - * @note GPIOD is not available for STM32F031. - * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains - * the configuration information for the specified GPIO peripheral. - * @retval None - */ -void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) -{ - uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)); - assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode)); - assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd)); - - /*-------------------------- Configure the port pins -----------------------*/ - /*-- GPIO Mode Configuration --*/ - for (pinpos = 0x00; pinpos < 0x10; pinpos++) - { - pos = ((uint32_t)0x01) << pinpos; - - /* Get the port pins position */ - currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; - - if (currentpin == pos) - { - if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF)) - { - /* Check Speed mode parameters */ - assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); - - /* Speed mode configuration */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2)); - GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2)); - - /* Check Output mode parameters */ - assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType)); - - /* Output mode configuration */ - GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos)); - GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos)); - } - - GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2)); - - GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2)); - - /* Pull-up Pull down resistor configuration */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2)); - GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2)); - } - } -} - -/** - * @brief Fills each GPIO_InitStruct member with its default value. - * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct) -{ - /* Reset GPIO init structure parameters values */ - GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All; - GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStruct->GPIO_Speed = GPIO_Speed_Level_2; - GPIO_InitStruct->GPIO_OType = GPIO_OType_PP; - GPIO_InitStruct->GPIO_PuPd = GPIO_PuPd_NOPULL; -} - -/** - * @brief Locks GPIO Pins configuration registers. - * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, - * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. - * @note The configuration of the locked GPIO pins can no longer be modified - * until the next device reset. - * @param GPIOx: where x can be (A or B) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bit to be written. - * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). - * @retval None - */ -void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - __IO uint32_t tmp = 0x00010000; - - /* Check the parameters */ - assert_param(IS_GPIO_LIST_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - tmp |= GPIO_Pin; - /* Set LCKK bit */ - GPIOx->LCKR = tmp; - /* Reset LCKK bit */ - GPIOx->LCKR = GPIO_Pin; - /* Set LCKK bit */ - GPIOx->LCKR = tmp; - /* Read LCKK bit */ - tmp = GPIOx->LCKR; - /* Read LCKK bit */ - tmp = GPIOx->LCKR; -} - -/** - * @} - */ - -/** @defgroup GPIO_Group2 GPIO Read and Write - * @brief GPIO Read and Write - * -@verbatim - =============================================================================== - ##### GPIO Read and Write ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Reads the specified input port pin. - * @param GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral. - * @note GPIOE is available only for STM32F072. - * @note GPIOD is not available for STM32F031. - * @param GPIO_Pin: specifies the port bit to read. - * @note This parameter can be GPIO_Pin_x where x can be: - * For STM32F051 and STM32F030: (0..15) for GPIOA, GPIOB, GPIOC, (2) for GPIOD and (0..1, 4..7) for GIIOF. - * For STM32F072: (0..15) for GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, (0..10) for GPIOF. - * For STM32F031: (0..15) for GPIOA, GPIOB, (13..15) for GPIOC and (0..1, 6..7) for GPIOF. - * @retval The input port pin value. - */ -uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - uint8_t bitstatus = 0x00; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); - - if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET) - { - bitstatus = (uint8_t)Bit_SET; - } - else - { - bitstatus = (uint8_t)Bit_RESET; - } - return bitstatus; -} - -/** - * @brief Reads the specified input port pin. - * @param GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral. - * @note GPIOE is available only for STM32F072. - * @note GPIOD is not available for STM32F031. - * @retval The input port pin value. - */ -uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - return ((uint16_t)GPIOx->IDR); -} - -/** - * @brief Reads the specified output data port bit. - * @param GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral. - * @note GPIOE is available only for STM32F072. - * @note GPIOD is not available for STM32F031. - * @param GPIO_Pin: Specifies the port bit to read. - * @note This parameter can be GPIO_Pin_x where x can be: - * For STM32F051 and STM32F030: (0..15) for GPIOA, GPIOB, GPIOC, (2) for GPIOD and (0..1, 4..7) for GIIOF. - * For STM32F072: (0..15) for GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, (0..10) for GPIOF. - * For STM32F031: (0..15) for GPIOA, GPIOB, (13..15) for GPIOC and (0..1, 6..7) for GPIOF. - * @retval The output port pin value. - */ -uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - uint8_t bitstatus = 0x00; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); - - if ((GPIOx->ODR & GPIO_Pin) != (uint32_t)Bit_RESET) - { - bitstatus = (uint8_t)Bit_SET; - } - else - { - bitstatus = (uint8_t)Bit_RESET; - } - return bitstatus; -} - -/** - * @brief Reads the specified GPIO output data port. - * @param GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral. - * @note GPIOE is available only for STM32F072. - * @note GPIOD is not available for STM32F031. - * @retval GPIO output data port value. - */ -uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - return ((uint16_t)GPIOx->ODR); -} - -/** - * @brief Sets the selected data port bits. - * @param GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral. - * @note GPIOE is available only for STM32F072. - * @note GPIOD is not available for STM32F031. - * @param GPIO_Pin: specifies the port bits to be written. - * @note This parameter can be GPIO_Pin_x where x can be: - * For STM32F051 and STM32F030: (0..15) for GPIOA, GPIOB, GPIOC, (2) for GPIOD and (0..1, 4..7) for GIIOF. - * For STM32F072: (0..15) for GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, (0..10) for GPIOF. - * For STM32F031: (0..15) for GPIOA, GPIOB, (13..15) for GPIOC and (0..1, 6..7) for GPIOF. - * @retval None - */ -void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - GPIOx->BSRR = GPIO_Pin; -} - -/** - * @brief Clears the selected data port bits. - * @param GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral. - * @note GPIOE is available only for STM32F072. - * @note GPIOD is not available for STM32F031. - * @param GPIO_Pin: specifies the port bits to be written. - * @note This parameter can be GPIO_Pin_x where x can be: - * For STM32F051 and STM32F030: (0..15) for GPIOA, GPIOB, GPIOC, (2) for GPIOD and (0..1, 4..7) for GIIOF. - * For STM32F072: (0..15) for GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, (0..10) for GPIOF. - * For STM32F031: (0..15) for GPIOA, GPIOB, (13..15) for GPIOC and (0..1, 6..7) for GPIOF. - * @retval None - */ -void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - GPIOx->BRR = GPIO_Pin; -} - -/** - * @brief Sets or clears the selected data port bit. - * @param GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral. - * @note GPIOE is available only for STM32F072. - * @note GPIOD is not available for STM32F031. - * @param GPIO_Pin: specifies the port bit to be written. - * @param BitVal: specifies the value to be written to the selected bit. - * This parameter can be one of the BitAction enumeration values: - * @arg Bit_RESET: to clear the port pin - * @arg Bit_SET: to set the port pin - * @note This parameter can be GPIO_Pin_x where x can be: - * For STM32F051 and STM32F030: (0..15) for GPIOA, GPIOB, GPIOC, (2) for GPIOD and (0..1, 4..7) for GIIOF. - * For STM32F072: (0..15) for GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, (0..10) for GPIOF. - * For STM32F031: (0..15) for GPIOA, GPIOB, (13..15) for GPIOC and (0..1, 6..7) for GPIOF. - * @retval None - */ -void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); - assert_param(IS_GPIO_BIT_ACTION(BitVal)); - - if (BitVal != Bit_RESET) - { - GPIOx->BSRR = GPIO_Pin; - } - else - { - GPIOx->BRR = GPIO_Pin ; - } -} - -/** - * @brief Writes data to the specified GPIO data port. - * @param GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral. - * @note GPIOE is available only for STM32F072. - * @note GPIOD is not available for STM32F031. - * @param PortVal: specifies the value to be written to the port output data register. - * @retval None - */ -void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - GPIOx->ODR = PortVal; -} - -/** - * @} - */ - -/** @defgroup GPIO_Group3 GPIO Alternate functions configuration functions - * @brief GPIO Alternate functions configuration functions - * -@verbatim - =============================================================================== - ##### GPIO Alternate functions configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Writes data to the specified GPIO data port. - * @param GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral. - * @note GPIOC, GPIOD, GPIOE and GPIOF are available only for STM32F072. - * @param GPIO_PinSource: specifies the pin for the Alternate function. - * This parameter can be GPIO_PinSourcex where x can be (0..15) for GPIOA, GPIOB, GPIOD, GPIOE - * and (0..12) for GPIOC and (0, 2..5, 9..10) for GPIOF. - * @param GPIO_AF: selects the pin to used as Alternate function. - * This parameter can be one of the following value: - * @arg GPIO_AF_0: WKUP, EVENTOUT, TIM15, SPI1, TIM17, MCO, SWDAT, SWCLK, - * TIM14, BOOT, USART1, CEC, IR_OUT, SPI2, TIM3, USART4, - * CAN, USART2, CRS, TIM16, TIM1, TS - * @arg GPIO_AF_1: USART2, CEC, TIM3, USART1, USART2, EVENTOUT, I2C1, - * I2C2, TIM15, SPI2, USART3, TS, SPI1 - * @arg GPIO_AF_2: TIM2, TIM1, EVENTOUT, TIM16, TIM17, USB - * @arg GPIO_AF_3: TS, I2C1, TIM15, EVENTOUT - * @arg GPIO_AF_4: TIM14, USART4, USART3, CRS, CAN - * @arg GPIO_AF_5: TIM16, TIM17, TIM15, SPI2, I2C2 - * @arg GPIO_AF_6: EVENTOUT - * @arg GPIO_AF_7: COMP1 OUT, COMP2 OUT - * @note The pin should already been configured in Alternate Function mode(AF) - * using GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF - * @note Refer to the Alternate function mapping table in the device datasheet - * for the detailed mapping of the system and peripherals'alternate - * function I/O pins. - * @retval None - */ -void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF) -{ - uint32_t temp = 0x00; - uint32_t temp_2 = 0x00; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); - assert_param(IS_GPIO_AF(GPIO_AF)); - - temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)); - GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)); - temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp; - GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_i2c.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_i2c.c deleted file mode 100644 index 05a7966..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_i2c.c +++ /dev/null @@ -1,1585 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_i2c.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Inter-Integrated circuit (I2C): - * + Initialization and Configuration - * + Communications handling - * + SMBUS management - * + I2C registers management - * + Data transfers management - * + DMA transfers management - * + Interrupts and flags management - * - * @verbatim - ============================================================================ - ##### How to use this driver ##### - ============================================================================ - [..] - (#) Enable peripheral clock using RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2Cx, ENABLE) - function for I2C1 or I2C2. - (#) Enable SDA, SCL and SMBA (when used) GPIO clocks using - RCC_AHBPeriphClockCmd() function. - (#) Peripherals alternate function: - (++) Connect the pin to the desired peripherals' Alternate - Function (AF) using GPIO_PinAFConfig() function. - (++) Configure the desired pin in alternate function by: - GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF - (++) Select the type, OpenDrain and speed via - GPIO_PuPd, GPIO_OType and GPIO_Speed members - (++) Call GPIO_Init() function. - (#) Program the Mode, Timing , Own address, Ack and Acknowledged Address - using the I2C_Init() function. - (#) Optionally you can enable/configure the following parameters without - re-initialization (i.e there is no need to call again I2C_Init() function): - (++) Enable the acknowledge feature using I2C_AcknowledgeConfig() function. - (++) Enable the dual addressing mode using I2C_DualAddressCmd() function. - (++) Enable the general call using the I2C_GeneralCallCmd() function. - (++) Enable the clock stretching using I2C_StretchClockCmd() function. - (++) Enable the PEC Calculation using I2C_CalculatePEC() function. - (++) For SMBus Mode: - (+++) Enable the SMBusAlert pin using I2C_SMBusAlertCmd() function. - (#) Enable the NVIC and the corresponding interrupt using the function - I2C_ITConfig() if you need to use interrupt mode. - (#) When using the DMA mode - (++) Configure the DMA using DMA_Init() function. - (++) Active the needed channel Request using I2C_DMACmd() function. - (#) Enable the I2C using the I2C_Cmd() function. - (#) Enable the DMA using the DMA_Cmd() function when using DMA mode in the - transfers. - [..] - (@) When using I2C in Fast Mode Plus, SCL and SDA pin 20mA current drive capability - must be enabled by setting the driving capability control bit in SYSCFG. - - @endverbatim - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_i2c.h" -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup I2C - * @brief I2C driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -#define CR1_CLEAR_MASK ((uint32_t)0x00CFE0FF) /*<! I2C CR1 clear register Mask */ -#define CR2_CLEAR_MASK ((uint32_t)0x07FF7FFF) /*<! I2C CR2 clear register Mask */ -#define TIMING_CLEAR_MASK ((uint32_t)0xF0FFFFFF) /*<! I2C TIMING clear register Mask */ -#define ERROR_IT_MASK ((uint32_t)0x00003F00) /*<! I2C Error interrupt register Mask */ -#define TC_IT_MASK ((uint32_t)0x000000C0) /*<! I2C TC interrupt register Mask */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup I2C_Private_Functions - * @{ - */ - - -/** @defgroup I2C_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides a set of functions allowing to initialize the I2C Mode, - I2C Timing, I2C filters, I2C Addressing mode, I2C OwnAddress1. - - [..] The I2C_Init() function follows the I2C configuration procedures (these procedures - are available in reference manual). - - [..] When the Software Reset is performed using I2C_SoftwareResetCmd() function, the internal - states machines are reset and communication control bits, as well as status bits come - back to their reset value. - - [..] Before enabling Stop mode using I2C_StopModeCmd() I2C Clock source must be set to - HSI and Digital filters must be disabled. - - [..] Before enabling Own Address 2 via I2C_DualAddressCmd() function, OA2 and mask should be - configured using I2C_OwnAddress2Config() function. - - [..] I2C_SlaveByteControlCmd() enable Slave byte control that allow user to get control of - each byte in slave mode when NBYTES is set to 0x01. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the I2Cx peripheral registers to their default reset values. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @retval None - */ -void I2C_DeInit(I2C_TypeDef* I2Cx) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - - if (I2Cx == I2C1) - { - /* Enable I2C1 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); - /* Release I2C1 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); - } - else - { - /* Enable I2C2 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE); - /* Release I2C2 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE); - } -} - -/** - * @brief Initializes the I2Cx peripheral according to the specified - * parameters in the I2C_InitStruct. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_InitStruct: pointer to a I2C_InitTypeDef structure that - * contains the configuration information for the specified I2C peripheral. - * @retval None - */ -void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_ANALOG_FILTER(I2C_InitStruct->I2C_AnalogFilter)); - assert_param(IS_I2C_DIGITAL_FILTER(I2C_InitStruct->I2C_DigitalFilter)); - assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode)); - assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1)); - assert_param(IS_I2C_ACK(I2C_InitStruct->I2C_Ack)); - assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress)); - - /* Disable I2Cx Peripheral */ - I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_PE); - - /*---------------------------- I2Cx FILTERS Configuration ------------------*/ - /* Get the I2Cx CR1 value */ - tmpreg = I2Cx->CR1; - /* Clear I2Cx CR1 register */ - tmpreg &= CR1_CLEAR_MASK; - /* Configure I2Cx: analog and digital filter */ - /* Set ANFOFF bit according to I2C_AnalogFilter value */ - /* Set DFN bits according to I2C_DigitalFilter value */ - tmpreg |= (uint32_t)I2C_InitStruct->I2C_AnalogFilter |(I2C_InitStruct->I2C_DigitalFilter << 8); - - /* Write to I2Cx CR1 */ - I2Cx->CR1 = tmpreg; - - /*---------------------------- I2Cx TIMING Configuration -------------------*/ - /* Configure I2Cx: Timing */ - /* Set TIMINGR bits according to I2C_Timing */ - /* Write to I2Cx TIMING */ - I2Cx->TIMINGR = I2C_InitStruct->I2C_Timing & TIMING_CLEAR_MASK; - - /* Enable I2Cx Peripheral */ - I2Cx->CR1 |= I2C_CR1_PE; - - /*---------------------------- I2Cx OAR1 Configuration ---------------------*/ - /* Clear tmpreg local variable */ - tmpreg = 0; - /* Clear OAR1 register */ - I2Cx->OAR1 = (uint32_t)tmpreg; - /* Clear OAR2 register */ - I2Cx->OAR2 = (uint32_t)tmpreg; - /* Configure I2Cx: Own Address1 and acknowledged address */ - /* Set OA1MODE bit according to I2C_AcknowledgedAddress value */ - /* Set OA1 bits according to I2C_OwnAddress1 value */ - tmpreg = (uint32_t)((uint32_t)I2C_InitStruct->I2C_AcknowledgedAddress | \ - (uint32_t)I2C_InitStruct->I2C_OwnAddress1); - /* Write to I2Cx OAR1 */ - I2Cx->OAR1 = tmpreg; - /* Enable Own Address1 acknowledgement */ - I2Cx->OAR1 |= I2C_OAR1_OA1EN; - - /*---------------------------- I2Cx MODE Configuration ---------------------*/ - /* Configure I2Cx: mode */ - /* Set SMBDEN and SMBHEN bits according to I2C_Mode value */ - tmpreg = I2C_InitStruct->I2C_Mode; - /* Write to I2Cx CR1 */ - I2Cx->CR1 |= tmpreg; - - /*---------------------------- I2Cx ACK Configuration ----------------------*/ - /* Get the I2Cx CR2 value */ - tmpreg = I2Cx->CR2; - /* Clear I2Cx CR2 register */ - tmpreg &= CR2_CLEAR_MASK; - /* Configure I2Cx: acknowledgement */ - /* Set NACK bit according to I2C_Ack value */ - tmpreg |= I2C_InitStruct->I2C_Ack; - /* Write to I2Cx CR2 */ - I2Cx->CR2 = tmpreg; -} - -/** - * @brief Fills each I2C_InitStruct member with its default value. - * @param I2C_InitStruct: pointer to an I2C_InitTypeDef structure which will be initialized. - * @retval None - */ -void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct) -{ - /*---------------- Reset I2C init structure parameters values --------------*/ - /* Initialize the I2C_Timing member */ - I2C_InitStruct->I2C_Timing = 0; - /* Initialize the I2C_AnalogFilter member */ - I2C_InitStruct->I2C_AnalogFilter = I2C_AnalogFilter_Enable; - /* Initialize the I2C_DigitalFilter member */ - I2C_InitStruct->I2C_DigitalFilter = 0; - /* Initialize the I2C_Mode member */ - I2C_InitStruct->I2C_Mode = I2C_Mode_I2C; - /* Initialize the I2C_OwnAddress1 member */ - I2C_InitStruct->I2C_OwnAddress1 = 0; - /* Initialize the I2C_Ack member */ - I2C_InitStruct->I2C_Ack = I2C_Ack_Disable; - /* Initialize the I2C_AcknowledgedAddress member */ - I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; -} - -/** - * @brief Enables or disables the specified I2C peripheral. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2Cx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected I2C peripheral */ - I2Cx->CR1 |= I2C_CR1_PE; - } - else - { - /* Disable the selected I2C peripheral */ - I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_PE); - } -} - -/** - * @brief Enables or disables the specified I2C software reset. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @retval None - */ -void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - - /* Disable peripheral */ - I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_PE); - - /* Perform a dummy read to delay the disable of peripheral for minimum - 3 APB clock cycles to perform the software reset functionality */ - *(__IO uint32_t *)(uint32_t)I2Cx; - - /* Enable peripheral */ - I2Cx->CR1 |= I2C_CR1_PE; -} - -/** - * @brief Enables or disables the specified I2C interrupts. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_IT: specifies the I2C interrupts sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg I2C_IT_ERRI: Error interrupt mask - * @arg I2C_IT_TCI: Transfer Complete interrupt mask - * @arg I2C_IT_STOPI: Stop Detection interrupt mask - * @arg I2C_IT_NACKI: Not Acknowledge received interrupt mask - * @arg I2C_IT_ADDRI: Address Match interrupt mask - * @arg I2C_IT_RXI: RX interrupt mask - * @arg I2C_IT_TXI: TX interrupt mask - * @param NewState: new state of the specified I2C interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_ITConfig(I2C_TypeDef* I2Cx, uint32_t I2C_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_I2C_CONFIG_IT(I2C_IT)); - - if (NewState != DISABLE) - { - /* Enable the selected I2C interrupts */ - I2Cx->CR1 |= I2C_IT; - } - else - { - /* Disable the selected I2C interrupts */ - I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_IT); - } -} - -/** - * @brief Enables or disables the I2C Clock stretching. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2Cx Clock stretching. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable clock stretching */ - I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_NOSTRETCH); - } - else - { - /* Disable clock stretching */ - I2Cx->CR1 |= I2C_CR1_NOSTRETCH; - } -} - -/** - * @brief Enables or disables I2C wakeup from stop mode. - * This function is not applicable for STM32F030 devices. - * @param I2Cx: where x can be 1 to select the I2C peripheral. - * @param NewState: new state of the I2Cx stop mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_StopModeCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_1_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable wakeup from stop mode */ - I2Cx->CR1 |= I2C_CR1_WUPEN; - } - else - { - /* Disable wakeup from stop mode */ - I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_WUPEN); - } -} - -/** - * @brief Enables or disables the I2C own address 2. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C own address 2. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable own address 2 */ - I2Cx->OAR2 |= I2C_OAR2_OA2EN; - } - else - { - /* Disable own address 2 */ - I2Cx->OAR2 &= (uint32_t)~((uint32_t)I2C_OAR2_OA2EN); - } -} - -/** - * @brief Configures the I2C slave own address 2 and mask. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param Address: specifies the slave address to be programmed. - * @param Mask: specifies own address 2 mask to be programmed. - * This parameter can be one of the following values: - * @arg I2C_OA2_NoMask: no mask. - * @arg I2C_OA2_Mask01: OA2[1] is masked and don't care. - * @arg I2C_OA2_Mask02: OA2[2:1] are masked and don't care. - * @arg I2C_OA2_Mask03: OA2[3:1] are masked and don't care. - * @arg I2C_OA2_Mask04: OA2[4:1] are masked and don't care. - * @arg I2C_OA2_Mask05: OA2[5:1] are masked and don't care. - * @arg I2C_OA2_Mask06: OA2[6:1] are masked and don't care. - * @arg I2C_OA2_Mask07: OA2[7:1] are masked and don't care. - * @retval None - */ -void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint16_t Address, uint8_t Mask) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_OWN_ADDRESS2(Address)); - assert_param(IS_I2C_OWN_ADDRESS2_MASK(Mask)); - - /* Get the old register value */ - tmpreg = I2Cx->OAR2; - - /* Reset I2Cx OA2 bit [7:1] and OA2MSK bit [1:0] */ - tmpreg &= (uint32_t)~((uint32_t)(I2C_OAR2_OA2 | I2C_OAR2_OA2MSK)); - - /* Set I2Cx SADD */ - tmpreg |= (uint32_t)(((uint32_t)Address & I2C_OAR2_OA2) | \ - (((uint32_t)Mask << 8) & I2C_OAR2_OA2MSK)) ; - - /* Store the new register value */ - I2Cx->OAR2 = tmpreg; -} - -/** - * @brief Enables or disables the I2C general call mode. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C general call mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable general call mode */ - I2Cx->CR1 |= I2C_CR1_GCEN; - } - else - { - /* Disable general call mode */ - I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_GCEN); - } -} - -/** - * @brief Enables or disables the I2C slave byte control. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C slave byte control. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_SlaveByteControlCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable slave byte control */ - I2Cx->CR1 |= I2C_CR1_SBC; - } - else - { - /* Disable slave byte control */ - I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_SBC); - } -} - -/** - * @brief Configures the slave address to be transmitted after start generation. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param Address: specifies the slave address to be programmed. - * @note This function should be called before generating start condition. - * @retval None - */ -void I2C_SlaveAddressConfig(I2C_TypeDef* I2Cx, uint16_t Address) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_SLAVE_ADDRESS(Address)); - - /* Get the old register value */ - tmpreg = I2Cx->CR2; - - /* Reset I2Cx SADD bit [9:0] */ - tmpreg &= (uint32_t)~((uint32_t)I2C_CR2_SADD); - - /* Set I2Cx SADD */ - tmpreg |= (uint32_t)((uint32_t)Address & I2C_CR2_SADD); - - /* Store the new register value */ - I2Cx->CR2 = tmpreg; -} - -/** - * @brief Enables or disables the I2C 10-bit addressing mode for the master. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C 10-bit addressing mode. - * This parameter can be: ENABLE or DISABLE. - * @note This function should be called before generating start condition. - * @retval None - */ -void I2C_10BitAddressingModeCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable 10-bit addressing mode */ - I2Cx->CR2 |= I2C_CR2_ADD10; - } - else - { - /* Disable 10-bit addressing mode */ - I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_ADD10); - } -} - -/** - * @} - */ - - -/** @defgroup I2C_Group2 Communications handling functions - * @brief Communications handling functions - * -@verbatim - =============================================================================== - ##### Communications handling functions ##### - =============================================================================== - [..] This section provides a set of functions that handles I2C communication. - - [..] Automatic End mode is enabled using I2C_AutoEndCmd() function. When Reload - mode is enabled via I2C_ReloadCmd() AutoEnd bit has no effect. - - [..] I2C_NumberOfBytesConfig() function set the number of bytes to be transferred, - this configuration should be done before generating start condition in master - mode. - - [..] When switching from master write operation to read operation in 10Bit addressing - mode, master can only sends the 1st 7 bits of the 10 bit address, followed by - Read direction by enabling HEADR bit using I2C_10BitAddressHeader() function. - - [..] In master mode, when transferring more than 255 bytes Reload mode should be used - to handle communication. In the first phase of transfer, Nbytes should be set to - 255. After transferring these bytes TCR flag is set and I2C_TransferHandling() - function should be called to handle remaining communication. - - [..] In master mode, when software end mode is selected when all data is transferred - TC flag is set I2C_TransferHandling() function should be called to generate STOP - or generate ReStart. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the I2C automatic end mode (stop condition is - * automatically sent when nbytes data are transferred). - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C automatic end mode. - * This parameter can be: ENABLE or DISABLE. - * @note This function has effect if Reload mode is disabled. - * @retval None - */ -void I2C_AutoEndCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable Auto end mode */ - I2Cx->CR2 |= I2C_CR2_AUTOEND; - } - else - { - /* Disable Auto end mode */ - I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_AUTOEND); - } -} - -/** - * @brief Enables or disables the I2C nbytes reload mode. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the nbytes reload mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_ReloadCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable Auto Reload mode */ - I2Cx->CR2 |= I2C_CR2_RELOAD; - } - else - { - /* Disable Auto Reload mode */ - I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_RELOAD); - } -} - -/** - * @brief Configures the number of bytes to be transmitted/received. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param Number_Bytes: specifies the number of bytes to be programmed. - * @retval None - */ -void I2C_NumberOfBytesConfig(I2C_TypeDef* I2Cx, uint8_t Number_Bytes) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - - /* Get the old register value */ - tmpreg = I2Cx->CR2; - - /* Reset I2Cx Nbytes bit [7:0] */ - tmpreg &= (uint32_t)~((uint32_t)I2C_CR2_NBYTES); - - /* Set I2Cx Nbytes */ - tmpreg |= (uint32_t)(((uint32_t)Number_Bytes << 16 ) & I2C_CR2_NBYTES); - - /* Store the new register value */ - I2Cx->CR2 = tmpreg; -} - -/** - * @brief Configures the type of transfer request for the master. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_Direction: specifies the transfer request direction to be programmed. - * This parameter can be one of the following values: - * @arg I2C_Direction_Transmitter: Master request a write transfer - * @arg I2C_Direction_Receiver: Master request a read transfer - * @retval None - */ -void I2C_MasterRequestConfig(I2C_TypeDef* I2Cx, uint16_t I2C_Direction) -{ -/* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_DIRECTION(I2C_Direction)); - - /* Test on the direction to set/reset the read/write bit */ - if (I2C_Direction == I2C_Direction_Transmitter) - { - /* Request a write Transfer */ - I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_RD_WRN); - } - else - { - /* Request a read Transfer */ - I2Cx->CR2 |= I2C_CR2_RD_WRN; - } -} - -/** - * @brief Generates I2Cx communication START condition. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C START condition generation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Generate a START condition */ - I2Cx->CR2 |= I2C_CR2_START; - } - else - { - /* Disable the START condition generation */ - I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_START); - } -} - -/** - * @brief Generates I2Cx communication STOP condition. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C STOP condition generation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Generate a STOP condition */ - I2Cx->CR2 |= I2C_CR2_STOP; - } - else - { - /* Disable the STOP condition generation */ - I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_STOP); - } -} - -/** - * @brief Enables or disables the I2C 10-bit header only mode with read direction. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C 10-bit header only mode. - * This parameter can be: ENABLE or DISABLE. - * @note This mode can be used only when switching from master transmitter mode - * to master receiver mode. - * @retval None - */ -void I2C_10BitAddressHeaderCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable 10-bit header only mode */ - I2Cx->CR2 |= I2C_CR2_HEAD10R; - } - else - { - /* Disable 10-bit header only mode */ - I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_HEAD10R); - } -} - -/** - * @brief Generates I2C communication Acknowledge. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the Acknowledge. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable ACK generation */ - I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_NACK); - } - else - { - /* Enable NACK generation */ - I2Cx->CR2 |= I2C_CR2_NACK; - } -} - -/** - * @brief Returns the I2C slave matched address . - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @retval The value of the slave matched address . - */ -uint8_t I2C_GetAddressMatched(I2C_TypeDef* I2Cx) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - - /* Return the slave matched address in the SR1 register */ - return (uint8_t)(((uint32_t)I2Cx->ISR & I2C_ISR_ADDCODE) >> 16) ; -} - -/** - * @brief Returns the I2C slave received request. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @retval The value of the received request. - */ -uint16_t I2C_GetTransferDirection(I2C_TypeDef* I2Cx) -{ - uint32_t tmpreg = 0; - uint16_t direction = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - - /* Return the slave matched address in the SR1 register */ - tmpreg = (uint32_t)(I2Cx->ISR & I2C_ISR_DIR); - - /* If write transfer is requested */ - if (tmpreg == 0) - { - /* write transfer is requested */ - direction = I2C_Direction_Transmitter; - } - else - { - /* Read transfer is requested */ - direction = I2C_Direction_Receiver; - } - return direction; -} - -/** - * @brief Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set). - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param Address: specifies the slave address to be programmed. - * @param Number_Bytes: specifies the number of bytes to be programmed. - * This parameter must be a value between 0 and 255. - * @param ReloadEndMode: new state of the I2C START condition generation. - * This parameter can be one of the following values: - * @arg I2C_Reload_Mode: Enable Reload mode . - * @arg I2C_AutoEnd_Mode: Enable Automatic end mode. - * @arg I2C_SoftEnd_Mode: Enable Software end mode. - * @param StartStopMode: new state of the I2C START condition generation. - * This parameter can be one of the following values: - * @arg I2C_No_StartStop: Don't Generate stop and start condition. - * @arg I2C_Generate_Stop: Generate stop condition (Number_Bytes should be set to 0). - * @arg I2C_Generate_Start_Read: Generate Restart for read request. - * @arg I2C_Generate_Start_Write: Generate Restart for write request. - * @retval None - */ -void I2C_TransferHandling(I2C_TypeDef* I2Cx, uint16_t Address, uint8_t Number_Bytes, uint32_t ReloadEndMode, uint32_t StartStopMode) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_SLAVE_ADDRESS(Address)); - assert_param(IS_RELOAD_END_MODE(ReloadEndMode)); - assert_param(IS_START_STOP_MODE(StartStopMode)); - - /* Get the CR2 register value */ - tmpreg = I2Cx->CR2; - - /* clear tmpreg specific bits */ - tmpreg &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)); - - /* update tmpreg */ - tmpreg |= (uint32_t)(((uint32_t)Address & I2C_CR2_SADD) | (((uint32_t)Number_Bytes << 16 ) & I2C_CR2_NBYTES) | \ - (uint32_t)ReloadEndMode | (uint32_t)StartStopMode); - - /* update CR2 register */ - I2Cx->CR2 = tmpreg; -} - -/** - * @} - */ - - -/** @defgroup I2C_Group3 SMBUS management functions - * @brief SMBUS management functions - * -@verbatim - =============================================================================== - ##### SMBUS management functions ##### - =============================================================================== - [..] This section provides a set of functions that handles SMBus communication - and timeouts detection. - - [..] The SMBus Device default address (0b1100 001) is enabled by calling I2C_Init() - function and setting I2C_Mode member of I2C_InitTypeDef() structure to - I2C_Mode_SMBusDevice. - - [..] The SMBus Host address (0b0001 000) is enabled by calling I2C_Init() - function and setting I2C_Mode member of I2C_InitTypeDef() structure to - I2C_Mode_SMBusHost. - - [..] The Alert Response Address (0b0001 100) is enabled using I2C_SMBusAlertCmd() - function. - - [..] To detect cumulative SCL stretch in master and slave mode, TIMEOUTB should be - configured (in accordance to SMBus specification) using I2C_TimeoutBConfig() - function then I2C_ExtendedClockTimeoutCmd() function should be called to enable - the detection. - - [..] SCL low timeout is detected by configuring TIMEOUTB using I2C_TimeoutBConfig() - function followed by the call of I2C_ClockTimeoutCmd(). When adding to this - procedure the call of I2C_IdleClockTimeoutCmd() function, Bus Idle condition - (both SCL and SDA high) is detected also. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables I2C SMBus alert. - * @param I2Cx: where x can be 1 to select the I2C peripheral. - * @param NewState: new state of the I2Cx SMBus alert. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_SMBusAlertCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_1_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable SMBus alert */ - I2Cx->CR1 |= I2C_CR1_ALERTEN; - } - else - { - /* Disable SMBus alert */ - I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_ALERTEN); - } -} - -/** - * @brief Enables or disables I2C Clock Timeout (SCL Timeout detection). - * @param I2Cx: where x can be 1 to select the I2C peripheral. - * @param NewState: new state of the I2Cx clock Timeout. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_ClockTimeoutCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_1_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable Clock Timeout */ - I2Cx->TIMEOUTR |= I2C_TIMEOUTR_TIMOUTEN; - } - else - { - /* Disable Clock Timeout */ - I2Cx->TIMEOUTR &= (uint32_t)~((uint32_t)I2C_TIMEOUTR_TIMOUTEN); - } -} - -/** - * @brief Enables or disables I2C Extended Clock Timeout (SCL cumulative Timeout detection). - * @param I2Cx: where x can be 1 to select the I2C peripheral. - * @param NewState: new state of the I2Cx Extended clock Timeout. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_ExtendedClockTimeoutCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_1_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable Clock Timeout */ - I2Cx->TIMEOUTR |= I2C_TIMEOUTR_TEXTEN; - } - else - { - /* Disable Clock Timeout */ - I2Cx->TIMEOUTR &= (uint32_t)~((uint32_t)I2C_TIMEOUTR_TEXTEN); - } -} - -/** - * @brief Enables or disables I2C Idle Clock Timeout (Bus idle SCL and SDA - * high detection). - * @param I2Cx: where x can be 1 to select the I2C peripheral. - * @param NewState: new state of the I2Cx Idle clock Timeout. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_IdleClockTimeoutCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_1_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable Clock Timeout */ - I2Cx->TIMEOUTR |= I2C_TIMEOUTR_TIDLE; - } - else - { - /* Disable Clock Timeout */ - I2Cx->TIMEOUTR &= (uint32_t)~((uint32_t)I2C_TIMEOUTR_TIDLE); - } -} - -/** - * @brief Configures the I2C Bus Timeout A (SCL Timeout when TIDLE = 0 or Bus - * idle SCL and SDA high when TIDLE = 1). - * @param I2Cx: where x can be 1 to select the I2C peripheral. - * @param Timeout: specifies the TimeoutA to be programmed. - * @retval None - */ -void I2C_TimeoutAConfig(I2C_TypeDef* I2Cx, uint16_t Timeout) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_1_PERIPH(I2Cx)); - assert_param(IS_I2C_TIMEOUT(Timeout)); - - /* Get the old register value */ - tmpreg = I2Cx->TIMEOUTR; - - /* Reset I2Cx TIMEOUTA bit [11:0] */ - tmpreg &= (uint32_t)~((uint32_t)I2C_TIMEOUTR_TIMEOUTA); - - /* Set I2Cx TIMEOUTA */ - tmpreg |= (uint32_t)((uint32_t)Timeout & I2C_TIMEOUTR_TIMEOUTA) ; - - /* Store the new register value */ - I2Cx->TIMEOUTR = tmpreg; -} - -/** - * @brief Configures the I2C Bus Timeout B (SCL cumulative Timeout). - * @param I2Cx: where x can be 1 to select the I2C peripheral. - * @param Timeout: specifies the TimeoutB to be programmed. - * @retval None - */ -void I2C_TimeoutBConfig(I2C_TypeDef* I2Cx, uint16_t Timeout) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_1_PERIPH(I2Cx)); - assert_param(IS_I2C_TIMEOUT(Timeout)); - - /* Get the old register value */ - tmpreg = I2Cx->TIMEOUTR; - - /* Reset I2Cx TIMEOUTB bit [11:0] */ - tmpreg &= (uint32_t)~((uint32_t)I2C_TIMEOUTR_TIMEOUTB); - - /* Set I2Cx TIMEOUTB */ - tmpreg |= (uint32_t)(((uint32_t)Timeout << 16) & I2C_TIMEOUTR_TIMEOUTB) ; - - /* Store the new register value */ - I2Cx->TIMEOUTR = tmpreg; -} - -/** - * @brief Enables or disables I2C PEC calculation. - * @param I2Cx: where x can be 1 to select the I2C peripheral. - * @param NewState: new state of the I2Cx PEC calculation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_1_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable PEC calculation */ - I2Cx->CR1 |= I2C_CR1_PECEN; - } - else - { - /* Disable PEC calculation */ - I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_PECEN); - } -} - -/** - * @brief Enables or disables I2C PEC transmission/reception request. - * @param I2Cx: where x can be 1 to select the I2C peripheral. - * @param NewState: new state of the I2Cx PEC request. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_PECRequestCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_1_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable PEC transmission/reception request */ - I2Cx->CR1 |= I2C_CR2_PECBYTE; - } - else - { - /* Disable PEC transmission/reception request */ - I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR2_PECBYTE); - } -} - -/** - * @brief Returns the I2C PEC. - * @param I2Cx: where x can be 1 to select the I2C peripheral. - * @retval The value of the PEC . - */ -uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx) -{ - /* Check the parameters */ - assert_param(IS_I2C_1_PERIPH(I2Cx)); - - /* Return the slave matched address in the SR1 register */ - return (uint8_t)((uint32_t)I2Cx->PECR & I2C_PECR_PEC); -} - -/** - * @} - */ - - -/** @defgroup I2C_Group4 I2C registers management functions - * @brief I2C registers management functions - * -@verbatim - =============================================================================== - ##### I2C registers management functions ##### - =============================================================================== - [..] This section provides a functions that allow user the management of - I2C registers. - -@endverbatim - * @{ - */ - - /** - * @brief Reads the specified I2C register and returns its value. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_Register: specifies the register to read. - * This parameter can be one of the following values: - * @arg I2C_Register_CR1: CR1 register. - * @arg I2C_Register_CR2: CR2 register. - * @arg I2C_Register_OAR1: OAR1 register. - * @arg I2C_Register_OAR2: OAR2 register. - * @arg I2C_Register_TIMINGR: TIMING register. - * @arg I2C_Register_TIMEOUTR: TIMEOUTR register. - * @arg I2C_Register_ISR: ISR register. - * @arg I2C_Register_ICR: ICR register. - * @arg I2C_Register_PECR: PECR register. - * @arg I2C_Register_RXDR: RXDR register. - * @arg I2C_Register_TXDR: TXDR register. - * @retval The value of the read register. - */ -uint32_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_REGISTER(I2C_Register)); - - tmp = (uint32_t)I2Cx; - tmp += I2C_Register; - - /* Return the selected register value */ - return (*(__IO uint32_t *) tmp); -} - -/** - * @} - */ - -/** @defgroup I2C_Group5 Data transfers management functions - * @brief Data transfers management functions - * -@verbatim - =============================================================================== - ##### Data transfers management functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage - the I2C data transfers. - - [..] The read access of the I2C_RXDR register can be done using - the I2C_ReceiveData() function and returns the received value. - Whereas a write access to the I2C_TXDR can be done using I2C_SendData() - function and stores the written data into TXDR. -@endverbatim - * @{ - */ - -/** - * @brief Sends a data byte through the I2Cx peripheral. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param Data: Byte to be transmitted.. - * @retval None - */ -void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - - /* Write in the DR register the data to be sent */ - I2Cx->TXDR = (uint8_t)Data; -} - -/** - * @brief Returns the most recent received data by the I2Cx peripheral. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @retval The value of the received data. - */ -uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - - /* Return the data in the DR register */ - return (uint8_t)I2Cx->RXDR; -} - -/** - * @} - */ - - -/** @defgroup I2C_Group6 DMA transfers management functions - * @brief DMA transfers management functions - * -@verbatim - =============================================================================== - ##### DMA transfers management functions ##### - =============================================================================== - [..] This section provides two functions that can be used only in DMA mode. - [..] In DMA Mode, the I2C communication can be managed by 2 DMA Channel - requests: - (#) I2C_DMAReq_Tx: specifies the Tx buffer DMA transfer request. - (#) I2C_DMAReq_Rx: specifies the Rx buffer DMA transfer request. - [..] In this Mode it is advised to use the following function: - (+) I2C_DMACmd(I2C_TypeDef* I2Cx, uint32_t I2C_DMAReq, FunctionalState NewState); -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the I2C DMA interface. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_DMAReq: specifies the I2C DMA transfer request to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg I2C_DMAReq_Tx: Tx DMA transfer request - * @arg I2C_DMAReq_Rx: Rx DMA transfer request - * @param NewState: new state of the selected I2C DMA transfer request. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_DMACmd(I2C_TypeDef* I2Cx, uint32_t I2C_DMAReq, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_I2C_DMA_REQ(I2C_DMAReq)); - - if (NewState != DISABLE) - { - /* Enable the selected I2C DMA requests */ - I2Cx->CR1 |= I2C_DMAReq; - } - else - { - /* Disable the selected I2C DMA requests */ - I2Cx->CR1 &= (uint32_t)~I2C_DMAReq; - } -} -/** - * @} - */ - - -/** @defgroup I2C_Group7 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== - [..] This section provides functions allowing to configure the I2C Interrupts - sources and check or clear the flags or pending bits status. - The user should identify which mode will be used in his application to manage - the communication: Polling mode, Interrupt mode or DMA mode(refer I2C_Group6). - - *** Polling Mode *** - ==================== - [..] In Polling Mode, the I2C communication can be managed by 15 flags: - (#) I2C_FLAG_TXE: to indicate the status of Transmit data register empty flag. - (#) I2C_FLAG_TXIS: to indicate the status of Transmit interrupt status flag . - (#) I2C_FLAG_RXNE: to indicate the status of Receive data register not empty flag. - (#) I2C_FLAG_ADDR: to indicate the status of Address matched flag (slave mode). - (#) I2C_FLAG_NACKF: to indicate the status of NACK received flag. - (#) I2C_FLAG_STOPF: to indicate the status of STOP detection flag. - (#) I2C_FLAG_TC: to indicate the status of Transfer complete flag(master mode). - (#) I2C_FLAG_TCR: to indicate the status of Transfer complete reload flag. - (#) I2C_FLAG_BERR: to indicate the status of Bus error flag. - (#) I2C_FLAG_ARLO: to indicate the status of Arbitration lost flag. - (#) I2C_FLAG_OVR: to indicate the status of Overrun/Underrun flag. - (#) I2C_FLAG_PECERR: to indicate the status of PEC error in reception flag. - (#) I2C_FLAG_TIMEOUT: to indicate the status of Timeout or Tlow detection flag. - (#) I2C_FLAG_ALERT: to indicate the status of SMBus Alert flag. - (#) I2C_FLAG_BUSY: to indicate the status of Bus busy flag. - - [..] In this Mode it is advised to use the following functions: - (+) FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); - (+) void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); - - [..] - (@)Do not use the BUSY flag to handle each data transmission or reception.It is - better to use the TXIS and RXNE flags instead. - - *** Interrupt Mode *** - ====================== - [..] In Interrupt Mode, the I2C communication can be managed by 7 interrupt sources - and 15 pending bits: - [..] Interrupt Source: - (#) I2C_IT_ERRI: specifies the interrupt source for the Error interrupt. - (#) I2C_IT_TCI: specifies the interrupt source for the Transfer Complete interrupt. - (#) I2C_IT_STOPI: specifies the interrupt source for the Stop Detection interrupt. - (#) I2C_IT_NACKI: specifies the interrupt source for the Not Acknowledge received interrupt. - (#) I2C_IT_ADDRI: specifies the interrupt source for the Address Match interrupt. - (#) I2C_IT_RXI: specifies the interrupt source for the RX interrupt. - (#) I2C_IT_TXI: specifies the interrupt source for the TX interrupt. - - [..] Pending Bits: - (#) I2C_IT_TXIS: to indicate the status of Transmit interrupt status flag. - (#) I2C_IT_RXNE: to indicate the status of Receive data register not empty flag. - (#) I2C_IT_ADDR: to indicate the status of Address matched flag (slave mode). - (#) I2C_IT_NACKF: to indicate the status of NACK received flag. - (#) I2C_IT_STOPF: to indicate the status of STOP detection flag. - (#) I2C_IT_TC: to indicate the status of Transfer complete flag (master mode). - (#) I2C_IT_TCR: to indicate the status of Transfer complete reload flag. - (#) I2C_IT_BERR: to indicate the status of Bus error flag. - (#) I2C_IT_ARLO: to indicate the status of Arbitration lost flag. - (#) I2C_IT_OVR: to indicate the status of Overrun/Underrun flag. - (#) I2C_IT_PECERR: to indicate the status of PEC error in reception flag. - (#) I2C_IT_TIMEOUT: to indicate the status of Timeout or Tlow detection flag. - (#) I2C_IT_ALERT: to indicate the status of SMBus Alert flag. - - [..] In this Mode it is advised to use the following functions: - (+) void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT); - (+) ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT); - -@endverbatim - * @{ - */ - -/** - * @brief Checks whether the specified I2C flag is set or not. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg I2C_FLAG_TXE: Transmit data register empty - * @arg I2C_FLAG_TXIS: Transmit interrupt status - * @arg I2C_FLAG_RXNE: Receive data register not empty - * @arg I2C_FLAG_ADDR: Address matched (slave mode) - * @arg I2C_FLAG_NACKF: NACK received flag - * @arg I2C_FLAG_STOPF: STOP detection flag - * @arg I2C_FLAG_TC: Transfer complete (master mode) - * @arg I2C_FLAG_TCR: Transfer complete reload - * @arg I2C_FLAG_BERR: Bus error - * @arg I2C_FLAG_ARLO: Arbitration lost - * @arg I2C_FLAG_OVR: Overrun/Underrun - * @arg I2C_FLAG_PECERR: PEC error in reception - * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow detection flag - * @arg I2C_FLAG_ALERT: SMBus Alert - * @arg I2C_FLAG_BUSY: Bus busy - * @retval The new state of I2C_FLAG (SET or RESET). - */ -FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) -{ - uint32_t tmpreg = 0; - FlagStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_GET_FLAG(I2C_FLAG)); - - /* Get the ISR register value */ - tmpreg = I2Cx->ISR; - - /* Get flag status */ - tmpreg &= I2C_FLAG; - - if(tmpreg != 0) - { - /* I2C_FLAG is set */ - bitstatus = SET; - } - else - { - /* I2C_FLAG is reset */ - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the I2Cx's pending flags. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg I2C_FLAG_ADDR: Address matched (slave mode) - * @arg I2C_FLAG_NACKF: NACK received flag - * @arg I2C_FLAG_STOPF: STOP detection flag - * @arg I2C_FLAG_BERR: Bus error - * @arg I2C_FLAG_ARLO: Arbitration lost - * @arg I2C_FLAG_OVR: Overrun/Underrun - * @arg I2C_FLAG_PECERR: PEC error in reception - * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow detection flag - * @arg I2C_FLAG_ALERT: SMBus Alert - * @retval The new state of I2C_FLAG (SET or RESET). - */ -void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_CLEAR_FLAG(I2C_FLAG)); - - /* Clear the selected flag */ - I2Cx->ICR = I2C_FLAG; - } - -/** - * @brief Checks whether the specified I2C interrupt has occurred or not. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_IT: specifies the interrupt source to check. - * This parameter can be one of the following values: - * @arg I2C_IT_TXIS: Transmit interrupt status - * @arg I2C_IT_RXNE: Receive data register not empty - * @arg I2C_IT_ADDR: Address matched (slave mode) - * @arg I2C_IT_NACKF: NACK received flag - * @arg I2C_IT_STOPF: STOP detection flag - * @arg I2C_IT_TC: Transfer complete (master mode) - * @arg I2C_IT_TCR: Transfer complete reload - * @arg I2C_IT_BERR: Bus error - * @arg I2C_IT_ARLO: Arbitration lost - * @arg I2C_IT_OVR: Overrun/Underrun - * @arg I2C_IT_PECERR: PEC error in reception - * @arg I2C_IT_TIMEOUT: Timeout or Tlow detection flag - * @arg I2C_IT_ALERT: SMBus Alert - * @retval The new state of I2C_IT (SET or RESET). - */ -ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT) -{ - uint32_t tmpreg = 0; - ITStatus bitstatus = RESET; - uint32_t enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_GET_IT(I2C_IT)); - - /* Check if the interrupt source is enabled or not */ - /* If Error interrupt */ - if ((uint32_t)(I2C_IT & ERROR_IT_MASK)) - { - enablestatus = (uint32_t)((I2C_CR1_ERRIE) & (I2Cx->CR1)); - } - /* If TC interrupt */ - else if ((uint32_t)(I2C_IT & TC_IT_MASK)) - { - enablestatus = (uint32_t)((I2C_CR1_TCIE) & (I2Cx->CR1)); - } - else - { - enablestatus = (uint32_t)((I2C_IT) & (I2Cx->CR1)); - } - - /* Get the ISR register value */ - tmpreg = I2Cx->ISR; - - /* Get flag status */ - tmpreg &= I2C_IT; - - /* Check the status of the specified I2C flag */ - if((tmpreg != RESET) && enablestatus) - { - /* I2C_IT is set */ - bitstatus = SET; - } - else - { - /* I2C_IT is reset */ - bitstatus = RESET; - } - - /* Return the I2C_IT status */ - return bitstatus; -} - -/** - * @brief Clears the I2Cx's interrupt pending bits. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_IT: specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg I2C_IT_ADDR: Address matched (slave mode) - * @arg I2C_IT_NACKF: NACK received flag - * @arg I2C_IT_STOPF: STOP detection flag - * @arg I2C_IT_BERR: Bus error - * @arg I2C_IT_ARLO: Arbitration lost - * @arg I2C_IT_OVR: Overrun/Underrun - * @arg I2C_IT_PECERR: PEC error in reception - * @arg I2C_IT_TIMEOUT: Timeout or Tlow detection flag - * @arg I2C_IT_ALERT: SMBus Alert - * @retval The new state of I2C_IT (SET or RESET). - */ -void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_CLEAR_IT(I2C_IT)); - - /* Clear the selected flag */ - I2Cx->ICR = I2C_IT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_iwdg.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_iwdg.c deleted file mode 100644 index 2eca2c8..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_iwdg.c +++ /dev/null @@ -1,293 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_iwdg.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Independent watchdog (IWDG) peripheral: - * + Prescaler and Counter configuration - * + IWDG activation - * + Flag management - * - * @verbatim - * - ============================================================================== - ##### IWDG features ##### - ============================================================================== - [..] The IWDG can be started by either software or hardware (configurable - through option byte). - - [..] The IWDG is clocked by its own dedicated low-speed clock (LSI) and - thus stays active even if the main clock fails. - Once the IWDG is started, the LSI is forced ON and cannot be disabled - (LSI cannot be disabled too), and the counter starts counting down from - the reset value of 0xFFF. When it reaches the end of count value (0x000) - a system reset is generated. - The IWDG counter should be reloaded at regular intervals to prevent - an MCU reset. - - [..] The IWDG is implemented in the VDD voltage domain that is still functional - in STOP and STANDBY mode (IWDG reset can wake-up from STANDBY). - - [..] IWDGRST flag in RCC_CSR register can be used to inform when a IWDG - reset occurs. - - [..] Min-max timeout value @40KHz (LSI): ~0.1ms / ~28.3s - The IWDG timeout may vary due to LSI frequency dispersion. STM32F0xx - devices provide the capability to measure the LSI frequency (LSI clock - should be seleted as RTC clock which is internally connected to TIM10 CH1 - input capture). The measured value can be used to have an IWDG timeout with - an acceptable accuracy. - For more information, please refer to the STM32F0xx Reference manual. - - ##### How to use this driver ##### - ============================================================================== - [..] This driver allows to use IWDG peripheral with either window option enabled - or disabled. To do so follow one of the two procedures below. - (#) Window option is enabled: - (++) Start the IWDG using IWDG_Enable() function, when the IWDG is used - in software mode (no need to enable the LSI, it will be enabled - by hardware). - (++) Enable write access to IWDG_PR and IWDG_RLR registers using - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable) function. - (++) Configure the IWDG prescaler using IWDG_SetPrescaler() function. - (++) Configure the IWDG counter value using IWDG_SetReload() function. - This value will be loaded in the IWDG counter each time the counter - is reloaded, then the IWDG will start counting down from this value. - (++) Wait for the IWDG registers to be updated using IWDG_GetFlagStatus() function. - (++) Configure the IWDG refresh window using IWDG_SetWindowValue() function. - - (#) Window option is disabled: - (++) Enable write access to IWDG_PR and IWDG_RLR registers using - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable) function. - (++) Configure the IWDG prescaler using IWDG_SetPrescaler() function. - (++) Configure the IWDG counter value using IWDG_SetReload() function. - This value will be loaded in the IWDG counter each time the counter - is reloaded, then the IWDG will start counting down from this value. - (++) Wait for the IWDG registers to be updated using IWDG_GetFlagStatus() function. - (++) reload the IWDG counter at regular intervals during normal operation - to prevent an MCU reset, using IWDG_ReloadCounter() function. - (++) Start the IWDG using IWDG_Enable() function, when the IWDG is used - in software mode (no need to enable the LSI, it will be enabled - by hardware). - - @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_iwdg.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup IWDG - * @brief IWDG driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* ---------------------- IWDG registers bit mask ----------------------------*/ -/* KR register bit mask */ -#define KR_KEY_RELOAD ((uint16_t)0xAAAA) -#define KR_KEY_ENABLE ((uint16_t)0xCCCC) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup IWDG_Private_Functions - * @{ - */ - -/** @defgroup IWDG_Group1 Prescaler and Counter configuration functions - * @brief Prescaler and Counter configuration functions - * -@verbatim - ============================================================================== - ##### Prescaler and Counter configuration functions ##### - ============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables write access to IWDG_PR and IWDG_RLR registers. - * @param IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers. - * This parameter can be one of the following values: - * @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers - * @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers - * @retval None - */ -void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) -{ - /* Check the parameters */ - assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess)); - IWDG->KR = IWDG_WriteAccess; -} - -/** - * @brief Sets IWDG Prescaler value. - * @param IWDG_Prescaler: specifies the IWDG Prescaler value. - * This parameter can be one of the following values: - * @arg IWDG_Prescaler_4: IWDG prescaler set to 4 - * @arg IWDG_Prescaler_8: IWDG prescaler set to 8 - * @arg IWDG_Prescaler_16: IWDG prescaler set to 16 - * @arg IWDG_Prescaler_32: IWDG prescaler set to 32 - * @arg IWDG_Prescaler_64: IWDG prescaler set to 64 - * @arg IWDG_Prescaler_128: IWDG prescaler set to 128 - * @arg IWDG_Prescaler_256: IWDG prescaler set to 256 - * @retval None - */ -void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) -{ - /* Check the parameters */ - assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler)); - IWDG->PR = IWDG_Prescaler; -} - -/** - * @brief Sets IWDG Reload value. - * @param Reload: specifies the IWDG Reload value. - * This parameter must be a number between 0 and 0x0FFF. - * @retval None - */ -void IWDG_SetReload(uint16_t Reload) -{ - /* Check the parameters */ - assert_param(IS_IWDG_RELOAD(Reload)); - IWDG->RLR = Reload; -} - -/** - * @brief Reloads IWDG counter with value defined in the reload register - * (write access to IWDG_PR and IWDG_RLR registers disabled). - * @param None - * @retval None - */ -void IWDG_ReloadCounter(void) -{ - IWDG->KR = KR_KEY_RELOAD; -} - - -/** - * @brief Sets the IWDG window value. - * @param WindowValue: specifies the window value to be compared to the downcounter. - * @retval None - */ -void IWDG_SetWindowValue(uint16_t WindowValue) -{ - /* Check the parameters */ - assert_param(IS_IWDG_WINDOW_VALUE(WindowValue)); - IWDG->WINR = WindowValue; -} - -/** - * @} - */ - -/** @defgroup IWDG_Group2 IWDG activation function - * @brief IWDG activation function - * -@verbatim - ============================================================================== - ##### IWDG activation function ##### - ============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled). - * @param None - * @retval None - */ -void IWDG_Enable(void) -{ - IWDG->KR = KR_KEY_ENABLE; -} - -/** - * @} - */ - -/** @defgroup IWDG_Group3 Flag management function - * @brief Flag management function - * -@verbatim - =============================================================================== - ##### Flag management function ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Checks whether the specified IWDG flag is set or not. - * @param IWDG_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg IWDG_FLAG_PVU: Prescaler Value Update on going - * @arg IWDG_FLAG_RVU: Reload Value Update on going - * @arg IWDG_FLAG_WVU: Counter Window Value Update on going - * @retval The new state of IWDG_FLAG (SET or RESET). - */ -FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_IWDG_FLAG(IWDG_FLAG)); - if ((IWDG->SR & IWDG_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the flag status */ - return bitstatus; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_misc.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_misc.c deleted file mode 100644 index 1ace673..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_misc.c +++ /dev/null @@ -1,167 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_misc.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides all the miscellaneous firmware functions (add-on - * to CMSIS functions). - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_misc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup MISC - * @brief MISC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup MISC_Private_Functions - * @{ - */ -/** - * -@verbatim - ******************************************************************************* - ##### Interrupts configuration functions ##### - ******************************************************************************* - [..] This section provide functions allowing to configure the NVIC interrupts - (IRQ). The Cortex-M0 exceptions are managed by CMSIS functions. - (#) Enable and Configure the priority of the selected IRQ Channels. - The priority can be 0..3. - - -@- Lower priority values gives higher priority. - -@- Priority Order: - (#@) Lowest priority. - (#@) Lowest hardware priority (IRQn position). - -@endverbatim -*/ - -/** - * @brief Initializes the NVIC peripheral according to the specified - * parameters in the NVIC_InitStruct. - * @param NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure that contains - * the configuration information for the specified NVIC peripheral. - * @retval None - */ -void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) -{ - uint32_t tmppriority = 0x00; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd)); - assert_param(IS_NVIC_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPriority)); - - if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) - { - /* Compute the Corresponding IRQ Priority --------------------------------*/ - tmppriority = NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel >> 0x02]; - tmppriority &= (uint32_t)(~(((uint32_t)0xFF) << ((NVIC_InitStruct->NVIC_IRQChannel & 0x03) * 8))); - tmppriority |= (uint32_t)((((uint32_t)NVIC_InitStruct->NVIC_IRQChannelPriority << 6) & 0xFF) << ((NVIC_InitStruct->NVIC_IRQChannel & 0x03) * 8)); - - NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel >> 0x02] = tmppriority; - - /* Enable the Selected IRQ Channels --------------------------------------*/ - NVIC->ISER[0] = (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); - } - else - { - /* Disable the Selected IRQ Channels -------------------------------------*/ - NVIC->ICER[0] = (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); - } -} - -/** - * @brief Selects the condition for the system to enter low power mode. - * @param LowPowerMode: Specifies the new mode for the system to enter low power mode. - * This parameter can be one of the following values: - * @arg NVIC_LP_SEVONPEND: Low Power SEV on Pend. - * @arg NVIC_LP_SLEEPDEEP: Low Power DEEPSLEEP request. - * @arg NVIC_LP_SLEEPONEXIT: Low Power Sleep on Exit. - * @param NewState: new state of LP condition. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_NVIC_LP(LowPowerMode)); - - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - SCB->SCR |= LowPowerMode; - } - else - { - SCB->SCR &= (uint32_t)(~(uint32_t)LowPowerMode); - } -} - -/** - * @brief Configures the SysTick clock source. - * @param SysTick_CLKSource: specifies the SysTick clock source. - * This parameter can be one of the following values: - * @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source. - * @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source. - * @retval None - */ -void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) -{ - /* Check the parameters */ - assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); - - if (SysTick_CLKSource == SysTick_CLKSource_HCLK) - { - SysTick->CTRL |= SysTick_CLKSource_HCLK; - } - else - { - SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_pwr.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_pwr.c deleted file mode 100644 index 7c13ce4..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_pwr.c +++ /dev/null @@ -1,566 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_pwr.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Power Controller (PWR) peripheral: - * + Backup Domain Access - * + PVD configuration - * + WakeUp pins configuration - * + Low Power modes configuration - * + Flags management - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_pwr.h" -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup PWR - * @brief PWR driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* ------------------ PWR registers bit mask ------------------------ */ - -/* CR register bit mask */ -#define CR_DS_MASK ((uint32_t)0xFFFFFFFC) -#define CR_PLS_MASK ((uint32_t)0xFFFFFF1F) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup PWR_Private_Functions - * @{ - */ - -/** @defgroup PWR_Group1 Backup Domain Access function - * @brief Backup Domain Access function - * -@verbatim - ============================================================================== - ##### Backup Domain Access function ##### - ============================================================================== - - [..] After reset, the Backup Domain Registers (RCC BDCR Register, RTC registers - and RTC backup registers) are protected against possible stray write accesses. - [..] To enable access to Backup domain use the PWR_BackupAccessCmd(ENABLE) function. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the PWR peripheral registers to their default reset values. - * @param None - * @retval None - */ -void PWR_DeInit(void) -{ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE); -} - -/** - * @brief Enables or disables access to the Backup domain registers. - * @note If the HSE divided by 32 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @param NewState: new state of the access to the Backup domain registers. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void PWR_BackupAccessCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Backup Domain Access */ - PWR->CR |= PWR_CR_DBP; - } - else - { - /* Disable the Backup Domain Access */ - PWR->CR &= (uint32_t)~((uint32_t)PWR_CR_DBP); - } -} - -/** - * @} - */ - -/** @defgroup PWR_Group2 PVD configuration functions - * @brief PVD configuration functions - * -@verbatim - ============================================================================== - ##### PVD configuration functions ##### - ============================================================================== - [..] - (+) The PVD is used to monitor the VDD power supply by comparing it to a threshold - selected by the PVD Level (PLS[2:0] bits in the PWR_CR). - (+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower than the - PVD threshold. This event is internally connected to the EXTI line16 - and can generate an interrupt if enabled through the EXTI registers. - (+) The PVD is stopped in Standby mode. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). - * @note This function is not applicable for STM32F030 devices. - * @param PWR_PVDLevel: specifies the PVD detection level - * This parameter can be one of the following values: - * @arg PWR_PVDLevel_0 - * @arg PWR_PVDLevel_1 - * @arg PWR_PVDLevel_2 - * @arg PWR_PVDLevel_3 - * @arg PWR_PVDLevel_4 - * @arg PWR_PVDLevel_5 - * @arg PWR_PVDLevel_6 - * @arg PWR_PVDLevel_7 - * @note Refer to the electrical characteristics of your device datasheet for - * more details about the voltage threshold corresponding to each - * detection level. - * @retval None - */ -void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_PWR_PVD_LEVEL(PWR_PVDLevel)); - - tmpreg = PWR->CR; - - /* Clear PLS[7:5] bits */ - tmpreg &= CR_PLS_MASK; - - /* Set PLS[7:5] bits according to PWR_PVDLevel value */ - tmpreg |= PWR_PVDLevel; - - /* Store the new value */ - PWR->CR = tmpreg; -} - -/** - * @brief Enables or disables the Power Voltage Detector(PVD). - * @note This function is not applicable for STM32F030 devices. - * @param NewState: new state of the PVD. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void PWR_PVDCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the PVD */ - PWR->CR |= PWR_CR_PVDE; - } - else - { - /* Disable the PVD */ - PWR->CR &= (uint32_t)~((uint32_t)PWR_CR_PVDE); - } -} - -/** - * @} - */ - -/** @defgroup PWR_Group3 WakeUp pins configuration functions - * @brief WakeUp pins configuration functions - * -@verbatim - ============================================================================== - ##### WakeUp pin configuration functions ##### - ============================================================================== - - (+) WakeUp pins are used to wakeup the system from Standby mode. These pins are - forced in input pull down configuration and are active on rising edges. - (+) There are eight WakeUp pins: WakeUp Pin 1 on PA.00 and WakeUp Pin 2 on PC.13. - The following WakeUp pins are only applicable for STM32F072 dvices: - WakeUp Pin 3 on PE.06, WakeUp Pin 4 on PA.02, WakeUp Pin 5 on PC.05, - WakeUp Pin 6 on PB.05, WakeUp Pin 7 on PB.15 and WakeUp Pin 8 on PF.02. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the WakeUp Pin functionality. - * @param PWR_WakeUpPin: specifies the WakeUpPin. - * This parameter can be one of the following values - * @arg PWR_WakeUpPin_1 - * @arg PWR_WakeUpPin_2 - * @arg PWR_WakeUpPin_3, only applicable for STM32F072 devices - * @arg PWR_WakeUpPin_4, only applicable for STM32F072 devices - * @arg PWR_WakeUpPin_5, only applicable for STM32F072 devices - * @arg PWR_WakeUpPin_6, only applicable for STM32F072 devices - * @arg PWR_WakeUpPin_7, only applicable for STM32F072 devices - * @arg PWR_WakeUpPin_8, only applicable for STM32F072 devices - * @param NewState: new state of the WakeUp Pin functionality. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void PWR_WakeUpPinCmd(uint32_t PWR_WakeUpPin, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_PWR_WAKEUP_PIN(PWR_WakeUpPin)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the EWUPx pin */ - PWR->CSR |= PWR_WakeUpPin; - } - else - { - /* Disable the EWUPx pin */ - PWR->CSR &= ~PWR_WakeUpPin; - } -} - -/** - * @} - */ - - -/** @defgroup PWR_Group4 Low Power modes configuration functions - * @brief Low Power modes configuration functions - * -@verbatim - ============================================================================== - ##### Low Power modes configuration functions ##### - ============================================================================== - - [..] The devices feature three low-power modes: - (+) Sleep mode: Cortex-M0 core stopped, peripherals kept running. - (+) Stop mode: all clocks are stopped, regulator running, regulator in low power mode - (+) Standby mode: VCORE domain powered off - - *** Sleep mode *** - ================== - [..] - (+) Entry: - (++) The Sleep mode is entered by executing the WFE() or WFI() instructions. - (+) Exit: - (++) Any peripheral interrupt acknowledged by the nested vectored interrupt - controller (NVIC) can wake up the device from Sleep mode. - - *** Stop mode *** - ================= - [..] In Stop mode, all clocks in the VCORE domain are stopped, the PLL, the HSI, - the HSI14 and the HSE RC oscillators are disabled. Internal SRAM and register - contents are preserved. - The voltage regulator can be configured either in normal or low-power mode. - - (+) Entry: - (++) The Stop mode is entered using the PWR_EnterSTOPMode(PWR_Regulator_LowPower,) - function with regulator in LowPower or with Regulator ON. - (+) Exit: - (++) Any EXTI Line (Internal or External) configured in Interrupt/Event mode - or any internal IPs (I2C, UASRT or CEC) wakeup event. - - *** Standby mode *** - ==================== - [..] The Standby mode allows to achieve the lowest power consumption. It is based - on the Cortex-M0 deepsleep mode, with the voltage regulator disabled. - The VCORE domain is consequently powered off. The PLL, the HSI, the HSI14 - oscillator and the HSE oscillator are also switched off. SRAM and register - contents are lost except for the Backup domain (RTC registers, RTC backup - registers and Standby circuitry). - - [..] The voltage regulator is OFF. - - (+) Entry: - (++) The Standby mode is entered using the PWR_EnterSTANDBYMode() function. - (+) Exit: - (++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wakeup, - tamper event, time-stamp event, external reset in NRST pin, IWDG reset. - - *** Auto-wakeup (AWU) from low-power mode *** - ============================================= - [..] The MCU can be woken up from low-power mode by an RTC Alarm event, a tamper - event, a time-stamp event, or a comparator event, without depending on an - external interrupt (Auto-wakeup mode). - - (+) RTC auto-wakeup (AWU) from the Stop mode - (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to: - (+++) Configure the EXTI Line 17 to be sensitive to rising edges (Interrupt - or Event modes) using the EXTI_Init() function. - (+++) Enable the RTC Alarm Interrupt using the RTC_ITConfig() function - (+++) Configure the RTC to generate the RTC alarm using the RTC_SetAlarm() - and RTC_AlarmCmd() functions. - (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it - is necessary to: - (+++) Configure the EXTI Line 19 to be sensitive to rising edges (Interrupt - or Event modes) using the EXTI_Init() function. - (+++) Enable the RTC Tamper or time stamp Interrupt using the RTC_ITConfig() - function. - (+++) Configure the RTC to detect the tamper or time stamp event using the - RTC_TimeStampConfig(), RTC_TamperTriggerConfig() and RTC_TamperCmd() - functions. - - (+) RTC auto-wakeup (AWU) from the Standby mode - (++) To wake up from the Standby mode with an RTC alarm event, it is necessary to: - (+++) Enable the RTC Alarm Interrupt using the RTC_ITConfig() function. - (+++) Configure the RTC to generate the RTC alarm using the RTC_SetAlarm() - and RTC_AlarmCmd() functions. - (++) To wake up from the Standby mode with an RTC Tamper or time stamp event, it - is necessary to: - (+++) Enable the RTC Tamper or time stamp Interrupt using the RTC_ITConfig() - function. - (+++) Configure the RTC to detect the tamper or time stamp event using the - RTC_TimeStampConfig(), RTC_TamperTriggerConfig() and RTC_TamperCmd() - functions. - - (+) Comparator auto-wakeup (AWU) from the Stop mode - (++) To wake up from the Stop mode with an comparator 1 or comparator 2 wakeup - event, it is necessary to: - (+++) Configure the EXTI Line 21 for comparator 1 or EXTI Line 22 for comparator 2 - to be sensitive to to the selected edges (falling, rising or falling - and rising) (Interrupt or Event modes) using the EXTI_Init() function. - (+++) Configure the comparator to generate the event. - -@endverbatim - * @{ - */ - -/** - * @brief Enters Sleep mode. - * @note In Sleep mode, all I/O pins keep the same state as in Run mode. - * @param PWR_SLEEPEntry: specifies if SLEEP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_SLEEPEntry_WFI: enter SLEEP mode with WFI instruction - * @arg PWR_SLEEPEntry_WFE: enter SLEEP mode with WFE instruction - * @retval None - */ -void PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry) -{ - /* Check the parameters */ - assert_param(IS_PWR_SLEEP_ENTRY(PWR_SLEEPEntry)); - - /* Clear SLEEPDEEP bit of Cortex-M0 System Control Register */ - SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); - - /* Select SLEEP mode entry -------------------------------------------------*/ - if(PWR_SLEEPEntry == PWR_SLEEPEntry_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* Request Wait For Event */ - __WFE(); - } -} - -/** - * @brief Enters STOP mode. - * @note In Stop mode, all I/O pins keep the same state as in Run mode. - * @note When exiting Stop mode by issuing an interrupt or a wakeup event, - * the HSI RC oscillator is selected as system clock. - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * @param PWR_Regulator: specifies the regulator state in STOP mode. - * This parameter can be one of the following values: - * @arg PWR_Regulator_ON: STOP mode with regulator ON - * @arg PWR_Regulator_LowPower: STOP mode with regulator in low power mode - * @param PWR_STOPEntry: specifies if STOP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_STOPEntry_WFI: enter STOP mode with WFI instruction - * @arg PWR_STOPEntry_WFE: enter STOP mode with WFE instruction - @arg PWR_STOPEntry_SLEEPONEXIT: enter STOP mode with SLEEPONEXIT instruction - * @retval None - */ -void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(PWR_Regulator)); - assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry)); - - /* Select the regulator state in STOP mode ---------------------------------*/ - tmpreg = PWR->CR; - /* Clear PDDS and LPDSR bits */ - tmpreg &= CR_DS_MASK; - - /* Set LPDSR bit according to PWR_Regulator value */ - tmpreg |= PWR_Regulator; - - /* Store the new value */ - PWR->CR = tmpreg; - - /* Set SLEEPDEEP bit of Cortex-M0 System Control Register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - - /* Select STOP mode entry --------------------------------------------------*/ - if(PWR_STOPEntry == PWR_STOPEntry_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); - } - else if (PWR_STOPEntry == PWR_STOPEntry_WFE) - { - /* Request Wait For Event */ - __WFE(); - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); - } - else - { - /* Set SLEEP on exit bit of Cortex-M0 System Control Register */ - SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; - } -} - -/** - * @brief Enters STANDBY mode. - * @note In Standby mode, all I/O pins are high impedance except for: - * - Reset pad (still available) - * - RTC_AF1 pin (PC13) if configured for Wakeup pin 2 (WKUP2), tamper, - * time-stamp, RTC Alarm out, or RTC clock calibration out. - * - WKUP pin 1 (PA0) if enabled. - * @param None - * @retval None - */ -void PWR_EnterSTANDBYMode(void) -{ - /* Clear Wakeup flag */ - PWR->CR |= PWR_CR_CWUF; - - /* Select STANDBY mode */ - PWR->CR |= PWR_CR_PDDS; - - /* Set SLEEPDEEP bit of Cortex-M0 System Control Register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - - /* Request Wait For Interrupt */ - __WFI(); -} - -/** - * @} - */ - -/** @defgroup PWR_Group5 Flags management functions - * @brief Flags management functions - * -@verbatim - ============================================================================== - ##### Flags management functions ##### - ============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Checks whether the specified PWR flag is set or not. - * @param PWR_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup - * event was received from the WKUP pin or from the RTC alarm - * (Alarm A or Alarm B), RTC Tamper event or RTC TimeStamp event. - * @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the - * system was resumed from StandBy mode. - * @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD - * is enabled by the PWR_PVDCmd() function. - * @arg PWR_FLAG_VREFINTRDY: Internal Voltage Reference Ready flag. - * This flag indicates the state of the internal voltage - * reference, VREFINT. - * @retval The new state of PWR_FLAG (SET or RESET). - */ -FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_PWR_GET_FLAG(PWR_FLAG)); - - if ((PWR->CSR & PWR_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the flag status */ - return bitstatus; -} - -/** - * @brief Clears the PWR's pending flags. - * @param PWR_FLAG: specifies the flag to clear. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag - * @arg PWR_FLAG_SB: StandBy flag - * @retval None - */ -void PWR_ClearFlag(uint32_t PWR_FLAG) -{ - /* Check the parameters */ - assert_param(IS_PWR_CLEAR_FLAG(PWR_FLAG)); - - PWR->CR |= PWR_FLAG << 2; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_rcc.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_rcc.c deleted file mode 100644 index ef8d5fd..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_rcc.c +++ /dev/null @@ -1,1741 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_rcc.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Reset and clock control (RCC) peripheral: - * + Internal/external clocks, PLL, CSS and MCO configuration - * + System, AHB and APB busses clocks configuration - * + Peripheral clocks configuration - * + Interrupts and flags management - * - @verbatim - - =============================================================================== - ##### RCC specific features ##### - =============================================================================== - [..] After reset the device is running from HSI (8 MHz) with Flash 0 WS, - all peripherals are off except internal SRAM, Flash and SWD. - (#) There is no prescaler on High speed (AHB) and Low speed (APB) busses; - all peripherals mapped on these busses are running at HSI speed. - (#) The clock for all peripherals is switched off, except the SRAM and FLASH. - (#) All GPIOs are in input floating state, except the SWD pins which - are assigned to be used for debug purpose. - [..] Once the device started from reset, the user application has to: - (#) Configure the clock source to be used to drive the System clock - (if the application needs higher frequency/performance) - (#) Configure the System clock frequency and Flash settings - (#) Configure the AHB and APB busses prescalers - (#) Enable the clock for the peripheral(s) to be used - (#) Configure the clock source(s) for peripherals which clocks are not - derived from the System clock (ADC, CEC, I2C, USART, RTC and IWDG) - - @endverbatim - - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup RCC - * @brief RCC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* ---------------------- RCC registers mask -------------------------------- */ -/* RCC Flag Mask */ -#define FLAG_MASK ((uint8_t)0x1F) - -/* CR register byte 2 (Bits[23:16]) base address */ -#define CR_BYTE2_ADDRESS ((uint32_t)0x40021002) - -/* CFGR register byte 3 (Bits[31:23]) base address */ -#define CFGR_BYTE3_ADDRESS ((uint32_t)0x40021007) - -/* CIR register byte 1 (Bits[15:8]) base address */ -#define CIR_BYTE1_ADDRESS ((uint32_t)0x40021009) - -/* CIR register byte 2 (Bits[23:16]) base address */ -#define CIR_BYTE2_ADDRESS ((uint32_t)0x4002100A) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; - -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup RCC_Private_Functions - * @{ - */ - -/** @defgroup RCC_Group1 Internal and external clocks, PLL, CSS and MCO configuration functions - * @brief Internal and external clocks, PLL, CSS and MCO configuration functions - * -@verbatim - =============================================================================== - ##### Internal-external clocks, PLL, CSS and MCO configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to configure the internal/external clocks, - PLL, CSS and MCO. - (#) HSI (high-speed internal), 8 MHz factory-trimmed RC used directly - or through the PLL as System clock source. - The HSI clock can be used also to clock the USART, I2C and CEC peripherals. - (#) HSI14 (high-speed internal for ADC), 14 MHz factory-trimmed RC used to clock - the ADC peripheral. - (#) LSI (low-speed internal), 40 KHz low consumption RC used as IWDG and/or RTC - clock source. - (#) HSE (high-speed external), 4 to 32 MHz crystal oscillator used directly or - through the PLL as System clock source. Can be used also as RTC clock source. - (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. - LSE can be used also to clock the USART and CEC peripherals. - (#) PLL (clocked by HSI or HSE), for System clock. - (#) CSS (Clock security system), once enabled and if a HSE clock failure occurs - (HSE used directly or through PLL as System clock source), the System clock - is automatically switched to HSI and an interrupt is generated if enabled. - The interrupt is linked to the Cortex-M0 NMI (Non-Maskable Interrupt) - exception vector. - (#) MCO (microcontroller clock output), used to output SYSCLK, HSI, HSI14, LSI, - HSE, LSE or PLL (divided by 2) clock on PA8 pin. - -@endverbatim - * @{ - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * @note HSI ON and used as system clock source - * @note HSI14, HSE and PLL OFF - * @note AHB, APB prescaler set to 1. - * @note CSS and MCO OFF - * @note All interrupts disabled - * @note However, this function doesn't modify the configuration of the - * @note Peripheral clocks - * @note LSI, LSE and RTC clocks - * @param None - * @retval None - */ -void RCC_DeInit(void) -{ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - -#if defined (STM32F051) - /* Reset SW[1:0], HPRE[3:0], PPRE[2:0] and MCOSEL[2:0] bits */ - RCC->CFGR &= (uint32_t)0xF8FFB80C; -#else - /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits */ - RCC->CFGR &= (uint32_t)0x08FFB80C; -#endif /* STM32F051 */ - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */ - RCC->CFGR &= (uint32_t)0xFFC0FFFF; - - /* Reset PREDIV1[3:0] bits */ - RCC->CFGR2 &= (uint32_t)0xFFFFFFF0; - - /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */ - RCC->CFGR3 &= (uint32_t)0xFFFFFEAC; - - /* Reset HSI14 bit */ - RCC->CR2 &= (uint32_t)0xFFFFFFFE; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; -} - -/** - * @brief Configures the External High Speed oscillator (HSE). - * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application - * software should wait on HSERDY flag to be set indicating that HSE clock - * is stable and can be used to clock the PLL and/or system clock. - * @note HSE state can not be changed if it is used directly or through the - * PLL as system clock. In this case, you have to select another source - * of the system clock then change the HSE state (ex. disable it). - * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. - * @note This function resets the CSSON bit, so if the Clock security system(CSS) - * was previously enabled you have to enable it again after calling this - * function. - * @param RCC_HSE: specifies the new state of the HSE. - * This parameter can be one of the following values: - * @arg RCC_HSE_OFF: turn OFF the HSE oscillator, HSERDY flag goes low after - * 6 HSE oscillator clock cycles. - * @arg RCC_HSE_ON: turn ON the HSE oscillator - * @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock - * @retval None - */ -void RCC_HSEConfig(uint8_t RCC_HSE) -{ - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_HSE)); - - /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/ - *(__IO uint8_t *) CR_BYTE2_ADDRESS = RCC_HSE_OFF; - - /* Set the new HSE configuration -------------------------------------------*/ - *(__IO uint8_t *) CR_BYTE2_ADDRESS = RCC_HSE; - -} - -/** - * @brief Waits for HSE start-up. - * @note This function waits on HSERDY flag to be set and return SUCCESS if - * this flag is set, otherwise returns ERROR if the timeout is reached - * and this flag is not set. The timeout value is defined by the constant - * HSE_STARTUP_TIMEOUT in stm32f0xx.h file. You can tailor it depending - * on the HSE crystal used in your application. - * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. - * @param None - * @retval An ErrorStatus enumeration value: - * - SUCCESS: HSE oscillator is stable and ready to use - * - ERROR: HSE oscillator not yet ready - */ -ErrorStatus RCC_WaitForHSEStartUp(void) -{ - __IO uint32_t StartUpCounter = 0; - ErrorStatus status = ERROR; - FlagStatus HSEStatus = RESET; - - /* Wait till HSE is ready and if timeout is reached exit */ - do - { - HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY); - StartUpCounter++; - } while((StartUpCounter != HSE_STARTUP_TIMEOUT) && (HSEStatus == RESET)); - - if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) - { - status = SUCCESS; - } - else - { - status = ERROR; - } - return (status); -} - -/** - * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value. - * @note The calibration is used to compensate for the variations in voltage - * and temperature that influence the frequency of the internal HSI RC. - * Refer to the Application Note AN4067 for more details on how to - * calibrate the HSI. - * @param HSICalibrationValue: specifies the HSI calibration trimming value. - * This parameter must be a number between 0 and 0x1F. - * @retval None - */ -void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_HSI_CALIBRATION_VALUE(HSICalibrationValue)); - - tmpreg = RCC->CR; - - /* Clear HSITRIM[4:0] bits */ - tmpreg &= ~RCC_CR_HSITRIM; - - /* Set the HSITRIM[4:0] bits according to HSICalibrationValue value */ - tmpreg |= (uint32_t)HSICalibrationValue << 3; - - /* Store the new value */ - RCC->CR = tmpreg; -} - -/** - * @brief Enables or disables the Internal High Speed oscillator (HSI). - * @note After enabling the HSI, the application software should wait on - * HSIRDY flag to be set indicating that HSI clock is stable and can - * be used to clock the PLL and/or system clock. - * @note HSI can not be stopped if it is used directly or through the PLL - * as system clock. In this case, you have to select another source - * of the system clock then stop the HSI. - * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. - * @param NewState: new state of the HSI. - * This parameter can be: ENABLE or DISABLE. - * @note When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator - * clock cycles. - * @retval None - */ -void RCC_HSICmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->CR |= RCC_CR_HSION; - } - else - { - RCC->CR &= ~RCC_CR_HSION; - } -} - -/** - * @brief Adjusts the Internal High Speed oscillator for ADC (HSI14) - * calibration value. - * @note The calibration is used to compensate for the variations in voltage - * and temperature that influence the frequency of the internal HSI RC. - * Refer to the Application Note AN4067 for more details on how to - * calibrate the HSI14. - * @param HSI14CalibrationValue: specifies the HSI14 calibration trimming value. - * This parameter must be a number between 0 and 0x1F. - * @retval None - */ -void RCC_AdjustHSI14CalibrationValue(uint8_t HSI14CalibrationValue) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_HSI14_CALIBRATION_VALUE(HSI14CalibrationValue)); - - tmpreg = RCC->CR2; - - /* Clear HSI14TRIM[4:0] bits */ - tmpreg &= ~RCC_CR2_HSI14TRIM; - - /* Set the HSITRIM14[4:0] bits according to HSI14CalibrationValue value */ - tmpreg |= (uint32_t)HSI14CalibrationValue << 3; - - /* Store the new value */ - RCC->CR2 = tmpreg; -} - -/** - * @brief Enables or disables the Internal High Speed oscillator for ADC (HSI14). - * @note After enabling the HSI14, the application software should wait on - * HSIRDY flag to be set indicating that HSI clock is stable and can - * be used to clock the ADC. - * @note The HSI14 is stopped by hardware when entering STOP and STANDBY modes. - * @param NewState: new state of the HSI14. - * This parameter can be: ENABLE or DISABLE. - * @note When the HSI14 is stopped, HSI14RDY flag goes low after 6 HSI14 oscillator - * clock cycles. - * @retval None - */ -void RCC_HSI14Cmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->CR2 |= RCC_CR2_HSI14ON; - } - else - { - RCC->CR2 &= ~RCC_CR2_HSI14ON; - } -} - -/** - * @brief Enables or disables the Internal High Speed oscillator request from ADC. - * @param NewState: new state of the HSI14 ADC request. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_HSI14ADCRequestCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->CR2 &= ~RCC_CR2_HSI14DIS; - } - else - { - RCC->CR2 |= RCC_CR2_HSI14DIS; - } -} - -/** - * @brief Configures the External Low Speed oscillator (LSE). - * @note As the LSE is in the Backup domain and write access is denied to this - * domain after reset, you have to enable write access using - * PWR_BackupAccessCmd(ENABLE) function before to configure the LSE - * (to be done once after reset). - * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_Bypass), the application - * software should wait on LSERDY flag to be set indicating that LSE clock - * is stable and can be used to clock the RTC. - * @param RCC_LSE: specifies the new state of the LSE. - * This parameter can be one of the following values: - * @arg RCC_LSE_OFF: turn OFF the LSE oscillator, LSERDY flag goes low after - * 6 LSE oscillator clock cycles. - * @arg RCC_LSE_ON: turn ON the LSE oscillator - * @arg RCC_LSE_Bypass: LSE oscillator bypassed with external clock - * @retval None - */ -void RCC_LSEConfig(uint32_t RCC_LSE) -{ - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_LSE)); - - /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/ - /* Reset LSEON bit */ - RCC->BDCR &= ~(RCC_BDCR_LSEON); - - /* Reset LSEBYP bit */ - RCC->BDCR &= ~(RCC_BDCR_LSEBYP); - - /* Configure LSE */ - RCC->BDCR |= RCC_LSE; -} - -/** - * @brief Configures the External Low Speed oscillator (LSE) drive capability. - * @param RCC_LSEDrive: specifies the new state of the LSE drive capability. - * This parameter can be one of the following values: - * @arg RCC_LSEDrive_Low: LSE oscillator low drive capability. - * @arg RCC_LSEDrive_MediumLow: LSE oscillator medium low drive capability. - * @arg RCC_LSEDrive_MediumHigh: LSE oscillator medium high drive capability. - * @arg RCC_LSEDrive_High: LSE oscillator high drive capability. - * @retval None - */ -void RCC_LSEDriveConfig(uint32_t RCC_LSEDrive) -{ - /* Check the parameters */ - assert_param(IS_RCC_LSE_DRIVE(RCC_LSEDrive)); - - /* Clear LSEDRV[1:0] bits */ - RCC->BDCR &= ~(RCC_BDCR_LSEDRV); - - /* Set the LSE Drive */ - RCC->BDCR |= RCC_LSEDrive; -} - -/** - * @brief Enables or disables the Internal Low Speed oscillator (LSI). - * @note After enabling the LSI, the application software should wait on - * LSIRDY flag to be set indicating that LSI clock is stable and can - * be used to clock the IWDG and/or the RTC. - * @note LSI can not be disabled if the IWDG is running. - * @param NewState: new state of the LSI. - * This parameter can be: ENABLE or DISABLE. - * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator - * clock cycles. - * @retval None - */ -void RCC_LSICmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->CSR |= RCC_CSR_LSION; - } - else - { - RCC->CSR &= ~RCC_CSR_LSION; - } -} - -/** - * @brief Configures the PLL clock source and multiplication factor. - * @note This function must be used only when the PLL is disabled. - * - * @param RCC_PLLSource: specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock selected as PLL clock source - * @arg RCC_PLLSource_PREDIV1: PREDIV1 clock selected as PLL clock entry - * @arg RCC_PLLSource_HSI48 HSI48 oscillator clock selected as PLL clock source, applicable only for STM32F072 devices - * @arg RCC_PLLSource_HSI: HSI clock selected as PLL clock entry, applicable only for STM32F072 devices - * @note The minimum input clock frequency for PLL is 2 MHz (when using HSE as - * PLL source). - * - * @param RCC_PLLMul: specifies the PLL multiplication factor, which drive the PLLVCO clock - * This parameter can be RCC_PLLMul_x where x:[2,16] - * - * @retval None - */ -void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul) -{ - /* Check the parameters */ - assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource)); - assert_param(IS_RCC_PLL_MUL(RCC_PLLMul)); - - /* Clear PLL Source [16] and Multiplier [21:18] bits */ - RCC->CFGR &= ~(RCC_CFGR_PLLMULL | RCC_CFGR_PLLSRC); - - /* Set the PLL Source and Multiplier */ - RCC->CFGR |= (uint32_t)(RCC_PLLSource | RCC_PLLMul); -} - -/** - * @brief Enables or disables the PLL. - * @note After enabling the PLL, the application software should wait on - * PLLRDY flag to be set indicating that PLL clock is stable and can - * be used as system clock source. - * @note The PLL can not be disabled if it is used as system clock source - * @note The PLL is disabled by hardware when entering STOP and STANDBY modes. - * @param NewState: new state of the PLL. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_PLLCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->CR |= RCC_CR_PLLON; - } - else - { - RCC->CR &= ~RCC_CR_PLLON; - } -} - -/** - * @brief Enables or disables the Internal High Speed oscillator for USB (HSI48). - * This function is only applicable for STM32F072 devices. - * @note After enabling the HSI48, the application software should wait on - * HSI48RDY flag to be set indicating that HSI48 clock is stable and can - * be used to clock the USB. - * @note The HSI48 is stopped by hardware when entering STOP and STANDBY modes. - * @param NewState: new state of the HSI48. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_HSI48Cmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->CR2 |= RCC_CR2_HSI48ON; - } - else - { - RCC->CR2 &= ~RCC_CR2_HSI48ON; - } -} - -/** - * @brief Configures the PREDIV1 division factor. - * @note This function must be used only when the PLL is disabled. - * @param RCC_PREDIV1_Div: specifies the PREDIV1 clock division factor. - * This parameter can be RCC_PREDIV1_Divx where x:[1,16] - * @retval None - */ -void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Div) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_PREDIV1(RCC_PREDIV1_Div)); - - tmpreg = RCC->CFGR2; - /* Clear PREDIV1[3:0] bits */ - tmpreg &= ~(RCC_CFGR2_PREDIV1); - /* Set the PREDIV1 division factor */ - tmpreg |= RCC_PREDIV1_Div; - /* Store the new value */ - RCC->CFGR2 = tmpreg; -} - -/** - * @brief Enables or disables the Clock Security System. - * @note If a failure is detected on the HSE oscillator clock, this oscillator - * is automatically disabled and an interrupt is generated to inform the - * software about the failure (Clock Security System Interrupt, CSSI), - * allowing the MCU to perform rescue operations. The CSSI is linked to - * the Cortex-M0 NMI (Non-Maskable Interrupt) exception vector. - * @param NewState: new state of the Clock Security System. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_ClockSecuritySystemCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->CR |= RCC_CR_CSSON; - } - else - { - RCC->CR &= ~RCC_CR_CSSON; - } -} - -#ifdef STM32F051 -/** - * @brief Selects the clock source to output on MCO pin (PA8). - * @note PA8 should be configured in alternate function mode. - * @param RCC_MCOSource: specifies the clock source to output. - * This parameter can be one of the following values: - * @arg RCC_MCOSource_NoClock: No clock selected. - * @arg RCC_MCOSource_HSI14: HSI14 oscillator clock selected. - * @arg RCC_MCOSource_LSI: LSI oscillator clock selected. - * @arg RCC_MCOSource_LSE: LSE oscillator clock selected. - * @arg RCC_MCOSource_SYSCLK: System clock selected. - * @arg RCC_MCOSource_HSI: HSI oscillator clock selected. - * @arg RCC_MCOSource_HSE: HSE oscillator clock selected. - * @arg RCC_MCOSource_PLLCLK_Div2: PLL clock divided by 2 selected. - * @retval None - */ -void RCC_MCOConfig(uint8_t RCC_MCOSource) -{ - /* Check the parameters */ - assert_param(IS_RCC_MCO_SOURCE(RCC_MCOSource)); - - /* Select MCO clock source and prescaler */ - *(__IO uint8_t *) CFGR_BYTE3_ADDRESS = RCC_MCOSource; -} -#else - -/** - * @brief Selects the clock source to output on MCO pin (PA8) and the corresponding - * prescsaler. - * @note PA8 should be configured in alternate function mode. - * @param RCC_MCOSource: specifies the clock source to output. - * This parameter can be one of the following values: - * @arg RCC_MCOSource_NoClock: No clock selected. - * @arg RCC_MCOSource_HSI14: HSI14 oscillator clock selected. - * @arg RCC_MCOSource_LSI: LSI oscillator clock selected. - * @arg RCC_MCOSource_LSE: LSE oscillator clock selected. - * @arg RCC_MCOSource_SYSCLK: System clock selected. - * @arg RCC_MCOSource_HSI: HSI oscillator clock selected. - * @arg RCC_MCOSource_HSE: HSE oscillator clock selected. - * @arg RCC_MCOSource_PLLCLK_Div2: PLL clock divided by 2 selected. - * @arg RCC_MCOSource_PLLCLK: PLL clock selected. - * @arg RCC_MCOSource_HSI48: HSI48 clock selected. - * @param RCC_MCOPrescaler: specifies the prescaler on MCO pin. - * This parameter can be one of the following values: - * @arg RCC_MCOPrescaler_1: MCO clock is divided by 1. - * @arg RCC_MCOPrescaler_2: MCO clock is divided by 2. - * @arg RCC_MCOPrescaler_4: MCO clock is divided by 4. - * @arg RCC_MCOPrescaler_8: MCO clock is divided by 8. - * @arg RCC_MCOPrescaler_16: MCO clock is divided by 16. - * @arg RCC_MCOPrescaler_32: MCO clock is divided by 32. - * @arg RCC_MCOPrescaler_64: MCO clock is divided by 64. - * @arg RCC_MCOPrescaler_128: MCO clock is divided by 128. - * @retval None - */ -void RCC_MCOConfig(uint8_t RCC_MCOSource, uint32_t RCC_MCOPrescaler) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_MCO_SOURCE(RCC_MCOSource)); - assert_param(IS_RCC_MCO_PRESCALER(RCC_MCOPrescaler)); - - /* Get CFGR value */ - tmpreg = RCC->CFGR; - /* Clear MCOPRE[2:0] bits */ - tmpreg &= ~(RCC_CFGR_MCO_PRE | RCC_CFGR_MCO | RCC_CFGR_PLLNODIV); - /* Set the RCC_MCOSource and RCC_MCOPrescaler */ - tmpreg |= (RCC_MCOPrescaler | ((uint32_t)RCC_MCOSource<<24)); - /* Store the new value */ - RCC->CFGR = tmpreg; -} -#endif /* STM32F072 */ - -/** - * @} - */ - -/** @defgroup RCC_Group2 System AHB and APB busses clocks configuration functions - * @brief System, AHB and APB busses clocks configuration functions - * -@verbatim - =============================================================================== - ##### System, AHB and APB busses clocks configuration functions ##### - =============================================================================== - - [..] This section provide functions allowing to configure the System, AHB and - APB busses clocks. - (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, - HSE and PLL. - The AHB clock (HCLK) is derived from System clock through configurable prescaler - and used to clock the CPU, memory and peripherals mapped on AHB bus (DMA and GPIO). - and APB (PCLK) clocks are derived from AHB clock through - configurable prescalers and used to clock the peripherals mapped on these busses. - You can use "RCC_GetClocksFreq()" function to retrieve the frequencies of these clocks. - - -@- All the peripheral clocks are derived from the System clock (SYSCLK) except: - (+@) The ADC clock which is derived from HSI14 or APB (APB divided by a - programmable prescaler: 2 or 4). - (+@) The CEC clock which is derived from LSE or HSI divided by 244. - (+@) The I2C clock which is derived from HSI or system clock (SYSCLK). - (+@) The USART clock which is derived from HSI, system clock (SYSCLK), APB or LSE. - (+@) The RTC/LCD clock which is derived from the LSE, LSI or 2 MHz HSE_RTC (HSE - divided by a programmable prescaler). - The System clock (SYSCLK) frequency must be higher or equal to the RTC/LCD - clock frequency. - (+@) IWDG clock which is always the LSI clock. - - (#) The maximum frequency of the SYSCLK, HCLK and PCLK is 48 MHz. - Depending on the maximum frequency, the FLASH wait states (WS) should be - adapted accordingly: - +--------------------------------------------- + - | Wait states | HCLK clock frequency (MHz) | - |---------------|------------------------------| - |0WS(1CPU cycle)| 0 < HCLK <= 24 | - |---------------|------------------------------| - |1WS(2CPU cycle)| 24 < HCLK <= 48 | - +----------------------------------------------+ - - (#) After reset, the System clock source is the HSI (8 MHz) with 0 WS and - prefetch is disabled. - - [..] It is recommended to use the following software sequences to tune the number - of wait states needed to access the Flash memory with the CPU frequency (HCLK). - (+) Increasing the CPU frequency - (++) Program the Flash Prefetch buffer, using "FLASH_PrefetchBufferCmd(ENABLE)" - function - (++) Check that Flash Prefetch buffer activation is taken into account by - reading FLASH_ACR using the FLASH_GetPrefetchBufferStatus() function - (++) Program Flash WS to 1, using "FLASH_SetLatency(FLASH_Latency_1)" function - (++) Check that the new number of WS is taken into account by reading FLASH_ACR - (++) Modify the CPU clock source, using "RCC_SYSCLKConfig()" function - (++) If needed, modify the CPU clock prescaler by using "RCC_HCLKConfig()" function - (++) Check that the new CPU clock source is taken into account by reading - the clock source status, using "RCC_GetSYSCLKSource()" function - (+) Decreasing the CPU frequency - (++) Modify the CPU clock source, using "RCC_SYSCLKConfig()" function - (++) If needed, modify the CPU clock prescaler by using "RCC_HCLKConfig()" function - (++) Check that the new CPU clock source is taken into account by reading - the clock source status, using "RCC_GetSYSCLKSource()" function - (++) Program the new number of WS, using "FLASH_SetLatency()" function - (++) Check that the new number of WS is taken into account by reading FLASH_ACR - (++) Disable the Flash Prefetch buffer using "FLASH_PrefetchBufferCmd(DISABLE)" - function - (++) Check that Flash Prefetch buffer deactivation is taken into account by reading FLASH_ACR - using the FLASH_GetPrefetchBufferStatus() function. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the system clock (SYSCLK). - * @note The HSI is used (enabled by hardware) as system clock source after - * startup from Reset, wake-up from STOP and STANDBY mode, or in case - * of failure of the HSE used directly or indirectly as system clock - * (if the Clock Security System CSS is enabled). - * @note A switch from one clock source to another occurs only if the target - * clock source is ready (clock stable after startup delay or PLL locked). - * If a clock source which is not yet ready is selected, the switch will - * occur when the clock source will be ready. - * You can use RCC_GetSYSCLKSource() function to know which clock is - * currently used as system clock source. - * @param RCC_SYSCLKSource: specifies the clock source used as system clock source - * This parameter can be one of the following values: - * @arg RCC_SYSCLKSource_HSI: HSI selected as system clock source - * @arg RCC_SYSCLKSource_HSE: HSE selected as system clock source - * @arg RCC_SYSCLKSource_PLLCLK: PLL selected as system clock source - * @arg RCC_SYSCLKSource_HSI48: HSI48 selected as system clock source, applicable only for STM32F072 devices - * @retval None - */ -void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource)); - - tmpreg = RCC->CFGR; - - /* Clear SW[1:0] bits */ - tmpreg &= ~RCC_CFGR_SW; - - /* Set SW[1:0] bits according to RCC_SYSCLKSource value */ - tmpreg |= RCC_SYSCLKSource; - - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Returns the clock source used as system clock. - * @param None - * @retval The clock source used as system clock. The returned value can be one - * of the following values: - * - 0x00: HSI used as system clock - * - 0x04: HSE used as system clock - * - 0x08: PLL used as system clock - * - 0x0C: HSI48 used as system clock, applicable only for STM32F072 devices - */ -uint8_t RCC_GetSYSCLKSource(void) -{ - return ((uint8_t)(RCC->CFGR & RCC_CFGR_SWS)); -} - -/** - * @brief Configures the AHB clock (HCLK). - * @param RCC_SYSCLK: defines the AHB clock divider. This clock is derived from - * the system clock (SYSCLK). - * This parameter can be one of the following values: - * @arg RCC_SYSCLK_Div1: AHB clock = SYSCLK - * @arg RCC_SYSCLK_Div2: AHB clock = SYSCLK/2 - * @arg RCC_SYSCLK_Div4: AHB clock = SYSCLK/4 - * @arg RCC_SYSCLK_Div8: AHB clock = SYSCLK/8 - * @arg RCC_SYSCLK_Div16: AHB clock = SYSCLK/16 - * @arg RCC_SYSCLK_Div64: AHB clock = SYSCLK/64 - * @arg RCC_SYSCLK_Div128: AHB clock = SYSCLK/128 - * @arg RCC_SYSCLK_Div256: AHB clock = SYSCLK/256 - * @arg RCC_SYSCLK_Div512: AHB clock = SYSCLK/512 - * @retval None - */ -void RCC_HCLKConfig(uint32_t RCC_SYSCLK) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_HCLK(RCC_SYSCLK)); - - tmpreg = RCC->CFGR; - - /* Clear HPRE[3:0] bits */ - tmpreg &= ~RCC_CFGR_HPRE; - - /* Set HPRE[3:0] bits according to RCC_SYSCLK value */ - tmpreg |= RCC_SYSCLK; - - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Configures the APB clock (PCLK). - * @param RCC_HCLK: defines the APB clock divider. This clock is derived from - * the AHB clock (HCLK). - * This parameter can be one of the following values: - * @arg RCC_HCLK_Div1: APB clock = HCLK - * @arg RCC_HCLK_Div2: APB clock = HCLK/2 - * @arg RCC_HCLK_Div4: APB clock = HCLK/4 - * @arg RCC_HCLK_Div8: APB clock = HCLK/8 - * @arg RCC_HCLK_Div16: APB clock = HCLK/16 - * @retval None - */ -void RCC_PCLKConfig(uint32_t RCC_HCLK) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_PCLK(RCC_HCLK)); - - tmpreg = RCC->CFGR; - - /* Clear PPRE[2:0] bits */ - tmpreg &= ~RCC_CFGR_PPRE; - - /* Set PPRE[2:0] bits according to RCC_HCLK value */ - tmpreg |= RCC_HCLK; - - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Configures the ADC clock (ADCCLK). - * @note This function is obsolete. - * For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver - * @param RCC_ADCCLK: defines the ADC clock source. This clock is derived - * from the HSI14 or APB clock (PCLK). - * This parameter can be one of the following values: - * @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz) - * @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2 - * @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4 - * @retval None - */ -void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK) -{ - /* Check the parameters */ - assert_param(IS_RCC_ADCCLK(RCC_ADCCLK)); - - /* Clear ADCPRE bit */ - RCC->CFGR &= ~RCC_CFGR_ADCPRE; - /* Set ADCPRE bits according to RCC_PCLK value */ - RCC->CFGR |= RCC_ADCCLK & 0xFFFF; - - /* Clear ADCSW bit */ - RCC->CFGR3 &= ~RCC_CFGR3_ADCSW; - /* Set ADCSW bits according to RCC_ADCCLK value */ - RCC->CFGR3 |= RCC_ADCCLK >> 16; -} - -/** - * @brief Configures the CEC clock (CECCLK). - * @param RCC_CECCLK: defines the CEC clock source. This clock is derived - * from the HSI or LSE clock. - * This parameter can be one of the following values: - * @arg RCC_CECCLK_HSI_Div244: CEC clock = HSI/244 (32768Hz) - * @arg RCC_CECCLK_LSE: CEC clock = LSE - * @retval None - */ -void RCC_CECCLKConfig(uint32_t RCC_CECCLK) -{ - /* Check the parameters */ - assert_param(IS_RCC_CECCLK(RCC_CECCLK)); - - /* Clear CECSW bit */ - RCC->CFGR3 &= ~RCC_CFGR3_CECSW; - /* Set CECSW bits according to RCC_CECCLK value */ - RCC->CFGR3 |= RCC_CECCLK; -} - -/** - * @brief Configures the I2C1 clock (I2C1CLK). - * @param RCC_I2CCLK: defines the I2C1 clock source. This clock is derived - * from the HSI or System clock. - * This parameter can be one of the following values: - * @arg RCC_I2C1CLK_HSI: I2C1 clock = HSI - * @arg RCC_I2C1CLK_SYSCLK: I2C1 clock = System Clock - * @retval None - */ -void RCC_I2CCLKConfig(uint32_t RCC_I2CCLK) -{ - /* Check the parameters */ - assert_param(IS_RCC_I2CCLK(RCC_I2CCLK)); - - /* Clear I2CSW bit */ - RCC->CFGR3 &= ~RCC_CFGR3_I2C1SW; - /* Set I2CSW bits according to RCC_I2CCLK value */ - RCC->CFGR3 |= RCC_I2CCLK; -} - -/** - * @brief Configures the USART1 clock (USART1CLK). - * @param RCC_USARTCLK: defines the USART clock source. This clock is derived - * from the HSI or System clock. - * This parameter can be one of the following values: - * @arg RCC_USART1CLK_PCLK: USART1 clock = APB Clock (PCLK) - * @arg RCC_USART1CLK_SYSCLK: USART1 clock = System Clock - * @arg RCC_USART1CLK_LSE: USART1 clock = LSE Clock - * @arg RCC_USART1CLK_HSI: USART1 clock = HSI Clock - * @arg RCC_USART2CLK_PCLK: USART2 clock = APB Clock (PCLK), applicable only for STM32F072 devices - * @arg RCC_USART2CLK_SYSCLK: USART2 clock = System Clock, applicable only for STM32F072 devices - * @arg RCC_USART2CLK_LSE: USART2 clock = LSE Clock, applicable only for STM32F072 devices - * @arg RCC_USART2CLK_HSI: USART2 clock = HSI Clock, applicable only for STM32F072 devices - * @retval None - */ -void RCC_USARTCLKConfig(uint32_t RCC_USARTCLK) -{ - uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_RCC_USARTCLK(RCC_USARTCLK)); - - /* Get USART index */ - tmp = (RCC_USARTCLK >> 28); - - /* Clear USARTSW[1:0] bit */ - if (tmp == (uint32_t)0x00000001) - { - /* Clear USART1SW[1:0] bit */ - RCC->CFGR3 &= ~RCC_CFGR3_USART1SW; - } - else - { - /* Clear USART2SW[1:0] bit */ - RCC->CFGR3 &= ~RCC_CFGR3_USART2SW; - } - - /* Set USARTxSW bits according to RCC_USARTCLK value */ - RCC->CFGR3 |= RCC_USARTCLK; -} - -/** - * @brief Configures the USB clock (USBCLK). - * This function is only applicable for STM32F072 devices. - * @param RCC_USBCLK: defines the USB clock source. This clock is derived - * from the HSI48 or system clock. - * This parameter can be one of the following values: - * @arg RCC_USBCLK_HSI48: USB clock = HSI48 - * @arg RCC_USBCLK_PLLCLK: USB clock = PLL clock - * @retval None - */ -void RCC_USBCLKConfig(uint32_t RCC_USBCLK) -{ - /* Check the parameters */ - assert_param(IS_RCC_USBCLK(RCC_USBCLK)); - - /* Clear USBSW bit */ - RCC->CFGR3 &= ~RCC_CFGR3_USBSW; - /* Set USBSW bits according to RCC_USBCLK value */ - RCC->CFGR3 |= RCC_USBCLK; -} - -/** - * @brief Returns the frequencies of the System, AHB and APB busses clocks. - * @note The frequency returned by this function is not the real frequency - * in the chip. It is calculated based on the predefined constant and - * the source selected by RCC_SYSCLKConfig(): - * - * @note If SYSCLK source is HSI, function returns constant HSI_VALUE(*) - * - * @note If SYSCLK source is HSE, function returns constant HSE_VALUE(**) - * - * @note If SYSCLK source is PLL, function returns constant HSE_VALUE(**) - * or HSI_VALUE(*) multiplied by the PLL factors. - * - * @note If SYSCLK source is HSI48, function returns constant HSI48_VALUE(***) - * - * @note (*) HSI_VALUE is a constant defined in stm32f0xx.h file (default value - * 8 MHz) but the real value may vary depending on the variations - * in voltage and temperature, refer to RCC_AdjustHSICalibrationValue(). - * - * @note (**) HSE_VALUE is a constant defined in stm32f0xx.h file (default value - * 8 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * return wrong result. - * - * @note (***) HSI48_VALUE is a constant defined in stm32f0xx.h file (default value - * 48 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * @note The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which will hold - * the clocks frequencies. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * @note Each time SYSCLK, HCLK and/or PCLK clock changes, this function - * must be called to update the structure's field. Otherwise, any - * configuration based on this function will be incorrect. - * - * @retval None - */ -void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) -{ - uint32_t tmp = 0, pllmull = 0, pllsource = 0, prediv1factor = 0, presc = 0, pllclk = 0; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock */ - RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock */ - RCC_Clocks->SYSCLK_Frequency = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock */ - /* Get PLL clock source and multiplication factor ----------------------*/ - pllmull = RCC->CFGR & RCC_CFGR_PLLMULL; - pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; - pllmull = ( pllmull >> 18) + 2; - - if (pllsource == 0x00) - { - /* HSI oscillator clock divided by 2 selected as PLL clock entry */ - pllclk = (HSI_VALUE >> 1) * pllmull; - } - else - { - prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1; - /* HSE oscillator clock selected as PREDIV1 clock entry */ - pllclk = (HSE_VALUE / prediv1factor) * pllmull; - } - RCC_Clocks->SYSCLK_Frequency = pllclk; - break; - case 0x0C: /* HSI48 used as system clock */ - RCC_Clocks->SYSCLK_Frequency = HSI48_VALUE; - break; - default: /* HSI used as system clock */ - RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; - break; - } - /* Compute HCLK, PCLK clocks frequencies -----------------------------------*/ - /* Get HCLK prescaler */ - tmp = RCC->CFGR & RCC_CFGR_HPRE; - tmp = tmp >> 4; - presc = APBAHBPrescTable[tmp]; - /* HCLK clock frequency */ - RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc; - - /* Get PCLK prescaler */ - tmp = RCC->CFGR & RCC_CFGR_PPRE; - tmp = tmp >> 8; - presc = APBAHBPrescTable[tmp]; - /* PCLK clock frequency */ - RCC_Clocks->PCLK_Frequency = RCC_Clocks->HCLK_Frequency >> presc; - - /* ADCCLK clock frequency */ - if((RCC->CFGR3 & RCC_CFGR3_ADCSW) != RCC_CFGR3_ADCSW) - { - /* ADC Clock is HSI14 Osc. */ - RCC_Clocks->ADCCLK_Frequency = HSI14_VALUE; - } - else - { - if((RCC->CFGR & RCC_CFGR_ADCPRE) != RCC_CFGR_ADCPRE) - { - /* ADC Clock is derived from PCLK/2 */ - RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK_Frequency >> 1; - } - else - { - /* ADC Clock is derived from PCLK/4 */ - RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK_Frequency >> 2; - } - - } - - /* CECCLK clock frequency */ - if((RCC->CFGR3 & RCC_CFGR3_CECSW) != RCC_CFGR3_CECSW) - { - /* CEC Clock is HSI/244 */ - RCC_Clocks->CECCLK_Frequency = HSI_VALUE / 244; - } - else - { - /* CECC Clock is LSE Osc. */ - RCC_Clocks->CECCLK_Frequency = LSE_VALUE; - } - - /* I2C1CLK clock frequency */ - if((RCC->CFGR3 & RCC_CFGR3_I2C1SW) != RCC_CFGR3_I2C1SW) - { - /* I2C1 Clock is HSI Osc. */ - RCC_Clocks->I2C1CLK_Frequency = HSI_VALUE; - } - else - { - /* I2C1 Clock is System Clock */ - RCC_Clocks->I2C1CLK_Frequency = RCC_Clocks->SYSCLK_Frequency; - } - - /* USART1CLK clock frequency */ - if((RCC->CFGR3 & RCC_CFGR3_USART1SW) == 0x0) - { - /* USART1 Clock is PCLK */ - RCC_Clocks->USART1CLK_Frequency = RCC_Clocks->PCLK_Frequency; - } - else if((RCC->CFGR3 & RCC_CFGR3_USART1SW) == RCC_CFGR3_USART1SW_0) - { - /* USART1 Clock is System Clock */ - RCC_Clocks->USART1CLK_Frequency = RCC_Clocks->SYSCLK_Frequency; - } - else if((RCC->CFGR3 & RCC_CFGR3_USART1SW) == RCC_CFGR3_USART1SW_1) - { - /* USART1 Clock is LSE Osc. */ - RCC_Clocks->USART1CLK_Frequency = LSE_VALUE; - } - else if((RCC->CFGR3 & RCC_CFGR3_USART1SW) == RCC_CFGR3_USART1SW) - { - /* USART1 Clock is HSI Osc. */ - RCC_Clocks->USART1CLK_Frequency = HSI_VALUE; - } - - /* USART2CLK clock frequency */ - if((RCC->CFGR3 & RCC_CFGR3_USART2SW) == 0x0) - { - /* USART Clock is PCLK */ - RCC_Clocks->USART2CLK_Frequency = RCC_Clocks->PCLK_Frequency; - } - else if((RCC->CFGR3 & RCC_CFGR3_USART2SW) == RCC_CFGR3_USART2SW_0) - { - /* USART Clock is System Clock */ - RCC_Clocks->USART2CLK_Frequency = RCC_Clocks->SYSCLK_Frequency; - } - else if((RCC->CFGR3 & RCC_CFGR3_USART2SW) == RCC_CFGR3_USART2SW_1) - { - /* USART Clock is LSE Osc. */ - RCC_Clocks->USART2CLK_Frequency = LSE_VALUE; - } - else if((RCC->CFGR3 & RCC_CFGR3_USART2SW) == RCC_CFGR3_USART2SW) - { - /* USART Clock is HSI Osc. */ - RCC_Clocks->USART2CLK_Frequency = HSI_VALUE; - } - - /* USBCLK clock frequency */ - if((RCC->CFGR3 & RCC_CFGR3_USBSW) != RCC_CFGR3_USBSW) - { - /* USB Clock is HSI48 */ - RCC_Clocks->USBCLK_Frequency = HSI48_VALUE; - } - else - { - /* USB Clock is PLL clock */ - RCC_Clocks->USBCLK_Frequency = pllclk; - } -} - -/** - * @} - */ - -/** @defgroup RCC_Group3 Peripheral clocks configuration functions - * @brief Peripheral clocks configuration functions - * -@verbatim - =============================================================================== - #####Peripheral clocks configuration functions ##### - =============================================================================== - - [..] This section provide functions allowing to configure the Peripheral clocks. - (#) The RTC clock which is derived from the LSE, LSI or HSE_Div32 (HSE - divided by 32). - (#) After restart from Reset or wakeup from STANDBY, all peripherals are off - except internal SRAM, Flash and SWD. Before to start using a peripheral you - have to enable its interface clock. You can do this using RCC_AHBPeriphClockCmd(), - RCC_APB2PeriphClockCmd() and RCC_APB1PeriphClockCmd() functions. - (#) To reset the peripherals configuration (to the default state after device reset) - you can use RCC_AHBPeriphResetCmd(), RCC_APB2PeriphResetCmd() and - RCC_APB1PeriphResetCmd() functions. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the RTC clock (RTCCLK). - * @note As the RTC clock configuration bits are in the Backup domain and write - * access is denied to this domain after reset, you have to enable write - * access using PWR_BackupAccessCmd(ENABLE) function before to configure - * the RTC clock source (to be done once after reset). - * @note Once the RTC clock is configured it can't be changed unless the RTC - * is reset using RCC_BackupResetCmd function, or by a Power On Reset (POR) - * - * @param RCC_RTCCLKSource: specifies the RTC clock source. - * This parameter can be one of the following values: - * @arg RCC_RTCCLKSource_LSE: LSE selected as RTC clock - * @arg RCC_RTCCLKSource_LSI: LSI selected as RTC clock - * @arg RCC_RTCCLKSource_HSE_Div32: HSE divided by 32 selected as RTC clock - * - * @note If the LSE or LSI is used as RTC clock source, the RTC continues to - * work in STOP and STANDBY modes, and can be used as wakeup source. - * However, when the HSE clock is used as RTC clock source, the RTC - * cannot be used in STOP and STANDBY modes. - * - * @note The maximum input clock frequency for RTC is 2MHz (when using HSE as - * RTC clock source). - * - * @retval None - */ -void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource) -{ - /* Check the parameters */ - assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource)); - - /* Select the RTC clock source */ - RCC->BDCR |= RCC_RTCCLKSource; -} - -/** - * @brief Enables or disables the RTC clock. - * @note This function must be used only after the RTC clock source was selected - * using the RCC_RTCCLKConfig function. - * @param NewState: new state of the RTC clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_RTCCLKCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->BDCR |= RCC_BDCR_RTCEN; - } - else - { - RCC->BDCR &= ~RCC_BDCR_RTCEN; - } -} - -/** - * @brief Forces or releases the Backup domain reset. - * @note This function resets the RTC peripheral (including the backup registers) - * and the RTC clock source selection in RCC_BDCR register. - * @param NewState: new state of the Backup domain reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_BackupResetCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->BDCR |= RCC_BDCR_BDRST; - } - else - { - RCC->BDCR &= ~RCC_BDCR_BDRST; - } -} - -/** - * @brief Enables or disables the AHB peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @param RCC_AHBPeriph: specifies the AHB peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_AHBPeriph_GPIOA: GPIOA clock - * @arg RCC_AHBPeriph_GPIOB: GPIOB clock - * @arg RCC_AHBPeriph_GPIOC: GPIOC clock - * @arg RCC_AHBPeriph_GPIOD: GPIOD clock - * @arg RCC_AHBPeriph_GPIOE: GPIOE clock, applicable only for STM32F072 devices - * @arg RCC_AHBPeriph_GPIOF: GPIOF clock - * @arg RCC_AHBPeriph_TS: TS clock - * @arg RCC_AHBPeriph_CRC: CRC clock - * @arg RCC_AHBPeriph_FLITF: (has effect only when the Flash memory is in power down mode) - * @arg RCC_AHBPeriph_SRAM: SRAM clock - * @arg RCC_AHBPeriph_DMA1: DMA1 clock - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->AHBENR |= RCC_AHBPeriph; - } - else - { - RCC->AHBENR &= ~RCC_AHBPeriph; - } -} - -/** - * @brief Enables or disables the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_APB2Periph_SYSCFG: SYSCFG clock - * @arg RCC_APB2Periph_ADC1: ADC1 clock - * @arg RCC_APB2Periph_TIM1: TIM1 clock - * @arg RCC_APB2Periph_SPI1: SPI1 clock - * @arg RCC_APB2Periph_USART1: USART1 clock - * @arg RCC_APB2Periph_TIM15: TIM15 clock - * @arg RCC_APB2Periph_TIM16: TIM16 clock - * @arg RCC_APB2Periph_TIM17: TIM17 clock - * @arg RCC_APB2Periph_DBGMCU: DBGMCU clock - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->APB2ENR |= RCC_APB2Periph; - } - else - { - RCC->APB2ENR &= ~RCC_APB2Periph; - } -} - -/** - * @brief Enables or disables the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @param RCC_APB1Periph: specifies the APB1 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_APB1Periph_TIM2: TIM2 clock, applicable only for STM32F051 and STM32F072 devices - * @arg RCC_APB1Periph_TIM3: TIM3 clock - * @arg RCC_APB1Periph_TIM6: TIM6 clock - * @arg RCC_APB1Periph_TIM7: TIM7 clock, applicable only for STM32F072 devices - * @arg RCC_APB1Periph_TIM14: TIM14 clock - * @arg RCC_APB1Periph_WWDG: WWDG clock - * @arg RCC_APB1Periph_SPI2: SPI2 clock - * @arg RCC_APB1Periph_USART2: USART2 clock - * @arg RCC_APB1Periph_USART3: USART3 clock, applicable only for STM32F072 devices - * @arg RCC_APB1Periph_USART4: USART4 clock, applicable only for STM32F072 devices - * @arg RCC_APB1Periph_I2C1: I2C1 clock - * @arg RCC_APB1Periph_I2C2: I2C2 clock - * @arg RCC_APB1Periph_USB: USB clock, applicable only for STM32F042 and STM32F072 devices - * @arg RCC_APB1Periph_CAN: CAN clock, applicable only for STM32F042 and STM32F072 devices - * @arg RCC_APB1Periph_CRS: CRS clock , applicable only for STM32F042 and STM32F072 devices - * @arg RCC_APB1Periph_PWR: PWR clock - * @arg RCC_APB1Periph_DAC: DAC clock, applicable only for STM32F051 and STM32F072 devices - * @arg RCC_APB1Periph_CEC: CEC clock, applicable only for STM32F051, STM32F042 and STM32F072 devices - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->APB1ENR |= RCC_APB1Periph; - } - else - { - RCC->APB1ENR &= ~RCC_APB1Periph; - } -} - -/** - * @brief Forces or releases AHB peripheral reset. - * @param RCC_AHBPeriph: specifies the AHB peripheral to reset. - * This parameter can be any combination of the following values: - * @arg RCC_AHBPeriph_GPIOA: GPIOA clock - * @arg RCC_AHBPeriph_GPIOB: GPIOB clock - * @arg RCC_AHBPeriph_GPIOC: GPIOC clock - * @arg RCC_AHBPeriph_GPIOD: GPIOD clock - * @arg RCC_AHBPeriph_GPIOE: GPIOE clock, applicable only for STM32F072 devices - * @arg RCC_AHBPeriph_GPIOF: GPIOF clock - * @arg RCC_AHBPeriph_TS: TS clock - * @param NewState: new state of the specified peripheral reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB_RST_PERIPH(RCC_AHBPeriph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->AHBRSTR |= RCC_AHBPeriph; - } - else - { - RCC->AHBRSTR &= ~RCC_AHBPeriph; - } -} - -/** - * @brief Forces or releases High Speed APB (APB2) peripheral reset. - * @param RCC_APB2Periph: specifies the APB2 peripheral to reset. - * This parameter can be any combination of the following values: - * @arg RCC_APB2Periph_SYSCFG: SYSCFG clock - * @arg RCC_APB2Periph_ADC1: ADC1 clock - * @arg RCC_APB2Periph_TIM1: TIM1 clock - * @arg RCC_APB2Periph_SPI1: SPI1 clock - * @arg RCC_APB2Periph_USART1: USART1 clock - * @arg RCC_APB2Periph_TIM15: TIM15 clock - * @arg RCC_APB2Periph_TIM16: TIM16 clock - * @arg RCC_APB2Periph_TIM17: TIM17 clock - * @arg RCC_APB2Periph_DBGMCU: DBGMCU clock - * @param NewState: new state of the specified peripheral reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->APB2RSTR |= RCC_APB2Periph; - } - else - { - RCC->APB2RSTR &= ~RCC_APB2Periph; - } -} - -/** - * @brief Forces or releases Low Speed APB (APB1) peripheral reset. - * @param RCC_APB1Periph: specifies the APB1 peripheral to reset. - * This parameter can be any combination of the following values: - * @arg RCC_APB1Periph_TIM2: TIM2 clock, applicable only for STM32F051 and STM32F072 devices - * @arg RCC_APB1Periph_TIM3: TIM3 clock - * @arg RCC_APB1Periph_TIM6: TIM6 clock - * @arg RCC_APB1Periph_TIM7: TIM7 clock, applicable only for STM32F072 devices - * @arg RCC_APB1Periph_TIM14: TIM14 clock - * @arg RCC_APB1Periph_WWDG: WWDG clock - * @arg RCC_APB1Periph_SPI2: SPI2 clock - * @arg RCC_APB1Periph_USART2: USART2 clock - * @arg RCC_APB1Periph_USART3: USART3 clock - * @arg RCC_APB1Periph_USART4: USART4 clock - * @arg RCC_APB1Periph_I2C1: I2C1 clock - * @arg RCC_APB1Periph_I2C2: I2C2 clock - * @arg RCC_APB1Periph_USB: USB clock, applicable only for STM32F072 devices - * @arg RCC_APB1Periph_CAN: CAN clock, applicable only for STM32F072 devices - * @arg RCC_APB1Periph_CRS: CRS clock, applicable only for STM32F072 devices - * @arg RCC_APB1Periph_PWR: PWR clock - * @arg RCC_APB1Periph_DAC: DAC clock, applicable only for STM32F051 and STM32F072 devices - * @arg RCC_APB1Periph_CEC: CEC clock, applicable only for STM32F051 and STM32F072 devices - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->APB1RSTR |= RCC_APB1Periph; - } - else - { - RCC->APB1RSTR &= ~RCC_APB1Periph; - } -} - -/** - * @} - */ - -/** @defgroup RCC_Group4 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified RCC interrupts. - * @note The CSS interrupt doesn't have an enable bit; once the CSS is enabled - * and if the HSE clock fails, the CSS interrupt occurs and an NMI is - * automatically generated. The NMI will be executed indefinitely, and - * since NMI has higher priority than any other IRQ (and main program) - * the application will be stacked in the NMI ISR unless the CSS interrupt - * pending bit is cleared. - * @param RCC_IT: specifies the RCC interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: PLL ready interrupt - * @arg RCC_IT_HSI14RDY: HSI14 ready interrupt - * @arg RCC_IT_HSI48RDY: HSI48 ready interrupt, applicable only for STM32F072 devices - * @param NewState: new state of the specified RCC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_IT(RCC_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Perform Byte access to RCC_CIR[13:8] bits to enable the selected interrupts */ - *(__IO uint8_t *) CIR_BYTE1_ADDRESS |= RCC_IT; - } - else - { - /* Perform Byte access to RCC_CIR[13:8] bits to disable the selected interrupts */ - *(__IO uint8_t *) CIR_BYTE1_ADDRESS &= (uint8_t)~RCC_IT; - } -} - -/** - * @brief Checks whether the specified RCC flag is set or not. - * @param RCC_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready - * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready - * @arg RCC_FLAG_PLLRDY: PLL clock ready - * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready - * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready - * @arg RCC_FLAG_OBLRST: Option Byte Loader (OBL) reset - * @arg RCC_FLAG_PINRST: Pin reset - * @arg RCC_FLAG_V18PWRRSTF: V1.8 power domain reset - * @arg RCC_FLAG_PORRST: POR/PDR reset - * @arg RCC_FLAG_SFTRST: Software reset - * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset - * @arg RCC_FLAG_WWDGRST: Window Watchdog reset - * @arg RCC_FLAG_LPWRRST: Low Power reset - * @arg RCC_FLAG_HSI14RDY: HSI14 oscillator clock ready - * @arg RCC_FLAG_HSI48RDY: HSI48 oscillator clock ready, applicable only for STM32F072 devices - * @retval The new state of RCC_FLAG (SET or RESET). - */ -FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) -{ - uint32_t tmp = 0; - uint32_t statusreg = 0; - FlagStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_FLAG(RCC_FLAG)); - - /* Get the RCC register index */ - tmp = RCC_FLAG >> 5; - - if (tmp == 0) /* The flag to check is in CR register */ - { - statusreg = RCC->CR; - } - else if (tmp == 1) /* The flag to check is in BDCR register */ - { - statusreg = RCC->BDCR; - } - else if (tmp == 2) /* The flag to check is in CSR register */ - { - statusreg = RCC->CSR; - } - else /* The flag to check is in CR2 register */ - { - statusreg = RCC->CR2; - } - - /* Get the flag position */ - tmp = RCC_FLAG & FLAG_MASK; - - if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the flag status */ - return bitstatus; -} - -/** - * @brief Clears the RCC reset flags. - * The reset flags are: RCC_FLAG_OBLRST, RCC_FLAG_PINRST, RCC_FLAG_V18PWRRSTF, - * RCC_FLAG_PORRST, RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, - * RCC_FLAG_LPWRRST. - * @param None - * @retval None - */ -void RCC_ClearFlag(void) -{ - /* Set RMVF bit to clear the reset flags */ - RCC->CSR |= RCC_CSR_RMVF; -} - -/** - * @brief Checks whether the specified RCC interrupt has occurred or not. - * @param RCC_IT: specifies the RCC interrupt source to check. - * This parameter can be one of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: PLL ready interrupt - * @arg RCC_IT_HSI14RDY: HSI14 ready interrupt - * @arg RCC_IT_HSI48RDY: HSI48 ready interrupt, applicable only for STM32F072 devices - * @arg RCC_IT_CSS: Clock Security System interrupt - * @retval The new state of RCC_IT (SET or RESET). - */ -ITStatus RCC_GetITStatus(uint8_t RCC_IT) -{ - ITStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_GET_IT(RCC_IT)); - - /* Check the status of the specified RCC interrupt */ - if ((RCC->CIR & RCC_IT) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the RCC_IT status */ - return bitstatus; -} - -/** - * @brief Clears the RCC's interrupt pending bits. - * @param RCC_IT: specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: PLL ready interrupt - * @arg RCC_IT_HSI48RDY: HSI48 ready interrupt, applicable only for STM32F072 devices - * @arg RCC_IT_HSI14RDY: HSI14 ready interrupt - * @arg RCC_IT_CSS: Clock Security System interrupt - * @retval None - */ -void RCC_ClearITPendingBit(uint8_t RCC_IT) -{ - /* Check the parameters */ - assert_param(IS_RCC_CLEAR_IT(RCC_IT)); - - /* Perform Byte access to RCC_CIR[23:16] bits to clear the selected interrupt - pending bits */ - *(__IO uint8_t *) CIR_BYTE2_ADDRESS = RCC_IT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_rtc.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_rtc.c deleted file mode 100644 index 58b9978..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_rtc.c +++ /dev/null @@ -1,2518 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_rtc.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Real-Time Clock (RTC) peripheral: - * + Initialization - * + Calendar (Time and Date) configuration - * + Alarms (Alarm A) configuration - * + Daylight Saving configuration - * + Output pin Configuration - * + Digital Calibration configuration - * + TimeStamp configuration - * + Tampers configuration - * + Backup Data Registers configuration - * + Output Type Config configuration - * + Shift control synchronisation - * + Interrupts and flags management - * - @verbatim - =============================================================================== - ##### Backup Domain Operating Condition ##### - =============================================================================== - [..] The real-time clock (RTC) and the RTC backup registers can be powered - from the VBAT voltage when the main VDD supply is powered off. - To retain the content of the RTC backup registers and supply the RTC - when VDD is turned off, VBAT pin can be connected to an optional - standby voltage supplied by a battery or by another source. - - [..] To allow the RTC to operate even when the main digital supply (VDD) - is turned off, the VBAT pin powers the following blocks: - (#) The RTC - (#) The LSE oscillator - (#) PC13 to PC15 I/Os I/Os (when available) - - [..] When the backup domain is supplied by VDD (analog switch connected - to VDD), the following functions are available: - (#) PC14 and PC15 can be used as either GPIO or LSE pins - (#) PC13 can be used as a GPIO or as the RTC_AF1 pin - - [..] When the backup domain is supplied by VBAT (analog switch connected - to VBAT because VDD is not present), the following functions are available: - (#) PC14 and PC15 can be used as LSE pins only - (#) PC13 can be used as the RTC_AF1 pin - - ##### Backup Domain Reset ##### - =============================================================================== - [..] The backup domain reset sets all RTC registers and the RCC_BDCR - register to their reset values. - A backup domain reset is generated when one of the following events - occurs: - (#) Software reset, triggered by setting the BDRST bit in the - RCC Backup domain control register (RCC_BDCR). You can use the - RCC_BackupResetCmd(). - (#) VDD or VBAT power on, if both supplies have previously been - powered off. - - ##### Backup Domain Access ##### - =============================================================================== - [..] After reset, the backup domain (RTC registers and RTC backup data - registers) is protected against possible unwanted write accesses. - [..] To enable access to the Backup Domain and RTC registers, proceed as follows: - (#) Enable the Power Controller (PWR) APB1 interface clock using the - RCC_APB1PeriphClockCmd() function. - (#) Enable access to Backup domain using the PWR_BackupAccessCmd() function. - (#) Select the RTC clock source using the RCC_RTCCLKConfig() function. - (#) Enable RTC Clock using the RCC_RTCCLKCmd() function. - - - ##### How to use this driver ##### - =============================================================================== - [..] - (+) Enable the backup domain access (see description in the section above) - (+) Configure the RTC Prescaler (Asynchronous and Synchronous) and - RTC hour format using the RTC_Init() function. - - ***Time and Date configuration *** - ================================== - [..] - (+) To configure the RTC Calendar (Time and Date) use the RTC_SetTime() - and RTC_SetDate() functions. - (+) To read the RTC Calendar, use the RTC_GetTime() and RTC_GetDate() - functions. - (+) To read the RTC subsecond, use the RTC_GetSubSecond() function. - (+) Use the RTC_DayLightSavingConfig() function to add or sub one - hour to the RTC Calendar. - - ***Alarm configuration *** - ========================== - [..] - (+) To configure the RTC Alarm use the RTC_SetAlarm() function. - (+) Enable the selected RTC Alarm using the RTC_AlarmCmd() function - (+) To read the RTC Alarm, use the RTC_GetAlarm() function. - (+) To read the RTC alarm SubSecond, use the RTC_GetAlarmSubSecond() function. - - ***RTC Wakeup configuration*** - ========================== - [..] - (+) Configure the RTC Wakeup Clock source use the RTC_WakeUpClockConfig() - function. - (+) Configure the RTC WakeUp Counter using the RTC_SetWakeUpCounter() - function - (+) Enable the RTC WakeUp using the RTC_WakeUpCmd() function - (+) To read the RTC WakeUp Counter register, use the RTC_GetWakeUpCounter() - function. - - ***Outputs configuration *** - ============================ - [..] The RTC has 2 different outputs: - (+) AFO_ALARM: this output is used to manage the RTC Alarm A. - To output the selected RTC signal on RTC_AF1 pin, use the - RTC_OutputConfig() function. - (+) AFO_CALIB: this output is 512Hz signal or 1Hz . - To output the RTC Clock on RTC_AF1 pin, use the RTC_CalibOutputCmd() - function. - - ***Original Digital Calibration configuration *** - ================================= - [..] Configure the RTC Original Digital Calibration Value and the corresponding - calibration cycle period (32s,16s and 8s) using the RTC_SmoothCalibConfig() - function. - - ***TimeStamp configuration *** - ============================== - [..] - (+) Configure the RTC_AF1 trigger and enables the RTC TimeStamp - using the RTC_TimeStampCmd() function. - (+) To read the RTC TimeStamp Time and Date register, use the - RTC_GetTimeStamp() function. - (+) To read the RTC TimeStamp SubSecond register, use the - RTC_GetTimeStampSubSecond() function. - - ***Tamper configuration *** - =========================== - [..] - (+) Configure the Tamper filter count using RTC_TamperFilterConfig() - function. - (+) Configure the RTC Tamper trigger Edge or Level according to the Tamper - filter (if equal to 0 Edge else Level) value using the RTC_TamperConfig() function - (+) Configure the Tamper sampling frequency using RTC_TamperSamplingFreqConfig() - function. - (+) Configure the Tamper precharge or discharge duration using - RTC_TamperPinsPrechargeDuration() function. - (+) Enable the Tamper Pull-UP using RTC_TamperPullUpDisableCmd() function. - (+) Enable the RTC Tamper using the RTC_TamperCmd() function. - (+) Enable the Time stamp on Tamper detection event using - RTC_TSOnTamperDetecCmd() function. - - ***Backup Data Registers configuration *** - ========================================== - [..] - (+) To write to the RTC Backup Data registers, use the RTC_WriteBackupRegister() - function. - (+) To read the RTC Backup Data registers, use the RTC_ReadBackupRegister() - function. - - ##### RTC and low power modes ##### - =============================================================================== - [..] The MCU can be woken up from a low power mode by an RTC alternate - function. - [..] The RTC alternate functions are the RTC alarm (Alarm A), RTC tamper - event detection and RTC time stamp event detection. - These RTC alternate functions can wake up the system from the Stop - and Standby lowpower modes. - The system can also wake up from low power modes without depending - on an external interrupt (Auto-wakeup mode), by using the RTC alarm events. - [..] The RTC provides a programmable time base for waking up from the - Stop or Standby mode at regular intervals. - Wakeup from STOP and Standby modes is possible only when the RTC - clock source is LSE or LSI. - - ##### Selection of RTC_AF1 alternate functions ##### - =============================================================================== - [..] The RTC_AF1 pin (PC13) can be used for the following purposes: - (+) AFO_ALARM output - (+) AFO_CALIB output - (+) AFI_TAMPER - (+) AFI_TIMESTAMP - - +------------------------------------------------------------------------------------------+ - | Pin |AFO_ALARM |AFO_CALIB |AFI_TAMPER |AFI_TIMESTAMP | WKUP2 |ALARMOUTTYPE | - | configuration | ENABLED | ENABLED | ENABLED | ENABLED |ENABLED | AFO_ALARM | - | and function | | | | | |Configuration | - |-----------------|----------|----------|-----------|--------------|--------|--------------| - | Alarm out | | | | | Don't | | - | output OD | 1 | 0 |Don't care | Don't care | care | 0 | - |-----------------|----------|----------|-----------|--------------|--------|--------------| - | Alarm out | | | | | Don't | | - | output PP | 1 | 0 |Don't care | Don't care | care | 1 | - |-----------------|----------|----------|-----------|--------------|--------|--------------| - | Calibration out | | | | | Don't | | - | output PP | 0 | 1 |Don't care | Don't care | care | Don't care | - |-----------------|----------|----------|-----------|--------------|--------|--------------| - | TAMPER input | | | | | Don't | | - | floating | 0 | 0 | 1 | 0 | care | Don't care | - |-----------------|----------|----------|-----------|--------------|--------|--------------| - | TIMESTAMP and | | | | | Don't | | - | TAMPER input | 0 | 0 | 1 | 1 | care | Don't care | - | floating | | | | | | | - |-----------------|----------|----------|-----------|--------------|--------|--------------| - | TIMESTAMP input | | | | | Don't | | - | floating | 0 | 0 | 0 | 1 | care | Don't care | - |-----------------|----------|----------|-----------|--------------|--------|--------------| - | Wakeup Pin 2 | 0 | 0 | 0 | 0 | 1 | Don't care | - |-----------------|----------|----------|-----------|--------------|--------|--------------| - | Standard GPIO | 0 | 0 | 0 | 0 | 0 | Don't care | - +------------------------------------------------------------------------------------------+ - - @endverbatim - - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_rtc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup RTC - * @brief RTC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* Masks Definition */ -#define RTC_TR_RESERVED_MASK ((uint32_t)0x007F7F7F) -#define RTC_DR_RESERVED_MASK ((uint32_t)0x00FFFF3F) -#define RTC_INIT_MASK ((uint32_t)0xFFFFFFFF) -#define RTC_RSF_MASK ((uint32_t)0xFFFFFF5F) -#define RTC_FLAGS_MASK ((uint32_t)(RTC_FLAG_TSOVF | RTC_FLAG_TSF | RTC_FLAG_ALRAF | \ - RTC_FLAG_RSF | RTC_FLAG_INITS |RTC_FLAG_INITF | \ - RTC_FLAG_TAMP1F | RTC_FLAG_TAMP2F | RTC_FLAG_RECALPF | \ - RTC_FLAG_SHPF)) - -#define INITMODE_TIMEOUT ((uint32_t) 0x00004000) -#define SYNCHRO_TIMEOUT ((uint32_t) 0x00008000) -#define RECALPF_TIMEOUT ((uint32_t) 0x00001000) -#define SHPF_TIMEOUT ((uint32_t) 0x00001000) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static uint8_t RTC_ByteToBcd2(uint8_t Value); -static uint8_t RTC_Bcd2ToByte(uint8_t Value); - -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup RTC_Private_Functions - * @{ - */ - -/** @defgroup RTC_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - - [..] This section provide functions allowing to initialize and configure the RTC - Prescaler (Synchronous and Asynchronous), RTC Hour format, disable RTC registers - Write protection, enter and exit the RTC initialization mode, RTC registers - synchronization check and reference clock detection enable. - - (#) The RTC Prescaler is programmed to generate the RTC 1Hz time base. - It is split into 2 programmable prescalers to minimize power consumption. - (++) A 7-bit asynchronous prescaler and A 13-bit synchronous prescaler. - (++) When both prescalers are used, it is recommended to configure the - asynchronous prescaler to a high value to minimize consumption. - (#) All RTC registers are Write protected. Writing to the RTC registers - is enabled by writing a key into the Write Protection register, RTC_WPR. - (#) To Configure the RTC Calendar, user application should enter - initialization mode. In this mode, the calendar counter is stopped - and its value can be updated. When the initialization sequence is - complete, the calendar restarts counting after 4 RTCCLK cycles. - (#) To read the calendar through the shadow registers after Calendar - initialization, calendar update or after wakeup from low power modes - the software must first clear the RSF flag. The software must then - wait until it is set again before reading the calendar, which means - that the calendar registers have been correctly copied into the - RTC_TR and RTC_DR shadow registers.The RTC_WaitForSynchro() function - implements the above software sequence (RSF clear and RSF check). - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the RTC registers to their default reset values. - * @note This function doesn't reset the RTC Clock source and RTC Backup Data - * registers. - * @param None - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC registers are deinitialized - * - ERROR: RTC registers are not deinitialized - */ -ErrorStatus RTC_DeInit(void) -{ - ErrorStatus status = ERROR; - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - /* Reset TR, DR and CR registers */ - RTC->TR = (uint32_t)0x00000000; - RTC->WUTR = (uint32_t)0x0000FFFF; - RTC->DR = (uint32_t)0x00002101; - RTC->CR &= (uint32_t)0x00000000; - RTC->PRER = (uint32_t)0x007F00FF; - RTC->ALRMAR = (uint32_t)0x00000000; - RTC->SHIFTR = (uint32_t)0x00000000; - RTC->CALR = (uint32_t)0x00000000; - RTC->ALRMASSR = (uint32_t)0x00000000; - - /* Reset ISR register and exit initialization mode */ - RTC->ISR = (uint32_t)0x00000000; - - /* Reset Tamper and alternate functions configuration register */ - RTC->TAFCR = 0x00000000; - - /* Wait till the RTC RSF flag is set */ - if (RTC_WaitForSynchro() == ERROR) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Initializes the RTC registers according to the specified parameters - * in RTC_InitStruct. - * @param RTC_InitStruct: pointer to a RTC_InitTypeDef structure that contains - * the configuration information for the RTC peripheral. - * @note The RTC Prescaler register is write protected and can be written in - * initialization mode only. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC registers are initialized - * - ERROR: RTC registers are not initialized - */ -ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct) -{ - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_RTC_HOUR_FORMAT(RTC_InitStruct->RTC_HourFormat)); - assert_param(IS_RTC_ASYNCH_PREDIV(RTC_InitStruct->RTC_AsynchPrediv)); - assert_param(IS_RTC_SYNCH_PREDIV(RTC_InitStruct->RTC_SynchPrediv)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - /* Clear RTC CR FMT Bit */ - RTC->CR &= ((uint32_t)~(RTC_CR_FMT)); - /* Set RTC_CR register */ - RTC->CR |= ((uint32_t)(RTC_InitStruct->RTC_HourFormat)); - - /* Configure the RTC PRER */ - RTC->PRER = (uint32_t)(RTC_InitStruct->RTC_SynchPrediv); - RTC->PRER |= (uint32_t)(RTC_InitStruct->RTC_AsynchPrediv << 16); - - /* Exit Initialization mode */ - RTC_ExitInitMode(); - - status = SUCCESS; - } - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Fills each RTC_InitStruct member with its default value. - * @param RTC_InitStruct: pointer to a RTC_InitTypeDef structure which will be - * initialized. - * @retval None - */ -void RTC_StructInit(RTC_InitTypeDef* RTC_InitStruct) -{ - /* Initialize the RTC_HourFormat member */ - RTC_InitStruct->RTC_HourFormat = RTC_HourFormat_24; - - /* Initialize the RTC_AsynchPrediv member */ - RTC_InitStruct->RTC_AsynchPrediv = (uint32_t)0x7F; - - /* Initialize the RTC_SynchPrediv member */ - RTC_InitStruct->RTC_SynchPrediv = (uint32_t)0xFF; -} - -/** - * @brief Enables or disables the RTC registers write protection. - * @note All the RTC registers are write protected except for RTC_ISR[13:8], - * RTC_TAFCR and RTC_BKPxR. - * @note Writing a wrong key reactivates the write protection. - * @note The protection mechanism is not affected by system reset. - * @param NewState: new state of the write protection. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_WriteProtectionCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - } - else - { - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - } -} - -/** - * @brief Enters the RTC Initialization mode. - * @note The RTC Initialization mode is write protected, use the - * RTC_WriteProtectionCmd(DISABLE) before calling this function. - * @param None - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC is in Init mode - * - ERROR: RTC is not in Init mode - */ -ErrorStatus RTC_EnterInitMode(void) -{ - __IO uint32_t initcounter = 0x00; - ErrorStatus status = ERROR; - uint32_t initstatus = 0x00; - - /* Check if the Initialization mode is set */ - if ((RTC->ISR & RTC_ISR_INITF) == (uint32_t)RESET) - { - /* Set the Initialization mode */ - RTC->ISR = (uint32_t)RTC_INIT_MASK; - - /* Wait till RTC is in INIT state and if Time out is reached exit */ - do - { - initstatus = RTC->ISR & RTC_ISR_INITF; - initcounter++; - } while((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00)); - - if ((RTC->ISR & RTC_ISR_INITF) != RESET) - { - status = SUCCESS; - } - else - { - status = ERROR; - } - } - else - { - status = SUCCESS; - } - - return (status); -} - -/** - * @brief Exits the RTC Initialization mode. - * @note When the initialization sequence is complete, the calendar restarts - * counting after 4 RTCCLK cycles. - * @note The RTC Initialization mode is write protected, use the - * RTC_WriteProtectionCmd(DISABLE) before calling this function. - * @param None - * @retval None - */ -void RTC_ExitInitMode(void) -{ - /* Exit Initialization mode */ - RTC->ISR &= (uint32_t)~RTC_ISR_INIT; -} - -/** - * @brief Waits until the RTC Time and Date registers (RTC_TR and RTC_DR) are - * synchronized with RTC APB clock. - * @note The RTC Resynchronization mode is write protected, use the - * RTC_WriteProtectionCmd(DISABLE) before calling this function. - * @note To read the calendar through the shadow registers after Calendar - * initialization, calendar update or after wakeup from low power modes - * the software must first clear the RSF flag. - * The software must then wait until it is set again before reading - * the calendar, which means that the calendar registers have been - * correctly copied into the RTC_TR and RTC_DR shadow registers. - * @param None - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC registers are synchronised - * - ERROR: RTC registers are not synchronised - */ -ErrorStatus RTC_WaitForSynchro(void) -{ - __IO uint32_t synchrocounter = 0; - ErrorStatus status = ERROR; - uint32_t synchrostatus = 0x00; - - if ((RTC->CR & RTC_CR_BYPSHAD) != RESET) - { - /* Bypass shadow mode */ - status = SUCCESS; - } - else - { - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Clear RSF flag */ - RTC->ISR &= (uint32_t)RTC_RSF_MASK; - - /* Wait the registers to be synchronised */ - do - { - synchrostatus = RTC->ISR & RTC_ISR_RSF; - synchrocounter++; - } while((synchrocounter != SYNCHRO_TIMEOUT) && (synchrostatus == 0x00)); - - if ((RTC->ISR & RTC_ISR_RSF) != RESET) - { - status = SUCCESS; - } - else - { - status = ERROR; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - } - - return (status); -} - -/** - * @brief Enables or disables the RTC reference clock detection. - * @param NewState: new state of the RTC reference clock. - * This parameter can be: ENABLE or DISABLE. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC reference clock detection is enabled - * - ERROR: RTC reference clock detection is disabled - */ -ErrorStatus RTC_RefClockCmd(FunctionalState NewState) -{ - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - if (NewState != DISABLE) - { - /* Enable the RTC reference clock detection */ - RTC->CR |= RTC_CR_REFCKON; - } - else - { - /* Disable the RTC reference clock detection */ - RTC->CR &= ~RTC_CR_REFCKON; - } - /* Exit Initialization mode */ - RTC_ExitInitMode(); - - status = SUCCESS; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Enables or Disables the Bypass Shadow feature. - * @note When the Bypass Shadow is enabled the calendar value are taken - * directly from the Calendar counter. - * @param NewState: new state of the Bypass Shadow feature. - * This parameter can be: ENABLE or DISABLE. - * @retval None -*/ -void RTC_BypassShadowCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - if (NewState != DISABLE) - { - /* Set the BYPSHAD bit */ - RTC->CR |= (uint8_t)RTC_CR_BYPSHAD; - } - else - { - /* Reset the BYPSHAD bit */ - RTC->CR &= (uint8_t)~RTC_CR_BYPSHAD; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @} - */ - -/** @defgroup RTC_Group2 Time and Date configuration functions - * @brief Time and Date configuration functions - * -@verbatim - =============================================================================== - ##### Time and Date configuration functions ##### - =============================================================================== - [..] This section provide functions allowing to program and read the RTC - Calendar (Time and Date). - -@endverbatim - * @{ - */ - -/** - * @brief Set the RTC current time. - * @param RTC_Format: specifies the format of the entered parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that contains - * the time configuration information for the RTC. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Time register is configured - * - ERROR: RTC Time register is not configured - */ -ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct) -{ - uint32_t tmpreg = 0; - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - - if (RTC_Format == RTC_Format_BIN) - { - if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) - { - assert_param(IS_RTC_HOUR12(RTC_TimeStruct->RTC_Hours)); - assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12)); - } - else - { - RTC_TimeStruct->RTC_H12 = 0x00; - assert_param(IS_RTC_HOUR24(RTC_TimeStruct->RTC_Hours)); - } - assert_param(IS_RTC_MINUTES(RTC_TimeStruct->RTC_Minutes)); - assert_param(IS_RTC_SECONDS(RTC_TimeStruct->RTC_Seconds)); - } - else - { - if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) - { - tmpreg = RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours); - assert_param(IS_RTC_HOUR12(tmpreg)); - assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12)); - } - else - { - RTC_TimeStruct->RTC_H12 = 0x00; - assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours))); - } - assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Minutes))); - assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Seconds))); - } - - /* Check the input parameters format */ - if (RTC_Format != RTC_Format_BIN) - { - tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \ - ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \ - ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \ - ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16)); - } - else - { - tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Minutes) << 8) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Seconds)) | \ - (((uint32_t)RTC_TimeStruct->RTC_H12) << 16)); - } - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - /* Set the RTC_TR register */ - RTC->TR = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK); - - /* Exit Initialization mode */ - RTC_ExitInitMode(); - - /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */ - if ((RTC->CR & RTC_CR_BYPSHAD) == RESET) - { - if (RTC_WaitForSynchro() == ERROR) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - } - else - { - status = SUCCESS; - } - - } - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Fills each RTC_TimeStruct member with its default value - * (Time = 00h:00min:00sec). - * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure which will be - * initialized. - * @retval None - */ -void RTC_TimeStructInit(RTC_TimeTypeDef* RTC_TimeStruct) -{ - /* Time = 00h:00min:00sec */ - RTC_TimeStruct->RTC_H12 = RTC_H12_AM; - RTC_TimeStruct->RTC_Hours = 0; - RTC_TimeStruct->RTC_Minutes = 0; - RTC_TimeStruct->RTC_Seconds = 0; -} - -/** - * @brief Get the RTC current Time. - * @param RTC_Format: specifies the format of the returned parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that will - * contain the returned current time configuration. - * @retval None - */ -void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - - /* Get the RTC_TR register */ - tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK); - - /* Fill the structure fields with the read parameters */ - RTC_TimeStruct->RTC_Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16); - RTC_TimeStruct->RTC_Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8); - RTC_TimeStruct->RTC_Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU)); - RTC_TimeStruct->RTC_H12 = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16); - - /* Check the input parameters format */ - if (RTC_Format == RTC_Format_BIN) - { - /* Convert the structure parameters to Binary format */ - RTC_TimeStruct->RTC_Hours = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours); - RTC_TimeStruct->RTC_Minutes = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Minutes); - RTC_TimeStruct->RTC_Seconds = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Seconds); - } -} - -/** - * @brief Gets the RTC current Calendar Subseconds value. - * @note This function freeze the Time and Date registers after reading the - * SSR register. - * @param None - * @retval RTC current Calendar Subseconds value. - */ -uint32_t RTC_GetSubSecond(void) -{ - uint32_t tmpreg = 0; - - /* Get subseconds values from the correspondent registers*/ - tmpreg = (uint32_t)(RTC->SSR); - - /* Read DR register to unfroze calendar registers */ - (void) (RTC->DR); - - return (tmpreg); -} - -/** - * @brief Set the RTC current date. - * @param RTC_Format: specifies the format of the entered parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that contains - * the date configuration information for the RTC. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Date register is configured - * - ERROR: RTC Date register is not configured - */ -ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct) -{ - uint32_t tmpreg = 0; - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - - if ((RTC_Format == RTC_Format_BIN) && ((RTC_DateStruct->RTC_Month & 0x10) == 0x10)) - { - RTC_DateStruct->RTC_Month = (RTC_DateStruct->RTC_Month & (uint32_t)~(0x10)) + 0x0A; - } - if (RTC_Format == RTC_Format_BIN) - { - assert_param(IS_RTC_YEAR(RTC_DateStruct->RTC_Year)); - assert_param(IS_RTC_MONTH(RTC_DateStruct->RTC_Month)); - assert_param(IS_RTC_DATE(RTC_DateStruct->RTC_Date)); - } - else - { - assert_param(IS_RTC_YEAR(RTC_Bcd2ToByte(RTC_DateStruct->RTC_Year))); - tmpreg = RTC_Bcd2ToByte(RTC_DateStruct->RTC_Month); - assert_param(IS_RTC_MONTH(tmpreg)); - tmpreg = RTC_Bcd2ToByte(RTC_DateStruct->RTC_Date); - assert_param(IS_RTC_DATE(tmpreg)); - } - assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay)); - - /* Check the input parameters format */ - if (RTC_Format != RTC_Format_BIN) - { - tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \ - (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \ - ((uint32_t)RTC_DateStruct->RTC_Date) | \ - (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13)); - } - else - { - tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Month) << 8) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Date)) | \ - ((uint32_t)RTC_DateStruct->RTC_WeekDay << 13)); - } - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - /* Set the RTC_DR register */ - RTC->DR = (uint32_t)(tmpreg & RTC_DR_RESERVED_MASK); - - /* Exit Initialization mode */ - RTC_ExitInitMode(); - - /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */ - if ((RTC->CR & RTC_CR_BYPSHAD) == RESET) - { - if (RTC_WaitForSynchro() == ERROR) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - } - else - { - status = SUCCESS; - } - } - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Fills each RTC_DateStruct member with its default value - * (Monday, January 01 xx00). - * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure which will be - * initialized. - * @retval None - */ -void RTC_DateStructInit(RTC_DateTypeDef* RTC_DateStruct) -{ - /* Monday, January 01 xx00 */ - RTC_DateStruct->RTC_WeekDay = RTC_Weekday_Monday; - RTC_DateStruct->RTC_Date = 1; - RTC_DateStruct->RTC_Month = RTC_Month_January; - RTC_DateStruct->RTC_Year = 0; -} - -/** - * @brief Get the RTC current date. - * @param RTC_Format: specifies the format of the returned parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that will - * contain the returned current date configuration. - * @retval None - */ -void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - - /* Get the RTC_TR register */ - tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK); - - /* Fill the structure fields with the read parameters */ - RTC_DateStruct->RTC_Year = (uint8_t)((tmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16); - RTC_DateStruct->RTC_Month = (uint8_t)((tmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8); - RTC_DateStruct->RTC_Date = (uint8_t)(tmpreg & (RTC_DR_DT | RTC_DR_DU)); - RTC_DateStruct->RTC_WeekDay = (uint8_t)((tmpreg & (RTC_DR_WDU)) >> 13); - - /* Check the input parameters format */ - if (RTC_Format == RTC_Format_BIN) - { - /* Convert the structure parameters to Binary format */ - RTC_DateStruct->RTC_Year = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Year); - RTC_DateStruct->RTC_Month = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Month); - RTC_DateStruct->RTC_Date = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Date); - RTC_DateStruct->RTC_WeekDay = (uint8_t)(RTC_DateStruct->RTC_WeekDay); - } -} - -/** - * @} - */ - -/** @defgroup RTC_Group3 Alarms configuration functions - * @brief Alarms (Alarm A) configuration functions - * -@verbatim - =============================================================================== - ##### Alarms (Alarm A and Alarm B) configuration functions ##### - =============================================================================== - [..] This section provide functions allowing to program and read the RTC - Alarms. - -@endverbatim - * @{ - */ - -/** - * @brief Set the specified RTC Alarm. - * @note The Alarm register can only be written when the corresponding Alarm - * is disabled (Use the RTC_AlarmCmd(DISABLE)). - * @param RTC_Format: specifies the format of the returned parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_Alarm: specifies the alarm to be configured. - * This parameter can be one of the following values: - * @arg RTC_Alarm_A: to select Alarm A - * @param RTC_AlarmStruct: pointer to a RTC_AlarmTypeDef structure that - * contains the alarm configuration parameters. - * @retval None - */ -void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - assert_param(IS_RTC_ALARM(RTC_Alarm)); - assert_param(IS_RTC_ALARM_MASK(RTC_AlarmStruct->RTC_AlarmMask)); - assert_param(IS_RTC_ALARM_DATE_WEEKDAY_SEL(RTC_AlarmStruct->RTC_AlarmDateWeekDaySel)); - - if (RTC_Format == RTC_Format_BIN) - { - if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) - { - assert_param(IS_RTC_HOUR12(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours)); - assert_param(IS_RTC_H12(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12)); - } - else - { - RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = 0x00; - assert_param(IS_RTC_HOUR24(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours)); - } - assert_param(IS_RTC_MINUTES(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes)); - assert_param(IS_RTC_SECONDS(RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds)); - - if(RTC_AlarmStruct->RTC_AlarmDateWeekDaySel == RTC_AlarmDateWeekDaySel_Date) - { - assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(RTC_AlarmStruct->RTC_AlarmDateWeekDay)); - } - else - { - assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(RTC_AlarmStruct->RTC_AlarmDateWeekDay)); - } - } - else - { - if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) - { - tmpreg = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours); - assert_param(IS_RTC_HOUR12(tmpreg)); - assert_param(IS_RTC_H12(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12)); - } - else - { - RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = 0x00; - assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours))); - } - - assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes))); - assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds))); - - if(RTC_AlarmStruct->RTC_AlarmDateWeekDaySel == RTC_AlarmDateWeekDaySel_Date) - { - tmpreg = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmDateWeekDay); - assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(tmpreg)); - } - else - { - tmpreg = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmDateWeekDay); - assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(tmpreg)); - } - } - - /* Check the input parameters format */ - if (RTC_Format != RTC_Format_BIN) - { - tmpreg = (((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours) << 16) | \ - ((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes) << 8) | \ - ((uint32_t)RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds) | \ - ((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12) << 16) | \ - ((uint32_t)(RTC_AlarmStruct->RTC_AlarmDateWeekDay) << 24) | \ - ((uint32_t)RTC_AlarmStruct->RTC_AlarmDateWeekDaySel) | \ - ((uint32_t)RTC_AlarmStruct->RTC_AlarmMask)); - } - else - { - tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours) << 16) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes) << 8) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds)) | \ - ((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12) << 16) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmDateWeekDay) << 24) | \ - ((uint32_t)RTC_AlarmStruct->RTC_AlarmDateWeekDaySel) | \ - ((uint32_t)RTC_AlarmStruct->RTC_AlarmMask)); - } - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Configure the Alarm register */ - RTC->ALRMAR = (uint32_t)tmpreg; - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Fills each RTC_AlarmStruct member with its default value - * (Time = 00h:00mn:00sec / Date = 1st day of the month/Mask = - * all fields are masked). - * @param RTC_AlarmStruct: pointer to a @ref RTC_AlarmTypeDef structure which - * will be initialized. - * @retval None - */ -void RTC_AlarmStructInit(RTC_AlarmTypeDef* RTC_AlarmStruct) -{ - /* Alarm Time Settings : Time = 00h:00mn:00sec */ - RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = RTC_H12_AM; - RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours = 0; - RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes = 0; - RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds = 0; - - /* Alarm Date Settings : Date = 1st day of the month */ - RTC_AlarmStruct->RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date; - RTC_AlarmStruct->RTC_AlarmDateWeekDay = 1; - - /* Alarm Masks Settings : Mask = all fields are not masked */ - RTC_AlarmStruct->RTC_AlarmMask = RTC_AlarmMask_None; -} - -/** - * @brief Get the RTC Alarm value and masks. - * @param RTC_Format: specifies the format of the output parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_Alarm: specifies the alarm to be read. - * This parameter can be one of the following values: - * @arg RTC_Alarm_A: to select Alarm A - * @param RTC_AlarmStruct: pointer to a RTC_AlarmTypeDef structure that will - * contains the output alarm configuration values. - * @retval None - */ -void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - assert_param(IS_RTC_ALARM(RTC_Alarm)); - - /* Get the RTC_ALRMAR register */ - tmpreg = (uint32_t)(RTC->ALRMAR); - - /* Fill the structure with the read parameters */ - RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours = (uint32_t)((tmpreg & (RTC_ALRMAR_HT | \ - RTC_ALRMAR_HU)) >> 16); - RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes = (uint32_t)((tmpreg & (RTC_ALRMAR_MNT | \ - RTC_ALRMAR_MNU)) >> 8); - RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds = (uint32_t)(tmpreg & (RTC_ALRMAR_ST | \ - RTC_ALRMAR_SU)); - RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = (uint32_t)((tmpreg & RTC_ALRMAR_PM) >> 16); - RTC_AlarmStruct->RTC_AlarmDateWeekDay = (uint32_t)((tmpreg & (RTC_ALRMAR_DT | RTC_ALRMAR_DU)) >> 24); - RTC_AlarmStruct->RTC_AlarmDateWeekDaySel = (uint32_t)(tmpreg & RTC_ALRMAR_WDSEL); - RTC_AlarmStruct->RTC_AlarmMask = (uint32_t)(tmpreg & RTC_AlarmMask_All); - - if (RTC_Format == RTC_Format_BIN) - { - RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours = RTC_Bcd2ToByte(RTC_AlarmStruct-> \ - RTC_AlarmTime.RTC_Hours); - RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes = RTC_Bcd2ToByte(RTC_AlarmStruct-> \ - RTC_AlarmTime.RTC_Minutes); - RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds = RTC_Bcd2ToByte(RTC_AlarmStruct-> \ - RTC_AlarmTime.RTC_Seconds); - RTC_AlarmStruct->RTC_AlarmDateWeekDay = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmDateWeekDay); - } -} - -/** - * @brief Enables or disables the specified RTC Alarm. - * @param RTC_Alarm: specifies the alarm to be configured. - * This parameter can be any combination of the following values: - * @arg RTC_Alarm_A: to select Alarm A - * @param NewState: new state of the specified alarm. - * This parameter can be: ENABLE or DISABLE. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Alarm is enabled/disabled - * - ERROR: RTC Alarm is not enabled/disabled - */ -ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState) -{ - __IO uint32_t alarmcounter = 0x00; - uint32_t alarmstatus = 0x00; - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_RTC_CMD_ALARM(RTC_Alarm)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Configure the Alarm state */ - if (NewState != DISABLE) - { - RTC->CR |= (uint32_t)RTC_Alarm; - - status = SUCCESS; - } - else - { - /* Disable the Alarm in RTC_CR register */ - RTC->CR &= (uint32_t)~RTC_Alarm; - - /* Wait till RTC ALRxWF flag is set and if Time out is reached exit */ - do - { - alarmstatus = RTC->ISR & (RTC_Alarm >> 8); - alarmcounter++; - } while((alarmcounter != INITMODE_TIMEOUT) && (alarmstatus == 0x00)); - - if ((RTC->ISR & (RTC_Alarm >> 8)) == RESET) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Configure the RTC AlarmA/B Subseconds value and mask. - * @note This function is performed only when the Alarm is disabled. - * @param RTC_Alarm: specifies the alarm to be configured. - * This parameter can be one of the following values: - * @arg RTC_Alarm_A: to select Alarm A - * @param RTC_AlarmSubSecondValue: specifies the Subseconds value. - * This parameter can be a value from 0 to 0x00007FFF. - * @param RTC_AlarmSubSecondMask: specifies the Subseconds Mask. - * This parameter can be any combination of the following values: - * @arg RTC_AlarmSubSecondMask_All: All Alarm SS fields are masked. - * There is no comparison on sub seconds for Alarm. - * @arg RTC_AlarmSubSecondMask_SS14_1: SS[14:1] are don't care in Alarm comparison. - * Only SS[0] is compared - * @arg RTC_AlarmSubSecondMask_SS14_2: SS[14:2] are don't care in Alarm comparison. - * Only SS[1:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_3: SS[14:3] are don't care in Alarm comparison. - * Only SS[2:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_4: SS[14:4] are don't care in Alarm comparison. - * Only SS[3:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_5: SS[14:5] are don't care in Alarm comparison. - * Only SS[4:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_6: SS[14:6] are don't care in Alarm comparison. - * Only SS[5:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_7: SS[14:7] are don't care in Alarm comparison. - * Only SS[6:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_8: SS[14:8] are don't care in Alarm comparison. - * Only SS[7:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_9: SS[14:9] are don't care in Alarm comparison. - * Only SS[8:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_10: SS[14:10] are don't care in Alarm comparison. - * Only SS[9:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_11: SS[14:11] are don't care in Alarm comparison. - * Only SS[10:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_12: SS[14:12] are don't care in Alarm comparison. - * Only SS[11:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_13: SS[14:13] are don't care in Alarm comparison. - * Only SS[12:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14: SS[14] is don't care in Alarm comparison. - * Only SS[13:0] are compared - * @arg RTC_AlarmSubSecondMask_None: SS[14:0] are compared and must match to activate alarm - * @retval None - */ -void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, uint8_t RTC_AlarmSubSecondMask) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_ALARM(RTC_Alarm)); - assert_param(IS_RTC_ALARM_SUB_SECOND_VALUE(RTC_AlarmSubSecondValue)); - assert_param(IS_RTC_ALARM_SUB_SECOND_MASK(RTC_AlarmSubSecondMask)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Configure the Alarm A or Alarm B SubSecond registers */ - tmpreg = (uint32_t) (((uint32_t)(RTC_AlarmSubSecondValue)) | ((uint32_t)(RTC_AlarmSubSecondMask) << 24)); - - /* Configure the AlarmA SubSecond register */ - RTC->ALRMASSR = tmpreg; - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - -} - -/** - * @brief Gets the RTC Alarm Subseconds value. - * @param RTC_Alarm: specifies the alarm to be read. - * This parameter can be one of the following values: - * @arg RTC_Alarm_A: to select Alarm A - * @param None - * @retval RTC Alarm Subseconds value. - */ -uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm) -{ - uint32_t tmpreg = 0; - - /* Get the RTC_ALRMAR register */ - tmpreg = (uint32_t)((RTC->ALRMASSR) & RTC_ALRMASSR_SS); - - return (tmpreg); -} - -/** - * @} - */ - -/** @defgroup RTC_Group4 WakeUp Timer configuration functions - * @brief WakeUp Timer configuration functions - * -@verbatim - =============================================================================== - ##### WakeUp Timer configuration functions ##### - =============================================================================== - - [..] This section provide functions allowing to program and read the RTC WakeUp. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the RTC Wakeup clock source. - * This function is available for STM32F072 devices. - * @note The WakeUp Clock source can only be changed when the RTC WakeUp - * is disabled (Use the RTC_WakeUpCmd(DISABLE)). - * @param RTC_WakeUpClock: Wakeup Clock source. - * This parameter can be one of the following values: - * @arg RTC_WakeUpClock_RTCCLK_Div16 - * @arg RTC_WakeUpClock_RTCCLK_Div8 - * @arg RTC_WakeUpClock_RTCCLK_Div4 - * @arg RTC_WakeUpClock_RTCCLK_Div2 - * @arg RTC_WakeUpClock_CK_SPRE_16bits - * @arg RTC_WakeUpClock_CK_SPRE_17bits - * @retval None - */ -void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock) -{ - /* Check the parameters */ - assert_param(IS_RTC_WAKEUP_CLOCK(RTC_WakeUpClock)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Clear the Wakeup Timer clock source bits in CR register */ - RTC->CR &= (uint32_t)~RTC_CR_WUCKSEL; - - /* Configure the clock source */ - RTC->CR |= (uint32_t)RTC_WakeUpClock; - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Configures the RTC Wakeup counter. - * This function is available for STM32F072 devices. - * @note The RTC WakeUp counter can only be written when the RTC WakeUp - * is disabled (Use the RTC_WakeUpCmd(DISABLE)). - * @param RTC_WakeUpCounter: specifies the WakeUp counter. - * This parameter can be a value from 0x0000 to 0xFFFF. - * @retval None - */ -void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter) -{ - /* Check the parameters */ - assert_param(IS_RTC_WAKEUP_COUNTER(RTC_WakeUpCounter)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Configure the Wakeup Timer counter */ - RTC->WUTR = (uint32_t)RTC_WakeUpCounter; - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Returns the RTC WakeUp timer counter value. - * This function is available for STM32F072 devices. - * @param None - * @retval The RTC WakeUp Counter value. - */ -uint32_t RTC_GetWakeUpCounter(void) -{ - /* Get the counter value */ - return ((uint32_t)(RTC->WUTR & RTC_WUTR_WUT)); -} - -/** - * @brief Enables or Disables the RTC WakeUp timer. - * This function is available for STM32F072 devices. - * @param NewState: new state of the WakeUp timer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -ErrorStatus RTC_WakeUpCmd(FunctionalState NewState) -{ - __IO uint32_t wutcounter = 0x00; - uint32_t wutwfstatus = 0x00; - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - if (NewState != DISABLE) - { - /* Enable the Wakeup Timer */ - RTC->CR |= (uint32_t)RTC_CR_WUTE; - status = SUCCESS; - } - else - { - /* Disable the Wakeup Timer */ - RTC->CR &= (uint32_t)~RTC_CR_WUTE; - /* Wait till RTC WUTWF flag is set and if Time out is reached exit */ - do - { - wutwfstatus = RTC->ISR & RTC_ISR_WUTWF; - wutcounter++; - } while((wutcounter != INITMODE_TIMEOUT) && (wutwfstatus == 0x00)); - - if ((RTC->ISR & RTC_ISR_WUTWF) == RESET) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @} - */ - -/** @defgroup RTC_Group5 Daylight Saving configuration functions - * @brief Daylight Saving configuration functions - * -@verbatim - =============================================================================== - ##### WakeUp Timer configuration functions ##### - =============================================================================== - [..] This section provide functions allowing to program and read the RTC WakeUp. - - This section provide functions allowing to configure the RTC DayLight Saving. - -@endverbatim - * @{ - */ - -/** - * @brief Adds or substract one hour from the current time. - * @param RTC_DayLightSaveOperation: the value of hour adjustment. - * This parameter can be one of the following values: - * @arg RTC_DayLightSaving_SUB1H: Substract one hour (winter time) - * @arg RTC_DayLightSaving_ADD1H: Add one hour (summer time) - * @param RTC_StoreOperation: Specifies the value to be written in the BCK bit - * in CR register to store the operation. - * This parameter can be one of the following values: - * @arg RTC_StoreOperation_Reset: BCK Bit Reset - * @arg RTC_StoreOperation_Set: BCK Bit Set - * @retval None - */ -void RTC_DayLightSavingConfig(uint32_t RTC_DayLightSaving, uint32_t RTC_StoreOperation) -{ - /* Check the parameters */ - assert_param(IS_RTC_DAYLIGHT_SAVING(RTC_DayLightSaving)); - assert_param(IS_RTC_STORE_OPERATION(RTC_StoreOperation)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Clear the bits to be configured */ - RTC->CR &= (uint32_t)~(RTC_CR_BCK); - - /* Configure the RTC_CR register */ - RTC->CR |= (uint32_t)(RTC_DayLightSaving | RTC_StoreOperation); - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Returns the RTC Day Light Saving stored operation. - * @param None - * @retval RTC Day Light Saving stored operation. - * - RTC_StoreOperation_Reset - * - RTC_StoreOperation_Set - */ -uint32_t RTC_GetStoreOperation(void) -{ - return (RTC->CR & RTC_CR_BCK); -} - -/** - * @} - */ - -/** @defgroup RTC_Group6 Output pin Configuration function - * @brief Output pin Configuration function - * -@verbatim - =============================================================================== - ##### Output pin Configuration function ##### - =============================================================================== - [..] This section provide functions allowing to configure the RTC Output source. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the RTC output source (AFO_ALARM). - * @param RTC_Output: Specifies which signal will be routed to the RTC output. - * This parameter can be one of the following values: - * @arg RTC_Output_Disable: No output selected - * @arg RTC_Output_AlarmA: signal of AlarmA mapped to output - * @arg RTC_Output_WakeUp: signal of WakeUp mapped to output, available only for STM32F072 devices - * @param RTC_OutputPolarity: Specifies the polarity of the output signal. - * This parameter can be one of the following: - * @arg RTC_OutputPolarity_High: The output pin is high when the - * ALRAF is high (depending on OSEL) - * @arg RTC_OutputPolarity_Low: The output pin is low when the - * ALRAF is high (depending on OSEL) - * @retval None - */ -void RTC_OutputConfig(uint32_t RTC_Output, uint32_t RTC_OutputPolarity) -{ - /* Check the parameters */ - assert_param(IS_RTC_OUTPUT(RTC_Output)); - assert_param(IS_RTC_OUTPUT_POL(RTC_OutputPolarity)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Clear the bits to be configured */ - RTC->CR &= (uint32_t)~(RTC_CR_OSEL | RTC_CR_POL); - - /* Configure the output selection and polarity */ - RTC->CR |= (uint32_t)(RTC_Output | RTC_OutputPolarity); - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @} - */ - -/** @defgroup RTC_Group7 Digital Calibration configuration functions - * @brief Digital Calibration configuration functions - * -@verbatim - =============================================================================== - ##### Digital Calibration configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the RTC clock to be output through the relative pin. - * @param NewState: new state of the digital calibration Output. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_CalibOutputCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - if (NewState != DISABLE) - { - /* Enable the RTC clock output */ - RTC->CR |= (uint32_t)RTC_CR_COE; - } - else - { - /* Disable the RTC clock output */ - RTC->CR &= (uint32_t)~RTC_CR_COE; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Configure the Calibration Pinout (RTC_CALIB) Selection (1Hz or 512Hz). - * @param RTC_CalibOutput: Select the Calibration output Selection . - * This parameter can be one of the following values: - * @arg RTC_CalibOutput_512Hz: A signal has a regular waveform at 512Hz. - * @arg RTC_CalibOutput_1Hz: A signal has a regular waveform at 1Hz. - * @retval None -*/ -void RTC_CalibOutputConfig(uint32_t RTC_CalibOutput) -{ - /* Check the parameters */ - assert_param(IS_RTC_CALIB_OUTPUT(RTC_CalibOutput)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /*clear flags before config*/ - RTC->CR &= (uint32_t)~(RTC_CR_CALSEL); - - /* Configure the RTC_CR register */ - RTC->CR |= (uint32_t)RTC_CalibOutput; - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Configures the Smooth Calibration Settings. - * @param RTC_SmoothCalibPeriod: Select the Smooth Calibration Period. - * This parameter can be can be one of the following values: - * @arg RTC_SmoothCalibPeriod_32sec: The smooth calibration periode is 32s. - * @arg RTC_SmoothCalibPeriod_16sec: The smooth calibration periode is 16s. - * @arg RTC_SmoothCalibPeriod_8sec: The smooth calibartion periode is 8s. - * @param RTC_SmoothCalibPlusPulses: Select to Set or reset the CALP bit. - * This parameter can be one of the following values: - * @arg RTC_SmoothCalibPlusPulses_Set: Add one RTCCLK puls every 2**11 pulses. - * @arg RTC_SmoothCalibPlusPulses_Reset: No RTCCLK pulses are added. - * @param RTC_SmouthCalibMinusPulsesValue: Select the value of CALM[8:0] bits. - * This parameter can be one any value from 0 to 0x000001FF. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Calib registers are configured - * - ERROR: RTC Calib registers are not configured -*/ -ErrorStatus RTC_SmoothCalibConfig(uint32_t RTC_SmoothCalibPeriod, - uint32_t RTC_SmoothCalibPlusPulses, - uint32_t RTC_SmouthCalibMinusPulsesValue) -{ - ErrorStatus status = ERROR; - uint32_t recalpfcount = 0; - - /* Check the parameters */ - assert_param(IS_RTC_SMOOTH_CALIB_PERIOD(RTC_SmoothCalibPeriod)); - assert_param(IS_RTC_SMOOTH_CALIB_PLUS(RTC_SmoothCalibPlusPulses)); - assert_param(IS_RTC_SMOOTH_CALIB_MINUS(RTC_SmouthCalibMinusPulsesValue)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* check if a calibration is pending*/ - if ((RTC->ISR & RTC_ISR_RECALPF) != RESET) - { - /* wait until the Calibration is completed*/ - while (((RTC->ISR & RTC_ISR_RECALPF) != RESET) && (recalpfcount != RECALPF_TIMEOUT)) - { - recalpfcount++; - } - } - - /* check if the calibration pending is completed or if there is no calibration operation at all*/ - if ((RTC->ISR & RTC_ISR_RECALPF) == RESET) - { - /* Configure the Smooth calibration settings */ - RTC->CALR = (uint32_t)((uint32_t)RTC_SmoothCalibPeriod | (uint32_t)RTC_SmoothCalibPlusPulses | (uint32_t)RTC_SmouthCalibMinusPulsesValue); - - status = SUCCESS; - } - else - { - status = ERROR; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return (ErrorStatus)(status); -} - -/** - * @} - */ - - -/** @defgroup RTC_Group8 TimeStamp configuration functions - * @brief TimeStamp configuration functions - * -@verbatim - =============================================================================== - ##### TimeStamp configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or Disables the RTC TimeStamp functionality with the - * specified time stamp pin stimulating edge. - * @param RTC_TimeStampEdge: Specifies the pin edge on which the TimeStamp is - * activated. - * This parameter can be one of the following: - * @arg RTC_TimeStampEdge_Rising: the Time stamp event occurs on the rising - * edge of the related pin. - * @arg RTC_TimeStampEdge_Falling: the Time stamp event occurs on the - * falling edge of the related pin. - * @param NewState: new state of the TimeStamp. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_TimeStampCmd(uint32_t RTC_TimeStampEdge, FunctionalState NewState) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_TIMESTAMP_EDGE(RTC_TimeStampEdge)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Get the RTC_CR register and clear the bits to be configured */ - tmpreg = (uint32_t)(RTC->CR & (uint32_t)~(RTC_CR_TSEDGE | RTC_CR_TSE)); - - /* Get the new configuration */ - if (NewState != DISABLE) - { - tmpreg |= (uint32_t)(RTC_TimeStampEdge | RTC_CR_TSE); - } - else - { - tmpreg |= (uint32_t)(RTC_TimeStampEdge); - } - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Configure the Time Stamp TSEDGE and Enable bits */ - RTC->CR = (uint32_t)tmpreg; - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Get the RTC TimeStamp value and masks. - * @param RTC_Format: specifies the format of the output parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_StampTimeStruct: pointer to a RTC_TimeTypeDef structure that will - * contains the TimeStamp time values. - * @param RTC_StampDateStruct: pointer to a RTC_DateTypeDef structure that will - * contains the TimeStamp date values. - * @retval None - */ -void RTC_GetTimeStamp(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_StampTimeStruct, - RTC_DateTypeDef* RTC_StampDateStruct) -{ - uint32_t tmptime = 0, tmpdate = 0; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - - /* Get the TimeStamp time and date registers values */ - tmptime = (uint32_t)(RTC->TSTR & RTC_TR_RESERVED_MASK); - tmpdate = (uint32_t)(RTC->TSDR & RTC_DR_RESERVED_MASK); - - /* Fill the Time structure fields with the read parameters */ - RTC_StampTimeStruct->RTC_Hours = (uint8_t)((tmptime & (RTC_TR_HT | RTC_TR_HU)) >> 16); - RTC_StampTimeStruct->RTC_Minutes = (uint8_t)((tmptime & (RTC_TR_MNT | RTC_TR_MNU)) >> 8); - RTC_StampTimeStruct->RTC_Seconds = (uint8_t)(tmptime & (RTC_TR_ST | RTC_TR_SU)); - RTC_StampTimeStruct->RTC_H12 = (uint8_t)((tmptime & (RTC_TR_PM)) >> 16); - - /* Fill the Date structure fields with the read parameters */ - RTC_StampDateStruct->RTC_Year = 0; - RTC_StampDateStruct->RTC_Month = (uint8_t)((tmpdate & (RTC_DR_MT | RTC_DR_MU)) >> 8); - RTC_StampDateStruct->RTC_Date = (uint8_t)(tmpdate & (RTC_DR_DT | RTC_DR_DU)); - RTC_StampDateStruct->RTC_WeekDay = (uint8_t)((tmpdate & (RTC_DR_WDU)) >> 13); - - /* Check the input parameters format */ - if (RTC_Format == RTC_Format_BIN) - { - /* Convert the Time structure parameters to Binary format */ - RTC_StampTimeStruct->RTC_Hours = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->RTC_Hours); - RTC_StampTimeStruct->RTC_Minutes = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->RTC_Minutes); - RTC_StampTimeStruct->RTC_Seconds = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->RTC_Seconds); - - /* Convert the Date structure parameters to Binary format */ - RTC_StampDateStruct->RTC_Month = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->RTC_Month); - RTC_StampDateStruct->RTC_Date = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->RTC_Date); - RTC_StampDateStruct->RTC_WeekDay = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->RTC_WeekDay); - } -} - -/** - * @brief Get the RTC timestamp Subseconds value. - * @param None - * @retval RTC current timestamp Subseconds value. - */ -uint32_t RTC_GetTimeStampSubSecond(void) -{ - /* Get timestamp subseconds values from the correspondent registers */ - return (uint32_t)(RTC->TSSSR); -} - -/** - * @} - */ - -/** @defgroup RTC_Group9 Tampers configuration functions - * @brief Tampers configuration functions - * -@verbatim - =============================================================================== - ##### Tampers configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures the select Tamper pin edge. - * @param RTC_Tamper: Selected tamper pin. - * This parameter can be any combination of the following values: - * @arg RTC_Tamper_1: Select Tamper 1. - * @arg RTC_Tamper_2: Select Tamper 2. - * @param RTC_TamperTrigger: Specifies the trigger on the tamper pin that - * stimulates tamper event. - * This parameter can be one of the following values: - * @arg RTC_TamperTrigger_RisingEdge: Rising Edge of the tamper pin causes tamper event. - * @arg RTC_TamperTrigger_FallingEdge: Falling Edge of the tamper pin causes tamper event. - * @arg RTC_TamperTrigger_LowLevel: Low Level of the tamper pin causes tamper event. - * @arg RTC_TamperTrigger_HighLevel: High Level of the tamper pin causes tamper event. - * @retval None - */ -void RTC_TamperTriggerConfig(uint32_t RTC_Tamper, uint32_t RTC_TamperTrigger) -{ - /* Check the parameters */ - assert_param(IS_RTC_TAMPER(RTC_Tamper)); - assert_param(IS_RTC_TAMPER_TRIGGER(RTC_TamperTrigger)); - - if (RTC_TamperTrigger == RTC_TamperTrigger_RisingEdge) - { - /* Configure the RTC_TAFCR register */ - RTC->TAFCR &= (uint32_t)((uint32_t)~(RTC_Tamper << 1)); - } - else - { - /* Configure the RTC_TAFCR register */ - RTC->TAFCR |= (uint32_t)(RTC_Tamper << 1); - } -} - -/** - * @brief Enables or Disables the Tamper detection. - * @param RTC_Tamper: Selected tamper pin. - * This parameter can be any combination of the following values: - * @arg RTC_Tamper_1: Select Tamper 1. - * @arg RTC_Tamper_2: Select Tamper 2. - * @param NewState: new state of the tamper pin. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_TamperCmd(uint32_t RTC_Tamper, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RTC_TAMPER(RTC_Tamper)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected Tamper pin */ - RTC->TAFCR |= (uint32_t)RTC_Tamper; - } - else - { - /* Disable the selected Tamper pin */ - RTC->TAFCR &= (uint32_t)~RTC_Tamper; - } -} - -/** - * @brief Configures the Tampers Filter. - * @param RTC_TamperFilter: Specifies the tampers filter. - * This parameter can be one of the following values: - * @arg RTC_TamperFilter_Disable: Tamper filter is disabled. - * @arg RTC_TamperFilter_2Sample: Tamper is activated after 2 consecutive - * samples at the active level - * @arg RTC_TamperFilter_4Sample: Tamper is activated after 4 consecutive - * samples at the active level - * @arg RTC_TamperFilter_8Sample: Tamper is activated after 8 consecutive - * samples at the active level - * @retval None - */ -void RTC_TamperFilterConfig(uint32_t RTC_TamperFilter) -{ - /* Check the parameters */ - assert_param(IS_RTC_TAMPER_FILTER(RTC_TamperFilter)); - - /* Clear TAMPFLT[1:0] bits in the RTC_TAFCR register */ - RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_TAMPFLT); - - /* Configure the RTC_TAFCR register */ - RTC->TAFCR |= (uint32_t)RTC_TamperFilter; -} - -/** - * @brief Configures the Tampers Sampling Frequency. - * @param RTC_TamperSamplingFreq: Specifies the tampers Sampling Frequency. - * This parameter can be one of the following values: - * @arg RTC_TamperSamplingFreq_RTCCLK_Div32768: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 32768 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div16384: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 16384 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div8192: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 8192 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div4096: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 4096 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div2048: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 2048 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div1024: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 1024 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div512: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 512 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div256: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 256 - * @retval None - */ -void RTC_TamperSamplingFreqConfig(uint32_t RTC_TamperSamplingFreq) -{ - /* Check the parameters */ - assert_param(IS_RTC_TAMPER_SAMPLING_FREQ(RTC_TamperSamplingFreq)); - - /* Clear TAMPFREQ[2:0] bits in the RTC_TAFCR register */ - RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_TAMPFREQ); - - /* Configure the RTC_TAFCR register */ - RTC->TAFCR |= (uint32_t)RTC_TamperSamplingFreq; -} - -/** - * @brief Configures the Tampers Pins input Precharge Duration. - * @param RTC_TamperPrechargeDuration: Specifies the Tampers Pins input - * Precharge Duration. - * This parameter can be one of the following values: - * @arg RTC_TamperPrechargeDuration_1RTCCLK: Tamper pins are pre-charged before sampling during 1 RTCCLK cycle - * @arg RTC_TamperPrechargeDuration_2RTCCLK: Tamper pins are pre-charged before sampling during 2 RTCCLK cycle - * @arg RTC_TamperPrechargeDuration_4RTCCLK: Tamper pins are pre-charged before sampling during 4 RTCCLK cycle - * @arg RTC_TamperPrechargeDuration_8RTCCLK: Tamper pins are pre-charged before sampling during 8 RTCCLK cycle - * @retval None - */ -void RTC_TamperPinsPrechargeDuration(uint32_t RTC_TamperPrechargeDuration) -{ - /* Check the parameters */ - assert_param(IS_RTC_TAMPER_PRECHARGE_DURATION(RTC_TamperPrechargeDuration)); - - /* Clear TAMPPRCH[1:0] bits in the RTC_TAFCR register */ - RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_TAMPPRCH); - - /* Configure the RTC_TAFCR register */ - RTC->TAFCR |= (uint32_t)RTC_TamperPrechargeDuration; -} - -/** - * @brief Enables or Disables the TimeStamp on Tamper Detection Event. - * @note The timestamp is valid even the TSE bit in tamper control register - * is reset. - * @param NewState: new state of the timestamp on tamper event. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_TimeStampOnTamperDetectionCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Save timestamp on tamper detection event */ - RTC->TAFCR |= (uint32_t)RTC_TAFCR_TAMPTS; - } - else - { - /* Tamper detection does not cause a timestamp to be saved */ - RTC->TAFCR &= (uint32_t)~RTC_TAFCR_TAMPTS; - } -} - -/** - * @brief Enables or Disables the Precharge of Tamper pin. - * @param NewState: new state of tamper pull up. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_TamperPullUpCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable precharge of the selected Tamper pin */ - RTC->TAFCR &= (uint32_t)~RTC_TAFCR_TAMPPUDIS; - } - else - { - /* Disable precharge of the selected Tamper pin */ - RTC->TAFCR |= (uint32_t)RTC_TAFCR_TAMPPUDIS; - } -} - -/** - * @} - */ - -/** @defgroup RTC_Group10 Backup Data Registers configuration functions - * @brief Backup Data Registers configuration functions - * -@verbatim - =============================================================================== - ##### Backup Data Registers configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Writes a data in a specified RTC Backup data register. - * @param RTC_BKP_DR: RTC Backup data Register number. - * This parameter can be: RTC_BKP_DRx where x can be from 0 to 4 to - * specify the register. - * @param Data: Data to be written in the specified RTC Backup data register. - * @retval None - */ -void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_RTC_BKP(RTC_BKP_DR)); - - tmp = RTC_BASE + 0x50; - tmp += (RTC_BKP_DR * 4); - - /* Write the specified register */ - *(__IO uint32_t *)tmp = (uint32_t)Data; -} - -/** - * @brief Reads data from the specified RTC Backup data Register. - * @param RTC_BKP_DR: RTC Backup data Register number. - * This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to - * specify the register. - * @retval None - */ -uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_RTC_BKP(RTC_BKP_DR)); - - tmp = RTC_BASE + 0x50; - tmp += (RTC_BKP_DR * 4); - - /* Read the specified register */ - return (*(__IO uint32_t *)tmp); -} - -/** - * @} - */ - -/** @defgroup RTC_Group11 Output Type Config configuration functions - * @brief Output Type Config configuration functions - * -@verbatim - =============================================================================== - ##### Output Type Config configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures the RTC Output Pin mode. - * @param RTC_OutputType: specifies the RTC Output (PC13) pin mode. - * This parameter can be one of the following values: - * @arg RTC_OutputType_OpenDrain: RTC Output (PC13) is configured in - * Open Drain mode. - * @arg RTC_OutputType_PushPull: RTC Output (PC13) is configured in - * Push Pull mode. - * @retval None - */ -void RTC_OutputTypeConfig(uint32_t RTC_OutputType) -{ - /* Check the parameters */ - assert_param(IS_RTC_OUTPUT_TYPE(RTC_OutputType)); - - RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_ALARMOUTTYPE); - RTC->TAFCR |= (uint32_t)(RTC_OutputType); -} - -/** - * @} - */ - -/** @defgroup RTC_Group12 Shift control synchronisation functions - * @brief Shift control synchronisation functions - * -@verbatim - =============================================================================== - ##### Shift control synchronisation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures the Synchronization Shift Control Settings. - * @note When REFCKON is set, firmware must not write to Shift control register - * @param RTC_ShiftAdd1S: Select to add or not 1 second to the time Calendar. - * This parameter can be one of the following values : - * @arg RTC_ShiftAdd1S_Set: Add one second to the clock calendar. - * @arg RTC_ShiftAdd1S_Reset: No effect. - * @param RTC_ShiftSubFS: Select the number of Second Fractions to Substitute. - * This parameter can be one any value from 0 to 0x7FFF. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Shift registers are configured - * - ERROR: RTC Shift registers are not configured -*/ -ErrorStatus RTC_SynchroShiftConfig(uint32_t RTC_ShiftAdd1S, uint32_t RTC_ShiftSubFS) -{ - ErrorStatus status = ERROR; - uint32_t shpfcount = 0; - - /* Check the parameters */ - assert_param(IS_RTC_SHIFT_ADD1S(RTC_ShiftAdd1S)); - assert_param(IS_RTC_SHIFT_SUBFS(RTC_ShiftSubFS)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Check if a Shift is pending*/ - if ((RTC->ISR & RTC_ISR_SHPF) != RESET) - { - /* Wait until the shift is completed*/ - while (((RTC->ISR & RTC_ISR_SHPF) != RESET) && (shpfcount != SHPF_TIMEOUT)) - { - shpfcount++; - } - } - - /* Check if the Shift pending is completed or if there is no Shift operation at all*/ - if ((RTC->ISR & RTC_ISR_SHPF) == RESET) - { - /* check if the reference clock detection is disabled */ - if((RTC->CR & RTC_CR_REFCKON) == RESET) - { - /* Configure the Shift settings */ - RTC->SHIFTR = (uint32_t)(uint32_t)(RTC_ShiftSubFS) | (uint32_t)(RTC_ShiftAdd1S); - - if(RTC_WaitForSynchro() == ERROR) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - } - else - { - status = ERROR; - } - } - else - { - status = ERROR; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return (ErrorStatus)(status); -} - -/** - * @} - */ - -/** @defgroup RTC_Group13 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== - [..] All RTC interrupts are connected to the EXTI controller. - - (+) To enable the RTC Alarm interrupt, the following sequence is required: - (++) Configure and enable the EXTI Line 17 in interrupt mode and select the rising - edge sensitivity using the EXTI_Init() function. - (++) Configure and enable the RTC_Alarm IRQ channel in the NVIC using the NVIC_Init() - function. - (++) Configure the RTC to generate RTC alarms (Alarm A) using - the RTC_SetAlarm() and RTC_AlarmCmd() functions. - - (+) To enable the RTC Tamper interrupt, the following sequence is required: - (++) Configure and enable the EXTI Line 19 in interrupt mode and select the rising - edge sensitivity using the EXTI_Init() function. - (++) Configure and enable the TAMP_STAMP IRQ channel in the NVIC using the NVIC_Init() - function. - (++) Configure the RTC to detect the RTC tamper event using the - RTC_TamperTriggerConfig() and RTC_TamperCmd() functions. - - (+) To enable the RTC TimeStamp interrupt, the following sequence is required: - (++) Configure and enable the EXTI Line 19 in interrupt mode and select the rising - edge sensitivity using the EXTI_Init() function. - (++) Configure and enable the TAMP_STAMP IRQ channel in the NVIC using the NVIC_Init() - function. - (++) Configure the RTC to detect the RTC time-stamp event using the - RTC_TimeStampCmd() functions. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified RTC interrupts. - * @param RTC_IT: specifies the RTC interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg RTC_IT_TS: Time Stamp interrupt mask - * @arg RTC_IT_WUT: WakeUp Timer interrupt mask, available only for STM32F072 devices - * @arg RTC_IT_ALRA: Alarm A interrupt mask - * @arg RTC_IT_TAMP: Tamper event interrupt mask - * @param NewState: new state of the specified RTC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RTC_CONFIG_IT(RTC_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - if (NewState != DISABLE) - { - /* Configure the Interrupts in the RTC_CR register */ - RTC->CR |= (uint32_t)(RTC_IT & ~RTC_TAFCR_TAMPIE); - /* Configure the Tamper Interrupt in the RTC_TAFCR */ - RTC->TAFCR |= (uint32_t)(RTC_IT & RTC_TAFCR_TAMPIE); - } - else - { - /* Configure the Interrupts in the RTC_CR register */ - RTC->CR &= (uint32_t)~(RTC_IT & (uint32_t)~RTC_TAFCR_TAMPIE); - /* Configure the Tamper Interrupt in the RTC_TAFCR */ - RTC->TAFCR &= (uint32_t)~(RTC_IT & RTC_TAFCR_TAMPIE); - } - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Checks whether the specified RTC flag is set or not. - * @param RTC_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg RTC_FLAG_RECALPF: RECALPF event flag - * @arg RTC_FLAG_TAMP2F: Tamper 2 event flag - * @arg RTC_FLAG_TAMP1F: Tamper 1 event flag - * @arg RTC_FLAG_TSOVF: Time Stamp OverFlow flag - * @arg RTC_FLAG_TSF: Time Stamp event flag - * @arg RTC_FLAG_WUTF: WakeUp Timer flag, available only for STM32F072 devices - * @arg RTC_FLAG_ALRAF: Alarm A flag - * @arg RTC_FLAG_INITF: Initialization mode flag - * @arg RTC_FLAG_RSF: Registers Synchronized flag - * @arg RTC_FLAG_INITS: Registers Configured flag - * @retval The new state of RTC_FLAG (SET or RESET). - */ -FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG) -{ - FlagStatus bitstatus = RESET; - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_GET_FLAG(RTC_FLAG)); - - /* Get all the flags */ - tmpreg = (uint32_t)(RTC->ISR & RTC_FLAGS_MASK); - - /* Return the status of the flag */ - if ((tmpreg & RTC_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the RTC's pending flags. - * @param RTC_FLAG: specifies the RTC flag to clear. - * This parameter can be any combination of the following values: - * @arg RTC_FLAG_TAMP2F: Tamper 2 event flag - * @arg RTC_FLAG_TAMP1F: Tamper 1 event flag - * @arg RTC_FLAG_TSOVF: Time Stamp Overflow flag - * @arg RTC_FLAG_TSF: Time Stamp event flag - * @arg RTC_FLAG_WUTF: WakeUp Timer flag, available only for STM32F072 devices - * @arg RTC_FLAG_ALRAF: Alarm A flag - * @arg RTC_FLAG_RSF: Registers Synchronized flag - * @retval None - */ -void RTC_ClearFlag(uint32_t RTC_FLAG) -{ - /* Check the parameters */ - assert_param(IS_RTC_CLEAR_FLAG(RTC_FLAG)); - - /* Clear the Flags in the RTC_ISR register */ - RTC->ISR = (uint32_t)((uint32_t)(~((RTC_FLAG | RTC_ISR_INIT)& 0x0001FFFF) | (uint32_t)(RTC->ISR & RTC_ISR_INIT))); -} - -/** - * @brief Checks whether the specified RTC interrupt has occurred or not. - * @param RTC_IT: specifies the RTC interrupt source to check. - * This parameter can be one of the following values: - * @arg RTC_IT_TS: Time Stamp interrupt - * @arg RTC_IT_WUT: WakeUp Timer interrupt, available only for STM32F072 devices - * @arg RTC_IT_ALRA: Alarm A interrupt - * @arg RTC_IT_TAMP1: Tamper1 event interrupt - * @arg RTC_IT_TAMP2: Tamper2 event interrupt - * @retval The new state of RTC_IT (SET or RESET). - */ -ITStatus RTC_GetITStatus(uint32_t RTC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t tmpreg = 0, enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_RTC_GET_IT(RTC_IT)); - - /* Get the TAMPER Interrupt enable bit and pending bit */ - tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE)); - - /* Get the Interrupt enable Status */ - enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & ((RTC_IT >> (RTC_IT >> 18)) >> 15))); - - /* Get the Interrupt pending bit */ - tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4))); - - /* Get the status of the Interrupt */ - if ((enablestatus != (uint32_t)RESET) && ((tmpreg & 0x0000FFFF) != (uint32_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the RTC's interrupt pending bits. - * @param RTC_IT: specifies the RTC interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg RTC_IT_TS: Time Stamp interrupt - * @arg RTC_IT_WUT: WakeUp Timer interrupt, available only for STM32F072 devices - * @arg RTC_IT_ALRA: Alarm A interrupt - * @arg RTC_IT_TAMP1: Tamper1 event interrupt - * @arg RTC_IT_TAMP2: Tamper2 event interrupt - * @retval None - */ -void RTC_ClearITPendingBit(uint32_t RTC_IT) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_CLEAR_IT(RTC_IT)); - - /* Get the RTC_ISR Interrupt pending bits mask */ - tmpreg = (uint32_t)(RTC_IT >> 4); - - /* Clear the interrupt pending bits in the RTC_ISR register */ - RTC->ISR = (uint32_t)((uint32_t)(~((tmpreg | RTC_ISR_INIT)& 0x0000FFFF) | (uint32_t)(RTC->ISR & RTC_ISR_INIT))); -} - -/** - * @} - */ - -/** - * @brief Converts a 2 digit decimal to BCD format. - * @param Value: Byte to be converted. - * @retval Converted byte - */ -static uint8_t RTC_ByteToBcd2(uint8_t Value) -{ - uint8_t bcdhigh = 0; - - while (Value >= 10) - { - bcdhigh++; - Value -= 10; - } - - return ((uint8_t)(bcdhigh << 4) | Value); -} - -/** - * @brief Convert from 2 digit BCD to Binary. - * @param Value: BCD value to be converted. - * @retval Converted word - */ -static uint8_t RTC_Bcd2ToByte(uint8_t Value) -{ - uint8_t tmp = 0; - tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10; - return (tmp + (Value & (uint8_t)0x0F)); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_spi.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_spi.c deleted file mode 100644 index e0c148b..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_spi.c +++ /dev/null @@ -1,1334 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_spi.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Serial peripheral interface (SPI): - * + Initialization and Configuration - * + Data transfers functions - * + Hardware CRC Calculation - * + DMA transfers management - * + Interrupts and flags management - * - * @verbatim - - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - (#) Enable peripheral clock using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE) - function for SPI1 or using RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE) - function for SPI2. - - (#) Enable SCK, MOSI, MISO and NSS GPIO clocks using - RCC_AHBPeriphClockCmd() function. - - (#) Peripherals alternate function: - (++) Connect the pin to the desired peripherals' Alternate - Function (AF) using GPIO_PinAFConfig() function. - (++) Configure the desired pin in alternate function by: - GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF. - (++) Select the type, pull-up/pull-down and output speed via - GPIO_PuPd, GPIO_OType and GPIO_Speed members. - (++) Call GPIO_Init() function. - - (#) Program the Polarity, Phase, First Data, Baud Rate Prescaler, Slave - Management, Peripheral Mode and CRC Polynomial values using the SPI_Init() - function.In I2S mode, program the Mode, Standard, Data Format, MCLK - Output, Audio frequency and Polarity using I2S_Init() function. - - (#) Configure the FIFO threshold using SPI_RxFIFOThresholdConfig() to select - at which threshold the RXNE event is generated. - - (#) Enable the NVIC and the corresponding interrupt using the function - SPI_ITConfig() if you need to use interrupt mode. - - (#) When using the DMA mode - (++) Configure the DMA using DMA_Init() function. - (++) Active the needed channel Request using SPI_I2S_DMACmd() function. - - (#) Enable the SPI using the SPI_Cmd() function or enable the I2S using - I2S_Cmd(). - - (#) Enable the DMA using the DMA_Cmd() function when using DMA mode. - - (#) Optionally, you can enable/configure the following parameters without - re-initialization (i.e there is no need to call again SPI_Init() function): - (++) When bidirectional mode (SPI_Direction_1Line_Rx or SPI_Direction_1Line_Tx) - is programmed as Data direction parameter using the SPI_Init() - function it can be possible to switch between SPI_Direction_Tx - or SPI_Direction_Rx using the SPI_BiDirectionalLineConfig() function. - (++) When SPI_NSS_Soft is selected as Slave Select Management parameter - using the SPI_Init() function it can be possible to manage the - NSS internal signal using the SPI_NSSInternalSoftwareConfig() function. - (++) Reconfigure the data size using the SPI_DataSizeConfig() function. - (++) Enable or disable the SS output using the SPI_SSOutputCmd() function. - - (#) To use the CRC Hardware calculation feature refer to the Peripheral - CRC hardware Calculation subsection. - - @endverbatim - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_spi.h" -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup SPI - * @brief SPI driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* SPI registers Masks */ -#define CR1_CLEAR_MASK ((uint16_t)0x3040) -#define CR1_CLEAR_MASK2 ((uint16_t)0xFFFB) -#define CR2_LDMA_MASK ((uint16_t)0x9FFF) - -#define I2SCFGR_CLEAR_Mask ((uint16_t)0xF040) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup SPI_Private_Functions - * @{ - */ - -/** @defgroup SPI_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides a set of functions allowing to initialize the SPI Direction, - SPI Mode, SPI Data Size, SPI Polarity, SPI Phase, SPI NSS Management, SPI Baud - Rate Prescaler, SPI First Bit and SPI CRC Polynomial. - - [..] The SPI_Init() function follows the SPI configuration procedures for Master mode - and Slave mode (details for these procedures are available in reference manual). - - [..] When the Software NSS management (SPI_InitStruct->SPI_NSS = SPI_NSS_Soft) is selected, - use the following function to manage the NSS bit: - void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft); - - [..] In Master mode, when the Hardware NSS management (SPI_InitStruct->SPI_NSS = SPI_NSS_Hard) - is selected, use the follwoing function to enable the NSS output feature. - void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState); - - [..] The NSS pulse mode can be managed by the SPI TI mode when enabling it using the following function: - void SPI_TIModeCmd(SPI_TypeDef* SPIx, FunctionalState NewState); - And it can be managed by software in the SPI Motorola mode using this function: - void SPI_NSSPulseModeCmd(SPI_TypeDef* SPIx, FunctionalState NewState); - - [..] This section provides also functions to initialize the I2S Mode, Standard, - Data Format, MCLK Output, Audio frequency and Polarity. - - [..] The I2S_Init() function follows the I2S configuration procedures for Master mode - and Slave mode. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the SPIx peripheral registers to their default - * reset values. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * I2S mode is not supported for STM32F030 devices. - * @retval None - */ -void SPI_I2S_DeInit(SPI_TypeDef* SPIx) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - if (SPIx == SPI1) - { - /* Enable SPI1 reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE); - /* Release SPI1 from reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE); - } - else - { - if (SPIx == SPI2) - { - /* Enable SPI2 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE); - /* Release SPI2 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE); - } - } -} - -/** - * @brief Fills each SPI_InitStruct member with its default value. - * @param SPI_InitStruct: pointer to a SPI_InitTypeDef structure which will be initialized. - * @retval None - */ -void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct) -{ -/*--------------- Reset SPI init structure parameters values -----------------*/ - /* Initialize the SPI_Direction member */ - SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex; - /* Initialize the SPI_Mode member */ - SPI_InitStruct->SPI_Mode = SPI_Mode_Slave; - /* Initialize the SPI_DataSize member */ - SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b; - /* Initialize the SPI_CPOL member */ - SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low; - /* Initialize the SPI_CPHA member */ - SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge; - /* Initialize the SPI_NSS member */ - SPI_InitStruct->SPI_NSS = SPI_NSS_Hard; - /* Initialize the SPI_BaudRatePrescaler member */ - SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; - /* Initialize the SPI_FirstBit member */ - SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB; - /* Initialize the SPI_CRCPolynomial member */ - SPI_InitStruct->SPI_CRCPolynomial = 7; -} - -/** - * @brief Initializes the SPIx peripheral according to the specified - * parameters in the SPI_InitStruct. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param SPI_InitStruct: pointer to a SPI_InitTypeDef structure that - * contains the configuration information for the specified SPI peripheral. - * @retval None - */ -void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct) -{ - uint16_t tmpreg = 0; - - /* check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - /* Check the SPI parameters */ - assert_param(IS_SPI_DIRECTION_MODE(SPI_InitStruct->SPI_Direction)); - assert_param(IS_SPI_MODE(SPI_InitStruct->SPI_Mode)); - assert_param(IS_SPI_DATA_SIZE(SPI_InitStruct->SPI_DataSize)); - assert_param(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL)); - assert_param(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA)); - assert_param(IS_SPI_NSS(SPI_InitStruct->SPI_NSS)); - assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_InitStruct->SPI_BaudRatePrescaler)); - assert_param(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit)); - assert_param(IS_SPI_CRC_POLYNOMIAL(SPI_InitStruct->SPI_CRCPolynomial)); - - /*---------------------------- SPIx CR1 Configuration ------------------------*/ - /* Get the SPIx CR1 value */ - tmpreg = SPIx->CR1; - /* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, CPOL and CPHA bits */ - tmpreg &= CR1_CLEAR_MASK; - /* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler - master/slave mode, CPOL and CPHA */ - /* Set BIDImode, BIDIOE and RxONLY bits according to SPI_Direction value */ - /* Set SSM, SSI bit according to SPI_NSS values */ - /* Set LSBFirst bit according to SPI_FirstBit value */ - /* Set BR bits according to SPI_BaudRatePrescaler value */ - /* Set CPOL bit according to SPI_CPOL value */ - /* Set CPHA bit according to SPI_CPHA value */ - tmpreg |= (uint16_t)((uint32_t)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_FirstBit | - SPI_InitStruct->SPI_CPOL | SPI_InitStruct->SPI_CPHA | - SPI_InitStruct->SPI_NSS | SPI_InitStruct->SPI_BaudRatePrescaler); - /* Write to SPIx CR1 */ - SPIx->CR1 = tmpreg; - /*-------------------------Data Size Configuration -----------------------*/ - /* Get the SPIx CR2 value */ - tmpreg = SPIx->CR2; - /* Clear DS[3:0] bits */ - tmpreg &=(uint16_t)~SPI_CR2_DS; - /* Configure SPIx: Data Size */ - tmpreg |= (uint16_t)(SPI_InitStruct->SPI_DataSize); - /* Write to SPIx CR2 */ - SPIx->CR2 = tmpreg; - - /*---------------------------- SPIx CRCPOLY Configuration --------------------*/ - /* Write to SPIx CRCPOLY */ - SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial; - - /*---------------------------- SPIx CR1 Configuration ------------------------*/ - /* Get the SPIx CR1 value */ - tmpreg = SPIx->CR1; - /* Clear MSTR bit */ - tmpreg &= CR1_CLEAR_MASK2; - /* Configure SPIx: master/slave mode */ - /* Set MSTR bit according to SPI_Mode */ - tmpreg |= (uint16_t)((uint32_t)SPI_InitStruct->SPI_Mode); - /* Write to SPIx CR1 */ - SPIx->CR1 = tmpreg; - - /* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */ - SPIx->I2SCFGR &= (uint16_t)~((uint16_t)SPI_I2SCFGR_I2SMOD); -} - -/** - * @brief Fills each I2S_InitStruct member with its default value. - * @note This mode is not supported for STM32F030 devices. - * @param I2S_InitStruct: pointer to a I2S_InitTypeDef structure which will be initialized. - * @retval None - */ -void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct) -{ -/*--------------- Reset I2S init structure parameters values -----------------*/ - /* Initialize the I2S_Mode member */ - I2S_InitStruct->I2S_Mode = I2S_Mode_SlaveTx; - - /* Initialize the I2S_Standard member */ - I2S_InitStruct->I2S_Standard = I2S_Standard_Phillips; - - /* Initialize the I2S_DataFormat member */ - I2S_InitStruct->I2S_DataFormat = I2S_DataFormat_16b; - - /* Initialize the I2S_MCLKOutput member */ - I2S_InitStruct->I2S_MCLKOutput = I2S_MCLKOutput_Disable; - - /* Initialize the I2S_AudioFreq member */ - I2S_InitStruct->I2S_AudioFreq = I2S_AudioFreq_Default; - - /* Initialize the I2S_CPOL member */ - I2S_InitStruct->I2S_CPOL = I2S_CPOL_Low; -} - -/** - * @brief Initializes the SPIx peripheral according to the specified - * parameters in the I2S_InitStruct. - * @note This mode is not supported for STM32F030 devices. - * @param SPIx: where x can be 1 to select the SPI peripheral (configured in I2S mode). - * @param I2S_InitStruct: pointer to an I2S_InitTypeDef structure that - * contains the configuration information for the specified SPI peripheral - * configured in I2S mode. - * @note This function calculates the optimal prescaler needed to obtain the most - * accurate audio frequency (depending on the I2S clock source, the PLL values - * and the product configuration). But in case the prescaler value is greater - * than 511, the default value (0x02) will be configured instead. - * @retval None - */ -void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct) -{ - uint16_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1; - uint32_t tmp = 0; - RCC_ClocksTypeDef RCC_Clocks; - uint32_t sourceclock = 0; - - /* Check the I2S parameters */ - assert_param(IS_SPI_1_PERIPH(SPIx)); - assert_param(IS_I2S_MODE(I2S_InitStruct->I2S_Mode)); - assert_param(IS_I2S_STANDARD(I2S_InitStruct->I2S_Standard)); - assert_param(IS_I2S_DATA_FORMAT(I2S_InitStruct->I2S_DataFormat)); - assert_param(IS_I2S_MCLK_OUTPUT(I2S_InitStruct->I2S_MCLKOutput)); - assert_param(IS_I2S_AUDIO_FREQ(I2S_InitStruct->I2S_AudioFreq)); - assert_param(IS_I2S_CPOL(I2S_InitStruct->I2S_CPOL)); - -/*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/ - /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ - SPIx->I2SCFGR &= I2SCFGR_CLEAR_Mask; - SPIx->I2SPR = 0x0002; - - /* Get the I2SCFGR register value */ - tmpreg = SPIx->I2SCFGR; - - /* If the default value has to be written, reinitialize i2sdiv and i2sodd*/ - if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_Default) - { - i2sodd = (uint16_t)0; - i2sdiv = (uint16_t)2; - } - /* If the requested audio frequency is not the default, compute the prescaler */ - else - { - /* Check the frame length (For the Prescaler computing) */ - if(I2S_InitStruct->I2S_DataFormat == I2S_DataFormat_16b) - { - /* Packet length is 16 bits */ - packetlength = 1; - } - else - { - /* Packet length is 32 bits */ - packetlength = 2; - } - - /* I2S Clock source is System clock: Get System Clock frequency */ - RCC_GetClocksFreq(&RCC_Clocks); - - /* Get the source clock value: based on System Clock value */ - sourceclock = RCC_Clocks.SYSCLK_Frequency; - - /* Compute the Real divider depending on the MCLK output state with a floating point */ - if(I2S_InitStruct->I2S_MCLKOutput == I2S_MCLKOutput_Enable) - { - /* MCLK output is enabled */ - tmp = (uint16_t)(((((sourceclock / 256) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5); - } - else - { - /* MCLK output is disabled */ - tmp = (uint16_t)(((((sourceclock / (32 * packetlength)) *10 ) / I2S_InitStruct->I2S_AudioFreq)) + 5); - } - - /* Remove the floating point */ - tmp = tmp / 10; - - /* Check the parity of the divider */ - i2sodd = (uint16_t)(tmp & (uint16_t)0x0001); - - /* Compute the i2sdiv prescaler */ - i2sdiv = (uint16_t)((tmp - i2sodd) / 2); - - /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ - i2sodd = (uint16_t) (i2sodd << 8); - } - - /* Test if the divider is 1 or 0 or greater than 0xFF */ - if ((i2sdiv < 2) || (i2sdiv > 0xFF)) - { - /* Set the default values */ - i2sdiv = 2; - i2sodd = 0; - } - - /* Write to SPIx I2SPR register the computed value */ - SPIx->I2SPR = (uint16_t)(i2sdiv | (uint16_t)(i2sodd | (uint16_t)I2S_InitStruct->I2S_MCLKOutput)); - - /* Configure the I2S with the SPI_InitStruct values */ - tmpreg |= (uint16_t)(SPI_I2SCFGR_I2SMOD | (uint16_t)(I2S_InitStruct->I2S_Mode | \ - (uint16_t)(I2S_InitStruct->I2S_Standard | (uint16_t)(I2S_InitStruct->I2S_DataFormat | \ - (uint16_t)I2S_InitStruct->I2S_CPOL)))); - - /* Write to SPIx I2SCFGR */ - SPIx->I2SCFGR = tmpreg; -} - -/** - * @brief Enables or disables the specified SPI peripheral. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param NewState: new state of the SPIx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected SPI peripheral */ - SPIx->CR1 |= SPI_CR1_SPE; - } - else - { - /* Disable the selected SPI peripheral */ - SPIx->CR1 &= (uint16_t)~((uint16_t)SPI_CR1_SPE); - } -} - -/** - * @brief Enables or disables the TI Mode. - * - * @note This function can be called only after the SPI_Init() function has - * been called. - * @note When TI mode is selected, the control bits SSM, SSI, CPOL and CPHA - * are not taken into consideration and are configured by hardware - * respectively to the TI mode requirements. - * - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param NewState: new state of the selected SPI TI communication mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_TIModeCmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the TI mode for the selected SPI peripheral */ - SPIx->CR2 |= SPI_CR2_FRF; - } - else - { - /* Disable the TI mode for the selected SPI peripheral */ - SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_FRF); - } -} - -/** - * @brief Enables or disables the specified SPI peripheral (in I2S mode). - * @note This mode is not supported for STM32F030 devices. - * @param SPIx: where x can be 1 to select the SPI peripheral. - * @param NewState: new state of the SPIx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_1_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected SPI peripheral in I2S mode */ - SPIx->I2SCFGR |= SPI_I2SCFGR_I2SE; - } - else - { - /* Disable the selected SPI peripheral in I2S mode */ - SPIx->I2SCFGR &= (uint16_t)~((uint16_t)SPI_I2SCFGR_I2SE); - } -} - -/** - * @brief Configures the data size for the selected SPI. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param SPI_DataSize: specifies the SPI data size. - * For the SPIx peripheral this parameter can be one of the following values: - * @arg SPI_DataSize_4b: Set data size to 4 bits - * @arg SPI_DataSize_5b: Set data size to 5 bits - * @arg SPI_DataSize_6b: Set data size to 6 bits - * @arg SPI_DataSize_7b: Set data size to 7 bits - * @arg SPI_DataSize_8b: Set data size to 8 bits - * @arg SPI_DataSize_9b: Set data size to 9 bits - * @arg SPI_DataSize_10b: Set data size to 10 bits - * @arg SPI_DataSize_11b: Set data size to 11 bits - * @arg SPI_DataSize_12b: Set data size to 12 bits - * @arg SPI_DataSize_13b: Set data size to 13 bits - * @arg SPI_DataSize_14b: Set data size to 14 bits - * @arg SPI_DataSize_15b: Set data size to 15 bits - * @arg SPI_DataSize_16b: Set data size to 16 bits - * @retval None - */ -void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize) -{ - uint16_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_DATA_SIZE(SPI_DataSize)); - /* Read the CR2 register */ - tmpreg = SPIx->CR2; - /* Clear DS[3:0] bits */ - tmpreg &= (uint16_t)~SPI_CR2_DS; - /* Set new DS[3:0] bits value */ - tmpreg |= SPI_DataSize; - SPIx->CR2 = tmpreg; -} - -/** - * @brief Configures the FIFO reception threshold for the selected SPI. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param SPI_RxFIFOThreshold: specifies the FIFO reception threshold. - * This parameter can be one of the following values: - * @arg SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO - * level is greater or equal to 1/2. - * @arg SPI_RxFIFOThreshold_QF: RXNE event is generated if the FIFO - * level is greater or equal to 1/4. - * @retval None - */ -void SPI_RxFIFOThresholdConfig(SPI_TypeDef* SPIx, uint16_t SPI_RxFIFOThreshold) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_RX_FIFO_THRESHOLD(SPI_RxFIFOThreshold)); - - /* Clear FRXTH bit */ - SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_FRXTH); - - /* Set new FRXTH bit value */ - SPIx->CR2 |= SPI_RxFIFOThreshold; -} - -/** - * @brief Selects the data transfer direction in bidirectional mode for the specified SPI. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param SPI_Direction: specifies the data transfer direction in bidirectional mode. - * This parameter can be one of the following values: - * @arg SPI_Direction_Tx: Selects Tx transmission direction - * @arg SPI_Direction_Rx: Selects Rx receive direction - * @retval None - */ -void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_DIRECTION(SPI_Direction)); - if (SPI_Direction == SPI_Direction_Tx) - { - /* Set the Tx only mode */ - SPIx->CR1 |= SPI_Direction_Tx; - } - else - { - /* Set the Rx only mode */ - SPIx->CR1 &= SPI_Direction_Rx; - } -} - -/** - * @brief Configures internally by software the NSS pin for the selected SPI. - * @note This function can be called only after the SPI_Init() function has - * been called. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param SPI_NSSInternalSoft: specifies the SPI NSS internal state. - * This parameter can be one of the following values: - * @arg SPI_NSSInternalSoft_Set: Set NSS pin internally - * @arg SPI_NSSInternalSoft_Reset: Reset NSS pin internally - * @retval None - */ -void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_NSS_INTERNAL(SPI_NSSInternalSoft)); - - if (SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset) - { - /* Set NSS pin internally by software */ - SPIx->CR1 |= SPI_NSSInternalSoft_Set; - } - else - { - /* Reset NSS pin internally by software */ - SPIx->CR1 &= SPI_NSSInternalSoft_Reset; - } -} - -/** - * @brief Enables or disables the SS output for the selected SPI. - * @note This function can be called only after the SPI_Init() function has - * been called and the NSS hardware management mode is selected. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param NewState: new state of the SPIx SS output. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected SPI SS output */ - SPIx->CR2 |= SPI_CR2_SSOE; - } - else - { - /* Disable the selected SPI SS output */ - SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_SSOE); - } -} - -/** - * @brief Enables or disables the NSS pulse management mode. - * @note This function can be called only after the SPI_Init() function has - * been called. - * @note When TI mode is selected, the control bits NSSP is not taken into - * consideration and are configured by hardware respectively to the - * TI mode requirements. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param NewState: new state of the NSS pulse management mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_NSSPulseModeCmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the NSS pulse management mode */ - SPIx->CR2 |= SPI_CR2_NSSP; - } - else - { - /* Disable the NSS pulse management mode */ - SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_NSSP); - } -} - -/** - * @} - */ - -/** @defgroup SPI_Group2 Data transfers functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### Data transfers functions ##### - =============================================================================== - [..] This section provides a set of functions allowing to manage the SPI or I2S - data transfers. - - [..] In reception, data are received and then stored into an internal Rx buffer while - In transmission, data are first stored into an internal Tx buffer before being - transmitted. - - [..] The read access of the SPI_DR register can be done using - SPI_ReceiveData8() (when data size is equal or inferior than 8bits) and. - SPI_I2S_ReceiveData16() (when data size is superior than 8bits)function - and returns the Rx buffered value. Whereas a write access to the SPI_DR - can be done using SPI_SendData8() (when data size is equal or inferior than 8bits) - and SPI_I2S_SendData16() (when data size is superior than 8bits) function - and stores the written data into Tx buffer. - -@endverbatim - * @{ - */ - -/** - * @brief Transmits a Data through the SPIx/I2Sx peripheral. - * @param SPIx: where x can be 1 or 2 in SPI mode to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param Data: Data to be transmitted. - * @retval None - */ -void SPI_SendData8(SPI_TypeDef* SPIx, uint8_t Data) -{ - uint32_t spixbase = 0x00; - - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - spixbase = (uint32_t)SPIx; - spixbase += 0x0C; - - *(__IO uint8_t *) spixbase = Data; -} - -/** - * @brief Transmits a Data through the SPIx/I2Sx peripheral. - * @param SPIx: where x can be 1 or 2 in SPI mode or 1 in I2S mode to select - * the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param Data: Data to be transmitted. - * @retval None - */ -void SPI_I2S_SendData16(SPI_TypeDef* SPIx, uint16_t Data) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - SPIx->DR = (uint16_t)Data; -} - -/** - * @brief Returns the most recent received data by the SPIx/I2Sx peripheral. - * @param SPIx: where x can be 1 or 2 in SPI mode to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @retval The value of the received data. - */ -uint8_t SPI_ReceiveData8(SPI_TypeDef* SPIx) -{ - uint32_t spixbase = 0x00; - - spixbase = (uint32_t)SPIx; - spixbase += 0x0C; - - return *(__IO uint8_t *) spixbase; -} - -/** - * @brief Returns the most recent received data by the SPIx peripheral. - * @param SPIx: where x can be 1 or 2 in SPI mode or 1 in I2S mode to select - * @note SPI2 is not available for STM32F031 devices. - * the SPI peripheral. - * @retval The value of the received data. - */ -uint16_t SPI_I2S_ReceiveData16(SPI_TypeDef* SPIx) -{ - return SPIx->DR; -} -/** - * @} - */ - -/** @defgroup SPI_Group3 Hardware CRC Calculation functions - * @brief Hardware CRC Calculation functions - * -@verbatim - =============================================================================== - ##### Hardware CRC Calculation functions ##### - =============================================================================== - [..] This section provides a set of functions allowing to manage the SPI CRC hardware - calculation.SPI communication using CRC is possible through the following procedure: - - (#) Program the Data direction, Polarity, Phase, First Data, Baud Rate Prescaler, - Slave Management, Peripheral Mode and CRC Polynomial values using the SPI_Init() - function. - (#) Enable the CRC calculation using the SPI_CalculateCRC() function. - (#) Enable the SPI using the SPI_Cmd() function - (#) Before writing the last data to the TX buffer, set the CRCNext bit using the - SPI_TransmitCRC() function to indicate that after transmission of the last - data, the CRC should be transmitted. - (#) After transmitting the last data, the SPI transmits the CRC. The SPI_CR1_CRCNEXT - bit is reset. The CRC is also received and compared against the SPI_RXCRCR - value. - If the value does not match, the SPI_FLAG_CRCERR flag is set and an interrupt - can be generated when the SPI_I2S_IT_ERR interrupt is enabled. - - -@- - (+@) It is advised to don't read the calculate CRC values during the communication. - (+@) When the SPI is in slave mode, be careful to enable CRC calculation only - when the clock is stable, that is, when the clock is in the steady state. - If not, a wrong CRC calculation may be done. In fact, the CRC is sensitive - to the SCK slave input clock as soon as CRCEN is set, and this, whatever - the value of the SPE bit. - (+@) With high bitrate frequencies, be careful when transmitting the CRC. - As the number of used CPU cycles has to be as low as possible in the CRC - transfer phase, it is forbidden to call software functions in the CRC - transmission sequence to avoid errors in the last data and CRC reception. - In fact, CRCNEXT bit has to be written before the end of the transmission/reception - of the last data. - (+@) For high bit rate frequencies, it is advised to use the DMA mode to avoid the - degradation of the SPI speed performance due to CPU accesses impacting the - SPI bandwidth. - (+@) When the STM32F0xx are configured as slaves and the NSS hardware mode is - used, the NSS pin needs to be kept low between the data phase and the CRC - phase. - (+@) When the SPI is configured in slave mode with the CRC feature enabled, CRC - calculation takes place even if a high level is applied on the NSS pin. - This may happen for example in case of a multislave environment where the - communication master addresses slaves alternately. - (+@) Between a slave deselection (high level on NSS) and a new slave selection - (low level on NSS), the CRC value should be cleared on both master and slave - sides in order to resynchronize the master and slave for their respective - CRC calculation. - - -@- To clear the CRC, follow the procedure below: - (#@) Disable SPI using the SPI_Cmd() function - (#@) Disable the CRC calculation using the SPI_CalculateCRC() function. - (#@) Enable the CRC calculation using the SPI_CalculateCRC() function. - (#@) Enable SPI using the SPI_Cmd() function. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the CRC calculation length for the selected SPI. - * @note This function can be called only after the SPI_Init() function has - * been called. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param SPI_CRCLength: specifies the SPI CRC calculation length. - * This parameter can be one of the following values: - * @arg SPI_CRCLength_8b: Set CRC Calculation to 8 bits - * @arg SPI_CRCLength_16b: Set CRC Calculation to 16 bits - * @retval None - */ -void SPI_CRCLengthConfig(SPI_TypeDef* SPIx, uint16_t SPI_CRCLength) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_CRC_LENGTH(SPI_CRCLength)); - - /* Clear CRCL bit */ - SPIx->CR1 &= (uint16_t)~((uint16_t)SPI_CR1_CRCL); - - /* Set new CRCL bit value */ - SPIx->CR1 |= SPI_CRCLength; -} - -/** - * @brief Enables or disables the CRC value calculation of the transferred bytes. - * @note This function can be called only after the SPI_Init() function has - * been called. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param NewState: new state of the SPIx CRC value calculation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected SPI CRC calculation */ - SPIx->CR1 |= SPI_CR1_CRCEN; - } - else - { - /* Disable the selected SPI CRC calculation */ - SPIx->CR1 &= (uint16_t)~((uint16_t)SPI_CR1_CRCEN); - } -} - -/** - * @brief Transmit the SPIx CRC value. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @retval None - */ -void SPI_TransmitCRC(SPI_TypeDef* SPIx) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - /* Enable the selected SPI CRC transmission */ - SPIx->CR1 |= SPI_CR1_CRCNEXT; -} - -/** - * @brief Returns the transmit or the receive CRC register value for the specified SPI. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param SPI_CRC: specifies the CRC register to be read. - * This parameter can be one of the following values: - * @arg SPI_CRC_Tx: Selects Tx CRC register - * @arg SPI_CRC_Rx: Selects Rx CRC register - * @retval The selected CRC register value.. - */ -uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC) -{ - uint16_t crcreg = 0; - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_CRC(SPI_CRC)); - - if (SPI_CRC != SPI_CRC_Rx) - { - /* Get the Tx CRC register */ - crcreg = SPIx->TXCRCR; - } - else - { - /* Get the Rx CRC register */ - crcreg = SPIx->RXCRCR; - } - /* Return the selected CRC register */ - return crcreg; -} - -/** - * @brief Returns the CRC Polynomial register value for the specified SPI. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @retval The CRC Polynomial register value. - */ -uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - /* Return the CRC polynomial register */ - return SPIx->CRCPR; -} - -/** - * @} - */ - -/** @defgroup SPI_Group4 DMA transfers management functions - * @brief DMA transfers management functions - * -@verbatim - =============================================================================== - ##### DMA transfers management functions ##### - =============================================================================== - [..] This section provides two functions that can be used only in DMA mode. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the SPIx/I2Sx DMA interface. - * @param SPIx: where x can be 1 or 2 in SPI mode or 1 in I2S mode to select - * the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * I2S mode is not supported for STM32F030 devices. - * @param SPI_I2S_DMAReq: specifies the SPI DMA transfer request to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg SPI_I2S_DMAReq_Tx: Tx buffer DMA transfer request - * @arg SPI_I2S_DMAReq_Rx: Rx buffer DMA transfer request - * @param NewState: new state of the selected SPI DMA transfer request. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_SPI_I2S_DMA_REQ(SPI_I2S_DMAReq)); - - if (NewState != DISABLE) - { - /* Enable the selected SPI DMA requests */ - SPIx->CR2 |= SPI_I2S_DMAReq; - } - else - { - /* Disable the selected SPI DMA requests */ - SPIx->CR2 &= (uint16_t)~SPI_I2S_DMAReq; - } -} - -/** - * @brief Configures the number of data to transfer type(Even/Odd) for the DMA - * last transfers and for the selected SPI. - * @note This function have a meaning only if DMA mode is selected and if - * the packing mode is used (data length <= 8 and DMA transfer size halfword) - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @param SPI_LastDMATransfer: specifies the SPI last DMA transfers state. - * This parameter can be one of the following values: - * @arg SPI_LastDMATransfer_TxEvenRxEven: Number of data for transmission Even - * and number of data for reception Even. - * @arg SPI_LastDMATransfer_TxOddRxEven: Number of data for transmission Odd - * and number of data for reception Even. - * @arg SPI_LastDMATransfer_TxEvenRxOdd: Number of data for transmission Even - * and number of data for reception Odd. - * @arg SPI_LastDMATransfer_TxOddRxOdd: Number of data for transmission Odd - * and number of data for reception Odd. - * @retval None - */ -void SPI_LastDMATransferCmd(SPI_TypeDef* SPIx, uint16_t SPI_LastDMATransfer) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_LAST_DMA_TRANSFER(SPI_LastDMATransfer)); - - /* Clear LDMA_TX and LDMA_RX bits */ - SPIx->CR2 &= CR2_LDMA_MASK; - - /* Set new LDMA_TX and LDMA_RX bits value */ - SPIx->CR2 |= SPI_LastDMATransfer; -} - -/** - * @} - */ - -/** @defgroup SPI_Group5 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== - [..] This section provides a set of functions allowing to configure the SPI/I2S Interrupts - sources and check or clear the flags or pending bits status. - The user should identify which mode will be used in his application to manage - the communication: Polling mode, Interrupt mode or DMA mode. - - *** Polling Mode *** - ==================== - [..] In Polling Mode, the SPI/I2S communication can be managed by 9 flags: - (#) SPI_I2S_FLAG_TXE : to indicate the status of the transmit buffer register - (#) SPI_I2S_FLAG_RXNE : to indicate the status of the receive buffer register - (#) SPI_I2S_FLAG_BSY : to indicate the state of the communication layer of the SPI. - (#) SPI_FLAG_CRCERR : to indicate if a CRC Calculation error occur - (#) SPI_FLAG_MODF : to indicate if a Mode Fault error occur - (#) SPI_I2S_FLAG_OVR : to indicate if an Overrun error occur - (#) SPI_I2S_FLAG_FRE: to indicate a Frame Format error occurs. - (#) I2S_FLAG_UDR: to indicate an Underrun error occurs. - (#) I2S_FLAG_CHSIDE: to indicate Channel Side. - - [..] - (@)Do not use the BSY flag to handle each data transmission or reception. It is better - to use the TXE and RXNE flags instead. - - [..] In this Mode it is advised to use the following functions: - (+) FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); - (+) void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); - - *** Interrupt Mode *** - ====================== - [..] In Interrupt Mode, the SPI/I2S communication can be managed by 3 interrupt sources - and 5 pending bits: - [..] Pending Bits: - (#) SPI_I2S_IT_TXE : to indicate the status of the transmit buffer register - (#) SPI_I2S_IT_RXNE : to indicate the status of the receive buffer register - (#) SPI_I2S_IT_OVR : to indicate if an Overrun error occur - (#) I2S_IT_UDR : to indicate an Underrun Error occurs. - (#) SPI_I2S_FLAG_FRE : to indicate a Frame Format error occurs. - - [..] Interrupt Source: - (#) SPI_I2S_IT_TXE: specifies the interrupt source for the Tx buffer empty - interrupt. - (#) SPI_I2S_IT_RXNE : specifies the interrupt source for the Rx buffer not - empty interrupt. - (#) SPI_I2S_IT_ERR : specifies the interrupt source for the errors interrupt. - - [..] In this Mode it is advised to use the following functions: - (+) void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); - (+) ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); - - *** FIFO Status *** - =================== - [..] It is possible to monitor the FIFO status when a transfer is ongoing using the - following function: - (+) uint32_t SPI_GetFIFOStatus(uint8_t SPI_FIFO_Direction); - - *** DMA Mode *** - ================ - [..] In DMA Mode, the SPI communication can be managed by 2 DMA Channel - requests: - (#) SPI_I2S_DMAReq_Tx: specifies the Tx buffer DMA transfer request. - (#) SPI_I2S_DMAReq_Rx: specifies the Rx buffer DMA transfer request. - - [..] In this Mode it is advised to use the following function: - (+) void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState). - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified SPI/I2S interrupts. - * @param SPIx: where x can be 1 or 2 in SPI mode or 1 in I2S mode to select - * the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * I2S mode is not supported for STM32F030 devices. - * @param SPI_I2S_IT: specifies the SPI interrupt source to be enabled or disabled. - * This parameter can be one of the following values: - * @arg SPI_I2S_IT_TXE: Tx buffer empty interrupt mask - * @arg SPI_I2S_IT_RXNE: Rx buffer not empty interrupt mask - * @arg SPI_I2S_IT_ERR: Error interrupt mask - * @param NewState: new state of the specified SPI interrupt. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState) -{ - uint16_t itpos = 0, itmask = 0 ; - - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_SPI_I2S_CONFIG_IT(SPI_I2S_IT)); - - /* Get the SPI IT index */ - itpos = SPI_I2S_IT >> 4; - - /* Set the IT mask */ - itmask = (uint16_t)1 << (uint16_t)itpos; - - if (NewState != DISABLE) - { - /* Enable the selected SPI interrupt */ - SPIx->CR2 |= itmask; - } - else - { - /* Disable the selected SPI interrupt */ - SPIx->CR2 &= (uint16_t)~itmask; - } -} - -/** - * @brief Returns the current SPIx Transmission FIFO filled level. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @retval The Transmission FIFO filling state. - * - SPI_TransmissionFIFOStatus_Empty: when FIFO is empty - * - SPI_TransmissionFIFOStatus_1QuarterFull: if more than 1 quarter-full. - * - SPI_TransmissionFIFOStatus_HalfFull: if more than 1 half-full. - * - SPI_TransmissionFIFOStatus_Full: when FIFO is full. - */ -uint16_t SPI_GetTransmissionFIFOStatus(SPI_TypeDef* SPIx) -{ - /* Get the SPIx Transmission FIFO level bits */ - return (uint16_t)((SPIx->SR & SPI_SR_FTLVL)); -} - -/** - * @brief Returns the current SPIx Reception FIFO filled level. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * @retval The Reception FIFO filling state. - * - SPI_ReceptionFIFOStatus_Empty: when FIFO is empty - * - SPI_ReceptionFIFOStatus_1QuarterFull: if more than 1 quarter-full. - * - SPI_ReceptionFIFOStatus_HalfFull: if more than 1 half-full. - * - SPI_ReceptionFIFOStatus_Full: when FIFO is full. - */ -uint16_t SPI_GetReceptionFIFOStatus(SPI_TypeDef* SPIx) -{ - /* Get the SPIx Reception FIFO level bits */ - return (uint16_t)((SPIx->SR & SPI_SR_FRLVL)); -} - -/** - * @brief Checks whether the specified SPI flag is set or not. - * @param SPIx: where x can be 1 or 2 in SPI mode or 1 in I2S mode to select - * the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * I2S mode is not supported for STM32F030 devices. - * @param SPI_I2S_FLAG: specifies the SPI flag to check. - * This parameter can be one of the following values: - * @arg SPI_I2S_FLAG_TXE: Transmit buffer empty flag. - * @arg SPI_I2S_FLAG_RXNE: Receive buffer not empty flag. - * @arg SPI_I2S_FLAG_BSY: Busy flag. - * @arg SPI_I2S_FLAG_OVR: Overrun flag. - * @arg SPI_FLAG_MODF: Mode Fault flag. - * @arg SPI_FLAG_CRCERR: CRC Error flag. - * @arg SPI_I2S_FLAG_FRE: TI frame format error flag. - * @arg I2S_FLAG_UDR: Underrun Error flag. - * @arg I2S_FLAG_CHSIDE: Channel Side flag. - * @retval The new state of SPI_I2S_FLAG (SET or RESET). - */ -FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_I2S_GET_FLAG(SPI_I2S_FLAG)); - - /* Check the status of the specified SPI flag */ - if ((SPIx->SR & SPI_I2S_FLAG) != (uint16_t)RESET) - { - /* SPI_I2S_FLAG is set */ - bitstatus = SET; - } - else - { - /* SPI_I2S_FLAG is reset */ - bitstatus = RESET; - } - /* Return the SPI_I2S_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the SPIx CRC Error (CRCERR) flag. - * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. - * @note SPI2 is not available for STM32F031 devices. - * I2S mode is not supported for STM32F030 devices. - * @param SPI_I2S_FLAG: specifies the SPI flag to clear. - * This function clears only CRCERR flag. - * @note OVR (OverRun error) flag is cleared by software sequence: a read - * operation to SPI_DR register (SPI_I2S_ReceiveData()) followed by - * a read operation to SPI_SR register (SPI_I2S_GetFlagStatus()). - * @note MODF (Mode Fault) flag is cleared by software sequence: a read/write - * operation to SPI_SR register (SPI_I2S_GetFlagStatus()) followed by - * a write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI). - * @retval None - */ -void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_CLEAR_FLAG(SPI_I2S_FLAG)); - - /* Clear the selected SPI CRC Error (CRCERR) flag */ - SPIx->SR = (uint16_t)~SPI_I2S_FLAG; -} - -/** - * @brief Checks whether the specified SPI/I2S interrupt has occurred or not. - * @param SPIx: where x can be 1 or 2 in SPI mode or 1 in I2S mode to select - * the SPI peripheral. - * @param SPI_I2S_IT: specifies the SPI interrupt source to check. - * This parameter can be one of the following values: - * @arg SPI_I2S_IT_TXE: Transmit buffer empty interrupt. - * @arg SPI_I2S_IT_RXNE: Receive buffer not empty interrupt. - * @arg SPI_IT_MODF: Mode Fault interrupt. - * @arg SPI_I2S_IT_OVR: Overrun interrupt. - * @arg I2S_IT_UDR: Underrun interrupt. - * @arg SPI_I2S_IT_FRE: Format Error interrupt. - * @retval The new state of SPI_I2S_IT (SET or RESET). - */ -ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) -{ - ITStatus bitstatus = RESET; - uint16_t itpos = 0, itmask = 0, enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_I2S_GET_IT(SPI_I2S_IT)); - - /* Get the SPI_I2S_IT index */ - itpos = 0x01 << (SPI_I2S_IT & 0x0F); - - /* Get the SPI_I2S_IT IT mask */ - itmask = SPI_I2S_IT >> 4; - - /* Set the IT mask */ - itmask = 0x01 << itmask; - - /* Get the SPI_I2S_IT enable bit status */ - enablestatus = (SPIx->CR2 & itmask) ; - - /* Check the status of the specified SPI interrupt */ - if (((SPIx->SR & itpos) != (uint16_t)RESET) && enablestatus) - { - /* SPI_I2S_IT is set */ - bitstatus = SET; - } - else - { - /* SPI_I2S_IT is reset */ - bitstatus = RESET; - } - /* Return the SPI_I2S_IT status */ - return bitstatus; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c deleted file mode 100644 index 518cf2a..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c +++ /dev/null @@ -1,320 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_syscfg.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the SYSCFG peripheral: - * + Remapping the memory mapped at 0x00000000 - * + Remapping the DMA channels - * + Enabling I2C fast mode plus driving capability for I2C pins - * + Configuring the EXTI lines connection to the GPIO port - * + Configuring the CFGR2 features (Connecting some internal signal - * to the break input of TIM1) - * - * @verbatim - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - The SYSCFG registers can be accessed only when the SYSCFG - interface APB clock is enabled. - To enable SYSCFG APB clock use: - RCC_APBPeriphClockCmd(RCC_APBPeriph_SYSCFG, ENABLE). - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_syscfg.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup SYSCFG - * @brief SYSCFG driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup SYSCFG_Private_Functions - * @{ - */ - -/** @defgroup SYSCFG_Group1 SYSCFG Initialization and Configuration functions - * @brief SYSCFG Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### SYSCFG Initialization and Configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the SYSCFG registers to their default reset values. - * @param None - * @retval None - * @note MEM_MODE bits are not affected by APB reset. - * @note MEM_MODE bits took the value from the user option bytes. - * @note CFGR2 register is not affected by APB reset. - * @note CLABBB configuration bits are locked when set. - * @note To unlock the configuration, perform a system reset. - */ -void SYSCFG_DeInit(void) -{ - /* Set SYSCFG_CFGR1 register to reset value without affecting MEM_MODE bits */ - SYSCFG->CFGR1 &= SYSCFG_CFGR1_MEM_MODE; - /* Set EXTICRx registers to reset value */ - SYSCFG->EXTICR[0] = 0; - SYSCFG->EXTICR[1] = 0; - SYSCFG->EXTICR[2] = 0; - SYSCFG->EXTICR[3] = 0; - /* Set CFGR2 register to reset value: clear SRAM parity error flag */ - SYSCFG->CFGR2 |= (uint32_t) SYSCFG_CFGR2_SRAM_PE; -} - -/** - * @brief Configures the memory mapping at address 0x00000000. - * @param SYSCFG_MemoryRemap: selects the memory remapping. - * This parameter can be one of the following values: - * @arg SYSCFG_MemoryRemap_Flash: Main Flash memory mapped at 0x00000000 - * @arg SYSCFG_MemoryRemap_SystemMemory: System Flash memory mapped at 0x00000000 - * @arg SYSCFG_MemoryRemap_SRAM: Embedded SRAM mapped at 0x00000000 - * @retval None - */ -void SYSCFG_MemoryRemapConfig(uint32_t SYSCFG_MemoryRemap) -{ - uint32_t tmpctrl = 0; - - /* Check the parameter */ - assert_param(IS_SYSCFG_MEMORY_REMAP(SYSCFG_MemoryRemap)); - - /* Get CFGR1 register value */ - tmpctrl = SYSCFG->CFGR1; - - /* Clear MEM_MODE bits */ - tmpctrl &= (uint32_t) (~SYSCFG_CFGR1_MEM_MODE); - - /* Set the new MEM_MODE bits value */ - tmpctrl |= (uint32_t) SYSCFG_MemoryRemap; - - /* Set CFGR1 register with the new memory remap configuration */ - SYSCFG->CFGR1 = tmpctrl; -} - -/** - * @brief Configure the DMA channels remapping. - * @param SYSCFG_DMARemap: selects the DMA channels remap. - * This parameter can be one of the following values: - * @arg SYSCFG_DMARemap_TIM17: Remap TIM17 DMA requests from channel1 to channel2 - * @arg SYSCFG_DMARemap_TIM16: Remap TIM16 DMA requests from channel3 to channel4 - * @arg SYSCFG_DMARemap_USART1Rx: Remap USART1 Rx DMA requests from channel3 to channel5 - * @arg SYSCFG_DMARemap_USART1Tx: Remap USART1 Tx DMA requests from channel2 to channel4 - * @arg SYSCFG_DMARemap_ADC1: Remap ADC1 DMA requests from channel1 to channel2 - * @param NewState: new state of the DMA channel remapping. - * This parameter can be: ENABLE or DISABLE. - * @note When enabled, DMA channel of the selected peripheral is remapped - * @note When disabled, Default DMA channel is mapped to the selected peripheral - * @note By default TIM17 DMA requests is mapped to channel 1, - * use SYSCFG_DMAChannelRemapConfig(SYSCFG_DMARemap_TIM17, Enable) to remap - * TIM17 DMA requests to channel 2 and use - * SYSCFG_DMAChannelRemapConfig(SYSCFG_DMARemap_TIM17, Disable) to map - * TIM17 DMA requests to channel 1 (default mapping) - * @retval None - */ -void SYSCFG_DMAChannelRemapConfig(uint32_t SYSCFG_DMARemap, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SYSCFG_DMA_REMAP(SYSCFG_DMARemap)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Remap the DMA channel */ - SYSCFG->CFGR1 |= (uint32_t)SYSCFG_DMARemap; - } - else - { - /* use the default DMA channel mapping */ - SYSCFG->CFGR1 &= (uint32_t)(~SYSCFG_DMARemap); - } -} - -/** - * @brief Configure the I2C fast mode plus driving capability. - * @param SYSCFG_I2CFastModePlus: selects the pin. - * This parameter can be one of the following values: - * @arg SYSCFG_I2CFastModePlus_PB6: Configure fast mode plus driving capability for PB6 - * @arg SYSCFG_I2CFastModePlus_PB7: Configure fast mode plus driving capability for PB7 - * @arg SYSCFG_I2CFastModePlus_PB8: Configure fast mode plus driving capability for PB8 - * @arg SYSCFG_I2CFastModePlus_PB9: Configure fast mode plus driving capability for PB9 - * @arg SYSCFG_I2CFastModePlus_PA9: Configure fast mode plus driving capability for PA9 (only for STM32F031 and STM32F030 devices) - * @arg SYSCFG_I2CFastModePlus_PA10: Configure fast mode plus driving capability for PA10 (only for STM32F031 and STM32F030 devices) - * @arg SYSCFG_I2CFastModePlus_I2C1: Configure fast mode plus driving capability for PB10, PB11, PF6 and PF7(only for STM32F031 and STM32F030 devices) - * @arg SYSCFG_I2CFastModePlus_I2C2: Configure fast mode plus driving capability for I2C2 pins, available only for STM32F072 devices - * - * @param NewState: new state of the DMA channel remapping. - * This parameter can be: ENABLE or DISABLE. - * @note ENABLE: Enable fast mode plus driving capability for selected I2C pin - * @note DISABLE: Disable fast mode plus driving capability for selected I2C pin - * @note For I2C1, fast mode plus driving capability can be enabled on all selected - * I2C1 pins using SYSCFG_I2CFastModePlus_I2C1 parameter or independently - * on each one of the following pins PB6, PB7, PB8 and PB9. - * @note For remaing I2C1 pins (PA14, PA15...) fast mode plus driving capability - * can be enabled only by using SYSCFG_I2CFastModePlus_I2C1 parameter. - * @note For all I2C2 pins fast mode plus driving capability can be enabled - * only by using SYSCFG_I2CFastModePlus_I2C2 parameter. - * @retval None - */ -void SYSCFG_I2CFastModePlusConfig(uint32_t SYSCFG_I2CFastModePlus, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SYSCFG_I2C_FMP(SYSCFG_I2CFastModePlus)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable fast mode plus driving capability for selected pin */ - SYSCFG->CFGR1 |= (uint32_t)SYSCFG_I2CFastModePlus; - } - else - { - /* Disable fast mode plus driving capability for selected pin */ - SYSCFG->CFGR1 &= (uint32_t)(~SYSCFG_I2CFastModePlus); - } -} - -/** - * @brief Selects the GPIO pin used as EXTI Line. - * @param EXTI_PortSourceGPIOx: selects the GPIO port to be used as source - * for EXTI lines where x can be (A, B, C, D, E or F). - * @note GPIOE is available only for STM32F072. - * @note GPIOD is not available for STM32F031. - * @param EXTI_PinSourcex: specifies the EXTI line to be configured. - * @note This parameter can be EXTI_PinSourcex where x can be: - * For STM32F051 and STM32F030: (0..15) for GPIOA, GPIOB, GPIOC, (2) for GPIOD and (0..1, 4..7) for GIIOF. - * For STM32F072: (0..15) for GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, (0..10) for GPIOF. - * For STM32F031: (0..15) for GPIOA, GPIOB, (13..15) for GPIOC and (0..1, 6..7) for GPIOF. - * @retval None - */ -void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex) -{ - uint32_t tmp = 0x00; - - /* Check the parameters */ - assert_param(IS_EXTI_PORT_SOURCE(EXTI_PortSourceGPIOx)); - assert_param(IS_EXTI_PIN_SOURCE(EXTI_PinSourcex)); - - tmp = ((uint32_t)0x0F) << (0x04 * (EXTI_PinSourcex & (uint8_t)0x03)); - SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02] &= ~tmp; - SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02] |= (((uint32_t)EXTI_PortSourceGPIOx) << (0x04 * (EXTI_PinSourcex & (uint8_t)0x03))); -} - -/** - * @brief Connect the selected parameter to the break input of TIM1. - * @note The selected configuration is locked and can be unlocked by system reset - * @param SYSCFG_Break: selects the configuration to be connected to break - * input of TIM1 - * This parameter can be any combination of the following values: - * @arg SYSCFG_Break_PVD: Connects the PVD event to the Break Input of TIM1,, not avaailable for STM32F030 devices. - * @arg SYSCFG_Break_SRAMParity: Connects the SRAM_PARITY error signal to the Break Input of TIM1 . - * @arg SYSCFG_Break_Lockup: Connects Lockup output of CortexM0 to the break input of TIM1. - * @retval None - */ -void SYSCFG_BreakConfig(uint32_t SYSCFG_Break) -{ - /* Check the parameter */ - assert_param(IS_SYSCFG_LOCK_CONFIG(SYSCFG_Break)); - - SYSCFG->CFGR2 |= (uint32_t) SYSCFG_Break; -} - -/** - * @brief Checks whether the specified SYSCFG flag is set or not. - * @param SYSCFG_Flag: specifies the SYSCFG flag to check. - * This parameter can be one of the following values: - * @arg SYSCFG_FLAG_PE: SRAM parity error flag. - * @retval The new state of SYSCFG_Flag (SET or RESET). - */ -FlagStatus SYSCFG_GetFlagStatus(uint32_t SYSCFG_Flag) -{ - FlagStatus bitstatus = RESET; - - /* Check the parameter */ - assert_param(IS_SYSCFG_FLAG(SYSCFG_Flag)); - - /* Check the status of the specified SPI flag */ - if ((SYSCFG->CFGR2 & SYSCFG_CFGR2_SRAM_PE) != (uint32_t)RESET) - { - /* SYSCFG_Flag is set */ - bitstatus = SET; - } - else - { - /* SYSCFG_Flag is reset */ - bitstatus = RESET; - } - /* Return the SYSCFG_Flag status */ - return bitstatus; -} - -/** - * @brief Clear the selected SYSCFG flag. - * @param SYSCFG_Flag: selects the flag to be cleared. - * This parameter can be any combination of the following values: - * @arg SYSCFG_FLAG_PE: SRAM parity error flag. - * @retval None - */ -void SYSCFG_ClearFlag(uint32_t SYSCFG_Flag) -{ - /* Check the parameter */ - assert_param(IS_SYSCFG_FLAG(SYSCFG_Flag)); - - SYSCFG->CFGR2 |= (uint32_t) SYSCFG_Flag; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_tim.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_tim.c deleted file mode 100644 index f7b4287..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_tim.c +++ /dev/null @@ -1,3349 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_tim.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the TIM peripheral: - * + TimeBase management - * + Output Compare management - * + Input Capture management - * + Interrupts, DMA and flags management - * + Clocks management - * + Synchronization management - * + Specific interface management - * + Specific remapping management - * - * @verbatim - - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] This driver provides functions to configure and program the TIM - of all STM32F0xx devices These functions are split in 8 groups: - (#) TIM TimeBase management: this group includes all needed functions - to configure the TM Timebase unit: - (++) Set/Get Prescaler. - (++) Set/Get Autoreload. - (++) Counter modes configuration. - (++) Set Clock division. - (++) Select the One Pulse mode. - (++) Update Request Configuration. - (++) Update Disable Configuration. - (++) Auto-Preload Configuration. - (++) Enable/Disable the counter. - - (#) TIM Output Compare management: this group includes all needed - functions to configure the Capture/Compare unit used in Output - compare mode: - (++) Configure each channel, independently, in Output Compare mode. - (++) Select the output compare modes. - (++) Select the Polarities of each channel. - (++) Set/Get the Capture/Compare register values. - (++) Select the Output Compare Fast mode. - (++) Select the Output Compare Forced mode. - (++) Output Compare-Preload Configuration. - (++) Clear Output Compare Reference. - (++) Select the OCREF Clear signal. - (++) Enable/Disable the Capture/Compare Channels. - - (#) TIM Input Capture management: this group includes all needed - functions to configure the Capture/Compare unit used in - Input Capture mode: - (++) Configure each channel in input capture mode. - (++) Configure Channel1/2 in PWM Input mode. - (++) Set the Input Capture Prescaler. - (++) Get the Capture/Compare values. - - (#) Advanced-control timers (TIM1) specific features - (++) Configures the Break input, dead time, Lock level, the OSSI, - the OSSR State and the AOE(automatic output enable) - (++) Enable/Disable the TIM peripheral Main Outputs - (++) Select the Commutation event - (++) Set/Reset the Capture Compare Preload Control bit - - (#) TIM interrupts, DMA and flags management. - (++) Enable/Disable interrupt sources. - (++) Get flags status. - (++) Clear flags/ Pending bits. - (++) Enable/Disable DMA requests. - (++) Configure DMA burst mode. - (++) Select CaptureCompare DMA request. - - (#) TIM clocks management: this group includes all needed functions - to configure the clock controller unit: - (++) Select internal/External clock. - (++) Select the external clock mode: ETR(Mode1/Mode2), TIx or ITRx. - - (#) TIM synchronization management: this group includes all needed. - functions to configure the Synchronization unit: - (++) Select Input Trigger. - (++) Select Output Trigger. - (++) Select Master Slave Mode. - (++) ETR Configuration when used as external trigger. - - (#) TIM specific interface management, this group includes all - needed functions to use the specific TIM interface: - (++) Encoder Interface Configuration. - (++) Select Hall Sensor. - - (#) TIM specific remapping management includes the Remapping - configuration of specific timers - -@endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_tim.h" -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup TIM - * @brief TIM driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* ---------------------- TIM registers bit mask ------------------------ */ -#define SMCR_ETR_MASK ((uint16_t)0x00FF) -#define CCMR_OFFSET ((uint16_t)0x0018) -#define CCER_CCE_SET ((uint16_t)0x0001) -#define CCER_CCNE_SET ((uint16_t)0x0004) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ - -static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); -static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); -static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); -static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup TIM_Private_Functions - * @{ - */ - -/** @defgroup TIM_Group1 TimeBase management functions - * @brief TimeBase management functions - * -@verbatim - =============================================================================== - ##### TimeBase management functions ##### - =============================================================================== - - *** TIM Driver: how to use it in Timing(Time base) Mode *** - =============================================================================== - [..] To use the Timer in Timing(Time base) mode, the following steps are - mandatory: - (#) Enable TIM clock using - RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) function. - (#) Fill the TIM_TimeBaseInitStruct with the desired parameters. - (#) Call TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStruct) to configure - the Time Base unit with the corresponding configuration. - (#) Enable the NVIC if you need to generate the update interrupt. - (#) Enable the corresponding interrupt using the function - TIM_ITConfig(TIMx, TIM_IT_Update). - (#) Call the TIM_Cmd(ENABLE) function to enable the TIM counter. - [..] - (@) All other functions can be used seperatly to modify, if needed, - a specific feature of the Timer. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the TIMx peripheral registers to their default reset values. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17 to select the TIM peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @retval None - * - */ -void TIM_DeInit(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - if (TIMx == TIM1) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE); - } - else if (TIMx == TIM2) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE); - } - else if (TIMx == TIM3) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE); - } - else if (TIMx == TIM6) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE); - } - else if (TIMx == TIM7) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE); - } - else if (TIMx == TIM14) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM14, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM14, DISABLE); - } - else if (TIMx == TIM15) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM15, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM15, DISABLE); - } - else if (TIMx == TIM16) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM16, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM16, DISABLE); - } - else - { - if (TIMx == TIM17) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM17, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM17, DISABLE); - } - } - -} - -/** - * @brief Initializes the TIMx Time Base Unit peripheral according to - * the specified parameters in the TIM_TimeBaseInitStruct. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17 to select the TIM - * peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef - * structure that contains the configuration information for - * the specified TIM peripheral. - * @retval None - */ -void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) -{ - uint16_t tmpcr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode)); - assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision)); - - tmpcr1 = TIMx->CR1; - - if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3)) - { - /* Select the Counter Mode */ - tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS))); - tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode; - } - - if(TIMx != TIM6) - { - /* Set the clock division */ - tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD)); - tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision; - } - - TIMx->CR1 = tmpcr1; - - /* Set the Autoreload value */ - TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ; - - /* Set the Prescaler value */ - TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler; - - if ((TIMx == TIM1) || (TIMx == TIM15)|| (TIMx == TIM16) || (TIMx == TIM17)) - { - /* Set the Repetition Counter value */ - TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter; - } - - /* Generate an update event to reload the Prescaler and the Repetition counter - values immediately */ - TIMx->EGR = TIM_PSCReloadMode_Immediate; -} - -/** - * @brief Fills each TIM_TimeBaseInitStruct member with its default value. - * @param TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef structure - * which will be initialized. - * @retval None - */ -void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) -{ - /* Set the default configuration */ - TIM_TimeBaseInitStruct->TIM_Period = 0xFFFFFFFF; - TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000; - TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1; - TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseInitStruct->TIM_RepetitionCounter = 0x0000; -} - -/** - * @brief Configures the TIMx Prescaler. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17 to select the TIM peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param Prescaler: specifies the Prescaler Register value - * @param TIM_PSCReloadMode: specifies the TIM Prescaler Reload mode - * This parameter can be one of the following values: - * @arg TIM_PSCReloadMode_Update: The Prescaler is loaded at the update event. - * @arg TIM_PSCReloadMode_Immediate: The Prescaler is loaded immediatly. - * @retval None - */ -void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_PRESCALER_RELOAD(TIM_PSCReloadMode)); - - /* Set the Prescaler value */ - TIMx->PSC = Prescaler; - /* Set or reset the UG Bit */ - TIMx->EGR = TIM_PSCReloadMode; -} - -/** - * @brief Specifies the TIMx Counter Mode to be used. - * @param TIMx: where x can be 1, 2, or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_CounterMode: specifies the Counter Mode to be used - * This parameter can be one of the following values: - * @arg TIM_CounterMode_Up: TIM Up Counting Mode - * @arg TIM_CounterMode_Down: TIM Down Counting Mode - * @arg TIM_CounterMode_CenterAligned1: TIM Center Aligned Mode1 - * @arg TIM_CounterMode_CenterAligned2: TIM Center Aligned Mode2 - * @arg TIM_CounterMode_CenterAligned3: TIM Center Aligned Mode3 - * @retval None - */ -void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode) -{ - uint16_t tmpcr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_COUNTER_MODE(TIM_CounterMode)); - - tmpcr1 = TIMx->CR1; - /* Reset the CMS and DIR Bits */ - tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS))); - /* Set the Counter Mode */ - tmpcr1 |= TIM_CounterMode; - /* Write to TIMx CR1 register */ - TIMx->CR1 = tmpcr1; -} - -/** - * @brief Sets the TIMx Counter Register value - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17 to select the TIM - * peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param Counter: specifies the Counter register new value. - * @retval None - */ -void TIM_SetCounter(TIM_TypeDef* TIMx, uint32_t Counter) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - /* Set the Counter Register value */ - TIMx->CNT = Counter; -} - -/** - * @brief Sets the TIMx Autoreload Register value - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17 to select the TIM peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param Autoreload: specifies the Autoreload register new value. - * @retval None - */ -void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint32_t Autoreload) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - /* Set the Autoreload Register value */ - TIMx->ARR = Autoreload; -} - -/** - * @brief Gets the TIMx Counter value. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17 to select the TIM - * peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @retval Counter Register value. - */ -uint32_t TIM_GetCounter(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - /* Get the Counter Register value */ - return TIMx->CNT; -} - -/** - * @brief Gets the TIMx Prescaler value. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17 to select the TIM - * peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @retval Prescaler Register value. - */ -uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - /* Get the Prescaler Register value */ - return TIMx->PSC; -} - -/** - * @brief Enables or Disables the TIMx Update event. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17 to select the TIM - * peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param NewState: new state of the TIMx UDIS bit - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Set the Update Disable Bit */ - TIMx->CR1 |= TIM_CR1_UDIS; - } - else - { - /* Reset the Update Disable Bit */ - TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_UDIS); - } -} - -/** - * @brief Configures the TIMx Update Request Interrupt source. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17 to select the TIM - * peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_UpdateSource: specifies the Update source. - * This parameter can be one of the following values: - * @arg TIM_UpdateSource_Regular: Source of update is the counter - * overflow/underflow or the setting of UG bit, or an update - * generation through the slave mode controller. - * @arg TIM_UpdateSource_Global: Source of update is counter overflow/underflow. - * @retval None - */ -void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_UPDATE_SOURCE(TIM_UpdateSource)); - - if (TIM_UpdateSource != TIM_UpdateSource_Global) - { - /* Set the URS Bit */ - TIMx->CR1 |= TIM_CR1_URS; - } - else - { - /* Reset the URS Bit */ - TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_URS); - } -} - -/** - * @brief Enables or disables TIMx peripheral Preload register on ARR. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17 to select the TIM - * peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param NewState: new state of the TIMx peripheral Preload register - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Set the ARR Preload Bit */ - TIMx->CR1 |= TIM_CR1_ARPE; - } - else - { - /* Reset the ARR Preload Bit */ - TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_ARPE); - } -} - -/** - * @brief Selects the TIMx's One Pulse Mode. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17 to select the TIM - * peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OPMode: specifies the OPM Mode to be used. - * This parameter can be one of the following values: - * @arg TIM_OPMode_Single - * @arg TIM_OPMode_Repetitive - * @retval None - */ -void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_OPM_MODE(TIM_OPMode)); - - /* Reset the OPM Bit */ - TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_OPM); - /* Configure the OPM Mode */ - TIMx->CR1 |= TIM_OPMode; -} - -/** - * @brief Sets the TIMx Clock Division value. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 and 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_CKD: specifies the clock division value. - * This parameter can be one of the following value: - * @arg TIM_CKD_DIV1: TDTS = Tck_tim - * @arg TIM_CKD_DIV2: TDTS = 2*Tck_tim - * @arg TIM_CKD_DIV4: TDTS = 4*Tck_tim - * @retval None - */ -void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_CKD_DIV(TIM_CKD)); - - /* Reset the CKD Bits */ - TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_CKD); - /* Set the CKD value */ - TIMx->CR1 |= TIM_CKD; -} - -/** - * @brief Enables or disables the specified TIM peripheral. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 and 17to select the TIMx - * peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param NewState: new state of the TIMx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the TIM Counter */ - TIMx->CR1 |= TIM_CR1_CEN; - } - else - { - /* Disable the TIM Counter */ - TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN)); - } -} - -/** - * @} - */ - -/** @defgroup TIM_Group2 Advanced-control timers (TIM1) specific features - * @brief Advanced-control timers (TIM1) specific features - * -@verbatim - =============================================================================== - ##### Advanced-control timers (TIM1) specific features ##### - =============================================================================== - - =================================================================== - *** TIM Driver: how to use the Break feature *** - =================================================================== - [..] After configuring the Timer channel(s) in the appropriate Output Compare mode: - - (#) Fill the TIM_BDTRInitStruct with the desired parameters for the Timer - Break Polarity, dead time, Lock level, the OSSI/OSSR State and the - AOE(automatic output enable). - - (#) Call TIM_BDTRConfig(TIMx, &TIM_BDTRInitStruct) to configure the Timer - - (#) Enable the Main Output using TIM_CtrlPWMOutputs(TIM1, ENABLE) - - (#) Once the break even occurs, the Timer's output signals are put in reset - state or in a known state (according to the configuration made in - TIM_BDTRConfig() function). - -@endverbatim - * @{ - */ -/** - * @brief Configures the: Break feature, dead time, Lock level, OSSI/OSSR State - * and the AOE(automatic output enable). - * @param TIMx: where x can be 1, 15, 16 or 17 to select the TIM - * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure that - * contains the BDTR Register configuration information for the TIM peripheral. - * @retval None - */ -void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_OSSR_STATE(TIM_BDTRInitStruct->TIM_OSSRState)); - assert_param(IS_TIM_OSSI_STATE(TIM_BDTRInitStruct->TIM_OSSIState)); - assert_param(IS_TIM_LOCK_LEVEL(TIM_BDTRInitStruct->TIM_LOCKLevel)); - assert_param(IS_TIM_BREAK_STATE(TIM_BDTRInitStruct->TIM_Break)); - assert_param(IS_TIM_BREAK_POLARITY(TIM_BDTRInitStruct->TIM_BreakPolarity)); - assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(TIM_BDTRInitStruct->TIM_AutomaticOutput)); - /* Set the Lock level, the Break enable Bit and the Ploarity, the OSSR State, - the OSSI State, the dead time value and the Automatic Output Enable Bit */ - TIMx->BDTR = (uint32_t)TIM_BDTRInitStruct->TIM_OSSRState | TIM_BDTRInitStruct->TIM_OSSIState | - TIM_BDTRInitStruct->TIM_LOCKLevel | TIM_BDTRInitStruct->TIM_DeadTime | - TIM_BDTRInitStruct->TIM_Break | TIM_BDTRInitStruct->TIM_BreakPolarity | - TIM_BDTRInitStruct->TIM_AutomaticOutput; -} - -/** - * @brief Fills each TIM_BDTRInitStruct member with its default value. - * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure which - * will be initialized. - * @retval None - */ -void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct) -{ - /* Set the default configuration */ - TIM_BDTRInitStruct->TIM_OSSRState = TIM_OSSRState_Disable; - TIM_BDTRInitStruct->TIM_OSSIState = TIM_OSSIState_Disable; - TIM_BDTRInitStruct->TIM_LOCKLevel = TIM_LOCKLevel_OFF; - TIM_BDTRInitStruct->TIM_DeadTime = 0x00; - TIM_BDTRInitStruct->TIM_Break = TIM_Break_Disable; - TIM_BDTRInitStruct->TIM_BreakPolarity = TIM_BreakPolarity_Low; - TIM_BDTRInitStruct->TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; -} - -/** - * @brief Enables or disables the TIM peripheral Main Outputs. - * @param TIMx: where x can be 1, 15, 16 or 17 to select the TIMx peripheral. - * @param NewState: new state of the TIM peripheral Main Outputs. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the TIM Main Output */ - TIMx->BDTR |= TIM_BDTR_MOE; - } - else - { - /* Disable the TIM Main Output */ - TIMx->BDTR &= (uint16_t)(~((uint16_t)TIM_BDTR_MOE)); - } -} - -/** - * @} - */ - -/** @defgroup TIM_Group3 Output Compare management functions - * @brief Output Compare management functions - * -@verbatim - =============================================================================== - ##### Output Compare management functions ##### - =============================================================================== - *** TIM Driver: how to use it in Output Compare Mode *** - =============================================================================== - [..] To use the Timer in Output Compare mode, the following steps are mandatory: - (#) Enable TIM clock using - RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) function. - (#) Configure the TIM pins by configuring the corresponding GPIO pins - (#) Configure the Time base unit as described in the first part of this - driver, if needed, else the Timer will run with the default - configuration: - (++) Autoreload value = 0xFFFF. - (++) Prescaler value = 0x0000. - (++) Counter mode = Up counting. - (++) Clock Division = TIM_CKD_DIV1. - (#) Fill the TIM_OCInitStruct with the desired parameters including: - (++) The TIM Output Compare mode: TIM_OCMode. - (++) TIM Output State: TIM_OutputState. - (++) TIM Pulse value: TIM_Pulse. - (++) TIM Output Compare Polarity : TIM_OCPolarity. - (#) Call TIM_OCxInit(TIMx, &TIM_OCInitStruct) to configure the desired - channel with the corresponding configuration. - (#) Call the TIM_Cmd(ENABLE) function to enable the TIM counter. - [..] - (@) All other functions can be used separately to modify, if needed, - a specific feature of the Timer. - (@) In case of PWM mode, this function is mandatory: - TIM_OCxPreloadConfig(TIMx, TIM_OCPreload_ENABLE). - (@) If the corresponding interrupt or DMA request are needed, the user should: - (#@) Enable the NVIC (or the DMA) to use the TIM interrupts (or DMA requests). - (#@) Enable the corresponding interrupt (or DMA request) using the function - TIM_ITConfig(TIMx, TIM_IT_CCx) (or TIM_DMA_Cmd(TIMx, TIM_DMA_CCx)). - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the TIMx Channel1 according to the specified - * parameters in the TIM_OCInitStruct. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 and 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure - * that contains the configuration information for the specified TIM - * peripheral. - * @retval None - */ -void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= (uint16_t)(~(uint16_t)TIM_CCER_CC1E); - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare Mode Bits */ - tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC1M)); - tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_CC1S)); - - /* Select the Output Compare Mode */ - tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1P)); - /* Set the Output Compare Polarity */ - tmpccer |= TIM_OCInitStruct->TIM_OCPolarity; - - /* Set the Output State */ - tmpccer |= TIM_OCInitStruct->TIM_OutputState; - - if((TIMx == TIM1) || (TIMx == TIM15) || (TIMx == TIM16) || (TIMx == TIM17)) - { - assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); - assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - - /* Reset the Output N Polarity level */ - tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1NP)); - /* Set the Output N Polarity */ - tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity; - - /* Reset the Output N State */ - tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1NE)); - /* Set the Output N State */ - tmpccer |= TIM_OCInitStruct->TIM_OutputNState; - - /* Reset the Ouput Compare and Output Compare N IDLE State */ - tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS1)); - tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS1N)); - - /* Set the Output Idle state */ - tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState; - /* Set the Output N Idle state */ - tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState; - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Initializes the TIMx Channel2 according to the specified - * parameters in the TIM_OCInitStruct. - * @param TIMx: where x can be 1, 2, 3 or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure - * that contains the configuration information for the specified TIM - * peripheral. - * @retval None - */ -void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC2E)); - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC2M)); - tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_CC2S)); - - /* Select the Output Compare Mode */ - tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); - - /* Reset the Output Polarity level */ - tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2P)); - /* Set the Output Compare Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4); - - /* Set the Output State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4); - - if((TIMx == TIM1) || (TIMx == TIM15)) - { - /* Check the parameters */ - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - - /* Reset the Ouput Compare State */ - tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS2)); - - /* Set the Output Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 2); - - if (TIMx == TIM1) - { - /* Check the parameters */ - assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); - assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); - - /* Reset the Output N Polarity level */ - tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2NP)); - /* Set the Output N Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 4); - - /* Reset the Output N State */ - tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2NE)); - /* Set the Output N State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 4); - - /* Reset the Output Compare N IDLE State */ - tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS2N)); - - /* Set the Output N Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 2); - } - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Initializes the TIMx Channel3 according to the specified - * parameters in the TIM_OCInitStruct. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure - * that contains the configuration information for the specified TIM - * peripheral. - * @retval None - */ -void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC3E)); - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC3M)); - tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_CC3S)); - /* Select the Output Compare Mode */ - tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3P)); - /* Set the Output Compare Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 8); - - /* Set the Output State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 8); - - if(TIMx == TIM1) - { - assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); - assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - - /* Reset the Output N Polarity level */ - tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3NP)); - /* Set the Output N Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 8); - /* Reset the Output N State */ - tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3NE)); - - /* Set the Output N State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 8); - /* Reset the Ouput Compare and Output Compare N IDLE State */ - tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS3)); - tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS3N)); - /* Set the Output Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 4); - /* Set the Output N Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 4); - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR3 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Initializes the TIMx Channel4 according to the specified - * parameters in the TIM_OCInitStruct. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure - * that contains the configuration information for the specified TIM - * peripheral. - * @retval None - */ -void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - /* Disable the Channel 2: Reset the CC4E Bit */ - TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC4E)); - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC4M)); - tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_CC4S)); - - /* Select the Output Compare Mode */ - tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); - - /* Reset the Output Polarity level */ - tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC4P)); - /* Set the Output Compare Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 12); - - /* Set the Output State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 12); - - if(TIMx == TIM1) - { - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - /* Reset the Ouput Compare IDLE State */ - tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS4)); - /* Set the Output Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 6); - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR4 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Fills each TIM_OCInitStruct member with its default value. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure which will - * be initialized. - * @retval None - */ -void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - /* Set the default configuration */ - TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing; - TIM_OCInitStruct->TIM_OutputState = TIM_OutputState_Disable; - TIM_OCInitStruct->TIM_OutputNState = TIM_OutputNState_Disable; - TIM_OCInitStruct->TIM_Pulse = 0x0000000; - TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High; - TIM_OCInitStruct->TIM_OCNPolarity = TIM_OCPolarity_High; - TIM_OCInitStruct->TIM_OCIdleState = TIM_OCIdleState_Reset; - TIM_OCInitStruct->TIM_OCNIdleState = TIM_OCNIdleState_Reset; -} - -/** - * @brief Selects the TIM Output Compare Mode. - * @note This function disables the selected channel before changing the Output - * Compare Mode. - * User has to enable this channel using TIM_CCxCmd and TIM_CCxNCmd functions. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_Channel: specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_Channel_1: TIM Channel 1 - * @arg TIM_Channel_2: TIM Channel 2 - * @arg TIM_Channel_3: TIM Channel 3 - * @arg TIM_Channel_4: TIM Channel 4 - * @param TIM_OCMode: specifies the TIM Output Compare Mode. - * This parameter can be one of the following values: - * @arg TIM_OCMode_Timing - * @arg TIM_OCMode_Active - * @arg TIM_OCMode_Toggle - * @arg TIM_OCMode_PWM1 - * @arg TIM_OCMode_PWM2 - * @arg TIM_ForcedAction_Active - * @arg TIM_ForcedAction_InActive - * @retval None - */ -void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) -{ - uint32_t tmp = 0; - uint16_t tmp1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_OCM(TIM_OCMode)); - - tmp = (uint32_t) TIMx; - tmp += CCMR_OFFSET; - - tmp1 = CCER_CCE_SET << (uint16_t)TIM_Channel; - - /* Disable the Channel: Reset the CCxE Bit */ - TIMx->CCER &= (uint16_t) ~tmp1; - - if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3)) - { - tmp += (TIM_Channel>>1); - - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC1M); - - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= TIM_OCMode; - } - else - { - tmp += (uint16_t)(TIM_Channel - (uint16_t)4)>> (uint16_t)1; - - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC2M); - - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8); - } -} - -/** - * @brief Sets the TIMx Capture Compare1 Register value - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param Compare1: specifies the Capture Compare1 register new value. - * @retval None - */ -void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - - /* Set the Capture Compare1 Register value */ - TIMx->CCR1 = Compare1; -} - -/** - * @brief Sets the TIMx Capture Compare2 Register value - * @param TIMx: where x can be 1, 2, 3 or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param Compare2: specifies the Capture Compare2 register new value. - * @retval None - */ -void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare2) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - - /* Set the Capture Compare2 Register value */ - TIMx->CCR2 = Compare2; -} - -/** - * @brief Sets the TIMx Capture Compare3 Register value - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @param Compare3: specifies the Capture Compare3 register new value. - * @retval None - */ -void TIM_SetCompare3(TIM_TypeDef* TIMx, uint32_t Compare3) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - - /* Set the Capture Compare3 Register value */ - TIMx->CCR3 = Compare3; -} - -/** - * @brief Sets the TIMx Capture Compare4 Register value - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param Compare4: specifies the Capture Compare4 register new value. - * @retval None - */ -void TIM_SetCompare4(TIM_TypeDef* TIMx, uint32_t Compare4) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - - /* Set the Capture Compare4 Register value */ - TIMx->CCR4 = Compare4; -} - -/** - * @brief Forces the TIMx output 1 waveform to active or inactive level. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC1REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC1REF. - * @retval None - */ -void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC1M Bits */ - tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1M); - /* Configure The Forced output Mode */ - tmpccmr1 |= TIM_ForcedAction; - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Forces the TIMx output 2 waveform to active or inactive level. - * @param TIMx: where x can be 1, 2, 3, or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC2REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC2REF. - * @retval None - */ -void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC2M Bits */ - tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2M); - /* Configure The Forced output Mode */ - tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8); - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Forces the TIMx output 3 waveform to active or inactive level. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC3REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC3REF. - * @retval None - */ -void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC1M Bits */ - tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3M); - /* Configure The Forced output Mode */ - tmpccmr2 |= TIM_ForcedAction; - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Forces the TIMx output 4 waveform to active or inactive level. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC4REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC4REF. - * @retval None - */ -void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr2 = 0; - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC2M Bits */ - tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4M); - /* Configure The Forced output Mode */ - tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8); - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Sets or Resets the TIM peripheral Capture Compare Preload Control bit. - * @param TIMx: where x can be 1, 2, 3 or 15 to select the TIMx peripheral - * @note TIM2 is not applicable for STM32F030 devices. - * @param NewState: new state of the Capture Compare Preload Control bit - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Set the CCPC Bit */ - TIMx->CR2 |= TIM_CR2_CCPC; - } - else - { - /* Reset the CCPC Bit */ - TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_CCPC); - } -} - - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR1. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 and 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC1PE Bit */ - tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1PE); - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr1 |= TIM_OCPreload; - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR2. - * @param TIMx: where x can be 1, 2, 3 and 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC2PE Bit */ - tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2PE); - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr1 |= (uint16_t)(TIM_OCPreload << 8); - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR3. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC3PE Bit */ - tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3PE); - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr2 |= TIM_OCPreload; - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR4. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC4PE Bit */ - tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4PE); - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr2 |= (uint16_t)(TIM_OCPreload << 8); - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Configures the TIMx Output Compare 1 Fast feature. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC1FE Bit */ - tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1FE); - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr1 |= TIM_OCFast; - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Configures the TIMx Output Compare 2 Fast feature. - * @param TIMx: where x can be 1, 2, 3 or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC2FE Bit */ - tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2FE); - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr1 |= (uint16_t)(TIM_OCFast << 8); - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Configures the TIMx Output Compare 3 Fast feature. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - - /* Get the TIMx CCMR2 register value */ - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC3FE Bit */ - tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3FE); - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr2 |= TIM_OCFast; - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Configures the TIMx Output Compare 4 Fast feature. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - - /* Get the TIMx CCMR2 register value */ - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC4FE Bit */ - tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4FE); - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr2 |= (uint16_t)(TIM_OCFast << 8); - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Clears or safeguards the OCREF1 signal on an external event - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC1CE Bit */ - tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1CE); - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr1 |= TIM_OCClear; - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Clears or safeguards the OCREF2 signal on an external event - * @param TIMx: where x can be 1, 2, 3 or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC2CE Bit */ - tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2CE); - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr1 |= (uint16_t)(TIM_OCClear << 8); - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Clears or safeguards the OCREF3 signal on an external event - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC3CE Bit */ - tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3CE); - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr2 |= TIM_OCClear; - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Clears or safeguards the OCREF4 signal on an external event - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC4CE Bit */ - tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4CE); - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr2 |= (uint16_t)(TIM_OCClear << 8); - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Configures the TIMx channel 1 polarity. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCPolarity: specifies the OC1 Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - - tmpccer = TIMx->CCER; - /* Set or Reset the CC1P Bit */ - tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1P); - tmpccer |= TIM_OCPolarity; - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx Channel 1N polarity. - * @param TIMx: where x can be 1, 15, 16 or 17 to select the TIM peripheral. - * @param TIM_OCNPolarity: specifies the OC1N Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCNPolarity_High: Output Compare active high - * @arg TIM_OCNPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) -{ - uint16_t tmpccer = 0; - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); - - tmpccer = TIMx->CCER; - /* Set or Reset the CC1NP Bit */ - tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1NP); - tmpccer |= TIM_OCNPolarity; - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx channel 2 polarity. - * @param TIMx: where x can be 1, 2, 3, or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCPolarity: specifies the OC2 Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - - tmpccer = TIMx->CCER; - /* Set or Reset the CC2P Bit */ - tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC2P); - tmpccer |= (uint16_t)(TIM_OCPolarity << 4); - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx Channel 2N polarity. - * @param TIMx: where x can be 1 to select the TIM peripheral. - * @param TIM_OCNPolarity: specifies the OC2N Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCNPolarity_High: Output Compare active high - * @arg TIM_OCNPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) -{ - uint16_t tmpccer = 0; - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); - - tmpccer = TIMx->CCER; - /* Set or Reset the CC2NP Bit */ - tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC2NP); - tmpccer |= (uint16_t)(TIM_OCNPolarity << 4); - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx channel 3 polarity. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCPolarity: specifies the OC3 Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - - tmpccer = TIMx->CCER; - /* Set or Reset the CC3P Bit */ - tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC3P); - tmpccer |= (uint16_t)(TIM_OCPolarity << 8); - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx Channel 3N polarity. - * @param TIMx: where x can be 1 to select the TIM peripheral. - * @param TIM_OCNPolarity: specifies the OC3N Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCNPolarity_High: Output Compare active high - * @arg TIM_OCNPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); - - tmpccer = TIMx->CCER; - /* Set or Reset the CC3NP Bit */ - tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC3NP); - tmpccer |= (uint16_t)(TIM_OCNPolarity << 8); - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx channel 4 polarity. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCPolarity: specifies the OC4 Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - - tmpccer = TIMx->CCER; - /* Set or Reset the CC4P Bit */ - tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC4P); - tmpccer |= (uint16_t)(TIM_OCPolarity << 12); - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Selects the OCReference Clear source. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_OCReferenceClear: specifies the OCReference Clear source. - * This parameter can be one of the following values: - * @arg TIM_OCReferenceClear_ETRF: The internal OCreference clear input is connected to ETRF. - * @arg TIM_OCReferenceClear_OCREFCLR: The internal OCreference clear input is connected to OCREF_CLR input. - * @retval None - */ -void TIM_SelectOCREFClear(TIM_TypeDef* TIMx, uint16_t TIM_OCReferenceClear) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(TIM_OCREFERENCECECLEAR_SOURCE(TIM_OCReferenceClear)); - - /* Set the TIM_OCReferenceClear source */ - TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_OCCS); - TIMx->SMCR |= TIM_OCReferenceClear; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel x. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_Channel: specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_Channel_1: TIM Channel 1 - * @arg TIM_Channel_2: TIM Channel 2 - * @arg TIM_Channel_3: TIM Channel 3 - * @arg TIM_Channel_4: TIM Channel 4 - * @param TIM_CCx: specifies the TIM Channel CCxE bit new state. - * This parameter can be: TIM_CCx_Enable or TIM_CCx_Disable. - * @retval None - */ -void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx) -{ - uint16_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_CCX(TIM_CCx)); - - tmp = CCER_CCE_SET << TIM_Channel; - - /* Reset the CCxE Bit */ - TIMx->CCER &= (uint16_t)~ tmp; - - /* Set or reset the CCxE Bit */ - TIMx->CCER |= (uint16_t)(TIM_CCx << TIM_Channel); -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel xN. - * @param TIMx: where x can be 1, 15, 16 or 17 to select the TIM peripheral. - * @param TIM_Channel: specifies the TIM Channel - * This parmeter can be one of the following values: - * @arg TIM_Channel_1: TIM Channel 1 - * @arg TIM_Channel_2: TIM Channel 2 - * @arg TIM_Channel_3: TIM Channel 3 - * @param TIM_CCxN: specifies the TIM Channel CCxNE bit new state. - * This parameter can be: TIM_CCxN_Enable or TIM_CCxN_Disable. - * @retval None - */ -void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN) -{ - uint16_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_COMPLEMENTARY_CHANNEL(TIM_Channel)); - assert_param(IS_TIM_CCXN(TIM_CCxN)); - - tmp = CCER_CCNE_SET << TIM_Channel; - - /* Reset the CCxNE Bit */ - TIMx->CCER &= (uint16_t) ~tmp; - - /* Set or reset the CCxNE Bit */ - TIMx->CCER |= (uint16_t)(TIM_CCxN << TIM_Channel); -} - -/** - * @brief Selects the TIM peripheral Commutation event. - * @param TIMx: where x can be 1, 15, 16 or 17 to select the TIMx peripheral - * @param NewState: new state of the Commutation event. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Set the COM Bit */ - TIMx->CR2 |= TIM_CR2_CCUS; - } - else - { - /* Reset the COM Bit */ - TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_CCUS); - } -} - -/** - * @} - */ - -/** @defgroup TIM_Group4 Input Capture management functions - * @brief Input Capture management functions - * -@verbatim - =============================================================================== - ##### Input Capture management functions ##### - =============================================================================== - - *** TIM Driver: how to use it in Input Capture Mode *** - =============================================================================== - [..] To use the Timer in Input Capture mode, the following steps are mandatory: - (#) Enable TIM clock using RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) - function. - (#) Configure the TIM pins by configuring the corresponding GPIO pins. - (#) Configure the Time base unit as described in the first part of this - driver, if needed, else the Timer will run with the default configuration: - (++) Autoreload value = 0xFFFF. - (++) Prescaler value = 0x0000. - (++) Counter mode = Up counting. - (++) Clock Division = TIM_CKD_DIV1. - (#) Fill the TIM_ICInitStruct with the desired parameters including: - (++) TIM Channel: TIM_Channel. - (++) TIM Input Capture polarity: TIM_ICPolarity. - (++) TIM Input Capture selection: TIM_ICSelection. - (++) TIM Input Capture Prescaler: TIM_ICPrescaler. - (++) TIM Input CApture filter value: TIM_ICFilter. - (#) Call TIM_ICInit(TIMx, &TIM_ICInitStruct) to configure the desired - channel with the corresponding configuration and to measure only - frequency or duty cycle of the input signal,or, Call - TIM_PWMIConfig(TIMx, &TIM_ICInitStruct) to configure the desired - channels with the corresponding configuration and to measure the - frequency and the duty cycle of the input signal. - (#) Enable the NVIC or the DMA to read the measured frequency. - (#) Enable the corresponding interrupt (or DMA request) to read - the Captured value, using the function TIM_ITConfig(TIMx, TIM_IT_CCx) - (or TIM_DMA_Cmd(TIMx, TIM_DMA_CCx)). - (#) Call the TIM_Cmd(ENABLE) function to enable the TIM counter. - (#) Use TIM_GetCapturex(TIMx); to read the captured value. - [..] - (@) All other functions can be used separately to modify, if needed, - a specific feature of the Timer. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the TIM peripheral according to the specified - * parameters in the TIM_ICInitStruct. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure - * that contains the configuration information for the specified TIM - * peripheral. - * @retval None - */ -void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_CHANNEL(TIM_ICInitStruct->TIM_Channel)); - assert_param(IS_TIM_IC_SELECTION(TIM_ICInitStruct->TIM_ICSelection)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICInitStruct->TIM_ICPrescaler)); - assert_param(IS_TIM_IC_FILTER(TIM_ICInitStruct->TIM_ICFilter)); - assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity)); - - if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) - { - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - /* TI1 Configuration */ - TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_2) - { - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - /* TI2 Configuration */ - TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_3) - { - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - /* TI3 Configuration */ - TI3_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else - { - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - /* TI4 Configuration */ - TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } -} - -/** - * @brief Fills each TIM_ICInitStruct member with its default value. - * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure which will - * be initialized. - * @retval None - */ -void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct) -{ - /* Set the default configuration */ - TIM_ICInitStruct->TIM_Channel = TIM_Channel_1; - TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising; - TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI; - TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1; - TIM_ICInitStruct->TIM_ICFilter = 0x00; -} - -/** - * @brief Configures the TIM peripheral according to the specified - * parameters in the TIM_ICInitStruct to measure an external PWM signal. - * @param TIMx: where x can be 1, 2, 3 or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure - * that contains the configuration information for the specified TIM - * peripheral. - * @retval None - */ -void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) -{ - uint16_t icoppositepolarity = TIM_ICPolarity_Rising; - uint16_t icoppositeselection = TIM_ICSelection_DirectTI; - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - /* Select the Opposite Input Polarity */ - if (TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising) - { - icoppositepolarity = TIM_ICPolarity_Falling; - } - else - { - icoppositepolarity = TIM_ICPolarity_Rising; - } - /* Select the Opposite Input */ - if (TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI) - { - icoppositeselection = TIM_ICSelection_IndirectTI; - } - else - { - icoppositeselection = TIM_ICSelection_DirectTI; - } - if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) - { - /* TI1 Configuration */ - TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - /* TI2 Configuration */ - TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else - { - /* TI2 Configuration */ - TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - /* TI1 Configuration */ - TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } -} - -/** - * @brief Gets the TIMx Input Capture 1 value. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @retval Capture Compare 1 Register value. - */ -uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - - /* Get the Capture 1 Register value */ - return TIMx->CCR1; -} - -/** - * @brief Gets the TIMx Input Capture 2 value. - * @param TIMx: where x can be 1, 2, 3 or 15 to select the TIM peripheral. - * @retval Capture Compare 2 Register value. - */ -uint32_t TIM_GetCapture2(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - - /* Get the Capture 2 Register value */ - return TIMx->CCR2; -} - -/** - * @brief Gets the TIMx Input Capture 3 value. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @retval Capture Compare 3 Register value. - */ -uint32_t TIM_GetCapture3(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - - /* Get the Capture 3 Register value */ - return TIMx->CCR3; -} - -/** - * @brief Gets the TIMx Input Capture 4 value. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @retval Capture Compare 4 Register value. - */ -uint32_t TIM_GetCapture4(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - - /* Get the Capture 4 Register value */ - return TIMx->CCR4; -} - -/** - * @brief Sets the TIMx Input Capture 1 prescaler. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ICPSC: specifies the Input Capture1 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - - /* Reset the IC1PSC Bits */ - TIMx->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC1PSC); - /* Set the IC1PSC value */ - TIMx->CCMR1 |= TIM_ICPSC; -} - -/** - * @brief Sets the TIMx Input Capture 2 prescaler. - * @param TIMx: where x can be 1, 2, 3 or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ICPSC: specifies the Input Capture2 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - - /* Reset the IC2PSC Bits */ - TIMx->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC2PSC); - /* Set the IC2PSC value */ - TIMx->CCMR1 |= (uint16_t)(TIM_ICPSC << 8); -} - -/** - * @brief Sets the TIMx Input Capture 3 prescaler. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ICPSC: specifies the Input Capture3 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - - /* Reset the IC3PSC Bits */ - TIMx->CCMR2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC3PSC); - /* Set the IC3PSC value */ - TIMx->CCMR2 |= TIM_ICPSC; -} - -/** - * @brief Sets the TIMx Input Capture 4 prescaler. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ICPSC: specifies the Input Capture4 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - - /* Reset the IC4PSC Bits */ - TIMx->CCMR2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC4PSC); - /* Set the IC4PSC value */ - TIMx->CCMR2 |= (uint16_t)(TIM_ICPSC << 8); -} - -/** - * @} - */ - -/** @defgroup TIM_Group5 Interrupts DMA and flags management functions - * @brief Interrupts, DMA and flags management functions - * -@verbatim - =============================================================================== - ##### Interrupts, DMA and flags management functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified TIM interrupts. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 or 17 to select the TIMx peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_IT: specifies the TIM interrupts sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg TIM_IT_Update: TIM update Interrupt source - * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source - * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source - * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source - * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source - * @arg TIM_IT_COM: TIM Commutation Interrupt source - * @arg TIM_IT_Trigger: TIM Trigger Interrupt source - * @arg TIM_IT_Break: TIM Break Interrupt source - * - * @note TIM6 and TIM7 can only generate an update interrupt. - * @note TIM15 can have only TIM_IT_Update, TIM_IT_CC1,TIM_IT_CC2 or TIM_IT_Trigger. - * @note TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1. - * @note TIM_IT_Break is used only with TIM1 and TIM15. - * @note TIM_IT_COM is used only with TIM1, TIM15, TIM16 and TIM17. - * - * @param NewState: new state of the TIM interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_IT(TIM_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Interrupt sources */ - TIMx->DIER |= TIM_IT; - } - else - { - /* Disable the Interrupt sources */ - TIMx->DIER &= (uint16_t)~TIM_IT; - } -} - -/** - * @brief Configures the TIMx event to be generate by software. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 or 17 to select the - * TIM peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_EventSource: specifies the event source. - * This parameter can be one or more of the following values: - * @arg TIM_EventSource_Update: Timer update Event source - * @arg TIM_EventSource_CC1: Timer Capture Compare 1 Event source - * @arg TIM_EventSource_CC2: Timer Capture Compare 2 Event source - * @arg TIM_EventSource_CC3: Timer Capture Compare 3 Event source - * @arg TIM_EventSource_CC4: Timer Capture Compare 4 Event source - * @arg TIM_EventSource_COM: Timer COM event source - * @arg TIM_EventSource_Trigger: Timer Trigger Event source - * @arg TIM_EventSource_Break: Timer Break event source - * - * @note TIM6 and TIM7 can only generate an update event. - * @note TIM_EventSource_COM and TIM_EventSource_Break are used only with TIM1. - * - * @retval None - */ -void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_EVENT_SOURCE(TIM_EventSource)); - /* Set the event sources */ - TIMx->EGR = TIM_EventSource; -} - -/** - * @brief Checks whether the specified TIM flag is set or not. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg TIM_FLAG_Update: TIM update Flag - * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag - * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag - * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag - * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag - * @arg TIM_FLAG_COM: TIM Commutation Flag - * @arg TIM_FLAG_Trigger: TIM Trigger Flag - * @arg TIM_FLAG_Break: TIM Break Flag - * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag - * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag - * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag - * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag - * - * @note TIM6 and TIM7 can have only one update flag. - * @note TIM15 can have only TIM_FLAG_Update, TIM_FLAG_CC1, TIM_FLAG_CC2 or TIM_FLAG_Trigger. - * @note TIM14, TIM16 and TIM17 can have TIM_FLAG_Update or TIM_FLAG_CC1. - * @note TIM_FLAG_Break is used only with TIM1 and TIM15. - * @note TIM_FLAG_COM is used only with TIM1 TIM15, TIM16 and TIM17. - * - * @retval The new state of TIM_FLAG (SET or RESET). - */ -FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) -{ - ITStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_GET_FLAG(TIM_FLAG)); - - if ((TIMx->SR & TIM_FLAG) != (uint16_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the TIMx's pending flags. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_FLAG: specifies the flag bit to clear. - * This parameter can be any combination of the following values: - * @arg TIM_FLAG_Update: TIM update Flag - * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag - * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag - * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag - * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag - * @arg TIM_FLAG_COM: TIM Commutation Flag - * @arg TIM_FLAG_Trigger: TIM Trigger Flag - * @arg TIM_FLAG_Break: TIM Break Flag - * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag - * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag - * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag - * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag - * - * @note TIM6 and TIM7 can have only one update flag. - * @note TIM15 can have only TIM_FLAG_Update, TIM_FLAG_CC1,TIM_FLAG_CC2 or - * TIM_FLAG_Trigger. - * @note TIM14, TIM16 and TIM17 can have TIM_FLAG_Update or TIM_FLAG_CC1. - * @note TIM_FLAG_Break is used only with TIM1 and TIM15. - * @note TIM_FLAG_COM is used only with TIM1, TIM15, TIM16 and TIM17. - * - * @retval None - */ -void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_CLEAR_FLAG(TIM_FLAG)); - - /* Clear the flags */ - TIMx->SR = (uint16_t)~TIM_FLAG; -} - -/** - * @brief Checks whether the TIM interrupt has occurred or not. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_IT: specifies the TIM interrupt source to check. - * This parameter can be one of the following values: - * @arg TIM_IT_Update: TIM update Interrupt source - * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source - * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source - * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source - * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source - * @arg TIM_IT_COM: TIM Commutation Interrupt source - * @arg TIM_IT_Trigger: TIM Trigger Interrupt source - * @arg TIM_IT_Break: TIM Break Interrupt source - * - * @note TIM6 and TIM7 can generate only an update interrupt. - * @note TIM15 can have only TIM_IT_Update, TIM_IT_CC1, TIM_IT_CC2 or TIM_IT_Trigger. - * @note TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1. - * @note TIM_IT_Break is used only with TIM1 and TIM15. - * @note TIM_IT_COM is used only with TIM1, TIM15, TIM16 and TIM17. - * - * @retval The new state of the TIM_IT(SET or RESET). - */ -ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT) -{ - ITStatus bitstatus = RESET; - uint16_t itstatus = 0x0, itenable = 0x0; - - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_GET_IT(TIM_IT)); - - itstatus = TIMx->SR & TIM_IT; - - itenable = TIMx->DIER & TIM_IT; - if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the TIMx's interrupt pending bits. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_IT: specifies the pending bit to clear. - * This parameter can be any combination of the following values: - * @arg TIM_IT_Update: TIM1 update Interrupt source - * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source - * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source - * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source - * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source - * @arg TIM_IT_COM: TIM Commutation Interrupt source - * @arg TIM_IT_Trigger: TIM Trigger Interrupt source - * @arg TIM_IT_Break: TIM Break Interrupt source - * - * @note TIM6 and TIM7 can generate only an update interrupt. - * @note TIM15 can have only TIM_IT_Update, TIM_IT_CC1, TIM_IT_CC2 or TIM_IT_Trigger. - * @note TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1. - * @note TIM_IT_Break is used only with TIM1 and TIM15. - * @note TIM_IT_COM is used only with TIM1, TIM15, TIM16 and TIM17. - * - * @retval None - */ -void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_IT(TIM_IT)); - - /* Clear the IT pending Bit */ - TIMx->SR = (uint16_t)~TIM_IT; -} - -/** - * @brief Configures the TIMx's DMA interface. - * @param TIMx: where x can be 1, 2, 3, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_DMABase: DMA Base address. - * This parameter can be one of the following values: - * @arg TIM_DMABase_CR1 - * @arg TIM_DMABase_CR2 - * @arg TIM_DMABase_SMCR - * @arg TIM_DMABase_DIER - * @arg TIM_DMABase_SR - * @arg TIM_DMABase_EGR - * @arg TIM_DMABase_CCMR1 - * @arg TIM_DMABase_CCMR2 - * @arg TIM_DMABase_CCER - * @arg TIM_DMABase_CNT - * @arg TIM_DMABase_PSC - * @arg TIM_DMABase_ARR - * @arg TIM_DMABase_CCR1 - * @arg TIM_DMABase_CCR2 - * @arg TIM_DMABase_CCR3 - * @arg TIM_DMABase_CCR4 - * @arg TIM_DMABase_DCR - * @arg TIM_DMABase_OR - * @param TIM_DMABurstLength: DMA Burst length. This parameter can be one value - * between: TIM_DMABurstLength_1Transfer and TIM_DMABurstLength_18Transfers. - * @retval None - */ -void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_DMA_BASE(TIM_DMABase)); - assert_param(IS_TIM_DMA_LENGTH(TIM_DMABurstLength)); - /* Set the DMA Base and the DMA Burst Length */ - TIMx->DCR = TIM_DMABase | TIM_DMABurstLength; -} - -/** - * @brief Enables or disables the TIMx's DMA Requests. - * @param TIMx: where x can be 1, 2, 3, 6, 7, 15, 16 or 17 to select the TIM peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_DMASource: specifies the DMA Request sources. - * This parameter can be any combination of the following values: - * @arg TIM_DMA_Update: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_Trigger: TIM Trigger DMA source - * @param NewState: new state of the DMA Request sources. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST10_PERIPH(TIMx)); - assert_param(IS_TIM_DMA_SOURCE(TIM_DMASource)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the DMA sources */ - TIMx->DIER |= TIM_DMASource; - } - else - { - /* Disable the DMA sources */ - TIMx->DIER &= (uint16_t)~TIM_DMASource; - } -} - -/** - * @brief Selects the TIMx peripheral Capture Compare DMA source. - * @param TIMx: where x can be 1, 2, 3, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param NewState: new state of the Capture Compare DMA source - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST5_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Set the CCDS Bit */ - TIMx->CR2 |= TIM_CR2_CCDS; - } - else - { - /* Reset the CCDS Bit */ - TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_CCDS); - } -} - -/** - * @} - */ - -/** @defgroup TIM_Group6 Clocks management functions - * @brief Clocks management functions - * -@verbatim - =============================================================================== - ##### Clocks management functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures the TIMx internal Clock - * @param TIMx: where x can be 1, 2, 3, or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @retval None - */ -void TIM_InternalClockConfig(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - /* Disable slave mode to clock the prescaler directly with the internal clock */ - TIMx->SMCR &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); -} - -/** - * @brief Configures the TIMx Internal Trigger as External Clock - * @param TIMx: where x can be 1, 2, 3, or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ITRSource: Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal Trigger 0 - * @arg TIM_TS_ITR1: Internal Trigger 1 - * @arg TIM_TS_ITR2: Internal Trigger 2 - * @arg TIM_TS_ITR3: Internal Trigger 3 - * @retval None - */ -void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_INTERNAL_TRIGGER_SELECTION(TIM_InputTriggerSource)); - /* Select the Internal Trigger */ - TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource); - /* Select the External clock mode1 */ - TIMx->SMCR |= TIM_SlaveMode_External1; -} - -/** - * @brief Configures the TIMx Trigger as External Clock - * @param TIMx: where x can be 1, 2, 3, or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_TIxExternalCLKSource: Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TIxExternalCLK1Source_TI1ED: TI1 Edge Detector - * @arg TIM_TIxExternalCLK1Source_TI1: Filtered Timer Input 1 - * @arg TIM_TIxExternalCLK1Source_TI2: Filtered Timer Input 2 - * @param TIM_ICPolarity: specifies the TIx Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @param ICFilter: specifies the filter value. - * This parameter must be a value between 0x0 and 0xF. - * @retval None - */ -void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, - uint16_t TIM_ICPolarity, uint16_t ICFilter) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_IC_POLARITY(TIM_ICPolarity)); - assert_param(IS_TIM_IC_FILTER(ICFilter)); - - /* Configure the Timer Input Clock Source */ - if (TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2) - { - TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); - } - else - { - TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); - } - /* Select the Trigger source */ - TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource); - /* Select the External clock mode1 */ - TIMx->SMCR |= TIM_SlaveMode_External1; -} - -/** - * @brief Configures the External clock Mode1 - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. - * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. - * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. - * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity: The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. - * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. - * @param ExtTRGFilter: External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, - uint16_t ExtTRGFilter) -{ - uint16_t tmpsmcr = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); - assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); - assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); - - /* Configure the ETR Clock source */ - TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - /* Reset the SMS Bits */ - tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); - /* Select the External clock mode1 */ - tmpsmcr |= TIM_SlaveMode_External1; - /* Select the Trigger selection : ETRF */ - tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS)); - tmpsmcr |= TIM_TS_ETRF; - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Configures the External clock Mode2 - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. - * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. - * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. - * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity: The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. - * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. - * @param ExtTRGFilter: External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, - uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); - assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); - assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); - - /* Configure the ETR Clock source */ - TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); - /* Enable the External clock mode2 */ - TIMx->SMCR |= TIM_SMCR_ECE; -} - -/** - * @} - */ - -/** @defgroup TIM_Group7 Synchronization management functions - * @brief Synchronization management functions - * -@verbatim - =============================================================================== - ##### Synchronization management functions ##### - =============================================================================== - *** TIM Driver: how to use it in synchronization Mode *** - =============================================================================== - [..] Case of two/several Timers - (#) Configure the Master Timers using the following functions: - (++) void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, - uint16_t TIM_TRGOSource). - (++) void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, - uint16_t TIM_MasterSlaveMode); - (#) Configure the Slave Timers using the following functions: - (++) void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, - uint16_t TIM_InputTriggerSource); - (++) void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); - [..] Case of Timers and external trigger(ETR pin) - (#) Configure the Etrenal trigger using this function: - (++) void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, - uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter); - (#) Configure the Slave Timers using the following functions: - (++) void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, - uint16_t TIM_InputTriggerSource); - (++) void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); - -@endverbatim - * @{ - */ -/** - * @brief Selects the Input Trigger source - * @param TIMx: where x can be 1, 2, 3 or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_InputTriggerSource: The Input Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal Trigger 0 - * @arg TIM_TS_ITR1: Internal Trigger 1 - * @arg TIM_TS_ITR2: Internal Trigger 2 - * @arg TIM_TS_ITR3: Internal Trigger 3 - * @arg TIM_TS_TI1F_ED: TI1 Edge Detector - * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 - * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 - * @arg TIM_TS_ETRF: External Trigger input - * @retval None - */ -void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) -{ - uint16_t tmpsmcr = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource)); - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - /* Reset the TS Bits */ - tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS)); - /* Set the Input Trigger source */ - tmpsmcr |= TIM_InputTriggerSource; - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Selects the TIMx Trigger Output Mode. - * @param TIMx: where x can be 1, 2, 3, 6, 7, or 15 to select the TIM peripheral. - * @note TIM7 is applicable only for STM32F072 devices - * @note TIM6 is not applivable for STM32F031 devices. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_TRGOSource: specifies the Trigger Output source. - * This parameter can be one of the following values: - * - * - For all TIMx - * @arg TIM_TRGOSource_Reset: The UG bit in the TIM_EGR register is used as the trigger output (TRGO). - * @arg TIM_TRGOSource_Enable: The Counter Enable CEN is used as the trigger output (TRGO). - * @arg TIM_TRGOSource_Update: The update event is selected as the trigger output (TRGO). - * - * - For all TIMx except TIM6 and TIM7 - * @arg TIM_TRGOSource_OC1: The trigger output sends a positive pulse when the CC1IF flag - * is to be set, as soon as a capture or compare match occurs (TRGO). - * @arg TIM_TRGOSource_OC1Ref: OC1REF signal is used as the trigger output (TRGO). - * @arg TIM_TRGOSource_OC2Ref: OC2REF signal is used as the trigger output (TRGO). - * @arg TIM_TRGOSource_OC3Ref: OC3REF signal is used as the trigger output (TRGO). - * @arg TIM_TRGOSource_OC4Ref: OC4REF signal is used as the trigger output (TRGO). - * - * @retval None - */ -void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST9_PERIPH(TIMx)); - assert_param(IS_TIM_TRGO_SOURCE(TIM_TRGOSource)); - - /* Reset the MMS Bits */ - TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_MMS); - /* Select the TRGO source */ - TIMx->CR2 |= TIM_TRGOSource; -} - -/** - * @brief Selects the TIMx Slave Mode. - * @param TIMx: where x can be 1, 2, 3 or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_SlaveMode: specifies the Timer Slave Mode. - * This parameter can be one of the following values: - * @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal (TRGI) re-initializes - * the counter and triggers an update of the registers. - * @arg TIM_SlaveMode_Gated: The counter clock is enabled when the trigger signal (TRGI) is high. - * @arg TIM_SlaveMode_Trigger: The counter starts at a rising edge of the trigger TRGI. - * @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter. - * @retval None - */ -void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_SLAVE_MODE(TIM_SlaveMode)); - - /* Reset the SMS Bits */ - TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_SMS); - /* Select the Slave Mode */ - TIMx->SMCR |= TIM_SlaveMode; -} - -/** - * @brief Sets or Resets the TIMx Master/Slave Mode. - * @param TIMx: where x can be 1, 2, 3, or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_MasterSlaveMode: specifies the Timer Master Slave Mode. - * This parameter can be one of the following values: - * @arg TIM_MasterSlaveMode_Enable: synchronization between the current timer - * and its slaves (through TRGO). - * @arg TIM_MasterSlaveMode_Disable: No action - * @retval None - */ -void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_MSM_STATE(TIM_MasterSlaveMode)); - - /* Reset the MSM Bit */ - TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_MSM); - - /* Set or Reset the MSM Bit */ - TIMx->SMCR |= TIM_MasterSlaveMode; -} - -/** - * @brief Configures the TIMx External Trigger (ETR). - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. - * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. - * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. - * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity: The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. - * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. - * @param ExtTRGFilter: External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, - uint16_t ExtTRGFilter) -{ - uint16_t tmpsmcr = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); - assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); - assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); - - tmpsmcr = TIMx->SMCR; - /* Reset the ETR Bits */ - tmpsmcr &= SMCR_ETR_MASK; - /* Set the Prescaler, the Filter value and the Polarity */ - tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8))); - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @} - */ - -/** @defgroup TIM_Group8 Specific interface management functions - * @brief Specific interface management functions - * -@verbatim - =============================================================================== - ##### Specific interface management functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures the TIMx Encoder Interface. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_EncoderMode: specifies the TIMx Encoder Mode. - * This parameter can be one of the following values: - * @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level. - * @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level. - * @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending - * on the level of the other input. - * @param TIM_IC1Polarity: specifies the IC1 Polarity - * This parmeter can be one of the following values: - * @arg TIM_ICPolarity_Falling: IC Falling edge. - * @arg TIM_ICPolarity_Rising: IC Rising edge. - * @param TIM_IC2Polarity: specifies the IC2 Polarity - * This parmeter can be one of the following values: - * @arg TIM_ICPolarity_Falling: IC Falling edge. - * @arg TIM_ICPolarity_Rising: IC Rising edge. - * @retval None - */ -void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, - uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity) -{ - uint16_t tmpsmcr = 0; - uint16_t tmpccmr1 = 0; - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_ENCODER_MODE(TIM_EncoderMode)); - assert_param(IS_TIM_IC_POLARITY(TIM_IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(TIM_IC2Polarity)); - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = TIMx->CCMR1; - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Set the encoder Mode */ - tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); - tmpsmcr |= TIM_EncoderMode; - /* Select the Capture Compare 1 and the Capture Compare 2 as input */ - tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & (uint16_t)(~((uint16_t)TIM_CCMR1_CC2S))); - tmpccmr1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; - /* Set the TI1 and the TI2 Polarities */ - tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC1P | TIM_CCER_CC1NP)) & (uint16_t)~((uint16_t)(TIM_CCER_CC2P | TIM_CCER_CC2NP)); - tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4)); - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmr1; - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Enables or disables the TIMx's Hall sensor interface. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param NewState: new state of the TIMx Hall sensor interface. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Set the TI1S Bit */ - TIMx->CR2 |= TIM_CR2_TI1S; - } - else - { - /* Reset the TI1S Bit */ - TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_TI1S); - } -} - -/** - * @} - */ - -/** @defgroup TIM_Group9 Specific remapping management function - * @brief Specific remapping management function - * -@verbatim - =============================================================================== - ##### Specific remapping management function ##### - =============================================================================== - -@endverbatim - * @{ - */ -/** - * @brief Configures the TIM14 Remapping input Capabilities. - * @param TIMx: where x can be 14 to select the TIM peripheral. - * @param TIM_Remap: specifies the TIM input reampping source. - * This parameter can be one of the following values: - * @arg TIM14_GPIO: TIM14 Channel 1 is connected to GPIO. - * @arg TIM14_RTC_CLK: TIM14 Channel 1 is connected to RTC input clock. - * RTC input clock can be LSE, LSI or HSE/div128. - * @arg TIM14_HSE_DIV32: TIM14 Channel 1 is connected to HSE/32 clock. - * @arg TIM14_MCO: TIM14 Channel 1 is connected to MCO clock. - * MCO clock can be HSI14, SYSCLK, HSI, HSE or PLL/2. - * @retval None - */ -void TIM_RemapConfig(TIM_TypeDef* TIMx, uint16_t TIM_Remap) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST11_PERIPH(TIMx)); - assert_param(IS_TIM_REMAP(TIM_Remap)); - - /* Set the Timer remapping configuration */ - TIMx->OR = TIM_Remap; -} - -/** - * @} - */ - -/** - * @brief Configure the TI1 as Input. - * @param TIMx: where x can be 1, 2, 3, 14, 15, 16 or 17 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ICPolarity: The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 1 is selected to be connected to IC1. - * @arg TIM_ICSelection_IndirectTI: TIM Input 1 is selected to be connected to IC2. - * @arg TIM_ICSelection_TRC: TIM Input 1 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr1 = 0, tmpccer = 0; - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC1E); - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - /* Select the Input and set the filter */ - tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC1F))); - tmpccmr1 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC1P | TIM_CCER_CC1NP)); - tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC1E); - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI2 as Input. - * @param TIMx: where x can be 1, 2, 3, or 15 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ICPolarity: The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 2 is selected to be connected to IC2. - * @arg TIM_ICSelection_IndirectTI: TIM Input 2 is selected to be connected to IC1. - * @arg TIM_ICSelection_TRC: TIM Input 2 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0; - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC2E); - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - tmp = (uint16_t)(TIM_ICPolarity << 4); - /* Select the Input and set the filter */ - tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC2S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC2F))); - tmpccmr1 |= (uint16_t)(TIM_ICFilter << 12); - tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8); - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC2P | TIM_CCER_CC2NP)); - tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC2E); - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI3 as Input. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ICPolarity: The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 3 is selected to be connected to IC3. - * @arg TIM_ICSelection_IndirectTI: TIM Input 3 is selected to be connected to IC4. - * @arg TIM_ICSelection_TRC: TIM Input 3 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; - /* Disable the Channel 3: Reset the CC3E Bit */ - TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC3E); - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - tmp = (uint16_t)(TIM_ICPolarity << 8); - /* Select the Input and set the filter */ - tmpccmr2 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR2_CC3S)) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC3F))); - tmpccmr2 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); - /* Select the Polarity and set the CC3E Bit */ - tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P | TIM_CCER_CC3NP)); - tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC3E); - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI4 as Input. - * @param TIMx: where x can be 1, 2 or 3 to select the TIM peripheral. - * @note TIM2 is not applicable for STM32F030 devices. - * @param TIM_ICPolarity: The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 4 is selected to be connected to IC4. - * @arg TIM_ICSelection_IndirectTI: TIM Input 4 is selected to be connected to IC3. - * @arg TIM_ICSelection_TRC: TIM Input 4 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC4E); - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - tmp = (uint16_t)(TIM_ICPolarity << 12); - /* Select the Input and set the filter */ - tmpccmr2 &= (uint16_t)((uint16_t)(~(uint16_t)TIM_CCMR2_CC4S) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC4F))); - tmpccmr2 |= (uint16_t)(TIM_ICSelection << 8); - tmpccmr2 |= (uint16_t)(TIM_ICFilter << 12); - /* Select the Polarity and set the CC4E Bit */ - tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC4P | TIM_CCER_CC4NP)); - tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC4E); - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_usart.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_usart.c deleted file mode 100644 index 43392f0..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_usart.c +++ /dev/null @@ -1,2096 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_usart.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Universal synchronous asynchronous receiver - * transmitter (USART): - * + Initialization and Configuration - * + STOP Mode - * + AutoBaudRate - * + Data transfers - * + Multi-Processor Communication - * + LIN mode - * + Half-duplex mode - * + Smartcard mode - * + IrDA mode - * + RS485 mode - * + DMA transfers management - * + Interrupts and flags management - * - * @verbatim - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - (#) Enable peripheral clock using RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE) - function for USART1 or using RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE) - function for USART2 and USART3. - (#) According to the USART mode, enable the GPIO clocks using - RCC_AHBPeriphClockCmd() function. (The I/O can be TX, RX, CTS, - or and SCLK). - (#) Peripheral's alternate function: - (++) Connect the pin to the desired peripherals' Alternate - Function (AF) using GPIO_PinAFConfig() function. - (++) Configure the desired pin in alternate function by: - GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF. - (++) Select the type, pull-up/pull-down and output speed via - GPIO_PuPd, GPIO_OType and GPIO_Speed members. - (++) Call GPIO_Init() function. - (#) Program the Baud Rate, Word Length , Stop Bit, Parity, Hardware - flow control and Mode(Receiver/Transmitter) using the SPI_Init() - function. - (#) For synchronous mode, enable the clock and program the polarity, - phase and last bit using the USART_ClockInit() function. - (#) Enable the NVIC and the corresponding interrupt using the function - USART_ITConfig() if you need to use interrupt mode. - (#) When using the DMA mode: - (++) Configure the DMA using DMA_Init() function. - (++) Active the needed channel Request using USART_DMACmd() function. - (#) Enable the USART using the USART_Cmd() function. - (#) Enable the DMA using the DMA_Cmd() function, when using DMA mode. - [..] - Refer to Multi-Processor, LIN, half-duplex, Smartcard, IrDA sub-sections - for more details. - -@endverbatim - - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_usart.h" -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup USART - * @brief USART driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/*!< USART CR1 register clear Mask ((~(uint32_t)0xFFFFE6F3)) */ -#define CR1_CLEAR_MASK ((uint32_t)(USART_CR1_M | USART_CR1_PCE | \ - USART_CR1_PS | USART_CR1_TE | \ - USART_CR1_RE)) - -/*!< USART CR2 register clock bits clear Mask ((~(uint32_t)0xFFFFF0FF)) */ -#define CR2_CLOCK_CLEAR_MASK ((uint32_t)(USART_CR2_CLKEN | USART_CR2_CPOL | \ - USART_CR2_CPHA | USART_CR2_LBCL)) - -/*!< USART CR3 register clear Mask ((~(uint32_t)0xFFFFFCFF)) */ -#define CR3_CLEAR_MASK ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE)) - -/*!< USART Interrupts mask */ -#define IT_MASK ((uint32_t)0x000000FF) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup USART_Private_Functions - * @{ - */ - -/** @defgroup USART_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to initialize the USART - in asynchronous and in synchronous modes. - (+) For the asynchronous mode only these parameters can be configured: - (++) Baud Rate. - (++) Word Length. - (++) Stop Bit. - (++) Parity: If the parity is enabled, then the MSB bit of the data written - in the data register is transmitted but is changed by the parity bit. - Depending on the frame length defined by the M bit (8-bits or 9-bits), - the possible USART frame formats are as listed in the following table: - - +-------------------------------------------------------------+ - | M bit | PCE bit | USART frame | - |---------------------|---------------------------------------| - | 0 | 0 | | SB | 8 bit data | STB | | - |---------|-----------|---------------------------------------| - | 0 | 1 | | SB | 7 bit data | PB | STB | | - |---------|-----------|---------------------------------------| - | 1 | 0 | | SB | 9 bit data | STB | | - |---------|-----------|---------------------------------------| - | 1 | 1 | | SB | 8 bit data | PB | STB | | - +-------------------------------------------------------------+ - - (++) Hardware flow control. - (++) Receiver/transmitter modes. - [..] The USART_Init() function follows the USART asynchronous configuration - procedure(details for the procedure are available in reference manual. - (+) For the synchronous mode in addition to the asynchronous mode parameters - these parameters should be also configured: - (++) USART Clock Enabled. - (++) USART polarity. - (++) USART phase. - (++) USART LastBit. - [..] These parameters can be configured using the USART_ClockInit() function. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the USARTx peripheral registers to their default reset values. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @retval None - */ -void USART_DeInit(USART_TypeDef* USARTx) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - - if (USARTx == USART1) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); - } - else if (USARTx == USART2) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE); - } - else if (USARTx == USART3) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE); - } - else - { - if (USARTx == USART4) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART4, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART4, DISABLE); - } - } -} - -/** - * @brief Initializes the USARTx peripheral according to the specified - * parameters in the USART_InitStruct . - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains - * the configuration information for the specified USART peripheral. - * @retval None - */ -void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) -{ - uint32_t divider = 0, apbclock = 0, tmpreg = 0; - RCC_ClocksTypeDef RCC_ClocksStatus; - - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_BAUDRATE(USART_InitStruct->USART_BaudRate)); - assert_param(IS_USART_WORD_LENGTH(USART_InitStruct->USART_WordLength)); - assert_param(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits)); - assert_param(IS_USART_PARITY(USART_InitStruct->USART_Parity)); - assert_param(IS_USART_MODE(USART_InitStruct->USART_Mode)); - assert_param(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct->USART_HardwareFlowControl)); - - /* Disable USART */ - USARTx->CR1 &= (uint32_t)~((uint32_t)USART_CR1_UE); - - /*---------------------------- USART CR2 Configuration -----------------------*/ - tmpreg = USARTx->CR2; - /* Clear STOP[13:12] bits */ - tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP); - - /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit ------------*/ - /* Set STOP[13:12] bits according to USART_StopBits value */ - tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits; - - /* Write to USART CR2 */ - USARTx->CR2 = tmpreg; - - /*---------------------------- USART CR1 Configuration -----------------------*/ - tmpreg = USARTx->CR1; - /* Clear M, PCE, PS, TE and RE bits */ - tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK); - - /* Configure the USART Word Length, Parity and mode ----------------------- */ - /* Set the M bits according to USART_WordLength value */ - /* Set PCE and PS bits according to USART_Parity value */ - /* Set TE and RE bits according to USART_Mode value */ - tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity | - USART_InitStruct->USART_Mode; - - /* Write to USART CR1 */ - USARTx->CR1 = tmpreg; - - /*---------------------------- USART CR3 Configuration -----------------------*/ - tmpreg = USARTx->CR3; - /* Clear CTSE and RTSE bits */ - tmpreg &= (uint32_t)~((uint32_t)CR3_CLEAR_MASK); - - /* Configure the USART HFC -------------------------------------------------*/ - /* Set CTSE and RTSE bits according to USART_HardwareFlowControl value */ - tmpreg |= USART_InitStruct->USART_HardwareFlowControl; - - /* Write to USART CR3 */ - USARTx->CR3 = tmpreg; - - /*---------------------------- USART BRR Configuration -----------------------*/ - /* Configure the USART Baud Rate -------------------------------------------*/ - RCC_GetClocksFreq(&RCC_ClocksStatus); - - if (USARTx == USART1) - { - apbclock = RCC_ClocksStatus.USART1CLK_Frequency; - } - else if (USARTx == USART2) - { - apbclock = RCC_ClocksStatus.USART2CLK_Frequency; - } - else - { - apbclock = RCC_ClocksStatus.PCLK_Frequency; - } - - /* Determine the integer part */ - if ((USARTx->CR1 & USART_CR1_OVER8) != 0) - { - /* (divider * 10) computing in case Oversampling mode is 8 Samples */ - divider = (uint32_t)((2 * apbclock) / (USART_InitStruct->USART_BaudRate)); - tmpreg = (uint32_t)((2 * apbclock) % (USART_InitStruct->USART_BaudRate)); - } - else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ - { - /* (divider * 10) computing in case Oversampling mode is 16 Samples */ - divider = (uint32_t)((apbclock) / (USART_InitStruct->USART_BaudRate)); - tmpreg = (uint32_t)((apbclock) % (USART_InitStruct->USART_BaudRate)); - } - - /* round the divider : if fractional part i greater than 0.5 increment divider */ - if (tmpreg >= (USART_InitStruct->USART_BaudRate) / 2) - { - divider++; - } - - /* Implement the divider in case Oversampling mode is 8 Samples */ - if ((USARTx->CR1 & USART_CR1_OVER8) != 0) - { - /* get the LSB of divider and shift it to the right by 1 bit */ - tmpreg = (divider & (uint16_t)0x000F) >> 1; - - /* update the divider value */ - divider = (divider & (uint16_t)0xFFF0) | tmpreg; - } - - /* Write to USART BRR */ - USARTx->BRR = (uint16_t)divider; -} - -/** - * @brief Fills each USART_InitStruct member with its default value. - * @param USART_InitStruct: pointer to a USART_InitTypeDef structure - * which will be initialized. - * @retval None - */ -void USART_StructInit(USART_InitTypeDef* USART_InitStruct) -{ - /* USART_InitStruct members default value */ - USART_InitStruct->USART_BaudRate = 9600; - USART_InitStruct->USART_WordLength = USART_WordLength_8b; - USART_InitStruct->USART_StopBits = USART_StopBits_1; - USART_InitStruct->USART_Parity = USART_Parity_No ; - USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None; -} - -/** - * @brief Initializes the USARTx peripheral Clock according to the - * specified parameters in the USART_ClockInitStruct. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef - * structure that contains the configuration information for the specified - * USART peripheral. - * @retval None - */ -void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_CLOCK(USART_ClockInitStruct->USART_Clock)); - assert_param(IS_USART_CPOL(USART_ClockInitStruct->USART_CPOL)); - assert_param(IS_USART_CPHA(USART_ClockInitStruct->USART_CPHA)); - assert_param(IS_USART_LASTBIT(USART_ClockInitStruct->USART_LastBit)); -/*---------------------------- USART CR2 Configuration -----------------------*/ - tmpreg = USARTx->CR2; - /* Clear CLKEN, CPOL, CPHA, LBCL and SSM bits */ - tmpreg &= (uint32_t)~((uint32_t)CR2_CLOCK_CLEAR_MASK); - /* Configure the USART Clock, CPOL, CPHA, LastBit and SSM ------------*/ - /* Set CLKEN bit according to USART_Clock value */ - /* Set CPOL bit according to USART_CPOL value */ - /* Set CPHA bit according to USART_CPHA value */ - /* Set LBCL bit according to USART_LastBit value */ - tmpreg |= (uint32_t)(USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL | - USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit); - /* Write to USART CR2 */ - USARTx->CR2 = tmpreg; -} - -/** - * @brief Fills each USART_ClockInitStruct member with its default value. - * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef - * structure which will be initialized. - * @retval None - */ -void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct) -{ - /* USART_ClockInitStruct members default value */ - USART_ClockInitStruct->USART_Clock = USART_Clock_Disable; - USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low; - USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge; - USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable; -} - -/** - * @brief Enables or disables the specified USART peripheral. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param NewState: new state of the USARTx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected USART by setting the UE bit in the CR1 register */ - USARTx->CR1 |= USART_CR1_UE; - } - else - { - /* Disable the selected USART by clearing the UE bit in the CR1 register */ - USARTx->CR1 &= (uint32_t)~((uint32_t)USART_CR1_UE); - } -} - -/** - * @brief Enables or disables the USART's transmitter or receiver. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_Direction: specifies the USART direction. - * This parameter can be any combination of the following values: - * @arg USART_Mode_Tx: USART Transmitter - * @arg USART_Mode_Rx: USART Receiver - * @param NewState: new state of the USART transfer direction. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_DirectionModeCmd(USART_TypeDef* USARTx, uint32_t USART_DirectionMode, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_MODE(USART_DirectionMode)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the USART's transfer interface by setting the TE and/or RE bits - in the USART CR1 register */ - USARTx->CR1 |= USART_DirectionMode; - } - else - { - /* Disable the USART's transfer interface by clearing the TE and/or RE bits - in the USART CR3 register */ - USARTx->CR1 &= (uint32_t)~USART_DirectionMode; - } -} - -/** - * @brief Enables or disables the USART's 8x oversampling mode. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param NewState: new state of the USART 8x oversampling mode. - * This parameter can be: ENABLE or DISABLE. - * @note This function has to be called before calling USART_Init() function - * in order to have correct baudrate Divider value. - * @retval None - */ -void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the 8x Oversampling mode by setting the OVER8 bit in the CR1 register */ - USARTx->CR1 |= USART_CR1_OVER8; - } - else - { - /* Disable the 8x Oversampling mode by clearing the OVER8 bit in the CR1 register */ - USARTx->CR1 &= (uint32_t)~((uint32_t)USART_CR1_OVER8); - } -} - -/** - * @brief Enables or disables the USART's one bit sampling method. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param NewState: new state of the USART one bit sampling method. - * This parameter can be: ENABLE or DISABLE. - * @note This function has to be called before calling USART_Cmd() function. - * @retval None - */ -void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the one bit method by setting the ONEBITE bit in the CR3 register */ - USARTx->CR3 |= USART_CR3_ONEBIT; - } - else - { - /* Disable the one bit method by clearing the ONEBITE bit in the CR3 register */ - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_ONEBIT); - } -} - -/** - * @brief Enables or disables the USART's most significant bit first - * transmitted/received following the start bit. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param NewState: new state of the USART most significant bit first - * transmitted/received following the start bit. - * This parameter can be: ENABLE or DISABLE. - * @note This function has to be called before calling USART_Cmd() function. - * @retval None - */ -void USART_MSBFirstCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the most significant bit first transmitted/received following the - start bit by setting the MSBFIRST bit in the CR2 register */ - USARTx->CR2 |= USART_CR2_MSBFIRST; - } - else - { - /* Disable the most significant bit first transmitted/received following the - start bit by clearing the MSBFIRST bit in the CR2 register */ - USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_MSBFIRST); - } -} - -/** - * @brief Enables or disables the binary data inversion. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param NewState: new defined levels for the USART data. - * This parameter can be: - * @arg ENABLE: Logical data from the data register are send/received in negative - * logic (1=L, 0=H). The parity bit is also inverted. - * @arg DISABLE: Logical data from the data register are send/received in positive - * logic (1=H, 0=L) - * @note This function has to be called before calling USART_Cmd() function. - * @retval None - */ -void USART_DataInvCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the binary data inversion feature by setting the DATAINV bit in - the CR2 register */ - USARTx->CR2 |= USART_CR2_DATAINV; - } - else - { - /* Disable the binary data inversion feature by clearing the DATAINV bit in - the CR2 register */ - USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_DATAINV); - } -} - -/** - * @brief Enables or disables the Pin(s) active level inversion. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_InvPin: specifies the USART pin(s) to invert. - * This parameter can be any combination of the following values: - * @arg USART_InvPin_Tx: USART Tx pin active level inversion. - * @arg USART_InvPin_Rx: USART Rx pin active level inversion. - * @param NewState: new active level status for the USART pin(s). - * This parameter can be: - * @arg ENABLE: pin(s) signal values are inverted (Vdd =0, Gnd =1). - * @arg DISABLE: pin(s) signal works using the standard logic levels (Vdd =1, Gnd =0). - * @note This function has to be called before calling USART_Cmd() function. - * @retval None - */ -void USART_InvPinCmd(USART_TypeDef* USARTx, uint32_t USART_InvPin, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_INVERSTION_PIN(USART_InvPin)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the active level inversion for selected pins by setting the TXINV - and/or RXINV bits in the USART CR2 register */ - USARTx->CR2 |= USART_InvPin; - } - else - { - /* Disable the active level inversion for selected requests by clearing the - TXINV and/or RXINV bits in the USART CR2 register */ - USARTx->CR2 &= (uint32_t)~USART_InvPin; - } -} - -/** - * @brief Enables or disables the swap Tx/Rx pins. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param NewState: new state of the USARTx TX/RX pins pinout. - * This parameter can be: - * @arg ENABLE: The TX and RX pins functions are swapped. - * @arg DISABLE: TX/RX pins are used as defined in standard pinout - * @note This function has to be called before calling USART_Cmd() function. - * @retval None - */ -void USART_SWAPPinCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the SWAP feature by setting the SWAP bit in the CR2 register */ - USARTx->CR2 |= USART_CR2_SWAP; - } - else - { - /* Disable the SWAP feature by clearing the SWAP bit in the CR2 register */ - USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_SWAP); - } -} - -/** - * @brief Enables or disables the receiver Time Out feature. - * @param USARTx: where x can be 1 to select the USART peripheral. - * @param NewState: new state of the USARTx receiver Time Out. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_ReceiverTimeOutCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the receiver time out feature by setting the RTOEN bit in the CR2 - register */ - USARTx->CR2 |= USART_CR2_RTOEN; - } - else - { - /* Disable the receiver time out feature by clearing the RTOEN bit in the CR2 - register */ - USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_RTOEN); - } -} - -/** - * @brief Sets the receiver Time Out value. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is available only for STM32F072 devices. - * @param USART_ReceiverTimeOut: specifies the Receiver Time Out value. - * @retval None - */ -void USART_SetReceiverTimeOut(USART_TypeDef* USARTx, uint32_t USART_ReceiverTimeOut) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_USART_TIMEOUT(USART_ReceiverTimeOut)); - - /* Clear the receiver Time Out value by clearing the RTO[23:0] bits in the RTOR - register */ - USARTx->RTOR &= (uint32_t)~((uint32_t)USART_RTOR_RTO); - /* Set the receiver Time Out value by setting the RTO[23:0] bits in the RTOR - register */ - USARTx->RTOR |= USART_ReceiverTimeOut; -} - -/** - * @brief Sets the system clock prescaler. - * @note This function is not available for STM32F030 devices. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is available only for STM32F072 devices. - * @param USART_Prescaler: specifies the prescaler clock. - * @note This function has to be called before calling USART_Cmd() function. - * @retval None - */ -void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - - /* Clear the USART prescaler */ - USARTx->GTPR &= USART_GTPR_GT; - /* Set the USART prescaler */ - USARTx->GTPR |= USART_Prescaler; -} - -/** - * @} - */ - - -/** @defgroup USART_Group2 STOP Mode functions - * @brief STOP Mode functions - * -@verbatim - =============================================================================== - ##### STOP Mode functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage - WakeUp from STOP mode. - - [..] The USART is able to WakeUp from Stop Mode if USART clock is set to HSI - or LSI. - - [..] The WakeUp source is configured by calling USART_StopModeWakeUpSourceConfig() - function. - - [..] After configuring the source of WakeUp and before entering in Stop Mode - USART_STOPModeCmd() function should be called to allow USART WakeUp. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified USART peripheral in STOP Mode. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is available only for STM32F072 devices. - * @param NewState: new state of the USARTx peripheral state in stop mode. - * This parameter can be: ENABLE or DISABLE. - * @note This function has to be called when USART clock is set to HSI or LSE. - * @retval None - */ -void USART_STOPModeCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected USART in STOP mode by setting the UESM bit in the CR1 - register */ - USARTx->CR1 |= USART_CR1_UESM; - } - else - { - /* Disable the selected USART in STOP mode by clearing the UE bit in the CR1 - register */ - USARTx->CR1 &= (uint32_t)~((uint32_t)USART_CR1_UESM); - } -} - -/** - * @brief Selects the USART WakeUp method form stop mode. - * @note This function is not available for STM32F030 devices. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is available only for STM32F072 devices. - * @param USART_WakeUp: specifies the selected USART wakeup method. - * This parameter can be one of the following values: - * @arg USART_WakeUpSource_AddressMatch: WUF active on address match. - * @arg USART_WakeUpSource_StartBit: WUF active on Start bit detection. - * @arg USART_WakeUpSource_RXNE: WUF active on RXNE. - * @note This function has to be called before calling USART_Cmd() function. - * @retval None - */ -void USART_StopModeWakeUpSourceConfig(USART_TypeDef* USARTx, uint32_t USART_WakeUpSource) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_USART_STOPMODE_WAKEUPSOURCE(USART_WakeUpSource)); - - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_WUS); - USARTx->CR3 |= USART_WakeUpSource; -} - -/** - * @} - */ - - -/** @defgroup USART_Group3 AutoBaudRate functions - * @brief AutoBaudRate functions - * -@verbatim - =============================================================================== - ##### AutoBaudRate functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage - the AutoBaudRate detections. - - [..] Before Enabling AutoBaudRate detection using USART_AutoBaudRateCmd () - The character patterns used to calculate baudrate must be chosen by calling - USART_AutoBaudRateConfig() function. These function take as parameter : - (#)USART_AutoBaudRate_StartBit : any character starting with a bit 1. - (#)USART_AutoBaudRate_FallingEdge : any character starting with a 10xx bit pattern. - - [..] At any later time, another request for AutoBaudRate detection can be performed - using USART_RequestCmd() function. - - [..] The AutoBaudRate detection is monitored by the status of ABRF flag which indicate - that the AutoBaudRate detection is completed. In addition to ABRF flag, the ABRE flag - indicate that this procedure is completed without success. USART_GetFlagStatus () - function should be used to monitor the status of these flags. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the Auto Baud Rate. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is available only for STM32F072 devices. - * @param NewState: new state of the USARTx auto baud rate. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_AutoBaudRateCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the auto baud rate feature by setting the ABREN bit in the CR2 - register */ - USARTx->CR2 |= USART_CR2_ABREN; - } - else - { - /* Disable the auto baud rate feature by clearing the ABREN bit in the CR2 - register */ - USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_ABREN); - } -} - -/** - * @brief Selects the USART auto baud rate method. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is available only for STM32F072 devices. - * @param USART_AutoBaudRate: specifies the selected USART auto baud rate method. - * This parameter can be one of the following values: - * @arg USART_AutoBaudRate_StartBit: Start Bit duration measurement. - * @arg USART_AutoBaudRate_FallingEdge: Falling edge to falling edge measurement. - * @note This function has to be called before calling USART_Cmd() function. - * @retval None - */ -void USART_AutoBaudRateConfig(USART_TypeDef* USARTx, uint32_t USART_AutoBaudRate) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_USART_AUTOBAUDRATE_MODE(USART_AutoBaudRate)); - - USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_ABRMODE); - USARTx->CR2 |= USART_AutoBaudRate; -} - -/** - * @} - */ - - -/** @defgroup USART_Group4 Data transfers functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### Data transfers functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage - the USART data transfers. - [..] During an USART reception, data shifts in least significant bit first - through the RX pin. When a transmission is taking place, a write instruction to - the USART_TDR register stores the data in the shift register. - [..] The read access of the USART_RDR register can be done using - the USART_ReceiveData() function and returns the RDR value. - Whereas a write access to the USART_TDR can be done using USART_SendData() - function and stores the written data into TDR. - -@endverbatim - * @{ - */ - -/** - * @brief Transmits single data through the USARTx peripheral. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param Data: the data to transmit. - * @retval None - */ -void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_DATA(Data)); - - /* Transmit Data */ - USARTx->TDR = (Data & (uint16_t)0x01FF); -} - -/** - * @brief Returns the most recent received data by the USARTx peripheral. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @retval The received data. - */ -uint16_t USART_ReceiveData(USART_TypeDef* USARTx) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - - /* Receive Data */ - return (uint16_t)(USARTx->RDR & (uint16_t)0x01FF); -} - -/** - * @} - */ - -/** @defgroup USART_Group5 MultiProcessor Communication functions - * @brief Multi-Processor Communication functions - * -@verbatim - =============================================================================== - ##### Multi-Processor Communication functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage the USART - multiprocessor communication. - [..] For instance one of the USARTs can be the master, its TX output is - connected to the RX input of the other USART. The others are slaves, - their respective TX outputs are logically ANDed together and connected - to the RX input of the master. USART multiprocessor communication is - possible through the following procedure: - (#) Program the Baud rate, Word length = 9 bits, Stop bits, Parity, - Mode transmitter or Mode receiver and hardware flow control values - using the USART_Init() function. - (#) Configures the USART address using the USART_SetAddress() function. - (#) Configures the wake up methode (USART_WakeUp_IdleLine or - USART_WakeUp_AddressMark) using USART_WakeUpConfig() function only - for the slaves. - (#) Enable the USART using the USART_Cmd() function. - (#) Enter the USART slaves in mute mode using USART_ReceiverWakeUpCmd() - function. - [..] The USART Slave exit from mute mode when receive the wake up condition. - -@endverbatim - * @{ - */ - -/** - * @brief Sets the address of the USART node. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_Address: Indicates the address of the USART node. - * @retval None - */ -void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - - /* Clear the USART address */ - USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_ADD); - /* Set the USART address node */ - USARTx->CR2 |=((uint32_t)USART_Address << (uint32_t)0x18); -} - -/** - * @brief Enables or disables the USART's mute mode. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param NewState: new state of the USART mute mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_MuteModeCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the USART mute mode by setting the MME bit in the CR1 register */ - USARTx->CR1 |= USART_CR1_MME; - } - else - { - /* Disable the USART mute mode by clearing the MME bit in the CR1 register */ - USARTx->CR1 &= (uint32_t)~((uint32_t)USART_CR1_MME); - } -} - -/** - * @brief Selects the USART WakeUp method from mute mode. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_WakeUp: specifies the USART wakeup method. - * This parameter can be one of the following values: - * @arg USART_WakeUp_IdleLine: WakeUp by an idle line detection - * @arg USART_WakeUp_AddressMark: WakeUp by an address mark - * @retval None - */ -void USART_MuteModeWakeUpConfig(USART_TypeDef* USARTx, uint32_t USART_WakeUp) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_MUTEMODE_WAKEUP(USART_WakeUp)); - - USARTx->CR1 &= (uint32_t)~((uint32_t)USART_CR1_WAKE); - USARTx->CR1 |= USART_WakeUp; -} - -/** - * @brief Configure the the USART Address detection length. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_AddressLength: specifies the USART address length detection. - * This parameter can be one of the following values: - * @arg USART_AddressLength_4b: 4-bit address length detection - * @arg USART_AddressLength_7b: 7-bit address length detection - * @retval None - */ -void USART_AddressDetectionConfig(USART_TypeDef* USARTx, uint32_t USART_AddressLength) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_ADDRESS_DETECTION(USART_AddressLength)); - - USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_ADDM7); - USARTx->CR2 |= USART_AddressLength; -} - -/** - * @} - */ - -/** @defgroup USART_Group6 LIN mode functions - * @brief LIN mode functions - * -@verbatim - =============================================================================== - ##### LIN mode functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage the USART - LIN Mode communication. - [..] In LIN mode, 8-bit data format with 1 stop bit is required in accordance - with the LIN standard. - [..] Only this LIN Feature is supported by the USART IP: - (+) LIN Master Synchronous Break send capability and LIN slave break - detection capability : 13-bit break generation and 10/11 bit break - detection. - [..] USART LIN Master transmitter communication is possible through the - following procedure: - (#) Program the Baud rate, Word length = 8bits, Stop bits = 1bit, Parity, - Mode transmitter or Mode receiver and hardware flow control values - using the USART_Init() function. - (#) Enable the LIN mode using the USART_LINCmd() function. - (#) Enable the USART using the USART_Cmd() function. - (#) Send the break character using USART_SendBreak() function. - [..] USART LIN Master receiver communication is possible through the - following procedure: - (#) Program the Baud rate, Word length = 8bits, Stop bits = 1bit, Parity, - Mode transmitter or Mode receiver and hardware flow control values - using the USART_Init() function. - (#) Configures the break detection length - using the USART_LINBreakDetectLengthConfig() function. - (#) Enable the LIN mode using the USART_LINCmd() function. - -@- In LIN mode, the following bits must be kept cleared: - (+@) CLKEN in the USART_CR2 register. - (+@) STOP[1:0], SCEN, HDSEL and IREN in the USART_CR3 register. - (#) Enable the USART using the USART_Cmd() function. - -@endverbatim - * @{ - */ - -/** - * @brief Sets the USART LIN Break detection length. - * @note This function is not available for STM32F030 devices. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is available only for STM32F072 devices. - * @param USART_LINBreakDetectLength: specifies the LIN break detection length. - * This parameter can be one of the following values: - * @arg USART_LINBreakDetectLength_10b: 10-bit break detection - * @arg USART_LINBreakDetectLength_11b: 11-bit break detection - * @retval None - */ -void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint32_t USART_LINBreakDetectLength) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_USART_LIN_BREAK_DETECT_LENGTH(USART_LINBreakDetectLength)); - - USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_LBDL); - USARTx->CR2 |= USART_LINBreakDetectLength; -} - -/** - * @brief Enables or disables the USART's LIN mode. - * @note This function is not available for STM32F030 devices. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is available only for STM32F072 devices. - * @param NewState: new state of the USART LIN mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the LIN mode by setting the LINEN bit in the CR2 register */ - USARTx->CR2 |= USART_CR2_LINEN; - } - else - { - /* Disable the LIN mode by clearing the LINEN bit in the CR2 register */ - USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_LINEN); - } -} - -/** - * @} - */ - -/** @defgroup USART_Group7 Halfduplex mode function - * @brief Half-duplex mode function - * -@verbatim - =============================================================================== - ##### Half-duplex mode function ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage the USART - Half-duplex communication. - [..] The USART can be configured to follow a single-wire half-duplex protocol - where the TX and RX lines are internally connected. - [..] USART Half duplex communication is possible through the following procedure: - (#) Program the Baud rate, Word length, Stop bits, Parity, Mode transmitter - or Mode receiver and hardware flow control values using the USART_Init() - function. - (#) Configures the USART address using the USART_SetAddress() function. - (#) Enable the half duplex mode using USART_HalfDuplexCmd() function. - (#) Enable the USART using the USART_Cmd() function. - -@- The RX pin is no longer used. - -@- In Half-duplex mode the following bits must be kept cleared: - (+@) LINEN and CLKEN bits in the USART_CR2 register. - (+@) SCEN and IREN bits in the USART_CR3 register. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the USART's Half Duplex communication. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param NewState: new state of the USART Communication. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ - USARTx->CR3 |= USART_CR3_HDSEL; - } - else - { - /* Disable the Half-Duplex mode by clearing the HDSEL bit in the CR3 register */ - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_HDSEL); - } -} - -/** - * @} - */ - - -/** @defgroup USART_Group8 Smartcard mode functions - * @brief Smartcard mode functions - * -@verbatim - =============================================================================== - ##### Smartcard mode functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage the USART - Smartcard communication. - [..] The Smartcard interface is designed to support asynchronous protocol - Smartcards as defined in the ISO 7816-3 standard. The USART can provide - a clock to the smartcard through the SCLK output. In smartcard mode, - SCLK is not associated to the communication but is simply derived from - the internal peripheral input clock through a 5-bit prescaler. - [..] Smartcard communication is possible through the following procedure: - (#) Configures the Smartcard Prsecaler using the USART_SetPrescaler() - function. - (#) Configures the Smartcard Guard Time using the USART_SetGuardTime() - function. - (#) Program the USART clock using the USART_ClockInit() function as following: - (++) USART Clock enabled. - (++) USART CPOL Low. - (++) USART CPHA on first edge. - (++) USART Last Bit Clock Enabled. - (#) Program the Smartcard interface using the USART_Init() function as - following: - (++) Word Length = 9 Bits. - (++) 1.5 Stop Bit. - (++) Even parity. - (++) BaudRate = 12096 baud. - (++) Hardware flow control disabled (RTS and CTS signals). - (++) Tx and Rx enabled - (#) Optionally you can enable the parity error interrupt using - the USART_ITConfig() function. - (#) Enable the Smartcard NACK using the USART_SmartCardNACKCmd() function. - (#) Enable the Smartcard interface using the USART_SmartCardCmd() function. - (#) Enable the USART using the USART_Cmd() function. - [..] - Please refer to the ISO 7816-3 specification for more details. - [..] - (@) It is also possible to choose 0.5 stop bit for receiving but it is - recommended to use 1.5 stop bits for both transmitting and receiving - to avoid switching between the two configurations. - (@) In smartcard mode, the following bits must be kept cleared: - (+@) LINEN bit in the USART_CR2 register. - (+@) HDSEL and IREN bits in the USART_CR3 register. - -@endverbatim - * @{ - */ - -/** - * @brief Sets the specified USART guard time. - * @note This function is not available for STM32F030 devices. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is applicable only for STM32F072 devices. - * @param USART_GuardTime: specifies the guard time. - * @retval None - */ -void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - - /* Clear the USART Guard time */ - USARTx->GTPR &= USART_GTPR_PSC; - /* Set the USART guard time */ - USARTx->GTPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08); -} - -/** - * @brief Enables or disables the USART's Smart Card mode. - * @note This function is not available for STM32F030 devices. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is applicable only for STM32F072 devices. - * @param NewState: new state of the Smart Card mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the SC mode by setting the SCEN bit in the CR3 register */ - USARTx->CR3 |= USART_CR3_SCEN; - } - else - { - /* Disable the SC mode by clearing the SCEN bit in the CR3 register */ - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_SCEN); - } -} - -/** - * @brief Enables or disables NACK transmission. - * @note This function is not available for STM32F030 devices. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is applicable only for STM32F072 devices. - * @param NewState: new state of the NACK transmission. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the NACK transmission by setting the NACK bit in the CR3 register */ - USARTx->CR3 |= USART_CR3_NACK; - } - else - { - /* Disable the NACK transmission by clearing the NACK bit in the CR3 register */ - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_NACK); - } -} - -/** - * @brief Sets the Smart Card number of retries in transmit and receive. - * @note This function is not available for STM32F030 devices. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is applicable only for STM32F072 devices. - * @param USART_AutoCount: specifies the Smart Card auto retry count. - * @retval None - */ -void USART_SetAutoRetryCount(USART_TypeDef* USARTx, uint8_t USART_AutoCount) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_USART_AUTO_RETRY_COUNTER(USART_AutoCount)); - /* Clear the USART auto retry count */ - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_SCARCNT); - /* Set the USART auto retry count*/ - USARTx->CR3 |= (uint32_t)((uint32_t)USART_AutoCount << 0x11); -} - -/** - * @brief Sets the Smart Card Block length. - * @note This function is not available for STM32F030 devices. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is applicable only for STM32F072 devices. - * @param USART_BlockLength: specifies the Smart Card block length. - * @retval None - */ -void USART_SetBlockLength(USART_TypeDef* USARTx, uint8_t USART_BlockLength) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - - /* Clear the Smart card block length */ - USARTx->RTOR &= (uint32_t)~((uint32_t)USART_RTOR_BLEN); - /* Set the Smart Card block length */ - USARTx->RTOR |= (uint32_t)((uint32_t)USART_BlockLength << 0x18); -} - -/** - * @} - */ - -/** @defgroup USART_Group9 IrDA mode functions - * @brief IrDA mode functions - * -@verbatim - =============================================================================== - ##### IrDA mode functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage the USART - IrDA communication. - [..] IrDA is a half duplex communication protocol. If the Transmitter is busy, - any data on the IrDA receive line will be ignored by the IrDA decoder - and if the Receiver is busy, data on the TX from the USART to IrDA will - not be encoded by IrDA. While receiving data, transmission should be - avoided as the data to be transmitted could be corrupted. - [..] IrDA communication is possible through the following procedure: - (#) Program the Baud rate, Word length = 8 bits, Stop bits, Parity, - Transmitter/Receiver modes and hardware flow control values using - the USART_Init() function. - (#) Configures the IrDA pulse width by configuring the prescaler using - the USART_SetPrescaler() function. - (#) Configures the IrDA USART_IrDAMode_LowPower or USART_IrDAMode_Normal - mode using the USART_IrDAConfig() function. - (#) Enable the IrDA using the USART_IrDACmd() function. - (#) Enable the USART using the USART_Cmd() function. - [..] - (@) A pulse of width less than two and greater than one PSC period(s) may or - may not be rejected. - (@) The receiver set up time should be managed by software. The IrDA physical - layer specification specifies a minimum of 10 ms delay between - transmission and reception (IrDA is a half duplex protocol). - (@) In IrDA mode, the following bits must be kept cleared: - (+@) LINEN, STOP and CLKEN bits in the USART_CR2 register. - (+@) SCEN and HDSEL bits in the USART_CR3 register. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the USART's IrDA interface. - * @note This function is not available for STM32F030 devices. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is applicable only for STM32F072 devices. - * @param USART_IrDAMode: specifies the IrDA mode. - * This parameter can be one of the following values: - * @arg USART_IrDAMode_LowPower - * @arg USART_IrDAMode_Normal - * @retval None - */ -void USART_IrDAConfig(USART_TypeDef* USARTx, uint32_t USART_IrDAMode) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_USART_IRDA_MODE(USART_IrDAMode)); - - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_IRLP); - USARTx->CR3 |= USART_IrDAMode; -} - -/** - * @brief Enables or disables the USART's IrDA interface. - * @note This function is not available for STM32F030 devices. - * @param USARTx: where x can be 1or 2 to select the USART peripheral. - * @note USART2 is applicable only for STM32F072 devices. - * @param NewState: new state of the IrDA mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_12_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the IrDA mode by setting the IREN bit in the CR3 register */ - USARTx->CR3 |= USART_CR3_IREN; - } - else - { - /* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_IREN); - } -} -/** - * @} - */ - -/** @defgroup USART_Group10 RS485 mode function - * @brief RS485 mode function - * -@verbatim - =============================================================================== - ##### RS485 mode functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage the USART - RS485 flow control. - [..] RS485 flow control (Driver enable feature) handling is possible through - the following procedure: - (#) Program the Baud rate, Word length = 8 bits, Stop bits, Parity, - Transmitter/Receiver modes and hardware flow control values using - the USART_Init() function. - (#) Enable the Driver Enable using the USART_DECmd() function. - (#) Configures the Driver Enable polarity using the USART_DEPolarityConfig() - function. - (#) Configures the Driver Enable assertion time using USART_SetDEAssertionTime() - function and deassertion time using the USART_SetDEDeassertionTime() - function. - (#) Enable the USART using the USART_Cmd() function. - -@- - (+@) The assertion and dessertion times are expressed in sample time units (1/8 or - 1/16 bit time, depending on the oversampling rate). - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the USART's DE functionality. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param NewState: new state of the driver enable mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_DECmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the DE functionality by setting the DEM bit in the CR3 register */ - USARTx->CR3 |= USART_CR3_DEM; - } - else - { - /* Disable the DE functionality by clearing the DEM bit in the CR3 register */ - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DEM); - } -} - -/** - * @brief Configures the USART's DE polarity - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_DEPolarity: specifies the DE polarity. - * This parameter can be one of the following values: - * @arg USART_DEPolarity_Low - * @arg USART_DEPolarity_High - * @retval None - */ -void USART_DEPolarityConfig(USART_TypeDef* USARTx, uint32_t USART_DEPolarity) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_DE_POLARITY(USART_DEPolarity)); - - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DEP); - USARTx->CR3 |= USART_DEPolarity; -} - -/** - * @brief Sets the specified RS485 DE assertion time - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_DEAssertionTime: specifies the time between the activation of - * the DE signal and the beginning of the start bit - * @retval None - */ -void USART_SetDEAssertionTime(USART_TypeDef* USARTx, uint32_t USART_DEAssertionTime) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_DE_ASSERTION_DEASSERTION_TIME(USART_DEAssertionTime)); - - /* Clear the DE assertion time */ - USARTx->CR1 &= (uint32_t)~((uint32_t)USART_CR1_DEAT); - /* Set the new value for the DE assertion time */ - USARTx->CR1 |=((uint32_t)USART_DEAssertionTime << (uint32_t)0x15); -} - -/** - * @brief Sets the specified RS485 DE deassertion time - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_DeassertionTime: specifies the time between the middle of the last - * stop bit in a transmitted message and the de-activation of the DE signal - * @retval None - */ -void USART_SetDEDeassertionTime(USART_TypeDef* USARTx, uint32_t USART_DEDeassertionTime) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_DE_ASSERTION_DEASSERTION_TIME(USART_DEDeassertionTime)); - - /* Clear the DE deassertion time */ - USARTx->CR1 &= (uint32_t)~((uint32_t)USART_CR1_DEDT); - /* Set the new value for the DE deassertion time */ - USARTx->CR1 |=((uint32_t)USART_DEDeassertionTime << (uint32_t)0x10); -} - -/** - * @} - */ - -/** @defgroup USART_Group11 DMA transfers management functions - * @brief DMA transfers management functions - * -@verbatim - =============================================================================== - ##### DMA transfers management functions ##### - =============================================================================== - [..] This section provides two functions that can be used only in DMA mode. - [..] In DMA Mode, the USART communication can be managed by 2 DMA Channel - requests: - (#) USART_DMAReq_Tx: specifies the Tx buffer DMA transfer request. - (#) USART_DMAReq_Rx: specifies the Rx buffer DMA transfer request. - [..] In this Mode it is advised to use the following function: - (+) void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, - FunctionalState NewState). -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the USART's DMA interface. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_DMAReq: specifies the DMA request. - * This parameter can be any combination of the following values: - * @arg USART_DMAReq_Tx: USART DMA transmit request - * @arg USART_DMAReq_Rx: USART DMA receive request - * @param NewState: new state of the DMA Request sources. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_DMACmd(USART_TypeDef* USARTx, uint32_t USART_DMAReq, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_DMAREQ(USART_DMAReq)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the DMA transfer for selected requests by setting the DMAT and/or - DMAR bits in the USART CR3 register */ - USARTx->CR3 |= USART_DMAReq; - } - else - { - /* Disable the DMA transfer for selected requests by clearing the DMAT and/or - DMAR bits in the USART CR3 register */ - USARTx->CR3 &= (uint32_t)~USART_DMAReq; - } -} - -/** - * @brief Enables or disables the USART's DMA interface when reception error occurs. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_DMAOnError: specifies the DMA status in case of reception error. - * This parameter can be any combination of the following values: - * @arg USART_DMAOnError_Enable: DMA receive request enabled when the USART DMA - * reception error is asserted. - * @arg USART_DMAOnError_Disable: DMA receive request disabled when the USART DMA - * reception error is asserted. - * @retval None - */ -void USART_DMAReceptionErrorConfig(USART_TypeDef* USARTx, uint32_t USART_DMAOnError) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_DMAONERROR(USART_DMAOnError)); - - /* Clear the DMA Reception error detection bit */ - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DDRE); - /* Set the new value for the DMA Reception error detection bit */ - USARTx->CR3 |= USART_DMAOnError; -} - -/** - * @} - */ - -/** @defgroup USART_Group12 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - ##### Interrupts and flags management functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to configure the - USART Interrupts sources, Requests and check or clear the flags or pending bits status. - The user should identify which mode will be used in his application to - manage the communication: Polling mode, Interrupt mode. - - *** Polling Mode *** - ==================== - [..] In Polling Mode, the SPI communication can be managed by these flags: - (#) USART_FLAG_REACK: to indicate the status of the Receive Enable - acknowledge flag - (#) USART_FLAG_TEACK: to indicate the status of the Transmit Enable - acknowledge flag. - (#) USART_FLAG_WU: to indicate the status of the Wake up flag. - (#) USART_FLAG_RWU: to indicate the status of the Receive Wake up flag. - (#) USART_FLAG_SBK: to indicate the status of the Send Break flag. - (#) USART_FLAG_CM: to indicate the status of the Character match flag. - (#) USART_FLAG_BUSY: to indicate the status of the Busy flag. - (#) USART_FLAG_ABRF: to indicate the status of the Auto baud rate flag. - (#) USART_FLAG_ABRE: to indicate the status of the Auto baud rate error flag. - (#) USART_FLAG_EOB: to indicate the status of the End of block flag. - (#) USART_FLAG_RTO: to indicate the status of the Receive time out flag. - (#) USART_FLAG_nCTSS: to indicate the status of the Inverted nCTS input - bit status. - (#) USART_FLAG_TXE: to indicate the status of the transmit buffer register. - (#) USART_FLAG_RXNE: to indicate the status of the receive buffer register. - (#) USART_FLAG_TC: to indicate the status of the transmit operation. - (#) USART_FLAG_IDLE: to indicate the status of the Idle Line. - (#) USART_FLAG_CTS: to indicate the status of the nCTS input. - (#) USART_FLAG_LBD: to indicate the status of the LIN break detection. - (#) USART_FLAG_NE: to indicate if a noise error occur. - (#) USART_FLAG_FE: to indicate if a frame error occur. - (#) USART_FLAG_PE: to indicate if a parity error occur. - (#) USART_FLAG_ORE: to indicate if an Overrun error occur. - [..] In this Mode it is advised to use the following functions: - (+) FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG). - (+) void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG). - - *** Interrupt Mode *** - ====================== - [..] In Interrupt Mode, the USART communication can be managed by 8 interrupt - sources and 10 pending bits: - (+) Pending Bits: - (##) USART_IT_WU: to indicate the status of the Wake up interrupt. - (##) USART_IT_CM: to indicate the status of Character match interrupt. - (##) USART_IT_EOB: to indicate the status of End of block interrupt. - (##) USART_IT_RTO: to indicate the status of Receive time out interrupt. - (##) USART_IT_CTS: to indicate the status of CTS change interrupt. - (##) USART_IT_LBD: to indicate the status of LIN Break detection interrupt. - (##) USART_IT_TC: to indicate the status of Transmission complete interrupt. - (##) USART_IT_IDLE: to indicate the status of IDLE line detected interrupt. - (##) USART_IT_ORE: to indicate the status of OverRun Error interrupt. - (##) USART_IT_NE: to indicate the status of Noise Error interrupt. - (##) USART_IT_FE: to indicate the status of Framing Error interrupt. - (##) USART_IT_PE: to indicate the status of Parity Error interrupt. - - (+) Interrupt Source: - (##) USART_IT_WU: specifies the interrupt source for Wake up interrupt. - (##) USART_IT_CM: specifies the interrupt source for Character match - interrupt. - (##) USART_IT_EOB: specifies the interrupt source for End of block - interrupt. - (##) USART_IT_RTO: specifies the interrupt source for Receive time-out - interrupt. - (##) USART_IT_CTS: specifies the interrupt source for CTS change interrupt. - (##) USART_IT_LBD: specifies the interrupt source for LIN Break - detection interrupt. - (##) USART_IT_TXE: specifies the interrupt source for Tansmit Data - Register empty interrupt. - (##) USART_IT_TC: specifies the interrupt source for Transmission - complete interrupt. - (##) USART_IT_RXNE: specifies the interrupt source for Receive Data - register not empty interrupt. - (##) USART_IT_IDLE: specifies the interrupt source for Idle line - detection interrupt. - (##) USART_IT_PE: specifies the interrupt source for Parity Error interrupt. - (##) USART_IT_ERR: specifies the interrupt source for Error interrupt - (Frame error, noise error, overrun error) - -@@- Some parameters are coded in order to use them as interrupt - source or as pending bits. - [..] In this Mode it is advised to use the following functions: - (+) void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState). - (+) ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT). - (+) void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT). - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified USART interrupts. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_IT: specifies the USART interrupt sources to be enabled or disabled. - * This parameter can be one of the following values: - * @arg USART_IT_WU: Wake up interrupt, not available for STM32F030 devices. - * @arg USART_IT_CM: Character match interrupt. - * @arg USART_IT_EOB: End of block interrupt, not available for STM32F030 devices. - * @arg USART_IT_RTO: Receive time out interrupt. - * @arg USART_IT_CTS: CTS change interrupt. - * @arg USART_IT_LBD: LIN Break detection interrupt, not available for STM32F030 devices. - * @arg USART_IT_TXE: Tansmit Data Register empty interrupt. - * @arg USART_IT_TC: Transmission complete interrupt. - * @arg USART_IT_RXNE: Receive Data register not empty interrupt. - * @arg USART_IT_IDLE: Idle line detection interrupt. - * @arg USART_IT_PE: Parity Error interrupt. - * @arg USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) - * @param NewState: new state of the specified USARTx interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_ITConfig(USART_TypeDef* USARTx, uint32_t USART_IT, FunctionalState NewState) -{ - uint32_t usartreg = 0, itpos = 0, itmask = 0; - uint32_t usartxbase = 0; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_CONFIG_IT(USART_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - usartxbase = (uint32_t)USARTx; - - /* Get the USART register index */ - usartreg = (((uint16_t)USART_IT) >> 0x08); - - /* Get the interrupt position */ - itpos = USART_IT & IT_MASK; - itmask = (((uint32_t)0x01) << itpos); - - if (usartreg == 0x02) /* The IT is in CR2 register */ - { - usartxbase += 0x04; - } - else if (usartreg == 0x03) /* The IT is in CR3 register */ - { - usartxbase += 0x08; - } - else /* The IT is in CR1 register */ - { - } - if (NewState != DISABLE) - { - *(__IO uint32_t*)usartxbase |= itmask; - } - else - { - *(__IO uint32_t*)usartxbase &= ~itmask; - } -} - -/** - * @brief Enables the specified USART's Request. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_Request: specifies the USART request. - * This parameter can be any combination of the following values: - * @arg USART_Request_TXFRQ: Transmit data flush ReQuest - * @arg USART_Request_RXFRQ: Receive data flush ReQuest - * @arg USART_Request_MMRQ: Mute Mode ReQuest - * @arg USART_Request_SBKRQ: Send Break ReQuest - * @arg USART_Request_ABRRQ: Auto Baud Rate ReQuest - * @param NewState: new state of the DMA interface when reception error occurs. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_RequestCmd(USART_TypeDef* USARTx, uint32_t USART_Request, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_REQUEST(USART_Request)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the USART ReQuest by setting the dedicated request bit in the RQR - register.*/ - USARTx->RQR |= USART_Request; - } - else - { - /* Disable the USART ReQuest by clearing the dedicated request bit in the RQR - register.*/ - USARTx->RQR &= (uint32_t)~USART_Request; - } -} - -/** - * @brief Enables or disables the USART's Overrun detection. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_OVRDetection: specifies the OVR detection status in case of OVR error. - * This parameter can be any combination of the following values: - * @arg USART_OVRDetection_Enable: OVR error detection enabled when - * the USART OVR error is asserted. - * @arg USART_OVRDetection_Disable: OVR error detection disabled when - * the USART OVR error is asserted. - * @retval None - */ -void USART_OverrunDetectionConfig(USART_TypeDef* USARTx, uint32_t USART_OVRDetection) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_OVRDETECTION(USART_OVRDetection)); - - /* Clear the OVR detection bit */ - USARTx->CR3 &= (uint32_t)~((uint32_t)USART_CR3_OVRDIS); - /* Set the new value for the OVR detection bit */ - USARTx->CR3 |= USART_OVRDetection; -} - -/** - * @brief Checks whether the specified USART flag is set or not. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg USART_FLAG_REACK: Receive Enable acknowledge flag. - * @arg USART_FLAG_TEACK: Transmit Enable acknowledge flag. - * @arg USART_FLAG_WU: Wake up flag, not available for STM32F030 devices. - * @arg USART_FLAG_RWU: Receive Wake up flag, not available for STM32F030 devices. - * @arg USART_FLAG_SBK: Send Break flag. - * @arg USART_FLAG_CM: Character match flag. - * @arg USART_FLAG_BUSY: Busy flag. - * @arg USART_FLAG_ABRF: Auto baud rate flag. - * @arg USART_FLAG_ABRE: Auto baud rate error flag. - * @arg USART_FLAG_EOB: End of block flag, not available for STM32F030 devices. - * @arg USART_FLAG_RTO: Receive time out flag. - * @arg USART_FLAG_nCTSS: Inverted nCTS input bit status. - * @arg USART_FLAG_CTS: CTS Change flag. - * @arg USART_FLAG_LBD: LIN Break detection flag, not available for STM32F030 devices. - * @arg USART_FLAG_TXE: Transmit data register empty flag. - * @arg USART_FLAG_TC: Transmission Complete flag. - * @arg USART_FLAG_RXNE: Receive data register not empty flag. - * @arg USART_FLAG_IDLE: Idle Line detection flag. - * @arg USART_FLAG_ORE: OverRun Error flag. - * @arg USART_FLAG_NE: Noise Error flag. - * @arg USART_FLAG_FE: Framing Error flag. - * @arg USART_FLAG_PE: Parity Error flag. - * @retval The new state of USART_FLAG (SET or RESET). - */ -FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint32_t USART_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_FLAG(USART_FLAG)); - - if ((USARTx->ISR & USART_FLAG) != (uint16_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the USARTx's pending flags. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg USART_FLAG_WU: Wake up flag, not available for STM32F030 devices. - * @arg USART_FLAG_CM: Character match flag. - * @arg USART_FLAG_EOB: End of block flag, not available for STM32F030 devices. - * @arg USART_FLAG_RTO: Receive time out flag. - * @arg USART_FLAG_CTS: CTS Change flag. - * @arg USART_FLAG_LBD: LIN Break detection flag, not available for STM32F030 devices. - * @arg USART_FLAG_TC: Transmission Complete flag. - * @arg USART_FLAG_IDLE: IDLE line detected flag. - * @arg USART_FLAG_ORE: OverRun Error flag. - * @arg USART_FLAG_NE: Noise Error flag. - * @arg USART_FLAG_FE: Framing Error flag. - * @arg USART_FLAG_PE: Parity Errorflag. - * - * @note RXNE pending bit is cleared by a read to the USART_RDR register - * (USART_ReceiveData()) or by writing 1 to the RXFRQ in the register - * USART_RQR (USART_RequestCmd()). - * @note TC flag can be also cleared by software sequence: a read operation - * to USART_SR register (USART_GetFlagStatus()) followed by a write - * operation to USART_TDR register (USART_SendData()). - * @note TXE flag is cleared by a write to the USART_TDR register (USART_SendData()) - * or by writing 1 to the TXFRQ in the register USART_RQR (USART_RequestCmd()). - * @note SBKF flag is cleared by 1 to the SBKRQ in the register USART_RQR - * (USART_RequestCmd()). - * @retval None - */ -void USART_ClearFlag(USART_TypeDef* USARTx, uint32_t USART_FLAG) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_CLEAR_FLAG(USART_FLAG)); - - USARTx->ICR = USART_FLAG; -} - -/** - * @brief Checks whether the specified USART interrupt has occurred or not. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_IT: specifies the USART interrupt source to check. - * This parameter can be one of the following values: - * @arg USART_IT_WU: Wake up interrupt, not available for STM32F030 devices. - * @arg USART_IT_CM: Character match interrupt. - * @arg USART_IT_EOB: End of block interrupt, not available for STM32F030 devices. - * @arg USART_IT_RTO: Receive time out interrupt. - * @arg USART_IT_CTS: CTS change interrupt. - * @arg USART_IT_LBD: LIN Break detection interrupt, not available for STM32F030 devices. - * @arg USART_IT_TXE: Tansmit Data Register empty interrupt. - * @arg USART_IT_TC: Transmission complete interrupt. - * @arg USART_IT_RXNE: Receive Data register not empty interrupt. - * @arg USART_IT_IDLE: Idle line detection interrupt. - * @arg USART_IT_ORE: OverRun Error interrupt. - * @arg USART_IT_NE: Noise Error interrupt. - * @arg USART_IT_FE: Framing Error interrupt. - * @arg USART_IT_PE: Parity Error interrupt. - * @retval The new state of USART_IT (SET or RESET). - */ -ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint32_t USART_IT) -{ - uint32_t bitpos = 0, itmask = 0, usartreg = 0; - ITStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_GET_IT(USART_IT)); - - /* Get the USART register index */ - usartreg = (((uint16_t)USART_IT) >> 0x08); - /* Get the interrupt position */ - itmask = USART_IT & IT_MASK; - itmask = (uint32_t)0x01 << itmask; - - if (usartreg == 0x01) /* The IT is in CR1 register */ - { - itmask &= USARTx->CR1; - } - else if (usartreg == 0x02) /* The IT is in CR2 register */ - { - itmask &= USARTx->CR2; - } - else /* The IT is in CR3 register */ - { - itmask &= USARTx->CR3; - } - - bitpos = USART_IT >> 0x10; - bitpos = (uint32_t)0x01 << bitpos; - bitpos &= USARTx->ISR; - if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - - return bitstatus; -} - -/** - * @brief Clears the USARTx's interrupt pending bits. - * @param USARTx: where x can be 1, 2, 3 or 4 to select the USART peripheral. - * @note USART3 and USART4 are available only for STM32F072 devices. - * @note USART2 is not available for STM32F031 devices. - * @param USART_IT: specifies the interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg USART_IT_WU: Wake up interrupt, not available for STM32F030 devices. - * @arg USART_IT_CM: Character match interrupt. - * @arg USART_IT_EOB: End of block interrupt, not available for STM32F030 devices. - * @arg USART_IT_RTO: Receive time out interrupt. - * @arg USART_IT_CTS: CTS change interrupt. - * @arg USART_IT_LBD: LIN Break detection interrupt, not available for STM32F030 devices. - * @arg USART_IT_TC: Transmission complete interrupt. - * @arg USART_IT_IDLE: IDLE line detected interrupt. - * @arg USART_IT_ORE: OverRun Error interrupt. - * @arg USART_IT_NE: Noise Error interrupt. - * @arg USART_IT_FE: Framing Error interrupt. - * @arg USART_IT_PE: Parity Error interrupt. - * - * @note RXNE pending bit is cleared by a read to the USART_RDR register - * (USART_ReceiveData()) or by writing 1 to the RXFRQ in the register - * USART_RQR (USART_RequestCmd()). - * @note TC pending bit can be also cleared by software sequence: a read - * operation to USART_SR register (USART_GetITStatus()) followed by - * a write operation to USART_TDR register (USART_SendData()). - * @note TXE pending bit is cleared by a write to the USART_TDR register - * (USART_SendData()) or by writing 1 to the TXFRQ in the register - * USART_RQR (USART_RequestCmd()). - * @retval None - */ -void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint32_t USART_IT) -{ - uint32_t bitpos = 0, itmask = 0; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_CLEAR_IT(USART_IT)); - - bitpos = USART_IT >> 0x10; - itmask = ((uint32_t)0x01 << (uint32_t)bitpos); - USARTx->ICR = (uint32_t)itmask; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_wwdg.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_wwdg.c deleted file mode 100644 index ab92920..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_wwdg.c +++ /dev/null @@ -1,303 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx_wwdg.c - * @author MCD Application Team - * @version V1.3.0 - * @date 16-January-2014 - * @brief This file provides firmware functions to manage the following - * functionalities of the Window watchdog (WWDG) peripheral: - * + Prescaler, Refresh window and Counter configuration - * + WWDG activation - * + Interrupts and flags management - * - * @verbatim - * - ============================================================================== - ##### WWDG features ##### - ============================================================================== - [..] Once enabled the WWDG generates a system reset on expiry of a programmed - time period, unless the program refreshes the counter (downcounter) - before to reach 0x3F value (i.e. a reset is generated when the counter - value rolls over from 0x40 to 0x3F). - [..] An MCU reset is also generated if the counter value is refreshed - before the counter has reached the refresh window value. This - implies that the counter must be refreshed in a limited window. - - [..] Once enabled the WWDG cannot be disabled except by a system reset. - - [..] WWDGRST flag in RCC_CSR register can be used to inform when a WWDG - reset occurs. - - [..] The WWDG counter input clock is derived from the APB clock divided - by a programmable prescaler. - - [..] WWDG counter clock = PCLK1 / Prescaler. - [..] WWDG timeout = (WWDG counter clock) * (counter value). - - [..] Min-max timeout value @32MHz (PCLK1): ~85us / ~43ms. - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable WWDG clock using RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE) - function. - - (#) Configure the WWDG prescaler using WWDG_SetPrescaler() function. - - (#) Configure the WWDG refresh window using WWDG_SetWindowValue() function. - - (#) Set the WWDG counter value and start it using WWDG_Enable() function. - When the WWDG is enabled the counter value should be configured to - a value greater than 0x40 to prevent generating an immediate reset. - - (#) Optionally you can enable the Early wakeup interrupt which is - generated when the counter reach 0x40. - Once enabled this interrupt cannot be disabled except by a system reset. - - (#) Then the application program must refresh the WWDG counter at regular - intervals during normal operation to prevent an MCU reset, using - WWDG_SetCounter() function. This operation must occur only when - the counter value is lower than the refresh window value, - programmed using WWDG_SetWindowValue(). - - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx_wwdg.h" -#include "stm32f0xx_rcc.h" - -/** @addtogroup STM32F0xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup WWDG - * @brief WWDG driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* --------------------- WWDG registers bit mask ---------------------------- */ -/* CFR register bit mask */ -#define CFR_WDGTB_MASK ((uint32_t)0xFFFFFE7F) -#define CFR_W_MASK ((uint32_t)0xFFFFFF80) -#define BIT_MASK ((uint8_t)0x7F) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup WWDG_Private_Functions - * @{ - */ - -/** @defgroup WWDG_Group1 Prescaler, Refresh window and Counter configuration functions - * @brief Prescaler, Refresh window and Counter configuration functions - * -@verbatim - ============================================================================== - ##### Prescaler, Refresh window and Counter configuration functions ##### - ============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the WWDG peripheral registers to their default reset values. - * @param None - * @retval None - */ -void WWDG_DeInit(void) -{ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE); -} - -/** - * @brief Sets the WWDG Prescaler. - * @param WWDG_Prescaler: specifies the WWDG Prescaler. - * This parameter can be one of the following values: - * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1 - * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2 - * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4 - * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8 - * @retval None - */ -void WWDG_SetPrescaler(uint32_t WWDG_Prescaler) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_WWDG_PRESCALER(WWDG_Prescaler)); - /* Clear WDGTB[1:0] bits */ - tmpreg = WWDG->CFR & CFR_WDGTB_MASK; - /* Set WDGTB[1:0] bits according to WWDG_Prescaler value */ - tmpreg |= WWDG_Prescaler; - /* Store the new value */ - WWDG->CFR = tmpreg; -} - -/** - * @brief Sets the WWDG window value. - * @param WindowValue: specifies the window value to be compared to the downcounter. - * This parameter value must be lower than 0x80. - * @retval None - */ -void WWDG_SetWindowValue(uint8_t WindowValue) -{ - __IO uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_WWDG_WINDOW_VALUE(WindowValue)); - /* Clear W[6:0] bits */ - - tmpreg = WWDG->CFR & CFR_W_MASK; - - /* Set W[6:0] bits according to WindowValue value */ - tmpreg |= WindowValue & (uint32_t) BIT_MASK; - - /* Store the new value */ - WWDG->CFR = tmpreg; -} - -/** - * @brief Enables the WWDG Early Wakeup interrupt(EWI). - * @note Once enabled this interrupt cannot be disabled except by a system reset. - * @param None - * @retval None - */ -void WWDG_EnableIT(void) -{ - WWDG->CFR |= WWDG_CFR_EWI; -} - -/** - * @brief Sets the WWDG counter value. - * @param Counter: specifies the watchdog counter value. - * This parameter must be a number between 0x40 and 0x7F (to prevent - * generating an immediate reset). - * @retval None - */ -void WWDG_SetCounter(uint8_t Counter) -{ - /* Check the parameters */ - assert_param(IS_WWDG_COUNTER(Counter)); - /* Write to T[6:0] bits to configure the counter value, no need to do - a read-modify-write; writing a 0 to WDGA bit does nothing */ - WWDG->CR = Counter & BIT_MASK; -} - -/** - * @} - */ - -/** @defgroup WWDG_Group2 WWDG activation functions - * @brief WWDG activation functions - * -@verbatim - ============================================================================== - ##### WWDG activation function ##### - ============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables WWDG and load the counter value. - * @param Counter: specifies the watchdog counter value. - * This parameter must be a number between 0x40 and 0x7F (to prevent - * generating an immediate reset). - * @retval None - */ -void WWDG_Enable(uint8_t Counter) -{ - /* Check the parameters */ - assert_param(IS_WWDG_COUNTER(Counter)); - WWDG->CR = WWDG_CR_WDGA | Counter; -} - -/** - * @} - */ - -/** @defgroup WWDG_Group3 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - ============================================================================== - ##### Interrupts and flags management functions ##### - ============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Checks whether the Early Wakeup interrupt flag is set or not. - * @param None - * @retval The new state of the Early Wakeup interrupt flag (SET or RESET). - */ -FlagStatus WWDG_GetFlagStatus(void) -{ - FlagStatus bitstatus = RESET; - - if ((WWDG->SR) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears Early Wakeup interrupt flag. - * @param None - * @retval None - */ -void WWDG_ClearFlag(void) -{ - WWDG->SR = (uint32_t)RESET; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_bsp.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_bsp.h deleted file mode 100644 index f105636..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_bsp.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - ****************************************************************************** - * @file usb_bsp.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Specific api's related to the used hardware platform - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_BSP__H__ -#define __USB_BSP__H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" - -/* Exported defines ----------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void USB_BSP_Init (USB_CORE_HANDLE *pdev); -void USB_BSP_EnableInterrupt (USB_CORE_HANDLE *pdev); -void USB_BSP_uDelay (const uint32_t usec); -void USB_BSP_mDelay (const uint32_t msec); - -#endif /* __USB_BSP__H__ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_conf_template.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_conf_template.h deleted file mode 100644 index 2b8d174..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_conf_template.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - ****************************************************************************** - * @file usb_conf_template.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief General low level driver configuration - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CONF__H__ -#define __USB_CONF__H__ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f0xx.h" -#include "stm32072b_eval.h" - -/* Exported defines ----------------------------------------------------------*/ -/* Select D+ pull up: internal or external */ -#ifdef USE_STM32072B_EVAL - /* When using STM32072B_EVAL board the internal pull up must be enabled */ - #define INTERNAL_PULLUP -#endif - -/* Define if Low power mode is enabled; it allows entering the device into STOP mode - following USB Suspend event, and wakes up after the USB wakeup event is received. */ -/* #define USB_DEVICE_LOW_PWR_MGMT_SUPPORT */ - -/* Select the CRS using HSI48 internal clock as USB clock source. - If this define is commented, PLL will be used as USB clock source. - User need to ensure that the PLL output clock to USB is 48MHz for proper - USB functioning */ -#define USB_CLOCK_SOURCE_CRS - -/* Endpoints used by the device */ -#define EP_NUM (3) /* EP0 + EP1 for MSC IN + EP2 for MSC OUT */ - -/* Buffer table base address */ -#define BTABLE_ADDRESS (0x00) - -/* EP0, RX/TX buffers base address */ -#define ENDP0_RX_ADDRESS (0x18) -#define ENDP0_TX_ADDRESS (0x58) - -/* EP1, TX buffer base address */ -#define MSC_IN_TX_ADDRESS (0x98) - -/* EP2, Rx buffer base address */ -#define MSC_OUT_RX_ADDRESS (0xD8) - -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#endif /* __USB_CONF__H__ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_core.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_core.h deleted file mode 100644 index f3cee3c..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_core.h +++ /dev/null @@ -1,495 +0,0 @@ -/** - ****************************************************************************** - * @file usb_core.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides Interface prototype functions to USB cell registers - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CORE_H__ -#define __USB_CORE_H__ -/* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" -#include "usb_regs.h" - -/* Exported defines ----------------------------------------------------------*/ -#define EP_TYPE_CTRL 0 - -#define USB_EP0_IDLE 0 -#define USB_EP0_SETUP 1 -#define USB_EP0_DATA_IN 2 -#define USB_EP0_DATA_OUT 3 -#define USB_EP0_STATUS_IN 4 -#define USB_EP0_STATUS_OUT 5 - - -#define USB_MAX_EP0_SIZE 64 - -#define USB_SPEED_FULL 1 - -/* Exported types ------------------------------------------------------------*/ -typedef enum { - USB_OK = 0, - USB_FAIL -}USB_STS; - -/* Exported macros -----------------------------------------------------------*/ -/* SetCNTR */ -#define _SetCNTR(wRegValue) (*CNTR = (uint16_t)wRegValue) - -/* SetISTR */ -#define _SetISTR(wRegValue) (*ISTR = (uint16_t)wRegValue) - -/* SetDADDR */ -#define _SetDADDR(wRegValue) (*DADDR = (uint16_t)wRegValue) - -/* SetBCDR */ -#define _SetBCDR(wRegValue) (*BCDR = (uint16_t)wRegValue) - -/* SetBTABLE */ -#define _SetBTABLE(wRegValue)(*BTABLE = (uint16_t)(wRegValue & 0xFFF8)) - -/*SetLPMCSR */ -#define _SetLPMCSR(wRegValue) (*LPMCSR = (uint16_t)wRegValue) - -/* GetCNTR */ -#define _GetCNTR() ((uint16_t) *CNTR) - -/* GetISTR */ -#define _GetISTR() ((uint16_t) *ISTR) - -/* GetFNR */ -#define _GetFNR() ((uint16_t) *FNR) - -/* GetDADDR */ -#define _GetDADDR() ((uint16_t) *DADDR) - -/* GetBTABLE */ -#define _GetBTABLE() ((uint16_t) *BTABLE) - -/*GetLPMCSR */ -#define _GetLPMCSR() ((uint16_t) *LPMCSR) - - -/* SetENDPOINT */ -#define _SetENDPOINT(bEpNum,wRegValue) (*(EP0REG + bEpNum)= \ - (uint16_t)wRegValue) - -/* GetENDPOINT */ -#define _GetENDPOINT(bEpNum) ((uint16_t)(*(EP0REG + bEpNum))) - - - -/** - * @brief sets the type in the endpoint register(bits EP_TYPE[1:0]) - * @param bEpNum: Endpoint Number. - * @param wType: Endpoint Type. - * @retval None - */ -#define _SetEPType(bEpNum,wType) (_SetENDPOINT(bEpNum,\ - ((_GetENDPOINT(bEpNum) & EP_T_MASK) | wType ))) - -/** - * @brief gets the type in the endpoint register(bits EP_TYPE[1:0]) - * @param bEpNum: Endpoint Number. - * @retval Endpoint Type - */ -#define _GetEPType(bEpNum) (_GetENDPOINT(bEpNum) & EP_T_FIELD) - - -/** - * @brief sets the status for tx transfer (bits STAT_TX[1:0]). - * @param bEpNum: Endpoint Number. - * @param wState: new state - * @retval None - */ -#define _SetEPTxStatus(bEpNum,wState) {\ -register uint16_t _wRegVal; \ - _wRegVal = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK;\ - /* toggle first bit ? */ \ - if((EPTX_DTOG1 & wState)!= 0) \ - _wRegVal ^= EPTX_DTOG1; \ - /* toggle second bit ? */ \ - if((EPTX_DTOG2 & wState)!= 0) \ - _wRegVal ^= EPTX_DTOG2; \ - _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ - } /* _SetEPTxStatus */ - -/** - * @brief sets the status for rx transfer (bits STAT_TX[1:0]) - * @param bEpNum: Endpoint Number. - * @param wState: new state - * @retval None - */ -#define _SetEPRxStatus(bEpNum,wState) {\ - register uint16_t _wRegVal; \ - \ - _wRegVal = _GetENDPOINT(bEpNum) & EPRX_DTOGMASK;\ - /* toggle first bit ? */ \ - if((EPRX_DTOG1 & wState)!= 0) \ - _wRegVal ^= EPRX_DTOG1; \ - /* toggle second bit ? */ \ - if((EPRX_DTOG2 & wState)!= 0) \ - _wRegVal ^= EPRX_DTOG2; \ - _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ - } /* _SetEPRxStatus */ - -/** - * @brief sets the status for rx & tx (bits STAT_TX[1:0] & STAT_RX[1:0]) - * @param bEpNum: Endpoint Number. - * @param wStaterx: new state. - * @param wStatetx: new state. - * @retval None - */ -#define _SetEPRxTxStatus(bEpNum,wStaterx,wStatetx) {\ - register uint32_t _wRegVal; \ - \ - _wRegVal = _GetENDPOINT(bEpNum) & (EPRX_DTOGMASK |EPTX_STAT) ;\ - /* toggle first bit ? */ \ - if((EPRX_DTOG1 & wStaterx)!= 0) \ - _wRegVal ^= EPRX_DTOG1; \ - /* toggle second bit ? */ \ - if((EPRX_DTOG2 & wStaterx)!= 0) \ - _wRegVal ^= EPRX_DTOG2; \ - /* toggle first bit ? */ \ - if((EPTX_DTOG1 & wStatetx)!= 0) \ - _wRegVal ^= EPTX_DTOG1; \ - /* toggle second bit ? */ \ - if((EPTX_DTOG2 & wStatetx)!= 0) \ - _wRegVal ^= EPTX_DTOG2; \ - _SetENDPOINT(bEpNum, _wRegVal | EP_CTR_RX|EP_CTR_TX); \ - } /* _SetEPRxTxStatus */ - -/** - * @brief gets the status for tx/rx transfer (bits STAT_TX[1:0] - * /STAT_RX[1:0]) - * @param bEpNum: Endpoint Number. - * @retval status - */ -#define _GetEPTxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPTX_STAT) - -#define _GetEPRxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPRX_STAT) - -/** - * @brief sets directly the VALID tx/rx-status into the endpoint register - * @param bEpNum: Endpoint Number. - * @retval None - */ -#define _SetEPTxValid(bEpNum) (_SetEPTxStatus(bEpNum, EP_TX_VALID)) - -#define _SetEPRxValid(bEpNum) (_SetEPRxStatus(bEpNum, EP_RX_VALID)) - -/** - * @brief checks stall condition in an endpoint. - * @param bEpNum: Endpoint Number. - * @retval TRUE = endpoint in stall condition. - */ -#define _GetTxStallStatus(bEpNum) (_GetEPTxStatus(bEpNum) \ - == EP_TX_STALL) -#define _GetRxStallStatus(bEpNum) (_GetEPRxStatus(bEpNum) \ - == EP_RX_STALL) - -/** - * @brief set & clear EP_KIND bit. - * @param bEpNum: Endpoint Number. - * @retval None - */ -#define _SetEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \ - (EP_CTR_RX|EP_CTR_TX|((_GetENDPOINT(bEpNum) | EP_KIND) & EPREG_MASK)))) -#define _ClearEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \ - (EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPKIND_MASK)))) - -/** - * @brief Sets/clears directly STATUS_OUT bit in the endpoint register. - * @param bEpNum: Endpoint Number. - * @retval None - */ -#define _Set_Status_Out(bEpNum) _SetEP_KIND(bEpNum) -#define _Clear_Status_Out(bEpNum) _ClearEP_KIND(bEpNum) - -/** - * @brief Sets/clears directly EP_KIND bit in the endpoint register. - * @param bEpNum: Endpoint Number. - * @retval None - */ -#define _SetEPDoubleBuff(bEpNum) _SetEP_KIND(bEpNum) -#define _ClearEPDoubleBuff(bEpNum) _ClearEP_KIND(bEpNum) - -/** - * @brief Clears bit CTR_RX / CTR_TX in the endpoint register. - * @param bEpNum: Endpoint Number. - * @retval None - */ -#define _ClearEP_CTR_RX(bEpNum) (_SetENDPOINT(bEpNum,\ - _GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK)) -#define _ClearEP_CTR_TX(bEpNum) (_SetENDPOINT(bEpNum,\ - _GetENDPOINT(bEpNum) & 0xFF7F & EPREG_MASK)) - -/** - * @brief Toggles DTOG_RX / DTOG_TX bit in the endpoint register. - * @param bEpNum: Endpoint Number. - * @retval None - */ -#define _ToggleDTOG_RX(bEpNum) (_SetENDPOINT(bEpNum, \ - EP_CTR_RX|EP_CTR_TX|EP_DTOG_RX | (_GetENDPOINT(bEpNum) & EPREG_MASK))) -#define _ToggleDTOG_TX(bEpNum) (_SetENDPOINT(bEpNum, \ - EP_CTR_RX|EP_CTR_TX|EP_DTOG_TX | (_GetENDPOINT(bEpNum) & EPREG_MASK))) - -/** - * @brief Clears DTOG_RX / DTOG_TX bit in the endpoint register. - * @param bEpNum: Endpoint Number. - * @retval None - */ -#define _ClearDTOG_RX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_RX) != 0)\ - _ToggleDTOG_RX(bEpNum) -#define _ClearDTOG_TX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_TX) != 0)\ - _ToggleDTOG_TX(bEpNum) - -/** - * @brief Sets address in an endpoint register. - * @param bEpNum: Endpoint Number. - * @param bAddr: Address. - * @retval None - */ -#define _SetEPAddress(bEpNum,bAddr) _SetENDPOINT(bEpNum,\ - EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPREG_MASK) | bAddr) - -/** - * @brief Gets address in an endpoint register. - * @param bEpNum: Endpoint Number. - * @retval None - */ -#define _GetEPAddress(bEpNum) ((uint8_t)(_GetENDPOINT(bEpNum) & EPADDR_FIELD)) -#define _pEPTxAddr(bEpNum) ((uint16_t *)((_GetBTABLE()+bEpNum*8) + PMAAddr)) -#define _pEPTxCount(bEpNum) ((uint16_t *)((_GetBTABLE()+bEpNum*8+2) + PMAAddr)) -#define _pEPRxAddr(bEpNum) ((uint16_t *)((_GetBTABLE()+bEpNum*8+4) + PMAAddr)) -#define _pEPRxCount(bEpNum) ((uint16_t *)((_GetBTABLE()+bEpNum*8+6) + PMAAddr)) - -/** - * @brief sets address of the tx/rx buffer. - * @param bEpNum: Endpoint Number. - * @param wAddr: address to be set (must be word aligned). - * @retval None - */ -#define _SetEPTxAddr(bEpNum,wAddr) (*_pEPTxAddr(bEpNum) = ((wAddr >> 1) << 1)) -#define _SetEPRxAddr(bEpNum,wAddr) (*_pEPRxAddr(bEpNum) = ((wAddr >> 1) << 1)) - -/** - * @brief Gets address of the tx/rx buffer. - * @param bEpNum: Endpoint Number. - * @retval address of the buffer. - */ -#define _GetEPTxAddr(bEpNum) ((uint16_t)*_pEPTxAddr(bEpNum)) -#define _GetEPRxAddr(bEpNum) ((uint16_t)*_pEPRxAddr(bEpNum)) - -/** - * @brief Sets counter of rx buffer with no. of blocks. - * @param bEpNum: Endpoint Number. - * @param wCount: Counter. - * @retval None - */ -#define _BlocksOf32(dwReg,wCount,wNBlocks) {\ - wNBlocks = wCount >> 5;\ - if((wCount & 0x1f) == 0)\ - wNBlocks--;\ - *pdwReg = (uint16_t)((wNBlocks << 10) | 0x8000);\ - }/* _BlocksOf32 */ - -#define _BlocksOf2(dwReg,wCount,wNBlocks) {\ - wNBlocks = wCount >> 1;\ - if((wCount & 0x1) != 0)\ - wNBlocks++;\ - *pdwReg = (uint16_t)(wNBlocks << 10);\ - }/* _BlocksOf2 */ - -#define _SetEPCountRxReg(dwReg,wCount) {\ - uint16_t wNBlocks;\ - if(wCount > 62){_BlocksOf32(dwReg,wCount,wNBlocks);}\ - else {_BlocksOf2(dwReg,wCount,wNBlocks);}\ - }/* _SetEPCountRxReg */ - -#define _SetEPRxDblBuf0Count(bEpNum,wCount) {\ - uint16_t *pdwReg = _pEPTxCount(bEpNum); \ - _SetEPCountRxReg(pdwReg, wCount);\ - } -/** - * @brief sets counter for the tx/rx buffer. - * @param bEpNum: Endpoint Number. - * @param wCount: Counter value. - * @retval None - */ -#define _SetEPTxCount(bEpNum,wCount) (*_pEPTxCount(bEpNum) = wCount) -#define _SetEPRxCount(bEpNum,wCount) {\ - uint16_t *pdwReg = _pEPRxCount(bEpNum); \ - _SetEPCountRxReg(pdwReg, wCount);\ - } - -/** - * @brief gets counter of the tx buffer. - * @param bEpNum: Endpoint Number. - * @retval Counter value - */ -#define _GetEPTxCount(bEpNum)((uint16_t)(*_pEPTxCount(bEpNum)) & 0x3ff) -#define _GetEPRxCount(bEpNum)((uint16_t)(*_pEPRxCount(bEpNum)) & 0x3ff) - -/** - * @brief Sets buffer 0/1 address in a double buffer endpoint. - * @param bEpNum: Endpoint Number. - * @param wBuf0Addr: buffer 0 address. - * @retval Counter value - */ -#define _SetEPDblBuf0Addr(bEpNum,wBuf0Addr) {_SetEPTxAddr(bEpNum, wBuf0Addr);} -#define _SetEPDblBuf1Addr(bEpNum,wBuf1Addr) {_SetEPRxAddr(bEpNum, wBuf1Addr);} - -/** - * @brief Sets addresses in a double buffer endpoint. - * @param bEpNum: Endpoint Number. - * @param wBuf0Addr: buffer 0 address. - * @param wBuf1Addr = buffer 1 address. - * @retval None - */ -#define _SetEPDblBuffAddr(bEpNum,wBuf0Addr,wBuf1Addr) { \ - _SetEPDblBuf0Addr(bEpNum, wBuf0Addr);\ - _SetEPDblBuf1Addr(bEpNum, wBuf1Addr);\ - } /* _SetEPDblBuffAddr */ - -/** - * @brief Gets buffer 0/1 address of a double buffer endpoint. - * @param bEpNum: Endpoint Number. - * @retval None - */ -#define _GetEPDblBuf0Addr(bEpNum) (_GetEPTxAddr(bEpNum)) -#define _GetEPDblBuf1Addr(bEpNum) (_GetEPRxAddr(bEpNum)) - -/** - * @brief Gets buffer 0/1 address of a double buffer endpoint. - * @param bEpNum: Endpoint Number. - * bDir: endpoint dir EP_DBUF_OUT = OUT - * EP_DBUF_IN = IN - * @param wCount: Counter value - * @retval None - */ -#define _SetEPDblBuf0Count(bEpNum, bDir, wCount) { \ - if(bDir == EP_DBUF_OUT)\ - /* OUT endpoint */ \ - {_SetEPRxDblBuf0Count(bEpNum,wCount);} \ - else if(bDir == EP_DBUF_IN)\ - /* IN endpoint */ \ - *_pEPTxCount(bEpNum) = (uint32_t)wCount; \ - } /* SetEPDblBuf0Count*/ - -#define _SetEPDblBuf1Count(bEpNum, bDir, wCount) { \ - if(bDir == EP_DBUF_OUT)\ - /* OUT endpoint */ \ - {_SetEPRxCount(bEpNum,wCount);}\ - else if(bDir == EP_DBUF_IN)\ - /* IN endpoint */\ - *_pEPRxCount(bEpNum) = (uint32_t)wCount; \ - } /* SetEPDblBuf1Count */ - -#define _SetEPDblBuffCount(bEpNum, bDir, wCount) {\ - _SetEPDblBuf0Count(bEpNum, bDir, wCount); \ - _SetEPDblBuf1Count(bEpNum, bDir, wCount); \ - } /* _SetEPDblBuffCount */ - -/** - * @brief Gets buffer 0/1 rx/tx counter for double buffering. - * @param bEpNum: Endpoint Number. - * @retval None - */ -#define _GetEPDblBuf0Count(bEpNum) (_GetEPTxCount(bEpNum)) -#define _GetEPDblBuf1Count(bEpNum) (_GetEPRxCount(bEpNum)) - -/* Exported variables --------------------------------------------------------*/ -extern __IO uint16_t wIstr; /* ISTR register last read value */ - -/* Exported functions ------------------------------------------------------- */ -void SetCNTR(uint16_t /*wRegValue*/); -void SetISTR(uint16_t /*wRegValue*/); -void SetDADDR(uint16_t /*wRegValue*/); -void SetBTABLE(uint16_t /*wRegValue*/); -void SetBTABLE(uint16_t /*wRegValue*/); -void SetLPMCSR(uint16_t /*wRegValue*/); -uint16_t GetCNTR(void); -uint16_t GetISTR(void); -uint16_t GetFNR(void); -uint16_t GetDADDR(void); -uint16_t GetBTABLE(void); -uint16_t GetLPMCSR(void); -void SetENDPOINT(uint8_t /*bEpNum*/, uint16_t /*wRegValue*/); -uint16_t GetENDPOINT(uint8_t /*bEpNum*/); -void SetEPType(uint8_t /*bEpNum*/, uint16_t /*wType*/); -uint16_t GetEPType(uint8_t /*bEpNum*/); -void SetEPTxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/); -void SetEPRxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/); -void SetDouBleBuffEPStall(uint8_t /*bEpNum*/, uint8_t bDir); -uint16_t GetEPTxStatus(uint8_t /*bEpNum*/); -uint16_t GetEPRxStatus(uint8_t /*bEpNum*/); -void SetEPTxValid(uint8_t /*bEpNum*/); -void SetEPRxValid(uint8_t /*bEpNum*/); -uint16_t GetTxStallStatus(uint8_t /*bEpNum*/); -uint16_t GetRxStallStatus(uint8_t /*bEpNum*/); -void SetEP_KIND(uint8_t /*bEpNum*/); -void ClearEP_KIND(uint8_t /*bEpNum*/); -void Set_Status_Out(uint8_t /*bEpNum*/); -void Clear_Status_Out(uint8_t /*bEpNum*/); -void SetEPDoubleBuff(uint8_t /*bEpNum*/); -void ClearEPDoubleBuff(uint8_t /*bEpNum*/); -void ClearEP_CTR_RX(uint8_t /*bEpNum*/); -void ClearEP_CTR_TX(uint8_t /*bEpNum*/); -void ToggleDTOG_RX(uint8_t /*bEpNum*/); -void ToggleDTOG_TX(uint8_t /*bEpNum*/); -void ClearDTOG_RX(uint8_t /*bEpNum*/); -void ClearDTOG_TX(uint8_t /*bEpNum*/); -void SetEPAddress(uint8_t /*bEpNum*/, uint8_t /*bAddr*/); -uint8_t GetEPAddress(uint8_t /*bEpNum*/); -void SetEPTxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/); -void SetEPRxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/); -uint16_t GetEPTxAddr(uint8_t /*bEpNum*/); -uint16_t GetEPRxAddr(uint8_t /*bEpNum*/); -void SetEPCountRxReg(uint16_t * /*pdwReg*/, uint16_t /*wCount*/); -void SetEPTxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/); -void SetEPRxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/); -uint16_t GetEPTxCount(uint8_t /*bEpNum*/); -uint16_t GetEPRxCount(uint8_t /*bEpNum*/); -void SetEPDblBuf0Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/); -void SetEPDblBuf1Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf1Addr*/); -void SetEPDblBuffAddr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/, uint16_t /*wBuf1Addr*/); -uint16_t GetEPDblBuf0Addr(uint8_t /*bEpNum*/); -uint16_t GetEPDblBuf1Addr(uint8_t /*bEpNum*/); -void SetEPDblBuffCount(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); -void SetEPDblBuf0Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); -void SetEPDblBuf1Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); -uint16_t GetEPDblBuf0Count(uint8_t /*bEpNum*/); -uint16_t GetEPDblBuf1Count(uint8_t /*bEpNum*/); -EP_DBUF_DIR GetEPDblBufDir(uint8_t /*bEpNum*/); -void FreeUserBuffer(uint8_t bEpNum/*bEpNum*/, uint8_t bDir); -uint16_t ToWord(uint8_t, uint8_t); -uint16_t ByteSwap(uint16_t); -void SetDeviceAddress(uint8_t); -void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); -void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); - -#endif /* __USB_CORE_H__ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_dcd.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_dcd.h deleted file mode 100644 index a387a93..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_dcd.h +++ /dev/null @@ -1,228 +0,0 @@ -/** - ****************************************************************************** - * @file usb_dcd.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Device Control Driver Header file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __DCD_H__ -#define __DCD_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_core.h" - -/* Exported defines ----------------------------------------------------------*/ -#define USB_EP_CONTROL 0 -#define USB_EP_ISOC 1 -#define USB_EP_BULK 2 -#define USB_EP_INT 3 - -/* Endpoint Kind */ -#define USB_SNG_BUF 0 -#define USB_DBL_BUF 1 - -/* Device Status */ -#define USB_UNCONNECTED 0 -#define USB_DEFAULT 1 -#define USB_ADDRESSED 2 -#define USB_CONFIGURED 3 -#define USB_SUSPENDED 4 - - -/* Exported types ------------------------------------------------------------*/ -/******************************************************************************** -Data structure type -********************************************************************************/ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; - uint8_t bmAttributes; - uint16_t wMaxPacketSize; - uint8_t bInterval; -} -EP_DESCRIPTOR , *PEP_DESCRIPTOR; - -typedef struct USB_ep -{ - uint8_t num; - uint8_t is_in; - uint8_t is_stall; - uint8_t type; - uint16_t pmaadress; - uint16_t pmaaddr0; - uint16_t pmaaddr1; - uint8_t doublebuffer; - uint32_t maxpacket; - /* transaction level variables !!! up to one max packet per transaction !!! */ - uint8_t *xfer_buff; - uint32_t xfer_len ; - uint32_t xfer_count; - /* control transfer variables*/ - uint32_t rem_data_len; - uint32_t total_data_len; - uint32_t ctl_data_len; -} -USB_EP; - -typedef struct usb_setup_req { - - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; -} USB_SETUP_REQ; - -typedef struct _Device_TypeDef -{ - uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length); -#ifdef LPM_ENABLED - uint8_t *(*GetBOSDescriptor)( uint8_t speed , uint16_t *length); -#endif - uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length); - uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length); - uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length); - uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length); - uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length); - uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length); -} USBD_DEVICE, *pUSBD_DEVICE; - - - - -typedef struct _Device_cb -{ - uint8_t (*Init) (void *pdev , uint8_t cfgidx); - uint8_t (*DeInit) (void *pdev , uint8_t cfgidx); - /* Control Endpoints*/ - uint8_t (*Setup) (void *pdev , USB_SETUP_REQ *req); - uint8_t (*EP0_TxSent) (void *pdev ); - uint8_t (*EP0_RxReady) (void *pdev); - /* Class Specific Endpoints*/ - uint8_t (*DataIn) (void *pdev , uint8_t epnum); - uint8_t (*DataOut) (void *pdev , uint8_t epnum); - uint8_t (*SOF) (void *pdev); - uint8_t *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length); - -#ifdef USB_SUPPORT_USER_STRING_DESC - uint8_t *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index, uint16_t *length); -#endif - -} USBD_Class_cb_TypeDef; - - - -typedef struct _USBD_USR_PROP -{ - void (*Init)(void); - void (*DeviceReset)(uint8_t speed); - void (*DeviceConfigured)(void); - void (*DeviceSuspended)(void); - void (*DeviceResumed)(void); -} -USBD_Usr_cb_TypeDef; - -typedef struct _DCD -{ - uint8_t device_config; - uint8_t device_state; - uint8_t device_status; - uint8_t device_old_status; - uint8_t device_address; - uint32_t DevRemoteWakeup; - uint32_t speed; - uint8_t setup_packet [8]; - USB_EP in_ep [EP_NUM]; - USB_EP out_ep [EP_NUM]; - USBD_Class_cb_TypeDef *class_cb; - USBD_Usr_cb_TypeDef *usr_cb; - USBD_DEVICE *usr_device; - uint8_t *pConfig_descriptor; - } -DCD_DEV , *DCD_PDEV; - -typedef struct USB_Device_handle -{ - DCD_DEV dev; -} -USB_DEVICE_HANDLE, USB_CORE_HANDLE; - -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/******************************************************************************** -EXPORTED FUNCTION FROM THE USB-DEVICE LAYER -********************************************************************************/ -void DCD_Init(USB_CORE_HANDLE *pdev); - -void DCD_DevConnect (USB_CORE_HANDLE *pdev); -void DCD_DevDisconnect (USB_CORE_HANDLE *pdev); -void DCD_EP_SetAddress (USB_CORE_HANDLE *pdev, - uint8_t address); - -uint32_t DCD_PMA_Config(USB_CORE_HANDLE *pdev , - uint16_t ep_addr, - uint16_t ep_kind, - uint32_t pmaadress); - -uint32_t DCD_EP_Open(USB_CORE_HANDLE *pdev , - uint16_t ep_addr, - uint16_t ep_mps, - uint8_t ep_type); - -uint32_t DCD_EP_Close (USB_CORE_HANDLE *pdev, - uint8_t ep_addr); - - -uint32_t DCD_EP_PrepareRx ( USB_CORE_HANDLE *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t buf_len); - -uint32_t DCD_EP_Tx (USB_CORE_HANDLE *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint32_t buf_len); -uint32_t DCD_EP_Stall (USB_CORE_HANDLE *pdev, - uint8_t epnum); -uint32_t DCD_EP_ClrStall (USB_CORE_HANDLE *pdev, - uint8_t epnum); - -uint32_t DCD_Handle_ISR(USB_CORE_HANDLE *pdev); - -uint32_t DCD_GetEPStatus(USB_CORE_HANDLE *pdev , - uint8_t epnum); - -void DCD_SetEPStatus (USB_CORE_HANDLE *pdev , - uint8_t epnum , - uint32_t Status); - -void DCD_StopDevice(USB_CORE_HANDLE *pdev); - -#endif /* __DCD_H__ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_dcd_int.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_dcd_int.h deleted file mode 100644 index 13155a8..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_dcd_int.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - ****************************************************************************** - * @file usb_dcd_int.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Device Control driver Interrupt management Header file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef USB_DCD_INT_H__ -#define USB_DCD_INT_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_pwr.h" - -/* Exported defines ----------------------------------------------------------*/ -/* Mask defining which events has to be handled by the device application software */ -#define IMR_MSK (CNTR_CTRM | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM | CNTR_SOFM | \ - CNTR_ESOFM | CNTR_RESETM) -#ifdef LPM_ENABLED -#undef IMR_MSK -#define IMR_MSK (CNTR_CTRM | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM | CNTR_SOFM | \ - CNTR_ESOFM | CNTR_RESETM | CNTR_L1REQM) -#endif - - - -/* Exported types ------------------------------------------------------------*/ -typedef struct _USBD_DCD_INT -{ - uint8_t (* DataOutStage) (USB_CORE_HANDLE *pdev , uint8_t epnum); - uint8_t (* DataInStage) (USB_CORE_HANDLE *pdev , uint8_t epnum); - uint8_t (* SetupStage) (USB_CORE_HANDLE *pdev); - uint8_t (* SOF) (USB_CORE_HANDLE *pdev); - uint8_t (* Reset) (USB_CORE_HANDLE *pdev); - uint8_t (* Suspend) (USB_CORE_HANDLE *pdev); - uint8_t (* Resume) (USB_CORE_HANDLE *pdev); - -}USBD_DCD_INT_cb_TypeDef; - -extern USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops; - -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void CTR(void); -void USB_Istr(void); - -#endif /* USB_DCD_INT_H__ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_regs.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_regs.h deleted file mode 100644 index befaa24..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/inc/usb_regs.h +++ /dev/null @@ -1,233 +0,0 @@ -/** - ****************************************************************************** - * @file usb_regs.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Interface prototype functions to USB cell registers - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_REGS_H -#define __USB_REGS_H - -/* Exported types ------------------------------------------------------------*/ -typedef enum _EP_DBUF_DIR -{ - /* double buffered endpoint direction */ - EP_DBUF_OUT, - EP_DBUF_IN, - EP_DBUF_ERR, -}EP_DBUF_DIR; - -/* endpoint buffer number */ -enum EP_BUF_NUM -{ - EP_NOBUF, - EP_BUF0, - EP_BUF1 -}; - -/* Exported defines ----------------------------------------------------------*/ -#define RegBase (0x40005C00L) /* USB_IP Peripheral Registers base address */ -#define PMAAddr (0x40006000L) /* USB_IP Packet Memory Area base address */ - -/******************************************************************************/ -/* General registers */ -/******************************************************************************/ - -/* Control register */ -#define CNTR ((__IO unsigned *)(RegBase + 0x40)) -/* Interrupt status register */ -#define ISTR ((__IO unsigned *)(RegBase + 0x44)) -/* Frame number register */ -#define FNR ((__IO unsigned *)(RegBase + 0x48)) -/* Device address register */ -#define DADDR ((__IO unsigned *)(RegBase + 0x4C)) -/* Buffer Table address register */ -#define BTABLE ((__IO unsigned *)(RegBase + 0x50)) - -/* Battery Charging detector register*/ -#define BCDR (( __IO unsigned *)(RegBase + 0x58)) - /* LPM Control and Status register */ -#define LPMCSR (( __IO unsigned *)(RegBase + 0x54)) - -/******************************************************************************/ -/* Endpoint registers */ -/******************************************************************************/ -#define EP0REG ((__IO unsigned *)(RegBase)) /* endpoint 0 register address */ - -/* Endpoint Addresses (w/direction) */ -#define EP0_OUT ((uint8_t)0x00) -#define EP0_IN ((uint8_t)0x80) -#define EP1_OUT ((uint8_t)0x01) -#define EP1_IN ((uint8_t)0x81) -#define EP2_OUT ((uint8_t)0x02) -#define EP2_IN ((uint8_t)0x82) -#define EP3_OUT ((uint8_t)0x03) -#define EP3_IN ((uint8_t)0x83) -#define EP4_OUT ((uint8_t)0x04) -#define EP4_IN ((uint8_t)0x84) -#define EP5_OUT ((uint8_t)0x05) -#define EP5_IN ((uint8_t)0x85) -#define EP6_OUT ((uint8_t)0x06) -#define EP6_IN ((uint8_t)0x86) -#define EP7_OUT ((uint8_t)0x07) -#define EP7_IN ((uint8_t)0x87) - -/* endpoints enumeration */ -#define ENDP0 ((uint8_t)0) -#define ENDP1 ((uint8_t)1) -#define ENDP2 ((uint8_t)2) -#define ENDP3 ((uint8_t)3) -#define ENDP4 ((uint8_t)4) -#define ENDP5 ((uint8_t)5) -#define ENDP6 ((uint8_t)6) -#define ENDP7 ((uint8_t)7) - -/******************************************************************************/ -/* ISTR interrupt events */ -/******************************************************************************/ -#define ISTR_CTR (0x8000) /* Correct TRansfer (clear-only bit) */ -#define ISTR_DOVR (0x4000) /* DMA OVeR/underrun (clear-only bit) */ -#define ISTR_ERR (0x2000) /* ERRor (clear-only bit) */ -#define ISTR_WKUP (0x1000) /* WaKe UP (clear-only bit) */ -#define ISTR_SUSP (0x0800) /* SUSPend (clear-only bit) */ -#define ISTR_RESET (0x0400) /* RESET (clear-only bit) */ -#define ISTR_SOF (0x0200) /* Start Of Frame (clear-only bit) */ -#define ISTR_ESOF (0x0100) /* Expected Start Of Frame (clear-only bit) */ -#define ISTR_L1REQ (0x0080) /* LPM L1 state request */ -#define ISTR_DIR (0x0010) /* DIRection of transaction (read-only bit) */ -#define ISTR_EP_ID (0x000F) /* EndPoint IDentifier (read-only bit) */ - -#define CLR_CTR (~ISTR_CTR) /* clear Correct TRansfer bit */ -#define CLR_DOVR (~ISTR_DOVR) /* clear DMA OVeR/underrun bit*/ -#define CLR_ERR (~ISTR_ERR) /* clear ERRor bit */ -#define CLR_WKUP (~ISTR_WKUP) /* clear WaKe UP bit */ -#define CLR_SUSP (~ISTR_SUSP) /* clear SUSPend bit */ -#define CLR_RESET (~ISTR_RESET) /* clear RESET bit */ -#define CLR_SOF (~ISTR_SOF) /* clear Start Of Frame bit */ -#define CLR_ESOF (~ISTR_ESOF) /* clear Expected Start Of Frame bit */ -#define CLR_L1REQ (~ISTR_L1REQ) /* clear LPM L1 bit */ - -/******************************************************************************/ -/* CNTR control register bits definitions */ -/******************************************************************************/ -#define CNTR_CTRM (0x8000) /* Correct TRansfer Mask */ -#define CNTR_DOVRM (0x4000) /* DMA OVeR/underrun Mask */ -#define CNTR_ERRM (0x2000) /* ERRor Mask */ -#define CNTR_WKUPM (0x1000) /* WaKe UP Mask */ -#define CNTR_SUSPM (0x0800) /* SUSPend Mask */ -#define CNTR_RESETM (0x0400) /* RESET Mask */ -#define CNTR_SOFM (0x0200) /* Start Of Frame Mask */ -#define CNTR_ESOFM (0x0100) /* Expected Start Of Frame Mask */ -#define CNTR_L1REQM (0x0080) /* LPM L1 state request interrupt mask */ -#define CNTR_L1RESUME (0x0020) /* LPM L1 Resume request */ -#define CNTR_RESUME (0x0010) /* RESUME request */ -#define CNTR_FSUSP (0x0008) /* Force SUSPend */ -#define CNTR_LPMODE (0x0004) /* Low-power MODE */ -#define CNTR_PDWN (0x0002) /* Power DoWN */ -#define CNTR_FRES (0x0001) /* Force USB RESet */ - -/******************************************************************************/ -/* BCDR control register bits definitions */ -/******************************************************************************/ -#define BCDR_DPPU ((uint16_t)0x8000) /* DP Pull-up Enable */ -#define BCDR_PS2DET ((uint16_t)0x0080) /* PS2 port or proprietary charger detected */ -#define BCDR_SDET ((uint16_t)0x0040) /* Secondary detection (SD) status */ -#define BCDR_PDET ((uint16_t)0x0020) /* Primary detection (PD) status */ -#define BCDR_DCDET ((uint16_t)0x0010) /* Data contact detection (DCD) status */ -#define BCDR_SDEN ((uint16_t)0x0008) /* Secondary detection (SD) mode enable */ -#define BCDR_PDEN ((uint16_t)0x0004) /* Primary detection (PD) mode enable */ -#define BCDR_DCDEN ((uint16_t)0x0002) /* Data contact detection (DCD) mode enable*/ -#define BCDR_BCDEN ((uint16_t)0x0001) /* Battery charging detector (BCD) enable */ - -/******************************************************************************/ -/* Bit definition for LPM register */ -/******************************************************************************/ -#define LPMCSR_BESL ((uint16_t)0x00F0) /* BESL value received with last ACKed LPM Token */ -#define LPMCSR_REMWAKE ((uint16_t)0x0008) /* bRemoteWake value received with last ACKed LPM Token */ -#define LPMCSR_LPMACK ((uint16_t)0x0002) /* LPM Token acknowledge enable*/ -#define LPMCSR_LMPEN ((uint16_t)0x0001) /* LPM support enable */ - -/******************************************************************************/ -/* FNR Frame Number Register bit definitions */ -/******************************************************************************/ -#define FNR_RXDP (0x8000) /* status of D+ data line */ -#define FNR_RXDM (0x4000) /* status of D- data line */ -#define FNR_LCK (0x2000) /* LoCKed */ -#define FNR_LSOF (0x1800) /* Lost SOF */ -#define FNR_FN (0x07FF) /* Frame Number */ -/******************************************************************************/ -/* DADDR Device ADDRess bit definitions */ -/******************************************************************************/ -#define DADDR_EF (0x80) -#define DADDR_ADD (0x7F) -/******************************************************************************/ -/* Endpoint register */ -/******************************************************************************/ -/* bit positions */ -#define EP_CTR_RX (0x8000) /* EndPoint Correct TRansfer RX */ -#define EP_DTOG_RX (0x4000) /* EndPoint Data TOGGLE RX */ -#define EPRX_STAT (0x3000) /* EndPoint RX STATus bit field */ -#define EP_SETUP (0x0800) /* EndPoint SETUP */ -#define EP_T_FIELD (0x0600) /* EndPoint TYPE */ -#define EP_KIND (0x0100) /* EndPoint KIND */ -#define EP_CTR_TX (0x0080) /* EndPoint Correct TRansfer TX */ -#define EP_DTOG_TX (0x0040) /* EndPoint Data TOGGLE TX */ -#define EPTX_STAT (0x0030) /* EndPoint TX STATus bit field */ -#define EPADDR_FIELD (0x000F) /* EndPoint ADDRess FIELD */ - -/* EndPoint REGister MASK (no toggle fields) */ -#define EPREG_MASK (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD) - -/* EP_TYPE[1:0] EndPoint TYPE */ -#define EP_TYPE_MASK (0x0600) /* EndPoint TYPE Mask */ -#define EP_BULK (0x0000) /* EndPoint BULK */ -#define EP_CONTROL (0x0200) /* EndPoint CONTROL */ -#define EP_ISOCHRONOUS (0x0400) /* EndPoint ISOCHRONOUS */ -#define EP_INTERRUPT (0x0600) /* EndPoint INTERRUPT */ -#define EP_T_MASK (~EP_T_FIELD & EPREG_MASK) - -/* EP_KIND EndPoint KIND */ -#define EPKIND_MASK (~EP_KIND & EPREG_MASK) - -/* STAT_TX[1:0] STATus for TX transfer */ -#define EP_TX_DIS (0x0000) /* EndPoint TX DISabled */ -#define EP_TX_STALL (0x0010) /* EndPoint TX STALLed */ -#define EP_TX_NAK (0x0020) /* EndPoint TX NAKed */ -#define EP_TX_VALID (0x0030) /* EndPoint TX VALID */ -#define EPTX_DTOG1 (0x0010) /* EndPoint TX Data TOGgle bit1 */ -#define EPTX_DTOG2 (0x0020) /* EndPoint TX Data TOGgle bit2 */ -#define EPTX_DTOGMASK (EPTX_STAT|EPREG_MASK) - -/* STAT_RX[1:0] STATus for RX transfer */ -#define EP_RX_DIS (0x0000) /* EndPoint RX DISabled */ -#define EP_RX_STALL (0x1000) /* EndPoint RX STALLed */ -#define EP_RX_NAK (0x2000) /* EndPoint RX NAKed */ -#define EP_RX_VALID (0x3000) /* EndPoint RX VALID */ -#define EPRX_DTOG1 (0x1000) /* EndPoint RX Data TOGgle bit1 */ -#define EPRX_DTOG2 (0x2000) /* EndPoint RX Data TOGgle bit1 */ -#define EPRX_DTOGMASK (EPRX_STAT|EPREG_MASK) - -#endif /* __USB_REGS_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_bsp_template.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_bsp_template.c deleted file mode 100644 index 27d8804..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_bsp_template.c +++ /dev/null @@ -1,82 +0,0 @@ -/** - ****************************************************************************** - * @file usb_bsp.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file Provides Device Core configuration Functions - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_bsp.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief USB_BSP_Init - * Initialize BSP configurations - * @param None - * @retval None - */ - -void USB_BSP_Init(void) -{ - -} -/** - * @brief USB_BSP_EnableInterrupt - * Enable USB Global interrupt - * @param None - * @retval None - */ -void USB_BSP_EnableInterrupt(void) -{ - -} - -/** -* @brief Configure CRS peripheral to automatically trim the HSI -* oscillator according to USB SOF -* @param None -* @retval None -*/ -void CRS_Config(void) -{ - -} - -/** -* @brief Set system clock to HSI48 -* @param None -* @param None -* @retval None -*/ -void SetSystemClockHSI48(void) -{ - -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_core.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_core.c deleted file mode 100644 index 730da80..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_core.c +++ /dev/null @@ -1,712 +0,0 @@ -/** - ****************************************************************************** - * @file usb_core.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides the interface functions to USB cell registers - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_core.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Set the CNTR register value - * @param wRegValue: new register value - * @retval None - */ -void SetCNTR(uint16_t wRegValue) -{ - _SetCNTR(wRegValue); -} - -/** - * @brief returns the CNTR register value - * @param None - * @retval CNTR register Value - */ -uint16_t GetCNTR(void) -{ - return(_GetCNTR()); -} - -/** - * @brief Set the ISTR register value - * @param wRegValue: new register value - * @retval None - */ -void SetISTR(uint16_t wRegValue) -{ - _SetISTR(wRegValue); -} - -/** - * @brief Returns the ISTR register value - * @param None - * @retval ISTR register Value - */ -uint16_t GetISTR(void) -{ - return(_GetISTR()); -} - -/** - * @brief Returns the FNR register value - * @param None - * @retval FNR register Value - */ -uint16_t GetFNR(void) -{ - return(_GetFNR()); -} - -/** - * @brief Set the DADDR register value - * @param wRegValue: new register value - * @retval None - */ -void SetDADDR(uint16_t wRegValue) -{ - _SetDADDR(wRegValue); -} - -/** - * @brief Set the LPMCSR register value - * @param wRegValue: new register value - * @retval None - */ -void SetLPMCSR(uint16_t wRegValue) -{ - _SetLPMCSR(wRegValue); -} - - -/** - * @brief Returns the LPMCSR register value - * @param None - * @retval LPMCSR register Value - */ -uint16_t GetLPMCSR(void) -{ - return(_GetLPMCSR()); -} - -/** - * @brief Returns the DADDR register value - * @param None - * @retval DADDR register Value - */ -uint16_t GetDADDR(void) -{ - return(_GetDADDR()); -} - -/** - * @brief Set the BTABLE. - * @param wRegValue: New register value - * @retval None - */ -void SetBTABLE(uint16_t wRegValue) -{ - _SetBTABLE(wRegValue); -} - -/** - * @brief Returns the BTABLE register value. - * @param None - * @retval BTABLE address - */ -uint16_t GetBTABLE(void) -{ - return(_GetBTABLE()); -} - -/** - * @brief Set the Endpoint register value. - * @param bEpNum: Endpoint Number - * @retval None - */ -void SetENDPOINT(uint8_t bEpNum, uint16_t wRegValue) -{ - _SetENDPOINT(bEpNum, wRegValue); -} - -/** - * @brief Return the Endpoint register value. - * @param bEpNum: Endpoint Number - * @retval Endpoint register value. - */ -uint16_t GetENDPOINT(uint8_t bEpNum) -{ - return(_GetENDPOINT(bEpNum)); -} - -/** - * @brief sets the type in the endpoint register. - * @param bEpNum: Endpoint Number - * @param wType: type definition - * @retval None. - */ -void SetEPType(uint8_t bEpNum, uint16_t wType) -{ - _SetEPType(bEpNum, wType); -} - -/** - * @brief Returns the endpoint type. - * @param bEpNum: Endpoint Number - * @retval Endpoint Type. - */ -uint16_t GetEPType(uint8_t bEpNum) -{ - return(_GetEPType(bEpNum)); -} - -/** - * @brief Set the status of Tx endpoint. - * @param bEpNum: Endpoint Number - * @param wState: new state. - * @retval None - */ -void SetEPTxStatus(uint8_t bEpNum, uint16_t wState) -{ - _SetEPTxStatus(bEpNum, wState); -} - -/** - * @brief Set the status of Rx endpoint. - * @param bEpNum: Endpoint Number - * @param wState: new state. - * @retval None - */ -void SetEPRxStatus(uint8_t bEpNum, uint16_t wState) -{ - _SetEPRxStatus(bEpNum, wState); -} - -/** - * @brief sets the status for Double Buffer Endpoint to STALL - * @param bEpNum: Endpoint Number - * @param bDir: Endpoint direction - * @retval None - */ -void SetDouBleBuffEPStall(uint8_t bEpNum, uint8_t bDir) -{ - uint16_t Endpoint_DTOG_Status; - Endpoint_DTOG_Status = GetENDPOINT(bEpNum); - if (bDir == EP_DBUF_OUT) - { /* OUT double buffered endpoint */ - _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPRX_DTOG1); - } - else if (bDir == EP_DBUF_IN) - { /* IN double buffered endpoint */ - _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPTX_DTOG1); - } -} - -/** - * @brief Returns the endpoint Tx status - * @param bEpNum: Endpoint Number - * @retval Endpoint TX Status - */ -uint16_t GetEPTxStatus(uint8_t bEpNum) -{ - return(_GetEPTxStatus(bEpNum)); -} - -/** - * @brief Returns the endpoint Rx status - * @param bEpNum: Endpoint Number - * @retval Endpoint Endpoint RX Status - */ -uint16_t GetEPRxStatus(uint8_t bEpNum) -{ - return(_GetEPRxStatus(bEpNum)); -} - -/** - * @brief Valid the endpoint Tx Status. - * @param bEpNum: Endpoint Number - * @retval None - */ -void SetEPTxValid(uint8_t bEpNum) -{ - _SetEPTxStatus(bEpNum, EP_TX_VALID); -} - -/** - * @brief Valid the endpoint Rx Status. - * @param bEpNum: Endpoint Number - * @retval None - */ -void SetEPRxValid(uint8_t bEpNum) -{ - _SetEPRxStatus(bEpNum, EP_RX_VALID); -} - -/** - * @brief set the EP_KIND bit. - * @param bEpNum: Endpoint Number - * @retval None - */ -void SetEP_KIND(uint8_t bEpNum) -{ - _SetEP_KIND(bEpNum); -} - -/** - * @brief ClearEP_KIND - * @param bEpNum: Endpoint Number - * @retval None - */ -void ClearEP_KIND(uint8_t bEpNum) -{ - _ClearEP_KIND(bEpNum); -} - -/** - * @brief Clear the Status Out of the related Endpoint - * @param bEpNum: Endpoint Number - * @retval None - */ -void Clear_Status_Out(uint8_t bEpNum) -{ - _ClearEP_KIND(bEpNum); -} - -/** - * @brief Set the Status Out of the related Endpoint - * @param bEpNum: Endpoint Number - * @retval None - */ -void Set_Status_Out(uint8_t bEpNum) -{ - _SetEP_KIND(bEpNum); -} - -/** - * @brief Enable the double buffer feature for the endpoint. - * @param bEpNum: Endpoint Number - * @retval None - */ -void SetEPDoubleBuff(uint8_t bEpNum) -{ - _SetEP_KIND(bEpNum); -} - -/** - * @brief Disable the double buffer feature for the endpoint - * @param bEpNum: Endpoint Number - * @retval None - */ -void ClearEPDoubleBuff(uint8_t bEpNum) -{ - _ClearEP_KIND(bEpNum); -} - -/** - * @brief Returns the Stall status of the Tx endpoint - * @param bEpNum: Endpoint Number - * @retval Tx Stall status - */ -uint16_t GetTxStallStatus(uint8_t bEpNum) -{ - return(_GetTxStallStatus(bEpNum)); -} - -/** - * @brief Returns the Stall status of the Rx endpoint - * @param bEpNum: Endpoint Number - * @retval Rx Stall status. - */ -uint16_t GetRxStallStatus(uint8_t bEpNum) -{ - return(_GetRxStallStatus(bEpNum)); -} - -/** - * @brief Returns the Stall status of the Rx endpoint - * @param bEpNum: Endpoint Number - * @retval None - */ -void ClearEP_CTR_RX(uint8_t bEpNum) -{ - _ClearEP_CTR_RX(bEpNum); -} - -/** - * @brief Clear the CTR_TX bit - * @param bEpNum: Endpoint Number - * @retval None - */ -void ClearEP_CTR_TX(uint8_t bEpNum) -{ - _ClearEP_CTR_TX(bEpNum); -} - -/** - * @brief Toggle the DTOG_RX bit. - * @param bEpNum: Endpoint Number - * @retval None - */ -void ToggleDTOG_RX(uint8_t bEpNum) -{ - _ToggleDTOG_RX(bEpNum); -} - -/** - * @brief Toggle the DTOG_TX bit. - * @param bEpNum: Endpoint Number - * @retval None - */ -void ToggleDTOG_TX(uint8_t bEpNum) -{ - _ToggleDTOG_TX(bEpNum); -} - -/** - * @brief Clear the DTOG_RX bit. - * @param bEpNum: Endpoint Number - * @retval None - */ -void ClearDTOG_RX(uint8_t bEpNum) -{ - _ClearDTOG_RX(bEpNum); -} - -/** - * @brief Clear the DTOG_TX bit. - * @param bEpNum: Endpoint Number - * @retval None - */ -void ClearDTOG_TX(uint8_t bEpNum) -{ - _ClearDTOG_TX(bEpNum); -} - -/** - * @brief Set the endpoint address. - * @param bEpNum: Endpoint Number - * @param bAddr: New endpoint address. - * @retval None - */ -void SetEPAddress(uint8_t bEpNum, uint8_t bAddr) -{ - _SetEPAddress(bEpNum, bAddr); -} - -/** - * @brief Get the endpoint address. - * @param bEpNum: Endpoint Number - * @retval Endpoint address. - */ -uint8_t GetEPAddress(uint8_t bEpNum) -{ - return(_GetEPAddress(bEpNum)); -} - -/** - * @brief Set the endpoint Tx buffer address. - * @param bEpNum: Endpoint Number - * @param wAddr: new address. - * @retval Endpoint address. - */ -void SetEPTxAddr(uint8_t bEpNum, uint16_t wAddr) -{ - _SetEPTxAddr(bEpNum, wAddr); -} - -/** - * @brief Set the endpoint Rx buffer address. - * @param bEpNum: Endpoint Number - * @param wAddr: new address. - * @retval Endpoint address. - */ -void SetEPRxAddr(uint8_t bEpNum, uint16_t wAddr) -{ - _SetEPRxAddr(bEpNum, wAddr); -} - -/** - * @brief Returns the endpoint Tx buffer address. - * @param bEpNum: Endpoint Number - * @retval Tx buffer address. - */ -uint16_t GetEPTxAddr(uint8_t bEpNum) -{ - return(_GetEPTxAddr(bEpNum)); -} - -/** - * @brief Returns the endpoint Rx buffer address. - * @param bEpNum: Endpoint Number - * @retval Rx buffer address. - */ -uint16_t GetEPRxAddr(uint8_t bEpNum) -{ - return(_GetEPRxAddr(bEpNum)); -} - -/** - * @brief Set the Tx count. - * @param bEpNum: Endpoint Number - * @param wCount: new count value. - * @retval Rx buffer address. - */ -void SetEPTxCount(uint8_t bEpNum, uint16_t wCount) -{ - _SetEPTxCount(bEpNum, wCount); -} - -/** - * @brief Set the Count Rx Register value. - * @param *pdwReg: point to the register. - * @param wCount: the new register value. - * @retval None - */ -void SetEPCountRxReg(uint16_t *pdwReg, uint16_t wCount) -{ - _SetEPCountRxReg(pdwReg, wCount); -} - -/** - * @brief Set the Rx count. - * @param bEpNum: Endpoint Number. - * @param wCount: the new register value. - * @retval None - */ -void SetEPRxCount(uint8_t bEpNum, uint16_t wCount) -{ - _SetEPRxCount(bEpNum, wCount); -} - -/** - * @brief Get the Tx count. - * @param bEpNum: Endpoint Number. - * @retval Tx count value. - */ -uint16_t GetEPTxCount(uint8_t bEpNum) -{ - return(_GetEPTxCount(bEpNum)); -} - -/** - * @brief Get the Rx count. - * @param bEpNum: Endpoint Number. - * @retval Rx count value. - */ -uint16_t GetEPRxCount(uint8_t bEpNum) -{ - return(_GetEPRxCount(bEpNum)); -} - -/** - * @brief Set the addresses of the buffer 0 and 1. - * @param bEpNum: Endpoint Number. - * @param wBuf0Addr: new address of buffer 0. - * @param wBuf1Addr: new address of buffer 1. - * @retval None - */ -void SetEPDblBuffAddr(uint8_t bEpNum, uint16_t wBuf0Addr, uint16_t wBuf1Addr) -{ - _SetEPDblBuffAddr(bEpNum, wBuf0Addr, wBuf1Addr); -} - -/** - * @brief Set the Buffer 1 address. - * @param bEpNum: Endpoint Number. - * @param wBuf0Addr: new address. - * @retval None - */ -void SetEPDblBuf0Addr(uint8_t bEpNum, uint16_t wBuf0Addr) -{ - _SetEPDblBuf0Addr(bEpNum, wBuf0Addr); -} - -/** - * @brief Set the Buffer 1 address. - * @param bEpNum: Endpoint Number. - * @param wBuf1Addr: new address. - * @retval None - */ -void SetEPDblBuf1Addr(uint8_t bEpNum, uint16_t wBuf1Addr) -{ - _SetEPDblBuf1Addr(bEpNum, wBuf1Addr); -} - -/** - * @brief Returns the address of the Buffer 0. - * @param bEpNum: Endpoint Number. - * @retval None - */ -uint16_t GetEPDblBuf0Addr(uint8_t bEpNum) -{ - return(_GetEPDblBuf0Addr(bEpNum)); -} - -/** - * @brief Returns the address of the Buffer 1. - * @param bEpNum: Endpoint Number. - * @retval Address of the Buffer 1. - */ -uint16_t GetEPDblBuf1Addr(uint8_t bEpNum) -{ - return(_GetEPDblBuf1Addr(bEpNum)); -} - -/** - * @brief Set the number of bytes for a double Buffer - * @param bEpNum,bDir, wCount - * @retval Address of the Buffer 1. - */ -void SetEPDblBuffCount(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) -{ - _SetEPDblBuffCount(bEpNum, bDir, wCount); -} - -/** - * @brief Set the number of bytes in the buffer 0 of a double Buffer endpoint. - * @param bEpNum,bDir, wCount - * @retval None - */ -void SetEPDblBuf0Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) -{ - _SetEPDblBuf0Count(bEpNum, bDir, wCount); -} - -/** - * @brief Set the number of bytes in the buffer 0 of a double Buffer - * @param bEpNum,bDir, wCount - * @retval None - */ -void SetEPDblBuf1Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) -{ - _SetEPDblBuf1Count(bEpNum, bDir, wCount); -} - -/** - * @brief Returns the number of byte received in the buffer 0 of a double - * Buffer endpoint. - * @param bEpNum: Endpoint Number. - * @retval Endpoint Buffer 0 count - */ -uint16_t GetEPDblBuf0Count(uint8_t bEpNum) -{ - return(_GetEPDblBuf0Count(bEpNum)); -} - -/** - * @brief Returns the number of data received in the buffer 1 of a double - * @param bEpNum: Endpoint Number. - * @retval Endpoint Buffer 1 count - */ -uint16_t GetEPDblBuf1Count(uint8_t bEpNum) -{ - return(_GetEPDblBuf1Count(bEpNum)); -} - -/** - * @brief gets direction of the double buffered endpoint - * @param bEpNum: Endpoint Number. - * @retval EP_DBUF_OUT, EP_DBUF_IN, - * EP_DBUF_ERR if the endpoint counter not yet programmed. - */ -EP_DBUF_DIR GetEPDblBufDir(uint8_t bEpNum) -{ - if ((uint16_t)(*_pEPRxCount(bEpNum) & 0xFC00) != 0) - return(EP_DBUF_OUT); - else if (((uint16_t)(*_pEPTxCount(bEpNum)) & 0x03FF) != 0) - return(EP_DBUF_IN); - else - return(EP_DBUF_ERR); -} - -/** - * @brief free buffer used from the application realizing it to the line - toggles bit SW_BUF in the double buffered endpoint register - * @param bEpNum, bDir - * @retval None - */ -void FreeUserBuffer(uint8_t bEpNum, uint8_t bDir) -{ - if (bDir == EP_DBUF_OUT) - { /* OUT double buffered endpoint */ - _ToggleDTOG_TX(bEpNum); - } - else if (bDir == EP_DBUF_IN) - { /* IN double buffered endpoint */ - _ToggleDTOG_RX(bEpNum); - } -} - -/** - * @brief Copy a buffer from user memory area to packet memory area (PMA) - * @param pbUsrBuf: pointer to user memory area. - * @param wPMABufAddr: address into PMA. - * @param wNBytes: no. of bytes to be copied. - * @retval None - */ -void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) -{ - uint32_t n = (wNBytes + 1) >> 1; - uint32_t i; - uint16_t temp1, temp2; - uint16_t *pdwVal; - pdwVal = (uint16_t *)(wPMABufAddr + PMAAddr); - - for (i = n; i != 0; i--) - { - temp1 = (uint16_t) * pbUsrBuf; - pbUsrBuf++; - temp2 = temp1 | (uint16_t) * pbUsrBuf << 8; - *pdwVal++ = temp2; - pbUsrBuf++; - } -} - -/** - * @brief Copy a buffer from user memory area to packet memory area (PMA) - * @param pbUsrBuf = pointer to user memory area. - * @param wPMABufAddr: address into PMA. - * @param wNBytes: no. of bytes to be copied. - * @retval None - */ -void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) -{ - uint32_t n = (wNBytes + 1) >> 1; - uint32_t i; - uint16_t *pdwVal; - pdwVal = (uint16_t *)(wPMABufAddr + PMAAddr); - for (i = n; i != 0; i--) - { - *(uint16_t*)pbUsrBuf++ = *pdwVal++; - pbUsrBuf++; - } -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_dcd.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_dcd.c deleted file mode 100644 index 0544cbf..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_dcd.c +++ /dev/null @@ -1,648 +0,0 @@ -/** - ****************************************************************************** - * @file usb_dcd.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Device interface layer used by the library to access the core. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -uint32_t wInterrupt_Mask=0; - -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Device Initialization - * @param pdev: device instance - * @retval : None - */ -void DCD_Init(USB_CORE_HANDLE *pdev) -{ - /*Device is in Default State*/ - pdev->dev.device_status = USB_DEFAULT; - pdev->dev.device_address = 0; - pdev->dev.DevRemoteWakeup = 0; - - pdev->dev.speed = USB_SPEED_FULL; /*kept for API compatibility reason*/ - - /*CNTR_FRES = 1*/ - SetCNTR(CNTR_FRES); - - /*CNTR_FRES = 0*/ - SetCNTR(0); - - /*Clear pending interrupts*/ - SetISTR(0); - - /*Set Btable Address*/ - SetBTABLE(BTABLE_ADDRESS); - - /*set wInterrupt_Mask global variable*/ - wInterrupt_Mask = CNTR_CTRM | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM | CNTR_SOFM \ - | CNTR_ESOFM | CNTR_RESETM; - -#ifdef LPM_ENABLED - /* enable L1REQ interrupt */ - wInterrupt_Mask |= CNTR_L1REQM; - - /* Enable LPM support and enable ACK answer to LPM request*/ - _SetLPMCSR(LPMCSR_LMPEN | LPMCSR_LPMACK); -#endif - - /*Set interrupt mask*/ - SetCNTR(wInterrupt_Mask); -} - - -/** - * @brief Stop device - * @param pdev: device instance - * @retval : None - */ -void DCD_StopDevice(USB_CORE_HANDLE *pdev) -{ - /* disable all interrupts and force USB reset */ - _SetCNTR(CNTR_FRES); - - /* clear interrupt status register */ - _SetISTR(0); - - /* switch-off device */ - _SetCNTR(CNTR_FRES + CNTR_PDWN); - - /*Device is in default state*/ - pdev->dev.device_status = USB_DEFAULT; - -} - -/** - * @brief Configure PMA for EP - * @param pdev : Device instance - * @param ep_addr: endpoint address - * @param ep_Kind: endpoint Kind - * @arg USB_SNG_BUF: Single Buffer used - * @arg USB_DBL_BUF: Double Buffer used - * @param pmaadress: EP address in The PMA: In case of single buffer endpoint - * this parameter is 16-bit value providing the address - * in PMA allocated to endpoint. - * In case of double buffer endpoint this parameter - * is a 32-bit value providing the endpoint buffer 0 address - * in the LSB part of 32-bit value and endpoint buffer 1 address - * in the MSB part of 32-bit value. - * @retval : status - */ - -uint32_t DCD_PMA_Config(USB_CORE_HANDLE *pdev , - uint16_t ep_addr, - uint16_t ep_kind, - uint32_t pmaadress) - -{ - USB_EP *ep; - /* initialize ep structure*/ - if ((ep_addr & 0x80) == 0x80) - { - ep = &pdev->dev.in_ep[ep_addr & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[ep_addr & 0x7F]; - } - - /* Here we check if the endpoint is single or double Buffer*/ - if (ep_kind == USB_SNG_BUF) - { - /*Single Buffer*/ - ep->doublebuffer = 0; - /*Configure te PMA*/ - ep->pmaadress = (uint16_t)pmaadress; - } - else /*USB_DBL_BUF*/ - { - /*Double Buffer Endpoint*/ - ep->doublebuffer = 1; - /*Configure the PMA*/ - ep->pmaaddr0 = pmaadress & 0xFFFF; - ep->pmaaddr1 = (pmaadress & 0xFFFF0000) >> 16; - } - - return USB_OK; -} - -/** - * @brief Configure an EP - * @param pdev : Device instance - * @param ep_addr: endpoint address - * @param ep_mps: endpoint max packet size - * @param ep_type: endpoint Type - */ -uint32_t DCD_EP_Open(USB_CORE_HANDLE *pdev , - uint16_t ep_addr, - uint16_t ep_mps, - uint8_t ep_type) -{ - - USB_EP *ep; - - /* initialize ep structure*/ - if ((ep_addr & 0x80) == 0x80) - { - ep = &pdev->dev.in_ep[ep_addr & 0x7F]; - ep->is_in = 1; - } - else - { - ep = &pdev->dev.out_ep[ep_addr & 0x7F]; - ep->is_in = 0; - } - - ep->maxpacket = ep_mps; - ep->type = ep_type; - ep->num = ep_addr & 0x7F; - - if (ep->num == 0) - { - /* Initialize the control transfer variables*/ - ep->ctl_data_len =0; - ep->rem_data_len = 0; - ep->total_data_len = 0; - } - - /* Initialize the transaction level variables */ - ep->xfer_buff = 0; - ep->xfer_len = 0; - ep->xfer_count = 0; - ep->is_stall = 0; - - /* initialize HW */ - switch (ep->type) - { - case USB_EP_CONTROL: - SetEPType(ep->num, EP_CONTROL); - break; - case USB_EP_BULK: - SetEPType(ep->num, EP_BULK); - break; - case USB_EP_INT: - SetEPType(ep->num, EP_INTERRUPT); - break; - case USB_EP_ISOC: - SetEPType(ep->num, EP_ISOCHRONOUS); - break; - } - - if (ep->doublebuffer == 0) - { - if (ep->is_in) - { - /*Set the endpoint Transmit buffer address */ - SetEPTxAddr(ep->num, ep->pmaadress); - ClearDTOG_TX(ep->num); - /* Configure NAK status for the Endpoint*/ - SetEPTxStatus(ep->num, EP_TX_NAK); - } - else - { - /*Set the endpoint Receive buffer address */ - SetEPRxAddr(ep->num, ep->pmaadress); - /*Set the endpoint Receive buffer counter*/ - SetEPRxCount(ep->num, ep->maxpacket); - ClearDTOG_RX(ep->num); - /* Configure VALID status for the Endpoint*/ - SetEPRxStatus(ep->num, EP_RX_VALID); - } - } - /*Double Buffer*/ - else - { - /*Set the endpoint as double buffered*/ - SetEPDoubleBuff(ep->num); - /*Set buffer address for double buffered mode*/ - SetEPDblBuffAddr(ep->num,ep->pmaaddr0, ep->pmaaddr1); - - if (ep->is_in==0) - { - /* Clear the data toggle bits for the endpoint IN/OUT*/ - ClearDTOG_RX(ep->num); - ClearDTOG_TX(ep->num); - - /* Reset value of the data toggle bits for the endpoint out*/ - ToggleDTOG_TX(ep->num); - - SetEPRxStatus(ep->num, EP_RX_VALID); - SetEPTxStatus(ep->num, EP_TX_DIS); - } - else - { - /* Clear the data toggle bits for the endpoint IN/OUT*/ - ClearDTOG_RX(ep->num); - ClearDTOG_TX(ep->num); - ToggleDTOG_RX(ep->num); - /* Configure DISABLE status for the Endpoint*/ - SetEPTxStatus(ep->num, EP_TX_DIS); - SetEPRxStatus(ep->num, EP_RX_DIS); - } - } - return USB_OK; -} -/** - * @brief called when an EP is disabled - * @param pdev: device instance - * @param ep_addr: endpoint address - * @retval : status - */ -uint32_t DCD_EP_Close(USB_CORE_HANDLE *pdev , uint8_t ep_addr) -{ - USB_EP *ep; - - if ((ep_addr&0x80) == 0x80) - { - ep = &pdev->dev.in_ep[ep_addr & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[ep_addr & 0x7F]; - } - - if (ep->doublebuffer == 0) - { - if (ep->is_in) - { - ClearDTOG_TX(ep->num); - /* Configure DISABLE status for the Endpoint*/ - SetEPTxStatus(ep->num, EP_TX_DIS); - } - else - { - ClearDTOG_RX(ep->num); - /* Configure DISABLE status for the Endpoint*/ - SetEPRxStatus(ep->num, EP_RX_DIS); - } - } - /*Double Buffer*/ - else - { - if (ep->is_in==0) - { - /* Clear the data toggle bits for the endpoint IN/OUT*/ - ClearDTOG_RX(ep->num); - ClearDTOG_TX(ep->num); - - /* Reset value of the data toggle bits for the endpoint out*/ - ToggleDTOG_TX(ep->num); - - SetEPRxStatus(ep->num, EP_RX_DIS); - SetEPTxStatus(ep->num, EP_TX_DIS); - } - else - { - /* Clear the data toggle bits for the endpoint IN/OUT*/ - ClearDTOG_RX(ep->num); - ClearDTOG_TX(ep->num); - ToggleDTOG_RX(ep->num); - /* Configure DISABLE status for the Endpoint*/ - SetEPTxStatus(ep->num, EP_TX_DIS); - SetEPRxStatus(ep->num, EP_RX_DIS); - } - } - return USB_OK; -} - - -/** - * @brief DCD_EP_PrepareRx - * @param pdev: device instance - * @param ep_addr: endpoint address - * @param pbuf: pointer to Rx buffer - * @param buf_len: data length - * @retval : status - */ -uint32_t DCD_EP_PrepareRx( USB_CORE_HANDLE *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t buf_len) -{ - __IO uint32_t len = 0; - USB_EP *ep; - - ep = &pdev->dev.out_ep[ep_addr & 0x7F]; - - /*setup and start the Xfer */ - ep->xfer_buff = pbuf; - ep->xfer_len = buf_len; - ep->xfer_count = 0; - - /*Multi packet transfer*/ - if (ep->xfer_len > ep->maxpacket) - { - len=ep->maxpacket; - ep->xfer_len-=len; - } - else - { - len=ep->xfer_len; - ep->xfer_len =0; - } - - /* configure and validate Rx endpoint */ - if (ep->doublebuffer == 0) - { - /*Set RX buffer count*/ - SetEPRxCount(ep->num, len); - } - else - { - /*Set the Double buffer counter*/ - SetEPDblBuffCount(ep->num, ep->is_in, len); - } - - SetEPRxStatus(ep->num, EP_RX_VALID); - - return USB_OK; -} - -/** - * @brief Transmit data Buffer - * @param pdev: device instance - * @param ep_addr: endpoint address - * @param pbuf: pointer to Tx buffer - * @param buf_len: data length - * @retval : status - */ -uint32_t DCD_EP_Tx ( USB_CORE_HANDLE *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint32_t buf_len) -{ - __IO uint32_t len = 0; - USB_EP *ep; - - ep = &pdev->dev.in_ep[ep_addr & 0x7F]; - - /*setup and start the Xfer */ - ep->num = ep_addr & 0x7F; - ep->xfer_buff = pbuf; - ep->xfer_len = buf_len; - ep->xfer_count = 0; - - /*Multi packet transfer*/ - if (ep->xfer_len > ep->maxpacket) - { - len=ep->maxpacket; - ep->xfer_len-=len; - } - else - { - len=ep->xfer_len; - ep->xfer_len =0; - } - - /* configure and validate Tx endpoint */ - if (ep->doublebuffer == 0) - { - UserToPMABufferCopy(ep->xfer_buff, ep->pmaadress, len); - SetEPTxCount(ep->num, len); - } - else - { - uint16_t pmabuffer=0; - /*Set the Double buffer counter*/ - SetEPDblBuffCount(ep->num, ep->is_in, len); - - /*Write the data to the USB endpoint*/ - if (GetENDPOINT(ep->num)&EP_DTOG_TX) - { - pmabuffer = ep->pmaaddr1; - } - else - { - pmabuffer = ep->pmaaddr0; - } - UserToPMABufferCopy(ep->xfer_buff, pmabuffer, len); - FreeUserBuffer(ep->num, ep->is_in); - } - - SetEPTxStatus(ep->num, EP_TX_VALID); - - return USB_OK; -} - - -/** - * @brief Stall an endpoint. - * @param pdev: device instance - * @param epnum: endpoint address - * @retval : status - */ -uint32_t DCD_EP_Stall (USB_CORE_HANDLE *pdev, uint8_t epnum) -{ - USB_EP *ep; - if ((0x80 & epnum) == 0x80) - { - ep = &pdev->dev.in_ep[epnum & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[epnum]; - } - - if (ep->num ==0) - { - /* This macro sets STALL status for RX & TX*/ - _SetEPRxTxStatus(ep->num,EP_RX_STALL,EP_TX_STALL); - /*Endpoint is stalled */ - ep->is_stall = 1; - return USB_OK; - } - if (ep->is_in) - { - /* IN endpoint */ - ep->is_stall = 1; - /* IN Endpoint stalled */ - SetEPTxStatus(ep->num , EP_TX_STALL); - } - else - { - ep->is_stall = 1; - /* OUT Endpoint stalled */ - SetEPRxStatus(ep->num , EP_RX_STALL); - } - - return USB_OK; -} - - -/** - * @brief Clear stall condition on endpoints. - * @param pdev: device instance - * @param epnum: endpoint address - * @retval : status - */ -uint32_t DCD_EP_ClrStall (USB_CORE_HANDLE *pdev, uint8_t epnum) -{ - USB_EP *ep; - if ((0x80 & epnum) == 0x80) - { - ep = &pdev->dev.in_ep[epnum & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[epnum]; - } - - if (ep->is_in) - { - ClearDTOG_TX(ep->num); - SetEPTxStatus(ep->num, EP_TX_VALID); - ep->is_stall = 0; - } - else - { - ClearDTOG_RX(ep->num); - SetEPRxStatus(ep->num, EP_RX_VALID); - ep->is_stall = 0; - } - - return USB_OK; -} - -/** - * @brief This Function set USB device address - * @param pdev: device instance - * @param address: new device address - */ -void DCD_EP_SetAddress (USB_CORE_HANDLE *pdev, uint8_t address) -{ - uint32_t i=0; - pdev->dev.device_address = address; - - /* set address in every used endpoint */ - for (i = 0; i < EP_NUM; i++) - { - _SetEPAddress((uint8_t)i, (uint8_t)i); - } /* set device address and enable function */ - _SetDADDR(address | DADDR_EF); -} - -/** - * @brief Connect device (enable internal pull-up) - * @param pdev: device instance - * @retval : None - */ -void DCD_DevConnect (USB_CORE_HANDLE *pdev) -{ - /* Enabling DP Pull-Down bit to Connect internal pull-up on USB DP line */ - *BCDR|=BCDR_DPPU; - /*Device is in default state*/ - pdev->dev.device_status = USB_DEFAULT; -} - -/** - * @brief Disconnect device (disable internal pull-up) - * @param pdev: device instance - * @retval : None - */ -void DCD_DevDisconnect (USB_CORE_HANDLE *pdev) -{ - - /* Disable DP Pull-Down bit*/ - *BCDR&=~BCDR_DPPU; - - /*Device is in unconnected state*/ - pdev->dev.device_status = USB_UNCONNECTED; -} - -/** - * @brief returns the EP Status - * @param pdev : Selected device - * epnum : endpoint address - * @retval : EP status - */ - -uint32_t DCD_GetEPStatus(USB_CORE_HANDLE *pdev ,uint8_t epnum) -{ - uint16_t Status=0; - - USB_EP *ep; - if ((0x80 & epnum) == 0x80) - { - ep = &pdev->dev.in_ep[epnum & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[epnum]; - } - - if (ep->is_in) - { - Status = GetEPTxStatus(ep->num); - } - else - { - Status = GetEPRxStatus(ep->num); - } - - return Status; -} - -/** - * @brief Set the EP Status - * @param pdev : Selected device - * Status : new Status - * epnum : EP address - * @retval : None - */ -void DCD_SetEPStatus (USB_CORE_HANDLE *pdev , uint8_t epnum , uint32_t Status) -{ - USB_EP *ep; - if ((0x80 & epnum) == 0x80) - { - ep = &pdev->dev.in_ep[epnum & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[epnum]; - } - - if (ep->is_in) - { - SetEPTxStatus(ep->num, (uint16_t)Status); - } - else - { - SetEPRxStatus(ep->num, (uint16_t)Status); - } - - if ((Status == EP_RX_STALL) || (Status == EP_TX_STALL)) - { - ep->is_stall =1; - } -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_dcd_int.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_dcd_int.c deleted file mode 100644 index 6ad48c7..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Driver/src/usb_dcd_int.c +++ /dev/null @@ -1,369 +0,0 @@ -/** - ****************************************************************************** - * @file usb_dcd_int.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides the interrupt subroutines for the Device - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_dcd_int.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -extern USB_CORE_HANDLE USB_Device_dev; -extern uint32_t wInterrupt_Mask; -#ifdef LPM_ENABLED -__IO uint32_t L1_remote_wakeup =0; -__IO uint32_t BESL = 0; -#endif - -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Correct Transfer interrupt's service - * @param None - * @retval None - */ -void CTR(void) -{ - USB_EP *ep; - uint16_t count=0; - uint8_t EPindex; - __IO uint16_t wIstr; - __IO uint16_t wEPVal = 0; - /* stay in loop while pending interrupts */ - while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) - { - /* extract highest priority endpoint number */ - EPindex = (uint8_t)(wIstr & ISTR_EP_ID); - - if (EPindex == 0) - { - /* Decode and service control endpoint interrupt */ - - /* DIR bit = origin of the interrupt */ - if ((wIstr & ISTR_DIR) == 0) - { - /* DIR = 0 */ - - /* DIR = 0 => IN int */ - /* DIR = 0 implies that (EP_CTR_TX = 1) always */ - _ClearEP_CTR_TX(ENDP0); - ep = &((&USB_Device_dev)->dev.in_ep[0]); - - ep->xfer_count = GetEPTxCount(ep->num); - ep->xfer_buff += ep->xfer_count; - - /* TX COMPLETE */ - USBD_DCD_INT_fops->DataInStage(&USB_Device_dev, 0x00); - } - else - { - /* DIR = 1 */ - - /* DIR = 1 & CTR_RX => SETUP or OUT int */ - /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */ - ep = &((&USB_Device_dev)->dev.out_ep[0]); - wEPVal = _GetENDPOINT(ENDP0); - - if ((wEPVal &EP_SETUP) != 0) - { - /* Get SETUP Packet*/ - ep->xfer_count = GetEPRxCount(ep->num); - PMAToUserBufferCopy(&((&USB_Device_dev)->dev.setup_packet[0]),ep->pmaadress , ep->xfer_count); - /* SETUP bit kept frozen while CTR_RX = 1*/ - _ClearEP_CTR_RX(ENDP0); - - /* Process SETUP Packet*/ - USBD_DCD_INT_fops->SetupStage(&USB_Device_dev); - } - - else if ((wEPVal & EP_CTR_RX) != 0) - { - _ClearEP_CTR_RX(ENDP0); - /* Get Control Data OUT Packet*/ - ep->xfer_count = GetEPRxCount(ep->num); - - if (ep->xfer_count != 0) - { - PMAToUserBufferCopy(ep->xfer_buff, ep->pmaadress, ep->xfer_count); - ep->xfer_buff+=ep->xfer_count; - } - - /* Process Control Data OUT Packet*/ - USBD_DCD_INT_fops->DataOutStage(&USB_Device_dev, 0x00); - - _SetEPRxCount(ENDP0, ep->maxpacket); - _SetEPRxStatus(ENDP0,EP_RX_VALID); - } - } - }/* if(EPindex == 0) */ - else - { - - /* Decode and service non control endpoints interrupt */ - - /* process related endpoint register */ - wEPVal = _GetENDPOINT(EPindex); - if ((wEPVal & EP_CTR_RX) != 0) - { - /* clear int flag */ - _ClearEP_CTR_RX(EPindex); - ep = &((&USB_Device_dev)->dev.out_ep[EPindex]); - - /* OUT double Buffering*/ - if (ep->doublebuffer == 0) - { - count = GetEPRxCount(ep->num); - if (count != 0) - { - PMAToUserBufferCopy(ep->xfer_buff, ep->pmaadress, count); - } - } - else - { - if (GetENDPOINT(ep->num) & EP_DTOG_RX) - { - /*read from endpoint BUF0Addr buffer*/ - count = GetEPDblBuf0Count(ep->num); - if (count != 0) - { - PMAToUserBufferCopy(ep->xfer_buff, ep->pmaaddr0, count); - } - } - else - { - /*read from endpoint BUF1Addr buffer*/ - count = GetEPDblBuf1Count(ep->num); - if (count != 0) - { - PMAToUserBufferCopy(ep->xfer_buff, ep->pmaaddr1, count); - } - } - FreeUserBuffer(ep->num, EP_DBUF_OUT); - } - /*multi-packet on the NON control OUT endpoint*/ - ep->xfer_count+=count; - ep->xfer_buff+=count; - - if ((ep->xfer_len == 0) || (count < ep->maxpacket)) - { - /* RX COMPLETE */ - USBD_DCD_INT_fops->DataOutStage(&USB_Device_dev, ep->num); - } - else - { - DCD_EP_PrepareRx (&USB_Device_dev,ep->num, ep->xfer_buff, ep->xfer_len); - } - - } /* if((wEPVal & EP_CTR_RX) */ - - if ((wEPVal & EP_CTR_TX) != 0) - { - ep = &((&USB_Device_dev)->dev.in_ep[EPindex]); - - /* clear int flag */ - _ClearEP_CTR_TX(EPindex); - - /* IN double Buffering*/ - if (ep->doublebuffer == 0) - { - ep->xfer_count = GetEPTxCount(ep->num); - if (ep->xfer_count != 0) - { - UserToPMABufferCopy(ep->xfer_buff, ep->pmaadress, ep->xfer_count); - } - } - else - { - if (GetENDPOINT(ep->num) & EP_DTOG_TX) - { - /*read from endpoint BUF0Addr buffer*/ - ep->xfer_count = GetEPDblBuf0Count(ep->num); - if (ep->xfer_count != 0) - { - UserToPMABufferCopy(ep->xfer_buff, ep->pmaaddr0, ep->xfer_count); - } - } - else - { - /*read from endpoint BUF1Addr buffer*/ - ep->xfer_count = GetEPDblBuf1Count(ep->num); - if (ep->xfer_count != 0) - { - UserToPMABufferCopy(ep->xfer_buff, ep->pmaaddr1, ep->xfer_count); - } - } - FreeUserBuffer(ep->num, EP_DBUF_IN); - } - /*multi-packet on the NON control IN endpoint*/ - ep->xfer_count =GetEPTxCount(ep->num); - ep->xfer_buff+=ep->xfer_count; - - /* Zero Length Packet? */ - if (ep->xfer_len == 0) - { - /* TX COMPLETE */ - USBD_DCD_INT_fops->DataInStage(&USB_Device_dev, ep->num); - } - else - { - DCD_EP_Tx (&USB_Device_dev,ep->num, ep->xfer_buff, ep->xfer_len); - } - - } /* if((wEPVal & EP_CTR_TX) != 0) */ - - }/* if(EPindex == 0) else */ - - }/* while(...) */ -} - -/** - * @brief ISTR events interrupt service routine - * @param None - * @retval None - */ -void USB_Istr(void) -{ - __IO uint16_t wIstr = 0; - - wIstr = _GetISTR(); - -#if (IMR_MSK & ISTR_CTR) - if (wIstr & ISTR_CTR & wInterrupt_Mask) - { - /* servicing of the endpoint correct transfer interrupt */ - /* clear of the CTR flag into the sub */ - CTR(); - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_RESET) - if (wIstr & ISTR_RESET & wInterrupt_Mask) - { - _SetISTR((uint16_t)CLR_RESET); - USBD_DCD_INT_fops->Reset(&USB_Device_dev); - DCD_EP_SetAddress(&USB_Device_dev, 0); - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_DOVR) - if (wIstr & ISTR_DOVR & wInterrupt_Mask) - { - _SetISTR((uint16_t)CLR_DOVR); - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_ERR) - if (wIstr & ISTR_ERR & wInterrupt_Mask) - { - _SetISTR((uint16_t)CLR_ERR); - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_WKUP) - if (wIstr & ISTR_WKUP & wInterrupt_Mask) - { - _SetISTR((uint16_t)CLR_WKUP); - - USBD_DCD_INT_fops->Resume(&USB_Device_dev); - - /* Handle Resume state machine */ - Resume(RESUME_EXTERNAL); - -#ifdef LPM_ENABLED - /* clear L1 remote wakeup flag */ - L1_remote_wakeup = 0; -#endif - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_SUSP) - if (wIstr & ISTR_SUSP & wInterrupt_Mask) - { - /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ - _SetISTR((uint16_t)CLR_SUSP); - - /* process library core layer suspend routine*/ - USBD_DCD_INT_fops->Suspend(&USB_Device_dev); - - /* enter macrocell in suspend and system in low power mode when - USB_DEVICE_LOW_PWR_MGMT_SUPPORT defined in usb_conf.h */ - Suspend(); - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_SOF) - if (wIstr & ISTR_SOF & wInterrupt_Mask) - { - _SetISTR((uint16_t)CLR_SOF); - USBD_DCD_INT_fops->SOF(&USB_Device_dev); - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_ESOF) - if (wIstr & ISTR_ESOF & wInterrupt_Mask) - { - /* clear ESOF flag in ISTR */ - _SetISTR((uint16_t)CLR_ESOF); - - /* resume handling timing is made with ESOFs */ - Resume(RESUME_ESOF); /* request without change of the machine state */ - } -#endif - -#ifdef LPM_ENABLED -#if (IMR_MSK & ISTR_L1REQ) - if (wIstr & ISTR_L1REQ & wInterrupt_Mask) - { - /* clear L1REQ flag in ISTR */ - _SetISTR((uint16_t)CLR_L1REQ); - - /* read BESL field which coressponds to HIRD parameter in LPM spec*/ - /* In your application depending on BESL value, you can choose the right - low power mode during L1 state, allowing wakeup time within the request time from host.*/ - BESL = (_GetLPMCSR()&LPMCSR_BESL) >>4 ; - - /* read REMWAKE bit which corresponding to bRemoteWake bit in LPM request*/ - /* if this bit is set then L1 remote wakeup is possible */ - L1_remote_wakeup = (_GetLPMCSR()&LPMCSR_REMWAKE) >>3; - - /* process library core layer suspend routine*/ - USBD_DCD_INT_fops->Suspend(&USB_Device_dev); - - /* enter macrocell in suspend and system in low power mode (STOP mode) when - USB_DEVICE_LOW_PWR_MGMT_SUPPORT defined in usb_conf.h.*/ - /* Please note that in this example we enter in STOP mode during L1 state independently - from value read in BESL (even for BESL= 0 which corresponds to 50us delay) because - STM32F072 can wakeup system from STOP mode in less than 50 us */ - Suspend(); - } -#endif -#endif -} /* USB_Istr */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h deleted file mode 100644 index 414cc71..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_audio_core.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header file for the usbd_audio_core.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_AUDIO_CORE_H_ -#define __USB_AUDIO_CORE_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" -#include "stm32_audio_out_if.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup usbd_audio - * @brief This file is the Header file for USBD_audio.c - * @{ - */ - -/* Exported defines ----------------------------------------------------------*/ - -/* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 2) */ -#define DEFAULT_OUT_BIT_RESOLUTION 16 -#define DEFAULT_OUT_CHANNEL_NBR 2 /* Mono = 1, Stereo = 2 */ -#define AUDIO_OUT_PACKET (uint32_t)(((DEFAULT_OUT_AUDIO_FREQ * \ - (DEFAULT_OUT_BIT_RESOLUTION/8) *\ - DEFAULT_OUT_CHANNEL_NBR) /1000)) - -/* Out endpoint max packet size (in Feedback Synchronization mode, this parameter should be set high enough - in order to tolerate the fluctuations of out packets size) */ -#define AUDIO_OUT_MPS 384 - -#define AUDIO_CONFIG_DESC_SIZE 109 -#define AUDIO_INTERFACE_DESC_SIZE 0x09 -#define USB_AUDIO_DESC_SIZ 0x09 -#define AUDIO_STANDARD_ENDPOINT_DESC_SIZE 0x09 -#define AUDIO_STREAMING_ENDPOINT_DESC_SIZE 0x07 - -#define AUDIO_DESCRIPTOR_TYPE 0x21 -#define USB_DEVICE_CLASS_AUDIO 0x01 -#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01 -#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02 -#define AUDIO_PROTOCOL_UNDEFINED 0x00 -#define AUDIO_STREAMING_GENERAL 0x01 -#define AUDIO_STREAMING_FORMAT_TYPE 0x02 - -/* Audio Descriptor Types */ -#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24 -#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25 - -/* Audio Control Interface Descriptor Subtypes */ -#define AUDIO_CONTROL_HEADER 0x01 -#define AUDIO_CONTROL_INPUT_TERMINAL 0x02 -#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03 -#define AUDIO_CONTROL_FEATURE_UNIT 0x06 - -#define AUDIO_INPUT_TERMINAL_DESC_SIZE 0x0C -#define AUDIO_OUTPUT_TERMINAL_DESC_SIZE 0x09 -#define AUDIO_STREAMING_INTERFACE_DESC_SIZE 0x07 - -#define AUDIO_CONTROL_MUTE 0x0001 - -#define AUDIO_FORMAT_TYPE_I 0x01 -#define AUDIO_FORMAT_TYPE_III 0x03 - -#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 -#define AUDIO_ENDPOINT_GENERAL 0x01 - -#define AUDIO_REQ_GET_CUR 0x81 -#define AUDIO_REQ_SET_CUR 0x01 - -#define AUDIO_OUT_STREAMING_CTRL 0x02 - -/* Buffering state definitions */ -#define STATE_IDLE 0 -#define STATE_BUFFERING 1 -#define STATE_READY 2 -#define STATE_CLOSING 3 -#define STATE_RUN 4 -#define STATE_RUN_OVR (STATE_RUN + 1) -#define STATE_RUN_UDR (STATE_RUN + 2) -#define STATE_RUN_ERR (STATE_RUN + 3) -#define STATE_ERROR 8 - -/* Number of empty frame after which the communication should be considered as closed. */ -#define EMPTY_FRAME_THRESHOLD 3 - -/* Exported types ------------------------------------------------------------*/ -typedef struct _Buff_Desc -{ - uint32_t Size; - uint8_t* Next; -}BUFF_DESC_TypeDef; - -/* Exported macros -----------------------------------------------------------*/ -#define AUDIO_PACKET_SZE(frq) (uint8_t)(AUDIO_OUT_PACKET & 0xFF), \ - (uint8_t)((AUDIO_OUT_PACKET >> 8) & 0xFF) -#define SAMPLE_FREQ(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16)) - -/* Exported variables --------------------------------------------------------*/ -extern USBD_Class_cb_TypeDef AUDIO_cb; - -/* Exported functions ------------------------------------------------------- */ -/* This function should be called by low layer functions when current buffer transfer is complete */ -void usbd_audio_BuffXferCplt (uint8_t** pbuf, uint32_t* pSize); - -#endif /* __USB_AUDIO_CORE_H_ */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/audio/src/usbd_audio_core.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/audio/src/usbd_audio_core.c deleted file mode 100644 index 924c778..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/audio/src/usbd_audio_core.c +++ /dev/null @@ -1,776 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_audio_core.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB Audio Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as Audio Streaming Device - * - Audio Streaming data transfer - * - AudioControl requests management - * - Error management - * - * @verbatim - * - * =================================================================== - * Audio Class Driver Description - * =================================================================== - * This driver manages the Audio Class 1.0 following the "USB Device Class Definition for - * Audio Devices V1.0 Mar 18, 98". - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Standard AC Interface Descriptor management - * - 1 Audio Streaming Interface (with single channel, PCM, Stereo mode) - * - 1 Audio Streaming Endpoint - * - 1 Audio Terminal Input (1 channel) - * - Audio Class-Specific AC Interfaces - * - Audio Class-Specific AS Interfaces - * - AudioControl Requests: only SET_CUR and GET_CUR requests are supported (for Mute) - * - Audio Feature Unit (limited to Mute control) - * - Audio Synchronization type: Asynchronous - * - Single fixed audio sampling rate (configurable in usbd_conf.h file) - * - * @note - * The Audio Class 1.0 is based on USB Specification 1.0 and thus supports only - * Low and Full speed modes and does not allow High Speed transfers. - * Please refer to "USB Device Class Definition for Audio Devices V1.0 Mar 18, 98" - * for more details. - * - * These aspects may be enriched or modified for a specific user application. - * - * This driver doesn't implement the following aspects of the specification - * (but it is possible to manage these features with some modifications on this driver): - * - AudioControl Endpoint management - * - AudioControl requests other than SET_CUR and GET_CUR - * - Abstraction layer for AudioControl requests (only Mute functionality is managed) - * - Audio Synchronization type: Adaptive - * - Audio Compression modules and interfaces - * - MIDI interfaces and modules - * - Mixer/Selector/Processing/Extension Units (Feature unit is limited to Mute control) - * - Any other application-specific modules - * - Multiple and Variable audio sampling rates - * - Out Streaming Endpoint/Interface (microphone) - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_audio_core.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup usbd_audio - * @brief usbd core module - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/********************************************* - AUDIO Device library callbacks - *********************************************/ -static uint8_t usbd_audio_Init (void *pdev, uint8_t cfgidx); -static uint8_t usbd_audio_DeInit (void *pdev, uint8_t cfgidx); -static uint8_t usbd_audio_Setup (void *pdev, USB_SETUP_REQ *req); -static uint8_t usbd_audio_EP0_RxReady(void *pdev); -static uint8_t usbd_audio_DataIn (void *pdev, uint8_t epnum); -static uint8_t usbd_audio_DataOut (void *pdev, uint8_t epnum); -static uint8_t usbd_audio_SOF (void *pdev); - -static uint8_t *USBD_audio_GetCfgDesc (uint8_t speed, uint16_t *length); - -/********************************************* - AUDIO Requests management functions - *********************************************/ -static void AUDIO_Req_GetCurrent(void *pdev, USB_SETUP_REQ *req); -static void AUDIO_Req_SetCurrent(void *pdev, USB_SETUP_REQ *req); - -/* Private variables ---------------------------------------------------------*/ - /* Main Buffer for Audio Data Out transfers and its related pointers */ -/* This is the main buffer where all out audio data are stored */ -uint8_t IsocOutBuff [TOTAL_OUT_BUF_SIZE]; -/* This is the pointer used by the write process (from host to device) */ -uint8_t* IsocOutWrPtr = IsocOutBuff; -/* This is the pointer used by the read process (from buffers to I2S) */ -uint8_t* IsocOutRdPtr = IsocOutBuff; - -uint8_t OutEmptyFrameCount = 0; - -BUFF_DESC_TypeDef IsocOutBufDesc[OUT_PACKET_NUM]; -uint32_t IsocOutWrBufDescIdx = 0; -uint32_t IsocOutRdBufDescIdx = 0; -uint8_t IsocOutWrState = STATE_IDLE; -uint8_t IsocOutRdState = STATE_IDLE; - -/* Main Buffer for Audio Control Requests transfers and its related variables */ -uint8_t AudioCtl[64]; -uint8_t AudioCtlCmd = 0; -uint32_t AudioCtlLen = 0; -uint8_t AudioCtlUnit = 0; - - -/* USB AUDIO device Configuration Descriptor */ -const uint8_t usbd_audio_CfgDesc[AUDIO_CONFIG_DESC_SIZE] = -{ - /* Configuration 1 */ - 0x09, /* bLength */ - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */ - LOBYTE(AUDIO_CONFIG_DESC_SIZE), /* wTotalLength 109 bytes*/ - HIBYTE(AUDIO_CONFIG_DESC_SIZE), - 0x02, /* bNumInterfaces */ - 0x01, /* bConfigurationValue */ - 0x00, /* iConfiguration */ - 0xC0, /* bmAttributes BUS Powred*/ - 0x32, /* bMaxPower = 100 mA*/ - /* 09 byte*/ - - /* USB Speaker Standard interface descriptor */ - AUDIO_INTERFACE_DESC_SIZE, /* bLength */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - 0x00, /* bInterfaceNumber */ - 0x00, /* bAlternateSetting */ - 0x00, /* bNumEndpoints */ - USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ - AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */ - AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ - 0x00, /* iInterface */ - /* 09 byte*/ - - /* USB Speaker Class-specific AC Interface Descriptor */ - AUDIO_INTERFACE_DESC_SIZE, /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */ - 0x00, /* 1.00 */ /* bcdADC */ - 0x01, - 0x27, /* wTotalLength = 39*/ - 0x00, - 0x01, /* bInCollection */ - 0x01, /* baInterfaceNr */ - /* 09 byte*/ - - /* USB Speaker Input Terminal Descriptor */ - AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */ - 0x01, /* bTerminalID */ - 0x01, /* wTerminalType AUDIO_TERMINAL_USB_STREAMING 0x0101 */ - 0x01, - 0x00, /* bAssocTerminal */ - 0x01, /* bNrChannels */ - 0x00, /* wChannelConfig 0x0000 Mono */ - 0x00, - 0x00, /* iChannelNames */ - 0x00, /* iTerminal */ - /* 12 byte*/ - - /* USB Speaker Audio Feature Unit Descriptor */ - 0x09, /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */ - AUDIO_OUT_STREAMING_CTRL, /* bUnitID */ - 0x01, /* bSourceID */ - 0x01, /* bControlSize */ - AUDIO_CONTROL_MUTE, /* bmaControls(0) */ - 0x00, /* bmaControls(1) */ - 0x00, /* iTerminal */ - /* 09 byte*/ - - /*USB Speaker Output Terminal Descriptor */ - 0x09, /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */ - 0x03, /* bTerminalID */ - 0x01, /* wTerminalType 0x0301*/ - 0x03, - 0x00, /* bAssocTerminal */ - 0x02, /* bSourceID */ - 0x00, /* iTerminal */ - /* 09 byte*/ - - /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwidth */ - /* Interface 1, Alternate Setting 0 */ - AUDIO_INTERFACE_DESC_SIZE, /* bLength */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - 0x01, /* bInterfaceNumber */ - 0x00, /* bAlternateSetting */ - 0x00, /* bNumEndpoints */ - USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ - AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ - AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ - 0x00, /* iInterface */ - /* 09 byte*/ - - /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational */ - /* Interface 1, Alternate Setting 1 */ - AUDIO_INTERFACE_DESC_SIZE, /* bLength */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - 0x01, /* bInterfaceNumber */ - 0x01, /* bAlternateSetting */ - 0x01, /* bNumEndpoints */ - USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ - AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ - AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ - 0x00, /* iInterface */ - /* 09 byte*/ - - /* USB Speaker Audio Streaming Interface Descriptor */ - AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ - 0x01, /* bTerminalLink */ - 0x01, /* bDelay */ - 0x01, /* wFormatTag AUDIO_FORMAT_PCM 0x0001 */ - 0x00, - /* 07 byte*/ - - /* USB Speaker Audio Type III Format Interface Descriptor */ - (0x08 + (3 * SUPPORTED_FREQ_NBR)), /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ - AUDIO_FORMAT_TYPE_I, /* bFormatType */ - - DEFAULT_OUT_CHANNEL_NBR, /* bNrChannels */ - DEFAULT_OUT_CHANNEL_NBR, /* bSubFrameSize : 2 Bytes per frame (16bits) */ - DEFAULT_OUT_BIT_RESOLUTION, /* bBitResolution (16-bits per sample) */ - SUPPORTED_FREQ_NBR, /* bSamFreqType only one frequency supported */ - SAMPLE_FREQ(DEFAULT_OUT_AUDIO_FREQ), /* Audio sampling frequency coded on 3 bytes */ -#if (SUPPORTED_FREQ_NBR > 1) - SAMPLE_FREQ(USBD_AUDIO_FREQ_2), /* Audio sampling frequency coded on 3 bytes */ -#endif -#if (SUPPORTED_FREQ_NBR > 2) - SAMPLE_FREQ(USBD_AUDIO_FREQ_3), /* Audio sampling frequency coded on 3 bytes */ -#endif -#if (SUPPORTED_FREQ_NBR > 3) - SAMPLE_FREQ(USBD_AUDIO_FREQ_4), /* Audio sampling frequency coded on 3 bytes */ -#endif -#if (SUPPORTED_FREQ_NBR > 4) - #error "Error: Max nbr of frequencies exceeded, you have to modify the conf descriptor in usbd_audio_core.c file!" -#endif - /* 11 + 3*N byte */ - - /* USB Speaker Streaming Standard Endpoint Descriptor */ - AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_OUT_EP, /* bEndpointAddress 1 out endpoint*/ - USB_ENDPOINT_TYPE_ISOCHRONOUS, /* bmAttributes */ - LOBYTE(AUDIO_OUT_MPS), /* wMaxPacketSize */ - HIBYTE(AUDIO_OUT_MPS), - 0x01, /* bInterval */ - 0x00, /* bRefresh */ - 0x00, /* bSynchAddress */ - /* 09 byte*/ - - /* Endpoint - Audio Streaming Descriptor*/ - AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */ - AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ -#if (SUPPORTED_FREQ_NBR > 1) - 0x01, /* bmAttributes: Freq selection */ -#else - 0x00, /* bmAttributes: None */ -#endif /* (SUPPORTED_FREQ_NBR > 1) */ - 0x00, /* bLockDelayUnits */ - 0x00, /* wLockDelay */ - 0x00, - /* 07 byte*/ -}; - -/* AUDIO interface class callbacks structure */ -USBD_Class_cb_TypeDef AUDIO_cb = -{ - usbd_audio_Init, - usbd_audio_DeInit, - usbd_audio_Setup, - NULL, /* EP0_TxSent */ - usbd_audio_EP0_RxReady, - usbd_audio_DataIn, - usbd_audio_DataOut, - usbd_audio_SOF, - USBD_audio_GetCfgDesc, -}; - -/* Private function ----------------------------------------------------------*/ - -/** - * @brief usbd_audio_Init - * Initializes the AUDIO interface. - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t usbd_audio_Init (void *pdev, - uint8_t cfgidx) -{ - /* Open EP OUT */ - DCD_PMA_Config(pdev, AUDIO_OUT_EP, USB_DBL_BUF, Audio_IN_TX_ADRESS); - - DCD_EP_Open(pdev, AUDIO_OUT_EP, AUDIO_OUT_PACKET, USB_EP_ISOC); - - /* Initialize the Audio output Hardware layer */ - if (AUDIO_OUT_fops.Init(DEFAULT_OUT_AUDIO_FREQ, DEFAULT_VOLUME, (DEFAULT_OUT_CHANNEL_NBR << 6 | DEFAULT_OUT_BIT_RESOLUTION)) != USBD_OK) - { - return USBD_FAIL; - } - -#if (DEFAULT_OUT_BIT_RESOLUTION == 16) - WAVADDON_Init((DEFAULT_OUT_CHANNEL_NBR<<6 | DEFAULT_OUT_BIT_RESOLUTION), 0); -#endif /* DEFAULT_OUT_BIT_RESOLUTION */ - - /* Prepare Out endpoint to receive audio data */ - DCD_EP_PrepareRx(pdev, - AUDIO_OUT_EP, - (uint8_t*)IsocOutBuff, - AUDIO_OUT_PACKET); - - return USBD_OK; -} - -/** - * @brief usbd_audio_DeInit - * DeInitializes the AUDIO layer. - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t usbd_audio_DeInit (void *pdev, - uint8_t cfgidx) -{ - DCD_EP_Close (pdev , AUDIO_OUT_EP); - - /* DeInitialize the Audio output Hardware layer */ - if (AUDIO_OUT_fops.DeInit() != USBD_OK) - { - return USBD_FAIL; - } - - return USBD_OK; -} - -/** - * @brief usbd_audio_Setup - * Handles the Audio control request parsing. - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t usbd_audio_Setup (void *pdev, - USB_SETUP_REQ *req) -{ - - __IO uint32_t usbd_audio_AltSet = 0; - uint16_t len=USB_AUDIO_DESC_SIZ; - uint8_t *pbuf= (uint8_t *) usbd_audio_CfgDesc + 18; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - /* AUDIO Class Requests -------------------------------*/ - case USB_REQ_TYPE_CLASS : - switch (req->bRequest) - { - case AUDIO_REQ_GET_CUR: - AUDIO_Req_GetCurrent(pdev, req); - break; - - case AUDIO_REQ_SET_CUR: - AUDIO_Req_SetCurrent(pdev, req); - break; - - default: - USBD_CtlError (pdev, req); - return USBD_FAIL; - } - break; - - /* Standard Requests -------------------------------*/ - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - if( (req->wValue >> 8) == AUDIO_DESCRIPTOR_TYPE) - { - pbuf = (uint8_t *)usbd_audio_CfgDesc + 18; - len = MIN(USB_AUDIO_DESC_SIZ , req->wLength); - } - - USBD_CtlSendData (pdev, - pbuf, - len); - break; - - case USB_REQ_GET_INTERFACE : - USBD_CtlSendData (pdev, - (uint8_t *)&usbd_audio_AltSet, - 1); - break; - - case USB_REQ_SET_INTERFACE : - if ((uint8_t)(req->wValue) < AUDIO_TOTAL_IF_NUM) - { - usbd_audio_AltSet = (uint8_t)(req->wValue); - } - else - { - /* Call the error management function (command will be nacked */ - USBD_CtlError (pdev, req); - } - break; - } - } - return USBD_OK; -} - -/** - * @brief usbd_audio_EP0_RxReady - * Handles audio control requests data. - * @param pdev: device device instance - * @retval status - */ -static uint8_t usbd_audio_EP0_RxReady (void *pdev) -{ - /* Check if an AudioControl request has been issued */ - if (AudioCtlCmd == AUDIO_REQ_SET_CUR) - { - /* In this driver, to simplify code, only SET_CUR request is managed */ - /* Check for which addressed unit the AudioControl request has been issued */ - if (AudioCtlUnit == AUDIO_OUT_STREAMING_CTRL) - { - /* In this driver, to simplify code, only one unit is manage */ - /* Call the audio interface mute function */ - AUDIO_OUT_fops.MuteCtl(AudioCtl[0]); - - /* Reset the AudioCtlCmd variable to prevent re-entering this function */ - AudioCtlCmd = 0; - AudioCtlLen = 0; - } - } - - return USBD_OK; -} - -/** - * @brief usbd_audio_DataIn - * Handles the audio IN data stage. - * @param pdev: instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t usbd_audio_DataIn (void *pdev, uint8_t epnum) -{ - return USBD_OK; -} - -/** - * @brief usbd_audio_DataOut - * Handles the Audio Out data stage. - * @param pdev: instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t usbd_audio_DataOut (void *pdev, uint8_t epnum) -{ - uint32_t IsocOutPacketSze = AUDIO_OUT_PACKET; - if (epnum == AUDIO_OUT_EP) - { - /* Set the Isochronous Buffer Out linked chain parameters */ - IsocOutBufDesc[IsocOutWrBufDescIdx].Size = ((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count; - IsocOutBufDesc[IsocOutWrBufDescIdx].Next = (uint8_t*)(IsocOutWrPtr + IsocOutBufDesc[IsocOutWrBufDescIdx].Size); - -#if (DEFAULT_OUT_BIT_RESOLUTION == 16) - WAVADDON_AudioProcessing(IsocOutWrPtr, IsocOutBufDesc[IsocOutWrBufDescIdx].Size); -#endif /* DEFAULT_OUT_BIT_RESOLUTION */ - - /* Increment the write buffer pointer */ - IsocOutWrPtr += IsocOutBufDesc[IsocOutWrBufDescIdx].Size; - - /* Increment the linked chain member index */ - IsocOutWrBufDescIdx++; - - /* Check if the end of the the buffer has been reached */ - if (IsocOutWrBufDescIdx >= OUT_PACKET_NUM) - { - /* All buffers are full: roll back */ - IsocOutWrPtr = IsocOutBuff; - IsocOutBufDesc[IsocOutWrBufDescIdx - 1].Next = IsocOutBuff; - IsocOutWrBufDescIdx = 0; - } - - /* Check and update the buffering state machine */ - switch (IsocOutWrState) - { - case STATE_IDLE: - IsocOutWrState = STATE_BUFFERING; - break; - - case STATE_BUFFERING: - /* Check if the buffer index reached the half of total out buffer */ - if (IsocOutWrBufDescIdx >= (OUT_PACKET_NUM / 2)) - { - /* Switch current state to Ready: allow read operation from the buffer */ - IsocOutWrState = STATE_READY; - } - break; - - case STATE_READY: - /* Decrement the empty frame counter */ - if (OutEmptyFrameCount) - { - OutEmptyFrameCount --; - } - break; - - case STATE_CLOSING: - break; - - default: - break; - } - - /* Prepare Out endpoint to receive next audio packet */ - DCD_EP_PrepareRx(pdev, - AUDIO_OUT_EP, - IsocOutWrPtr, - IsocOutPacketSze); - } - - return USBD_OK; -} - -/** - * @brief usbd_audio_SOF - * Handles the SOF event (data buffer update and synchronization). - * @param pdev: instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t usbd_audio_SOF (void *pdev) -{ - /*Uncomment this line to visualize the shift between SOF and audio clock*/ - STM_EVAL_LEDToggle(LED1); - - /* Check on current state */ - if (IsocOutWrState == STATE_READY) - { - /* Increment the empty frame counter */ - OutEmptyFrameCount ++; - - /* Check if the output read operation has been started */ - if (IsocOutRdState == STATE_IDLE) - { - /* Start playing received packet */ - AUDIO_OUT_fops.AudioCmd(IsocOutBuff, /* Samples buffer pointer */ - IsocOutBufDesc[IsocOutRdBufDescIdx].Size, /* Number of samples in Bytes */ - AUDIO_CMD_PLAY); /* Command to be processed */ - - /* Set the current read pointer */ - IsocOutRdPtr = IsocOutBufDesc[IsocOutRdBufDescIdx].Next; - - /* Increment the read buffer descriptor index */ - IsocOutRdBufDescIdx++; - - /* Update the out read operation state */ - IsocOutRdState = STATE_RUN; - } - } - - /* Check if the empty frame counter reached the threshold (means audio streaming stopped) */ - if (OutEmptyFrameCount >= EMPTY_FRAME_THRESHOLD) - { - IsocOutWrState = STATE_CLOSING; - OutEmptyFrameCount = 0; - } - - /* Check if there are available data in stream buffer. - The play operation must be executed as soon as possible after the SOF detection. */ - if (/*(IsocOutWrState == STATE_CLOSING) && */ - (IsocOutRdPtr == IsocOutWrPtr) && - (IsocOutRdState != STATE_IDLE)) - { - /* Pause the audio stream */ - AUDIO_OUT_fops.AudioCmd(IsocOutBufDesc[IsocOutRdBufDescIdx - 1].Next, /* Samples buffer pointer */ - IsocOutBufDesc[IsocOutRdBufDescIdx].Size, /* Number of samples in Bytes */ - AUDIO_CMD_PAUSE); /* Command to be processed */ - - IsocOutWrState = STATE_IDLE; - IsocOutRdState = STATE_IDLE; - - /* Reset buffer pointers */ - IsocOutRdPtr = IsocOutBuff; - IsocOutWrPtr = IsocOutBuff; - IsocOutRdBufDescIdx = 0; - IsocOutWrBufDescIdx = 0; - } - - return USBD_OK; -} - -/** - * @brief usbd_audio_BuffXferCplt - * Manage end of buffer transfer for each device. - * @param Direction: could be DIRECTION_IN or DIRECTION_OUT - * @param pbuf: Pointer to the address of the current buffer - * @param pSize: pointer to the variable which holds current buffer size - * @retval status - */ -void usbd_audio_BuffXferCplt (uint8_t** pbuf, uint32_t* pSize) -{ - uint8_t* pRdPtr = IsocOutRdPtr; - uint32_t currDistanceOut = 0; - - if (IsocOutRdState & STATE_RUN) - { - STM_EVAL_LEDToggle(LED2); - - if (IsocOutRdBufDescIdx == 0) - { - /* Start playing received packet */ - AUDIO_OUT_fops.AudioCmd(IsocOutBufDesc[OUT_PACKET_NUM - 1].Next, /* Samples buffer pointer */ - IsocOutBufDesc[IsocOutRdBufDescIdx].Size, /* Number of samples in Bytes */ - AUDIO_CMD_PLAY); /* Command to be processed */ - - /* Set the current read pointer */ - IsocOutRdPtr = IsocOutBufDesc[OUT_PACKET_NUM - 1].Next; - } - else - { - /* Start playing received packet */ - AUDIO_OUT_fops.AudioCmd(IsocOutBufDesc[IsocOutRdBufDescIdx - 1].Next, /* Samples buffer pointer */ - IsocOutBufDesc[IsocOutRdBufDescIdx].Size, /* Number of samples in Bytes */ - AUDIO_CMD_PLAY); /* Command to be processed */ - - /* Set the current read pointer */ - IsocOutRdPtr = IsocOutBufDesc[IsocOutRdBufDescIdx - 1].Next; - } - - /* Check if roll-back has been detected */ - if (((uint32_t)IsocOutWrPtr) >= (uint32_t)pRdPtr) - {/* No roll-back */ - currDistanceOut = (uint32_t)(((uint32_t)IsocOutWrPtr) - (uint32_t)pRdPtr); - } - else - {/* Roll-back occured */ - currDistanceOut = (uint32_t)(((uint32_t)(IsocOutBufDesc[OUT_PACKET_NUM-2].Next) + \ - IsocOutBufDesc[OUT_PACKET_NUM-1].Size) - \ - (uint32_t)pRdPtr + ((uint32_t)IsocOutWrPtr) - \ - (uint32_t)(IsocOutBufDesc[OUT_PACKET_NUM-1].Next)); - } - - /* Speed-up the timer (trigger of DAC) when the distance between write buffer - and read buffer pointers is higher than 3/4 buffer size */ - if(currDistanceOut > 1176)/* 3/4 buffer size = 1568 * 3/4 = 1176 */ - { - TIM6->ARR = 998;/* This value is hard-coded for 48KHz: 48MHz/48KHz - 2 */ - } - /* Slow-down the timer (trigger of DAC) when the distance between write buffer - and read buffer pointers is lower than 1/4 buffer size */ - else if(currDistanceOut < 392)/* 1/4 buffer size = 1568 * 1/4 = 392 */ - { - TIM6->ARR = 1000;/* This value is hard-coded for 48KHz: 48MHz/48KHz */ - } - /* Set the default timer frequency */ - else - { - TIM6->ARR = 999;/* This value is hard-coded for 48KHz: 48MHz/48KHz - 1 */ - } - /* Increment the read buffer descriptor index */ - IsocOutRdBufDescIdx++; - - /* Check if the end of the the buffer has been reached */ - if (IsocOutRdBufDescIdx == OUT_PACKET_NUM) - { - /* All buffers are full: roll back */ - IsocOutRdBufDescIdx = 0; - } - } -} - -/****************************************************************************** - AUDIO Class requests management -******************************************************************************/ -/** - * @brief AUDIO_Req_GetCurrent - * Handles the GET_CUR Audio control request. - * @param pdev: instance - * @param req: setup class request - * @retval status - */ -static void AUDIO_Req_GetCurrent(void *pdev, USB_SETUP_REQ *req) -{ - /* Send the current mute state */ - USBD_CtlSendData (pdev, - AudioCtl, - req->wLength); -} - -/** - * @brief AUDIO_Req_SetCurrent - * Handles the SET_CUR Audio control request. - * @param pdev: instance - * @param req: setup class request - * @retval status - */ -static void AUDIO_Req_SetCurrent(void *pdev, USB_SETUP_REQ *req) -{ - if (req->wLength) - { - /* Prepare the reception of the buffer over EP0 */ - USBD_CtlPrepareRx (pdev, - AudioCtl, - req->wLength); - - /* Set the global variables indicating current request and its length - to the function usbd_audio_EP0_RxReady() which will process the request */ - AudioCtlCmd = AUDIO_REQ_SET_CUR; /* Set the request value */ - AudioCtlLen = req->wLength; /* Set the request data length */ - AudioCtlUnit = HIBYTE(req->wIndex); /* Set the request target unit */ - } -} - -/** - * @brief USBD_audio_GetCfgDesc - * Returns configuration descriptor. - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_audio_GetCfgDesc (uint8_t speed, uint16_t *length) -{ - *length = sizeof (usbd_audio_CfgDesc); - return (uint8_t *)usbd_audio_CfgDesc; -} - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_cmd.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_cmd.h deleted file mode 100644 index f0e5114..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_cmd.h +++ /dev/null @@ -1,190 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_cmd.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief CCID Commands handling prototype - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CCID_CMD_H -#define __USBD_CCID_CMD_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid_core.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ - -/******************************************************************************/ -/* ERROR CODES for USB Bulk In Messages : bError */ -/******************************************************************************/ - -#define SLOT_NO_ERROR 0x81 -#define SLOTERROR_UNKNOWN 0x82 - -/* Index of not supported / incorrect message parameter : 7Fh to 01h */ -/* These Values are used for Return Types between Firmware Layers */ -/* -Failure of a command -The CCID cannot parse one parameter or the ICC is not supporting one parameter. -Then the Slot Error register contains the index of the first bad parameter as a -positive number (1-127). For instance, if the CCID receives an ICC command to -an unimplemented slot, then the Slot Error register shall be set to -‘5’ (index of bSlot field). - */ - -#define SLOTERROR_BAD_LENTGH 0x01 -#define SLOTERROR_BAD_SLOT 0x05 -#define SLOTERROR_BAD_POWERSELECT 0x07 -#define SLOTERROR_BAD_PROTOCOLNUM 0x07 -#define SLOTERROR_BAD_CLOCKCOMMAND 0x07 -#define SLOTERROR_BAD_ABRFU_3B 0x07 -#define SLOTERROR_BAD_BMCHANGES 0x07 -#define SLOTERROR_BAD_BFUNCTION_MECHANICAL 0x07 -#define SLOTERROR_BAD_ABRFU_2B 0x08 -#define SLOTERROR_BAD_LEVELPARAMETER 0x08 -#define SLOTERROR_BAD_FIDI 0x0A -#define SLOTERROR_BAD_T01CONVCHECKSUM 0x0B -#define SLOTERROR_BAD_GUARDTIME 0x0C -#define SLOTERROR_BAD_WAITINGINTEGER 0x0D -#define SLOTERROR_BAD_CLOCKSTOP 0x0E -#define SLOTERROR_BAD_IFSC 0x0F -#define SLOTERROR_BAD_NAD 0x10 -#define SLOTERROR_BAD_DWLENGTH 0x08 /* Used in PC_to_RDR_XfrBlock*/ - -/*---------- Table 6.2-2 Slot error register when bmCommandStatus = 1 */ -#define SLOTERROR_CMD_ABORTED 0xFF -#define SLOTERROR_ICC_MUTE 0xFE -#define SLOTERROR_XFR_PARITY_ERROR 0xFD -#define SLOTERROR_XFR_OVERRUN 0xFC -#define SLOTERROR_HW_ERROR 0xFB -#define SLOTERROR_BAD_ATR_TS 0xF8 -#define SLOTERROR_BAD_ATR_TCK 0xF7 -#define SLOTERROR_ICC_PROTOCOL_NOT_SUPPORTED 0xF6 -#define SLOTERROR_ICC_CLASS_NOT_SUPPORTED 0xF5 -#define SLOTERROR_PROCEDURE_BYTE_CONFLICT 0xF4 -#define SLOTERROR_DEACTIVATED_PROTOCOL 0xF3 -#define SLOTERROR_BUSY_WITH_AUTO_SEQUENCE 0xF2 -#define SLOTERROR_PIN_TIMEOUT 0xF0 -#define SLOTERROR_PIN_CANCELLED 0xEF -#define SLOTERROR_CMD_SLOT_BUSY 0xE0 -#define SLOTERROR_CMD_NOT_SUPPORTED 0x00 - - -#define DEFAULT_FIDI 0x11 /* DEFAULT_FIDI_VALUE */ -#define DEFAULT_T01CONVCHECKSUM 0x00 -#define DEFAULT_EXTRA_GUARDTIME 0x00 -#define DEFAULT_WAITINGINTEGER 0x0A -#define DEFAULT_CLOCKSTOP 0x00 -#define DEFAULT_IFSC 0x20 -#define DEFAULT_NAD 0x00 - -#define DEFAULT_DATA_RATE 0x000025CD -#define DEFAULT_CLOCK_FREQ 0x00000E10 - - -/* -Offset=0 bmICCStatus 2 bit 0, 1, 2 - 0 - An ICC is present and active (power is on and stable, RST is inactive) - 1 - An ICC is present and inactive (not activated or shut down by hardware error) - 2 - No ICC is present - 3 - RFU -Offset=0 bmRFU 4 bits 0 RFU -Offset=6 bmCommandStatus 2 bits 0, 1, 2 - 0 - Processed without error - 1 - Failed (error code provided by the error register) - 2 - Time Extension is requested - 3 - RFU - */ - -#define BM_ICC_PRESENT_ACTIVE 0x00 -#define BM_ICC_PRESENT_INACTIVE 0x01 -#define BM_ICC_NO_ICC_PRESENT 0x02 - -#define BM_COMMAND_STATUS_OFFSET 0x06 -#define BM_COMMAND_STATUS_NO_ERROR 0x00 -#define BM_COMMAND_STATUS_FAILED (0x01 << BM_COMMAND_STATUS_OFFSET) -#define BM_COMMAND_STATUS_TIME_EXTN (0x02 << BM_COMMAND_STATUS_OFFSET) - -/* defines for the CCID_CMD Layers */ -#define SIZE_OF_ATR 33 -#define LEN_RDR_TO_PC_SLOTSTATUS 10 -#define LEN_PROTOCOL_STRUCT_T0 5 - -#define BPROTOCOL_NUM_T0 0 -#define BPROTOCOL_NUM_T1 1 - -/************************************************************************************/ -/* ERROR CODES for RDR_TO_PC_HARDWAREERROR Message : bHardwareErrorCode */ -/************************************************************************************/ - -#define HARDWAREERRORCODE_OVERCURRENT 0x01 -#define HARDWAREERRORCODE_VOLTAGEERROR 0x02 -#define HARDWAREERRORCODE_OVERCURRENT_IT 0x04 -#define HARDWAREERRORCODE_VOLTAGEERROR_IT 0x08 - -typedef enum -{ - CHK_PARAM_SLOT = 1, - CHK_PARAM_DWLENGTH = (1<<1), - CHK_PARAM_abRFU2 = (1<<2), - CHK_PARAM_abRFU3 = (1<<3), - CHK_PARAM_CARD_PRESENT = (1<<4), - CHK_PARAM_ABORT = (1<<5), - CHK_ACTIVE_STATE = (1<<6) -} ChkParam_t; - - -/* Exported functions ------------------------------------------------------- */ - -uint8_t PC_to_RDR_IccPowerOn(void); -uint8_t PC_to_RDR_IccPowerOff(void); -uint8_t PC_to_RDR_GetSlotStatus(void); -uint8_t PC_to_RDR_XfrBlock(void); -uint8_t PC_to_RDR_GetParameters(void); -uint8_t PC_to_RDR_ResetParameters(void); -uint8_t PC_to_RDR_SetParameters(void); -uint8_t PC_to_RDR_Escape(void); -uint8_t PC_to_RDR_IccClock(void); -uint8_t PC_to_RDR_Abort(void); -uint8_t PC_TO_RDR_T0Apdu(void); -uint8_t PC_TO_RDR_Mechanical(void); -uint8_t PC_TO_RDR_SetDataRateAndClockFrequency(void); -uint8_t PC_TO_RDR_Secure(void); - -void RDR_to_PC_DataBlock(unsigned char ); -void RDR_to_PC_NotifySlotChange(void); -void RDR_to_PC_SlotStatus(unsigned char ); -void RDR_to_PC_Parameters(unsigned char ); -void RDR_to_PC_Escape(unsigned char ); -void RDR_to_PC_DataRateAndClockFrequency(uint8_t errorCode); - - -void CCID_UpdSlotStatus (uint8_t ); -void CCID_UpdSlotChange (uint8_t ); -uint8_t CCID_IsSlotStatusChange (void); -uint8_t CCID_CmdAbort(uint8_t slot, uint8_t seq); - -#endif /* __USBD_CCID_CMD_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_core.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_core.h deleted file mode 100644 index 4ce1b06..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_core.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_core.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the CCID core functions. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef _USB_CCID_CORE_H_ -#define _USB_CCID_CORE_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" -#include "sc_itf.h" - -/* Exported defines ----------------------------------------------------------*/ -#define TPDU_EXCHANGE 0x01 -#define SHORT_APDU_EXCHANGE 0x02 -#define EXTENDED_APDU_EXCHANGE 0x04 -#define CHARACTER_EXCHANGE 0x00 - -#define EXCHANGE_LEVEL_FEATURE TPDU_EXCHANGE - -#define REQUEST_ABORT 0x01 -#define REQUEST_GET_CLOCK_FREQUENCIES 0x02 -#define REQUEST_GET_DATA_RATES 0x03 - -#define SMARTCARD_SIZ_CONFIG_DESC 93 - -#define CCID_BULK_EPIN_SIZE CCID_BULK_EP_MAX_PACKET -#define CCID_BULK_EPOUT_SIZE CCID_BULK_EP_MAX_PACKET -#define CCID_INTR_EPIN_SIZE CCID_INTR_EP_MAX_PACKET -#define CCID_EP0_BUFF_SIZ 64 - -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern USBD_Class_cb_TypeDef USBD_CCID_cb; -/* Exported functions ------------------------------------------------------- */ - -#endif /* _USB_CCID_CORE_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_if.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_if.h deleted file mode 100644 index f4948e1..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/inc/usbd_ccid_if.h +++ /dev/null @@ -1,184 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_if.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the functions prototypes for USB CCID - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CCID_IF_H -#define __USBD_CCID_IF_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid_core.h" - -/* Exported defines ----------------------------------------------------------*/ -/* Bulk-only Command Block Wrapper */ -#define ABDATA_SIZE 261 -#define CCID_CMD_HEADER_SIZE 10 -#define CCID_RESPONSE_HEADER_SIZE 10 - - -#define CCID_INT_BUFF_SIZ 2 - -#define CARD_SLOT_FITTED 1 -#define CARD_SLOT_REMOVED 0 - -#define BULK_MAX_PACKET_SIZE 0x40 -#define CCID_IN_EP_SIZE 0x40 -#define INTR_MAX_PACKET_SIZE 8 -#define CCID_MESSAGE_HEADER_SIZE 10 -#define CCID_NUMBER_OF_SLOTS 1 - /* Number of SLOTS. For single card, this value is 1 */ - -/* Following Parameters used in PC_to_RDR_IccPowerOn */ -#define VOLTAGE_SELECTION_AUTOMATIC 0xFF -#define VOLTAGE_SELECTION_3V 0x02 -#define VOLTAGE_SELECTION_5V 0x01 -#define VOLTAGE_SELECTION_1V8 0x03 - -#define PC_TO_RDR_ICCPOWERON 0x62 -#define PC_TO_RDR_ICCPOWEROFF 0x63 -#define PC_TO_RDR_GETSLOTSTATUS 0x65 -#define PC_TO_RDR_XFRBLOCK 0x6F -#define PC_TO_RDR_GETPARAMETERS 0x6C -#define PC_TO_RDR_RESETPARAMETERS 0x6D -#define PC_TO_RDR_SETPARAMETERS 0x61 -#define PC_TO_RDR_ESCAPE 0x6B -#define PC_TO_RDR_ICCCLOCK 0x6E -#define PC_TO_RDR_T0APDU 0x6A -#define PC_TO_RDR_SECURE 0x69 -#define PC_TO_RDR_MECHANICAL 0x71 -#define PC_TO_RDR_ABORT 0x72 -#define PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY 0x73 - -#define RDR_TO_PC_DATABLOCK 0x80 -#define RDR_TO_PC_SLOTSTATUS 0x81 -#define RDR_TO_PC_PARAMETERS 0x82 -#define RDR_TO_PC_ESCAPE 0x83 -#define RDR_TO_PC_DATARATEANDCLOCKFREQUENCY 0x84 - -#define RDR_TO_PC_NOTIFYSLOTCHANGE 0x50 -#define RDR_TO_PC_HARDWAREERROR 0x51 - -#define OFFSET_INT_BMESSAGETYPE 0 -#define OFFSET_INT_BMSLOTICCSTATE 1 -#define SLOT_ICC_PRESENT 0x01 - /* LSb : (0b = no ICC present, 1b = ICC present) */ - -#define SLOT_ICC_CHANGE 0x02 /* MSb : (0b = no change, 1b = change) */ -/*****************************************************************************/ -/*********************** CCID Bulk Transfer State machine ********************/ -/*****************************************************************************/ -#define CCID_STATE_IDLE 0 /* Idle state */ -#define CCID_STATE_DATA_OUT 1 /* Data Out state */ -#define CCID_STATE_RECEIVE_DATA 2 -#define CCID_STATE_SEND_RESP 3 -#define CCID_STATE_DATAIN 4 -#define CCID_STATE_UNCORRECT_LENGTH 5 - -#define DIR_IN 0 -#define DIR_OUT 1 -#define BOTH_DIR 2 - -/* Exported types ------------------------------------------------------------*/ -#pragma pack(1) -typedef struct -{ - uint8_t bMessageType; /* Offset = 0*/ - uint32_t dwLength; /* Offset = 1, The length field (dwLength) is the length - of the message not including the 10-byte header.*/ - uint8_t bSlot; /* Offset = 5*/ - uint8_t bSeq; /* Offset = 6*/ - uint8_t bSpecific_0; /* Offset = 7*/ - uint8_t bSpecific_1; /* Offset = 8*/ - uint8_t bSpecific_2; /* Offset = 9*/ - uint8_t abData [ABDATA_SIZE]; /* Offset = 10, For reference, the absolute - maximum block size for a TPDU T=0 block is 260 bytes - (5 bytes command; 255 bytes data), - or for a TPDU T=1 block is 259 bytes, - or for a short APDU T=1 block is 261 bytes, - or for an extended APDU T=1 block is 65544 bytes.*/ -} Ccid_bulkout_data_t; -#pragma pack() - -#pragma pack(1) -typedef struct -{ - uint8_t bMessageType; /* Offset = 0*/ - uint32_t dwLength; /* Offset = 1*/ - uint8_t bSlot; /* Offset = 5, Same as Bulk-OUT message */ - uint8_t bSeq; /* Offset = 6, Same as Bulk-OUT message */ - uint8_t bStatus; /* Offset = 7, Slot status as defined in § 6.2.6*/ - uint8_t bError; /* Offset = 8, Slot error as defined in § 6.2.6*/ - uint8_t bSpecific; /* Offset = 9*/ - uint8_t abData[ABDATA_SIZE]; /* Offset = 10*/ - uint16_t u16SizeToSend; -} Ccid_bulkin_data_t; -#pragma pack() - -typedef struct -{ - __IO uint8_t SlotStatus; - __IO uint8_t SlotStatusChange; -} Ccid_SlotStatus_t; - - -typedef struct -{ - __IO uint8_t bAbortRequestFlag; - __IO uint8_t bSeq; - __IO uint8_t bSlot; -} usb_ccid_param_t; - -extern usb_ccid_param_t usb_ccid_param; -extern Ccid_bulkout_data_t Ccid_bulkout_data; /* Buffer for the Out Data */ -extern Ccid_bulkin_data_t Ccid_bulkin_data; /* Buffer for the IN Data */ -extern Ccid_SlotStatus_t Ccid_SlotStatus; -extern uint8_t UsbIntMessageBuffer[]; -extern uint8_t Ccid_BulkState; - -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void CCID_BulkMessage_In (USB_CORE_HANDLE *pdev, - uint8_t epnum); - -void CCID_BulkMessage_Out (USB_CORE_HANDLE *pdev, - uint8_t epnum); - -void CCID_ReceiveCmdHeader(uint8_t* pDst, uint8_t u8length); -void CCID_CmdDecode(USB_CORE_HANDLE *pdev); - -void CCID_IntMessage(USB_CORE_HANDLE *pdev); -void CCID_Init(USB_CORE_HANDLE *pdev); -void CCID_DeInit(USB_CORE_HANDLE *pdev); - -uint8_t CCID_IsIntrTransferComplete(void); -void CCID_SetIntrTransferStatus (uint8_t ); -void Transfer_Data_Request(uint8_t* dataPointer, uint16_t dataLen); -void Set_CSW (uint8_t CSW_Status, uint8_t Send_Permission); - -#endif /* __USBD_CCID_IF_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_cmd.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_cmd.c deleted file mode 100644 index 01df95c..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_cmd.c +++ /dev/null @@ -1,1091 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_cmd.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief CCID Commands handling - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid_cmd.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -#define CCID_UpdateCommandStatus(cmd_status,icc_status)\ - Ccid_bulkin_data.bStatus=(cmd_status|icc_status) - /* - The Above Macro can take any of following Values - #define BM_ICC_PRESENT_ACTIVE 0x00 - #define BM_ICC_PRESENT_INACTIVE 0x01 - #define BM_ICC_NO_ICC_PRESENT 0x02 - - #define BM_COMMAND_STATUS_OFFSET 0x06 - #define BM_COMMAND_STATUS_NO_ERROR 0x00 - #define BM_COMMAND_STATUS_FAILED (0x01 << BM_COMMAND_STATUS_OFFSET) - #define BM_COMMAND_STATUS_TIME_EXTN (0x02 << BM_COMMAND_STATUS_OFFSET) - */ - -/* Private variables ---------------------------------------------------------*/ -Ccid_bulkin_data_t Ccid_resp_buff; - -/* Private function prototypes -----------------------------------------------*/ -static uint8_t CCID_CheckCommandParams (uint32_t param_type); - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief PC_to_RDR_IccPowerOn - * PC_TO_RDR_ICCPOWERON message execution, apply voltage and get ATR - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_to_RDR_IccPowerOn(void) -{ - /* Apply the ICC VCC - Fills the Response buffer with ICC ATR - This Command is returned with RDR_to_PC_DataBlock(); - */ - - uint8_t voltage; - uint8_t sc_voltage = 0; - uint8_t index; - uint8_t error; - - Ccid_bulkin_data.dwLength = 0; /* Reset Number of Bytes in abData */ - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_DWLENGTH | \ - CHK_PARAM_abRFU2 |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_ABORT ); - if (error != 0) - { - return error; - } - - /* Voltage that is applied to the ICC - 00h – Automatic Voltage Selection - 01h – 5.0 volts - 02h – 3.0 volts - 03h – 1.8 volts - */ - /* Ccid_bulkout_data.bSpecific_0 Contains bPowerSelect */ - voltage = Ccid_bulkout_data.bSpecific_0; - if (voltage >= VOLTAGE_SELECTION_1V8) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - return SLOTERROR_BAD_POWERSELECT; /* The Voltage specified is out of Spec */ - } - - /* Correct Voltage Requested by the Host */ - if ((voltage == VOLTAGE_SELECTION_AUTOMATIC) || - (voltage == VOLTAGE_SELECTION_3V)) - { - /* voltage == 00 Voltage Automatic - voltage == 01 Voltage Automatic = 5.0V - voltage == 02 Voltage Automatic = 3V - voltage == 03 Voltage Automatic = 1.8V - */ - sc_voltage = SC_VOLTAGE_3V; - } - else if (voltage == VOLTAGE_SELECTION_5V) - { - sc_voltage = SC_VOLTAGE_5V; - } - - SC_AnswerToReset(sc_voltage); - - /* Check if the Card has come to Active State*/ - error = CCID_CheckCommandParams(CHK_ACTIVE_STATE); - if (error != 0) - { - /* Check if Voltage is not Automatic */ - if (voltage != 0) - { /* If Specific Voltage requested by Host i.e 3V or 5V*/ - return error; - } - else - {/* Automatic Voltage selection requested by Host */ - - if (sc_voltage != SC_VOLTAGE_5V) - { /* If voltage selected was Automatic and 5V is not yet tried */ - sc_voltage = SC_VOLTAGE_5V; - SC_AnswerToReset(sc_voltage); - - /* Check again the State */ - error = CCID_CheckCommandParams(CHK_ACTIVE_STATE); - if (error != 0) - return error; - - } - else - { /* Voltage requested from Host was 5V already*/ - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_INACTIVE); - return error; - } - } /* Voltage Selection was automatic */ - } /* If Active State */ - - /* ATR is received, No Error Condition Found */ - Ccid_bulkin_data.dwLength = SIZE_OF_ATR; - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); - - for (index=0; index < SIZE_OF_ATR ; index++) - {/* Copy the ATR to the Response Buffer */ - Ccid_bulkin_data.abData[index] = SC_ATR_Table[index]; - } - - return SLOT_NO_ERROR; -} - -/** - * @brief PC_to_RDR_IccPowerOff - * Icc VCC is switched Off - * @param None - * @retval uint8_t error: status of the command execution - */ -uint8_t PC_to_RDR_IccPowerOff(void) -{ - /* The response to this command message is the RDR_to_PC_SlotStatus - response message. */ - uint8_t error; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_abRFU3 |\ - CHK_PARAM_DWLENGTH ); - if (error != 0) - { - return error; - } - - /* Command is ok, Check for Card Presence */ - if (SC_Detect()) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR,BM_ICC_PRESENT_INACTIVE); - } - else - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR,BM_ICC_NO_ICC_PRESENT); - } - - /* Power OFF the card */ - SC_PowerCmd(DISABLE); - SC_SetState(SC_POWER_OFF); - - return SLOT_NO_ERROR; -} - -/** - * @brief PC_to_RDR_GetSlotStatus - * Provides the Slot status to the host - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_to_RDR_GetSlotStatus(void) -{ - uint8_t error; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_DWLENGTH |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_abRFU3 ); - if (error != 0) - { - return error; - } - - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR,BM_ICC_PRESENT_ACTIVE); - return SLOT_NO_ERROR; -} - - -/** - * @brief PC_to_RDR_XfrBlock - * Handles the Block transfer from Host. - * Response to this command message is the RDR_to_PC_DataBlock - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_to_RDR_XfrBlock(void) -{ - uint16_t expectedLength; - - uint8_t error; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_abRFU3 |\ - CHK_PARAM_ABORT |\ - CHK_ACTIVE_STATE ); - if (error != 0) - return error; - - if (Ccid_bulkout_data.dwLength > ABDATA_SIZE) - { /* Check amount of Data Sent by Host is > than memory allocated ? */ - - return SLOTERROR_BAD_DWLENGTH; - } - - - /* wLevelParameter = Size of expected data to be returned by the - bulk-IN endpoint */ - expectedLength = (Ccid_bulkout_data.bSpecific_2 << 8) | - Ccid_bulkout_data.bSpecific_1; - - Ccid_bulkin_data.dwLength = (uint16_t)expectedLength; - - - error = SC_XferBlock(&Ccid_bulkout_data.abData[0], - Ccid_bulkout_data.dwLength, - expectedLength); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - } - else - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); - error = SLOT_NO_ERROR; - } - - return error; -} - - -/** - * @brief PC_to_RDR_GetParameters - * Provides the ICC parameters to the host - * Response to this command message is the RDR_to_PC_Parameters - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_to_RDR_GetParameters(void) -{ - uint8_t error; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_DWLENGTH |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_abRFU3 ); - if (error != 0) - return error; - - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); - - return SLOT_NO_ERROR; -} - - -/** - * @brief PC_to_RDR_ResetParameters - * Set the ICC parameters to the default - * Response to this command message is the RDR_to_PC_Parameters - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_to_RDR_ResetParameters(void) -{ - uint8_t error; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_DWLENGTH |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_abRFU3 |\ - CHK_ACTIVE_STATE); - if (error != 0) - return error; - - /* This command resets the slot parameters to their default values */ - Ccid_bulkout_data.abData[0] = DEFAULT_FIDI; - Ccid_bulkout_data.abData[1] = DEFAULT_T01CONVCHECKSUM; - Ccid_bulkout_data.abData[2] = DEFAULT_EXTRA_GUARDTIME; - Ccid_bulkout_data.abData[3] = DEFAULT_WAITINGINTEGER; - Ccid_bulkout_data.abData[4] = DEFAULT_CLOCKSTOP; - Ccid_bulkout_data.abData[5] = 0x00; - Ccid_bulkout_data.abData[6] = 0x00; - - error = SC_SetParams((Protocol0_DataStructure_t*)(&(Ccid_bulkout_data.abData[0]))); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - } - else - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); - error = SLOT_NO_ERROR; - } - - return error; -} - - -/** - * @brief PC_to_RDR_SetParameters - * Set the ICC parameters to the host defined parameters - * Response to this command message is the RDR_to_PC_Parameters - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_to_RDR_SetParameters(void) -{ - uint8_t error; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_abRFU2 |\ - CHK_ACTIVE_STATE); - if (error != 0) - return error; - - error = SLOT_NO_ERROR; - - /* for Protocol T=0 (bProtocolNum=0) (dwLength=00000005h) */ - if ( (Ccid_bulkout_data.dwLength == 5) && - (Ccid_bulkout_data.bSpecific_0 != 0)) - error = SLOTERROR_BAD_PROTOCOLNUM; - - /* for Protocol T=1 (bProtocolNum=1) (dwLength=00000007h) */ - if ( (Ccid_bulkout_data.dwLength == 7) && - (Ccid_bulkout_data.bSpecific_0 != 1)) - error = SLOTERROR_CMD_NOT_SUPPORTED; - - /* For T0, Waiting Integer 0 supported */ - if (Ccid_bulkout_data.abData[3] != 0) - error = SLOTERROR_BAD_WAITINGINTEGER; - - if (Ccid_bulkout_data.abData[4] != DEFAULT_CLOCKSTOP) - error = SLOTERROR_BAD_CLOCKSTOP; - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - } - - error = SC_SetParams((Protocol0_DataStructure_t*)(&(Ccid_bulkout_data.abData[0]))); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - } - else - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); - error = SLOT_NO_ERROR; - } - - return error; -} - - -/** - * @brief PC_to_RDR_Escape - * Execute the Escape command. This is user specific Implementation - * Response to this command message is the RDR_to_PC_Escape - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_to_RDR_Escape(void) -{ - uint8_t error; - uint16_t size; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_abRFU3 |\ - CHK_PARAM_ABORT |\ - CHK_ACTIVE_STATE); - - if (error != 0) - return error; - - error = SC_ExecuteEscape(&Ccid_bulkout_data.abData[0], - Ccid_bulkout_data.dwLength, - &Ccid_bulkin_data.abData[0], - &size); - - Ccid_bulkin_data.dwLength = size; - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - } - else - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); - } - - return error; -} - - -/** - * @brief PC_to_RDR_IccClock - * Execute the Clock specific command from host - * Response to this command message is the RDR_to_PC_SlotStatus - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_to_RDR_IccClock(void) -{ - uint8_t error; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_abRFU2 |\ - CHK_PARAM_DWLENGTH|\ - CHK_ACTIVE_STATE); - if (error != 0) - return error; - - /* bClockCommand • 00h restarts Clock - • 01h Stops Clock in the state shown in the bClockStop - field of the PC_to_RDR_SetParameters command - and RDR_to_PC_Parameters message.*/ - if (Ccid_bulkout_data.bSpecific_0 > 1) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - return SLOTERROR_BAD_CLOCKCOMMAND; - } - - error = SC_SetClock(Ccid_bulkout_data.bSpecific_0); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - } - else - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); - } - - return error; -} - - -/** - * @brief PC_to_RDR_Abort - * Execute the Abort command from host, This stops all Bulk transfers - * from host and ICC - * Response to this command message is the RDR_to_PC_SlotStatus - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_to_RDR_Abort(void) -{ - uint8_t error; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_abRFU3 |\ - CHK_PARAM_DWLENGTH); - if (error != 0) - return error; - - CCID_CmdAbort (Ccid_bulkout_data.bSlot, Ccid_bulkout_data.bSeq); - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR,BM_ICC_PRESENT_ACTIVE); - return SLOT_NO_ERROR; -} - -/** - * @brief CCID_CmdAbort - * Execute the Abort command from Bulk EP or from Control EP, - * This stops all Bulk transfers from host and ICC - * @param uint8_t slot: slot number that host wants to abort - * @param uint8_t seq : Seq number for PC_to_RDR_Abort - * @retval uint8_t status of the command execution - */ -uint8_t CCID_CmdAbort(uint8_t slot, uint8_t seq) -{ - /* This function is called for REQUEST_ABORT & PC_to_RDR_Abort */ - - if (slot >= CCID_NUMBER_OF_SLOTS) - { /* This error condition is possible only from CLASS_REQUEST, otherwise - Slot is already checked in parameters from PC_to_RDR_Abort request */ - /* Slot requested is more than supported by Firmware */ - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_NO_ICC_PRESENT); - return SLOTERROR_BAD_SLOT; - } - - if ( usb_ccid_param.bAbortRequestFlag == 1) - { /* Abort Command was already received from ClassReq or PC_to_RDR */ - if (( usb_ccid_param.bSeq == seq) && (usb_ccid_param.bSlot == slot)) - { - /* CLASS Specific request is already Received, Reset the abort flag */ - usb_ccid_param.bAbortRequestFlag = 0; - } - } - else - { - /* Abort Command was NOT received from ClassReq or PC_to_RDR, - so save them for next ABORT command to verify */ - usb_ccid_param.bAbortRequestFlag = 1; - usb_ccid_param.bSeq = seq ; - usb_ccid_param.bSlot = slot; - } - - return 0; -} - -/** - * @brief PC_TO_RDR_T0Apdu - * Execute the PC_TO_RDR_T0APDU command from host - * Response to this command message is the RDR_to_PC_SlotStatus - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_TO_RDR_T0Apdu(void) -{ - uint8_t error; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_DWLENGTH | - CHK_PARAM_ABORT ); - if (error != 0) - return error; - - if (Ccid_bulkout_data.bSpecific_0 > 0x03) - {/* Bit 0 is associated with field bClassGetResponse - Bit 1 is associated with field bClassEnvelope - Other bits are RFU.*/ - - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - return SLOTERROR_BAD_BMCHANGES; - } - - error = SC_T0Apdu(Ccid_bulkout_data.bSpecific_0, - Ccid_bulkout_data.bSpecific_1, - Ccid_bulkout_data.bSpecific_2); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - } - else - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); - } - - return error; -} - -/** - * @brief PC_TO_RDR_Mechanical - * Execute the PC_TO_RDR_MECHANICAL command from host - * Response to this command message is the RDR_to_PC_SlotStatus - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_TO_RDR_Mechanical(void) -{ - uint8_t error; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_abRFU2 |\ - CHK_PARAM_DWLENGTH - ); - if (error != 0) - return error; - - if (Ccid_bulkout_data.bSpecific_0 > 0x05) - {/* 01h – Accept Card - 02h – Eject Card - 03h – Capture Card - 04h – Lock Card - 05h – Unlock Card*/ - - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - return SLOTERROR_BAD_BFUNCTION_MECHANICAL; - } - - error = SC_Mechanical(Ccid_bulkout_data.bSpecific_0); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - } - else - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); - } - - return error; -} - -/** - * @brief PC_TO_RDR_SetDataRateAndClockFrequency - * Set the required Card Frequency and Data rate from the host. - * Response to this command message is the - * RDR_to_PC_DataRateAndClockFrequency - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_TO_RDR_SetDataRateAndClockFrequency(void) -{ - uint8_t error; - uint32_t clockFrequency; - uint32_t dataRate; - uint32_t temp =0; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_abRFU3); - if (error != 0) - return error; - - if (Ccid_bulkout_data.dwLength != 0x08) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_ACTIVE); - return SLOTERROR_BAD_LENTGH; - } - - /* HERE we avoiding to an unaligned memory access*/ - temp = (Ccid_bulkout_data.abData[0]) & 0x000000FF; - clockFrequency = temp; - - temp= (Ccid_bulkout_data.abData[1]) & 0x000000FF; - clockFrequency |= temp << 8; - - temp= (Ccid_bulkout_data.abData[2]) & 0x000000FF; - clockFrequency |= temp << 16; - - temp= (Ccid_bulkout_data.abData[3]) & 0x000000FF; - clockFrequency |= temp << 24; - - temp = (Ccid_bulkout_data.abData[4]) & 0x000000FF; - dataRate = temp; - - temp= (Ccid_bulkout_data.abData[5]) & 0x000000FF; - dataRate |= temp << 8; - - temp= (Ccid_bulkout_data.abData[6]) & 0x000000FF; - dataRate |= temp << 16; - - temp= (Ccid_bulkout_data.abData[7]) & 0x000000FF; - dataRate |= temp << 24; - - error = SC_SetDataRateAndClockFrequency(clockFrequency, dataRate); - Ccid_bulkin_data.bError = error; - - if (error != SLOT_NO_ERROR) - { - Ccid_bulkin_data.dwLength = 0; - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - } - else - { - Ccid_bulkin_data.dwLength = 8; - - (Ccid_bulkin_data.abData[0]) = clockFrequency & 0x000000FF ; - - (Ccid_bulkin_data.abData[1]) = (clockFrequency & 0x0000FF00) >> 8; - - (Ccid_bulkin_data.abData[2]) = (clockFrequency & 0x00FF0000) >> 16; - - (Ccid_bulkin_data.abData[3]) = (clockFrequency & 0xFF000000) >> 24; - - (Ccid_bulkin_data.abData[4]) = dataRate & 0x000000FF ; - - (Ccid_bulkin_data.abData[5]) = (dataRate & 0x0000FF00) >> 8; - - (Ccid_bulkin_data.abData[6]) = (dataRate & 0x00FF0000) >> 16; - - (Ccid_bulkin_data.abData[7]) = (dataRate & 0xFF000000) >> 24; - - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); - } - - return error; -} - -/** - * @brief PC_TO_RDR_Secure - * Execute the Secure Command from the host. - * Response to this command message is the RDR_to_PC_DataBlock - * @param None - * @retval uint8_t status of the command execution - */ -uint8_t PC_TO_RDR_Secure(void) -{ - uint8_t error; - uint8_t bBWI; - uint16_t wLevelParameter; - uint32_t responseLen; - - Ccid_bulkin_data.dwLength =0; - - error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ - CHK_PARAM_CARD_PRESENT |\ - CHK_PARAM_ABORT ); - - if (error != 0) - return error; - - bBWI = Ccid_bulkout_data.bSpecific_0; - wLevelParameter = (Ccid_bulkout_data.bSpecific_1 + ((uint16_t)Ccid_bulkout_data.bSpecific_2<<8)); - - if ((EXCHANGE_LEVEL_FEATURE == TPDU_EXCHANGE) || - (EXCHANGE_LEVEL_FEATURE == SHORT_APDU_EXCHANGE)) - { - /* TPDU level & short APDU level, wLevelParameter is RFU, = 0000h */ - if (wLevelParameter != 0 ) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - error = SLOTERROR_BAD_LEVELPARAMETER; - return error; - } - } - - error = SC_Secure(Ccid_bulkout_data.dwLength, bBWI, wLevelParameter, - &Ccid_bulkout_data.abData[0], &responseLen); - - Ccid_bulkin_data.dwLength = responseLen; - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); - } - else - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); - } - - return error; -} - -/******************************************************************************/ -/* BULK IN ROUTINES */ -/******************************************************************************/ - -/** - * @brief RDR_to_PC_DataBlock - * Provide the data block response to the host - * Response for PC_to_RDR_IccPowerOn, PC_to_RDR_XfrBlock - * @param uint8_t errorCode: code to be returned to the host - * @retval None - */ -void RDR_to_PC_DataBlock(uint8_t errorCode) -{ - uint16_t length = CCID_RESPONSE_HEADER_SIZE; - - Ccid_bulkin_data.bMessageType = RDR_TO_PC_DATABLOCK; - Ccid_bulkin_data.bError = errorCode; - Ccid_bulkin_data.bSpecific=0; /* bChainParameter */ - - if(errorCode == SLOT_NO_ERROR) - { - length += Ccid_bulkin_data.dwLength; /* Length Specified in Command */ - } - - Transfer_Data_Request( (uint8_t*) (&Ccid_bulkin_data), length); - -} - - -/** - * @brief RDR_to_PC_SlotStatus - * Provide the Slot status response to the host - * Response for PC_to_RDR_IccPowerOff - * PC_to_RDR_GetSlotStatus - * PC_to_RDR_IccClock - * PC_to_RDR_T0APDU - * PC_to_RDR_Mechanical - * Also the device sends this response message when it has completed - * aborting a slot after receiving both the Class Specific ABORT request - * and PC_to_RDR_Abort command message. - * @param uint8_t errorCode: code to be returned to the host - * @retval None - */ -void RDR_to_PC_SlotStatus(uint8_t errorCode) -{ - - Ccid_bulkin_data.bMessageType = RDR_TO_PC_SLOTSTATUS; - Ccid_bulkin_data.dwLength =0; - Ccid_bulkin_data.bError = errorCode; - Ccid_bulkin_data.bSpecific=0; /* bClockStatus = 00h Clock running - 01h Clock stopped in state L - 02h Clock stopped in state H - 03h Clock stopped in an unknown state - All other values are RFU. */ - - Transfer_Data_Request( (uint8_t*) (&Ccid_bulkin_data), - LEN_RDR_TO_PC_SLOTSTATUS); - -} - -/** - * @brief RDR_to_PC_Parameters - * Provide the data block response to the host - * Response for PC_to_RDR_GetParameters, PC_to_RDR_ResetParameters - * PC_to_RDR_SetParameters - * @param uint8_t errorCode: code to be returned to the host - * @retval None - */ -void RDR_to_PC_Parameters(uint8_t errorCode) -{ - uint16_t length = CCID_RESPONSE_HEADER_SIZE; - - Ccid_bulkin_data.bMessageType = RDR_TO_PC_PARAMETERS; - Ccid_bulkin_data.bError = errorCode; - - if(errorCode == SLOT_NO_ERROR) - { - Ccid_bulkin_data.dwLength = LEN_PROTOCOL_STRUCT_T0; - length += LEN_PROTOCOL_STRUCT_T0; - } - else - { - Ccid_bulkin_data.dwLength = 0; - } - - Ccid_bulkin_data.abData[0] = Protocol0_DataStructure.bmFindexDindex ; - Ccid_bulkin_data.abData[1] = Protocol0_DataStructure.bmTCCKST0; - Ccid_bulkin_data.abData[2] = Protocol0_DataStructure.bGuardTimeT0; - Ccid_bulkin_data.abData[3] = Protocol0_DataStructure.bWaitingIntegerT0; - Ccid_bulkin_data.abData[4] = Protocol0_DataStructure.bClockStop; - - /* bProtocolNum */ - Ccid_bulkin_data.bSpecific = BPROTOCOL_NUM_T0; - - Transfer_Data_Request( (uint8_t*) (&Ccid_bulkin_data), length); -} - -/** - * @brief RDR_to_PC_Escape - * Provide the Escaped data block response to the host - * Response for PC_to_RDR_Escape - * @param uint8_t errorCode: code to be returned to the host - * @retval None - */ -void RDR_to_PC_Escape(uint8_t errorCode) -{ - uint16_t length = CCID_RESPONSE_HEADER_SIZE; - - Ccid_bulkin_data.bMessageType = RDR_TO_PC_ESCAPE; - - Ccid_bulkin_data.bSpecific=0; /* Reserved for Future Use */ - Ccid_bulkin_data.bError = errorCode; - - if(errorCode == SLOT_NO_ERROR) - { - length += Ccid_bulkin_data.dwLength; /* Length Specified in Command */ - } - - Transfer_Data_Request( (uint8_t*) (&Ccid_bulkin_data), length); -} - - - -/** - * @brief RDR_to_PC_DataRateAndClockFrequency - * Provide the Clock and Data Rate information to host - * Response for PC_TO_RDR_SetDataRateAndClockFrequency - * @param uint8_t errorCode: code to be returned to the host - * @retval None - */ -void RDR_to_PC_DataRateAndClockFrequency(uint8_t errorCode) -{ - uint16_t length = CCID_RESPONSE_HEADER_SIZE; - - Ccid_bulkin_data.bMessageType = RDR_TO_PC_DATARATEANDCLOCKFREQUENCY; - Ccid_bulkin_data.bError = errorCode; - Ccid_bulkin_data.bSpecific=0; /* Reserved for Future Use */ - - if(errorCode == SLOT_NO_ERROR) - { - length += Ccid_bulkin_data.dwLength; /* Length Specified in Command */ - } - - Transfer_Data_Request( (uint8_t*) (&Ccid_bulkin_data), length); -} - -/** - * @brief RDR_to_PC_NotifySlotChange - * Interrupt message to be sent to the host, Checks the card presence - * status and update the buffer accordingly - * @param None - * @retval None - */ -void RDR_to_PC_NotifySlotChange(void) -{ - UsbIntMessageBuffer[OFFSET_INT_BMESSAGETYPE] = RDR_TO_PC_NOTIFYSLOTCHANGE; - - if (SC_Detect() ) - { - /* - SLOT_ICC_PRESENT 0x01 : LSb : (0b = no ICC present, 1b = ICC present) - SLOT_ICC_CHANGE 0x02 : MSb : (0b = no change, 1b = change). - */ - UsbIntMessageBuffer[OFFSET_INT_BMSLOTICCSTATE] = SLOT_ICC_PRESENT | - SLOT_ICC_CHANGE; - } - else - { - UsbIntMessageBuffer[OFFSET_INT_BMSLOTICCSTATE] = SLOT_ICC_CHANGE; - - /* Power OFF the card */ - SC_PowerCmd(DISABLE); - SC_SetState(SC_POWER_OFF); - } -} - - -/** - * @brief CCID_UpdSlotStatus - * Updates the variable for the slot status - * @param uint8_t slotStatus : slot status from the calling function - * @retval None - */ -void CCID_UpdSlotStatus (uint8_t slotStatus) -{ - Ccid_SlotStatus.SlotStatus = slotStatus; -} - -/** - * @brief CCID_UpdSlotChange - * Updates the variable for the slot change status - * @param uint8_t changeStatus : slot change status from the calling function - * @retval None - */ -void CCID_UpdSlotChange (uint8_t changeStatus) -{ - Ccid_SlotStatus.SlotStatusChange = changeStatus; -} - -/** - * @brief CCID_IsSlotStatusChange - * Provides the value of the variable for the slot change status - * @param None - * @retval uint8_t slot change status - */ -uint8_t CCID_IsSlotStatusChange (void) -{ - return Ccid_SlotStatus.SlotStatusChange; -} - -/** - * @brief CCID_CheckCommandParams - * Checks the specific parameters requested by the function and update - * status accordingly. This function is called from all - * PC_to_RDR functions - * @param uint32_t param_type : Parameter enum to be checked by calling function - * @retval uint8_t status - */ -static uint8_t CCID_CheckCommandParams (uint32_t param_type) -{ - uint32_t parameter; - - Ccid_bulkin_data.bStatus = BM_ICC_PRESENT_ACTIVE | BM_COMMAND_STATUS_NO_ERROR ; - - parameter = (uint32_t)param_type; - - if (parameter & CHK_PARAM_SLOT) - { - /* - The slot number (bSlot) identifies which ICC slot is being addressed - by the message, if the CCID supports multiple slots. - The slot number is zero-relative, and is in the range of zero to FFh. - */ - - /* SLOT Number is 0 onwards, so always < CCID_NUMBER_OF_SLOTs */ - /* Error Condition !!! */ - if (Ccid_bulkout_data.bSlot >= CCID_NUMBER_OF_SLOTS) - { /* Slot requested is more than supported by Firmware */ - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_NO_ICC_PRESENT); - return SLOTERROR_BAD_SLOT; - } - } - - if (parameter & CHK_PARAM_CARD_PRESENT) - { - /* Commands Parameters ok, Check the Card Status */ - if (SC_Detect() == 0) - { /* Card is Not detected */ - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_NO_ICC_PRESENT); - return SLOTERROR_ICC_MUTE; - } - } - - /* Check that DwLength is 0 */ - if (parameter & CHK_PARAM_DWLENGTH) - { - if (Ccid_bulkout_data.dwLength != 0) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_ACTIVE); - return SLOTERROR_BAD_LENTGH; - } - } - - /* abRFU 2 : Reserved for Future Use*/ - if (parameter & CHK_PARAM_abRFU2) - { - - if ((Ccid_bulkout_data.bSpecific_1 != 0) || - (Ccid_bulkout_data.bSpecific_2 != 0)) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_ACTIVE); - return SLOTERROR_BAD_ABRFU_2B; /* bSpecific_1 */ - } - } - - if (parameter & CHK_PARAM_abRFU3) - { - /* abRFU 3 : Reserved for Future Use*/ - if ((Ccid_bulkout_data.bSpecific_0 != 0) || - (Ccid_bulkout_data.bSpecific_1 != 0) || - (Ccid_bulkout_data.bSpecific_2 != 0)) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_ACTIVE); - return SLOTERROR_BAD_ABRFU_3B; - } - } - - - if (parameter & CHK_PARAM_ABORT) - { - if( usb_ccid_param.bAbortRequestFlag ) - { - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_INACTIVE); - return SLOTERROR_CMD_ABORTED; - } - } - - if (parameter & CHK_ACTIVE_STATE) - { - /* Commands Parameters ok, Check the Card Status */ - /* Card is detected */ - if (SC_GetState() != SC_ACTIVE_ON_T0) - { - /* Check that from Lower Layers, the SmartCard come to known state */ - CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_INACTIVE); - return SLOTERROR_HW_ERROR; - } - } - - return 0; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_core.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_core.c deleted file mode 100644 index 45404b9..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_core.c +++ /dev/null @@ -1,455 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_core.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the CCID core functions. - * - * @verbatim - * - * =================================================================== - * CCID Class Description - * =================================================================== - * This module manages the Specification for Integrated Circuit(s) - * Cards Interface Revision 1.1 - * This driver implements the following aspects of the specification: - * - Bulk Transfers - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid_core.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static uint8_t USBD_CCID_Init (void *pdev, - uint8_t cfgidx); - -static uint8_t USBD_CCID_DeInit (void *pdev, - uint8_t cfgidx); - -static uint8_t USBD_CCID_Setup (void *pdev, - USB_SETUP_REQ *req); - -static uint8_t USBD_CCID_DataIn (void *pdev, - uint8_t epnum); - - -static uint8_t USBD_CCID_DataOut (void *pdev, - uint8_t epnum); - -static uint8_t *USBD_CCID_GetCfgDesc (uint8_t speed, - uint16_t *length); - -static uint8_t USBD_CCID_EP0_Buff[CCID_EP0_BUFF_SIZ] ; - -USBD_Class_cb_TypeDef USBD_CCID_cb = -{ - USBD_CCID_Init, - USBD_CCID_DeInit, - USBD_CCID_Setup, - NULL, /*EP0_TxSent*/ - NULL, /*EP0_RxReady*/ - USBD_CCID_DataIn, - USBD_CCID_DataOut, - NULL, /*SOF */ - USBD_CCID_GetCfgDesc, -}; - -/* USB Mass storage device Configuration Descriptor */ -/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ -const uint8_t USBD_CCID_CfgDesc[SMARTCARD_SIZ_CONFIG_DESC] = -{ - - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - SMARTCARD_SIZ_CONFIG_DESC, - - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: */ - 0x04, /* iConfiguration: */ - 0x80, /*bmAttributes: bus powered */ - 0x32, /* MaxPower 100 mA */ - - /******************** CCID **** interface ********************/ - 0x09, /* bLength: Interface Descriptor size */ - 0x04, /* bDescriptorType: */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x03, /* bNumEndpoints: 3 endpoints used */ - 0x0B, /* bInterfaceClass: user's interface for CCID */ - 0x00, /* bInterfaceSubClass : */ - 0x00, /* nInterfaceProtocol : None */ - 0x05, /* iInterface: */ - - /******************* CCID class descriptor ********************/ - 0x36, /* bLength: CCID Descriptor size */ - 0x21, /* bDescriptorType: Functional Descriptor type. */ - 0x10, /* bcdCCID(LSB): CCID Class Spec release number (1.00) */ - 0x01, /* bcdCCID(MSB) */ - - 0x00, /* bMaxSlotIndex :highest available slot on this device */ - 0x03, /* bVoltageSupport: bit Wise OR for 01h-5.0V 02h-3.0V - 04h 1.8V*/ - - 0x01,0x00,0x00,0x00, /* dwProtocols: 0001h = Protocol T=0 */ - 0x10,0x0E,0x00,0x00, /* dwDefaultClock: 3.6Mhz = 3600kHz = 0x0E10, - for 4 Mhz the value is (0x00000FA0) : - This is used in ETU and waiting time calculations*/ - 0x10,0x0E,0x00,0x00, /* dwMaximumClock: Maximum supported ICC clock frequency - in KHz. So, 3.6Mhz = 3600kHz = 0x0E10, - 4 Mhz (0x00000FA0) : */ - 0x00, /* bNumClockSupported : no setting from PC - If the value is 00h, the - supported clock frequencies are assumed to be the - default clock frequency defined by dwDefaultClock - and the maximum clock frequency defined by - dwMaximumClock */ - - 0xCD,0x25,0x00,0x00, /* dwDataRate: Default ICC I/O data rate in bps - 9677 bps = 0x25CD - for example 10752 bps (0x00002A00) */ - - 0xCD,0x25,0x00,0x00, /* dwMaxDataRate: Maximum supported ICC I/O data - rate in bps */ - 0x00, /* bNumDataRatesSupported : - The number of data rates that are supported by the CCID - If the value is 00h, all data rates between the default - data rate dwDataRate and the maximum data rate - dwMaxDataRate are supported. - Dont support GET_CLOCK_FREQUENCIES - */ - - 0x00,0x00,0x00,0x00, /* dwMaxIFSD: 0 (T=0 only) */ - 0x00,0x00,0x00,0x00, /* dwSynchProtocols */ - 0x00,0x00,0x00,0x00, /* dwMechanical: no special characteristics */ - - 0x38,0x00,EXCHANGE_LEVEL_FEATURE,0x00, - /* dwFeatures: clk, baud rate, voltage : automatic */ - /* 00000008h Automatic ICC voltage selection - 00000010h Automatic ICC clock frequency change - 00000020h Automatic baud rate change according to - active parameters provided by the Host or self - determined 00000100h CCID can set - ICC in clock stop mode - - Only one of the following values may be present to - select a level of exchange: - 00010000h TPDU level exchanges with CCID - 00020000h Short APDU level exchange with CCID - 00040000h Short and Extended APDU level exchange - If none of those values : character level of exchange*/ - 0x0F,0x01,0x00,0x00, /* dwMaxCCIDMessageLength: Maximum block size + header*/ - /* 261 + 10 */ - - 0x00, /* bClassGetResponse*/ - 0x00, /* bClassEnvelope */ - 0x00,0x00, /* wLcdLayout : 0000h no LCD. */ - 0x00, /* bPINSupport : no PIN verif and modif */ - 0x01, /* bMaxCCIDBusySlots */ - - /******************** CCID Endpoints ********************/ - 0x07, /*Endpoint descriptor length = 7*/ - 0x05, /*Endpoint descriptor type */ - CCID_BULK_IN_EP, /*Endpoint address (IN, address 1) */ - 0x02, /*Bulk endpoint type */ - LOBYTE(CCID_BULK_EPIN_SIZE), - HIBYTE(CCID_BULK_EPIN_SIZE), - 0x00, /*Polling interval in milliseconds */ - - 0x07, /*Endpoint descriptor length = 7 */ - 0x05, /*Endpoint descriptor type */ - CCID_BULK_OUT_EP, /*Endpoint address (OUT, address 1) */ - 0x02, /*Bulk endpoint type */ - LOBYTE(CCID_BULK_EPOUT_SIZE), - HIBYTE(CCID_BULK_EPOUT_SIZE), - 0x00, /*Polling interval in milliseconds*/ - - - 0x07, /*bLength: Endpoint Descriptor size*/ - 0x05, /*bDescriptorType:*/ - CCID_INTR_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/ - 0x03, /* bmAttributes: Interrupt endpoint */ - LOBYTE(CCID_INTR_EPIN_SIZE), - HIBYTE(CCID_INTR_EPIN_SIZE), - 0x18 /*Polling interval in milliseconds */ -}; - -/* Private function ----------------------------------------------------------*/ - -/** - * @brief USBD_CCID_Init - * Initialize the USB CCID Interface - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status - */ -static uint8_t USBD_CCID_Init (void *pdev, - uint8_t cfgidx) -{ - - DCD_PMA_Config(pdev , CCID_BULK_IN_EP,USB_SNG_BUF,CCID_BULK_TX_ADDRESS); - DCD_PMA_Config(pdev , CCID_INTR_IN_EP,USB_SNG_BUF,CCID_INT_TX_ADDRESS); - DCD_PMA_Config(pdev , CCID_BULK_OUT_EP,USB_SNG_BUF,CCID_BULK_RX_ADDRESS); - - - /* Open EP IN */ - DCD_EP_Open(pdev, - CCID_BULK_IN_EP, - CCID_BULK_EPIN_SIZE, - USB_EP_BULK); - - /* Open EP OUT */ - DCD_EP_Open(pdev, - CCID_BULK_OUT_EP, - CCID_BULK_EPOUT_SIZE, - USB_EP_BULK); - - /* Open INTR EP IN */ - DCD_EP_Open(pdev, - CCID_INTR_IN_EP, - CCID_INTR_EPIN_SIZE, - USB_EP_INT); - - /* Init the CCID layer */ - CCID_Init(pdev); - - return USBD_OK; -} - -/** - * @brief USBD_CCID_DeInit - * DeInitilaize the usb ccid configuration - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status - */ -static uint8_t USBD_CCID_DeInit (void *pdev, - uint8_t cfgidx) -{ - /* Close CCID EPs */ - DCD_EP_Close (pdev , CCID_BULK_IN_EP); - DCD_EP_Close (pdev , CCID_BULK_OUT_EP); - DCD_EP_Close (pdev , CCID_INTR_IN_EP); - - /* Un Init the CCID layer */ - CCID_DeInit(pdev); - return USBD_OK; -} - -/** - * @brief USBD_CCID_Setup - * Handle the CCID specific requests - * @param pdev: device instance - * @param req: USB request - * @retval status - */ -static uint8_t USBD_CCID_Setup (void *pdev, USB_SETUP_REQ *req) -{ - uint8_t slot_nb; - uint8_t seq_nb; - uint16_t len; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - /* Class request */ - case USB_REQ_TYPE_CLASS : - switch (req->bRequest) - { - case REQUEST_ABORT : - - if ((req->wLength == 0) && - ((req->bmRequest & 0x80) != 0x80)) - { /* Check bmRequest : No Data-In stage. 0x80 is Data Direction */ - - /* The wValue field contains the slot number (bSlot) in the low byte - and the sequence number (bSeq) in the high byte.*/ - slot_nb = (uint8_t) ((req->wValue) & 0x00ff); - seq_nb = (uint8_t) (((req->wValue) & 0xff00)>>8); - - if ( CCID_CmdAbort(slot_nb, seq_nb) != 0 ) - { /* If error is returned by lower layer : - Generally Slot# may not have matched */ - USBD_CtlError(pdev , req); - return USBD_FAIL; - } - } - else - { - USBD_CtlError(pdev , req); - return USBD_FAIL; - } - break; - - case REQUEST_GET_CLOCK_FREQUENCIES : - if((req->wValue == 0) && - (req->wLength != 0) && - ((req->bmRequest & 0x80) == 0x80)) - { /* Check bmRequest : Data-In stage. 0x80 is Data Direction */ - - if ( SC_Request_GetClockFrequencies(USBD_CCID_EP0_Buff, &len) != 0 ) - { /* If error is returned by lower layer */ - USBD_CtlError(pdev , req); - return USBD_FAIL; - } - else - { - if (len > CCID_EP0_BUFF_SIZ) - { - len = CCID_EP0_BUFF_SIZ; - } - - USBD_CtlSendData (pdev, - USBD_CCID_EP0_Buff, - len); - } - } - else - { - USBD_CtlError(pdev , req); - return USBD_FAIL; - } - break; - - case REQUEST_GET_DATA_RATES : - if((req->wValue == 0) && - (req->wLength != 0) && - ((req->bmRequest & 0x80) == 0x80)) - { /* Check bmRequest : Data-In stage. 0x80 is Data Direction */ - - if ( SC_Request_GetDataRates(USBD_CCID_EP0_Buff, &len) != 0 ) - { /* If error is returned by lower layer */ - USBD_CtlError(pdev , req); - return USBD_FAIL; - } - else - { - if (len > CCID_EP0_BUFF_SIZ) - { - len = CCID_EP0_BUFF_SIZ; - } - - USBD_CtlSendData (pdev, - USBD_CCID_EP0_Buff, - len); - } - } - else - { - USBD_CtlError(pdev , req); - return USBD_FAIL; - } - break; - - default: - USBD_CtlError(pdev , req); - return USBD_FAIL; - } - break; - /* Interface & Endpoint request */ - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_INTERFACE : - break; - - case USB_REQ_SET_INTERFACE : - break; - - case USB_REQ_CLEAR_FEATURE: - - /* Re-activate the EP */ - DCD_EP_Close (pdev , (uint8_t)req->wIndex); - if((((uint8_t)req->wIndex) & 0x80) == 0x80) - { - DCD_EP_Open(pdev, - ((uint8_t)req->wIndex), - CCID_BULK_EPIN_SIZE, - USB_EP_BULK); - } - else - { - DCD_EP_Open(pdev, - ((uint8_t)req->wIndex), - CCID_BULK_EPOUT_SIZE, - USB_EP_BULK); - } - - break; - - } - break; - - default: - break; - } - return USBD_OK; -} - -/** - * @brief USBD_CCID_DataIn - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_CCID_DataIn (void *pdev, - uint8_t epnum) -{ - CCID_BulkMessage_In(pdev , epnum); - return USBD_OK; -} - -/** - * @brief USBD_CCID_DataOut - * handle data OUT Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_CCID_DataOut (void *pdev, - uint8_t epnum) -{ - CCID_BulkMessage_Out(pdev , epnum); - return USBD_OK; -} - -/** - * @brief USBD_CCID_GetCfgDesc - * return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CCID_GetCfgDesc (uint8_t speed, uint16_t *length) -{ - *length = sizeof (USBD_CCID_CfgDesc); - return (uint8_t*)USBD_CCID_CfgDesc; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_if.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_if.c deleted file mode 100644 index 2efa317..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/ccid/src/usbd_ccid_if.c +++ /dev/null @@ -1,428 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_if.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the functions for USB Interface for CCID - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid_if.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -uint8_t Ccid_BulkState; -uint8_t UsbIntMessageBuffer[INTR_MAX_PACKET_SIZE]; /* data buffer*/ -__IO uint8_t PrevXferComplete_IntrIn; -usb_ccid_param_t usb_ccid_param; - -uint8_t* pUsbMessageBuffer; -static uint32_t UsbMessageLength; -Ccid_bulkin_data_t pCcid_resp_buff; -Ccid_SlotStatus_t Ccid_SlotStatus; - - -uint8_t BulkOut_Data_Buff[BULK_MAX_PACKET_SIZE] ; - -Ccid_bulkin_data_t Ccid_bulkin_data ; - -Ccid_bulkout_data_t Ccid_bulkout_data ; - -uint8_t UsbIntMessageBuffer[INTR_MAX_PACKET_SIZE] ; - -/* Private function prototypes -----------------------------------------------*/ -static void CCID_Response_SendData (USB_CORE_HANDLE *pdev, - uint8_t* pbuf, - uint16_t len); -/* Private function ----------------------------------------------------------*/ -/** - * @brief CCID_Init - * Initialize the CCID USB Layer - * @param pdev: device instance - * @retval None - */ -void CCID_Init (USB_CORE_HANDLE *pdev) -{ - /* CCID Related Initialization */ - CCID_SetIntrTransferStatus(1); /* Transfer Complete Status */ - CCID_UpdSlotChange(1); - SC_InitParams(); - - /* Prepare EP to Receive First Cmd */ - DCD_EP_PrepareRx (pdev, - CCID_BULK_OUT_EP, - (uint8_t *)&BulkOut_Data_Buff[0], - CCID_BULK_EPOUT_SIZE); -} - -/** - * @brief CCID_DeInit - * Uninitialize the CCID Machine - * @param pdev: device instance - * @retval None - */ -void CCID_DeInit (USB_CORE_HANDLE *pdev) -{ - Ccid_BulkState = CCID_STATE_IDLE; -} - -/** - * @brief CCID_Message_In - * Handle Bulk IN & Intr IN data stage - * @param pdev: device instance - * @param uint8_t epnum: endpoint index - * @retval None - */ -void CCID_BulkMessage_In (USB_CORE_HANDLE *pdev, - uint8_t epnum) -{ - if (epnum == (CCID_BULK_IN_EP & 0x7F)) - {/* Filter the epnum by masking with 0x7f (mask of IN Direction) */ - - /*************** Handle Bulk Transfer IN data completion *****************/ - - /* Toggle LED1 */ - STM_EVAL_LEDToggle(LED1); - - switch (Ccid_BulkState) - { - case CCID_STATE_SEND_RESP: - - Ccid_BulkState = CCID_STATE_IDLE; - - /* Prepare EP to Receive First Cmd */ - DCD_EP_PrepareRx (pdev, - CCID_BULK_OUT_EP, - (uint8_t *)&BulkOut_Data_Buff[0], - CCID_BULK_EPOUT_SIZE); - - break; - - default: - break; - } - } - else if (epnum == (CCID_INTR_IN_EP & 0x7F)) - { - /* Filter the epnum by masking with 0x7f (mask of IN Direction) */ - CCID_SetIntrTransferStatus(1); /* Transfer Complete Status */ - } -} - -/** - * @brief CCID_BulkMessage_Out - * Proccess CCID OUT data - * @param pdev: device instance - * @param uint8_t epnum: endpoint index - * @retval None - */ -void CCID_BulkMessage_Out (USB_CORE_HANDLE *pdev, - uint8_t epnum) -{ - uint16_t dataLen; - dataLen = USBD_GetRxCount (pdev, CCID_BULK_OUT_EP); - - switch (Ccid_BulkState) - { - case CCID_STATE_IDLE: - if (dataLen == 0x00) - { /* Zero Length Packet Received */ - Ccid_BulkState = CCID_STATE_IDLE; - } - else if (dataLen >= CCID_MESSAGE_HEADER_SIZE) - { - UsbMessageLength = dataLen; /* Store for future use */ - - /* Expected Data Length Packet Received */ - pUsbMessageBuffer = (uint8_t*) &Ccid_bulkout_data; - - /* Fill CCID_BulkOut Data Buffer from USB Buffer */ - CCID_ReceiveCmdHeader(pUsbMessageBuffer, dataLen); - - /* - Refer : 6 CCID Messages - The response messages always contain the exact same slot number, - and sequence number fields from the header that was contained in - the Bulk-OUT command message. - */ - Ccid_bulkin_data.bSlot = Ccid_bulkout_data.bSlot; - Ccid_bulkin_data.bSeq = Ccid_bulkout_data.bSeq; - - if (dataLen < CCID_BULK_EPOUT_SIZE) - {/* Short message, less than the EP Out Size, execute the command, - if parameter like dwLength is too big, the appropriate command will - give an error */ - CCID_CmdDecode(pdev); - } - else - { /* Long message, receive additional data with command */ - /* (u8dataLen == CCID_BULK_EPOUT_SIZE) */ - - if (Ccid_bulkout_data.dwLength > ABDATA_SIZE) - { /* Check if length of data to be sent by host is > buffer size */ - - /* Too long data received.... Error ! */ - Ccid_BulkState = CCID_STATE_UNCORRECT_LENGTH; - } - - else - { /* Expect more data on OUT EP */ - Ccid_BulkState = CCID_STATE_RECEIVE_DATA; - pUsbMessageBuffer += dataLen; /* Point to new offset */ - - /* Prepare EP to Receive next Cmd */ - DCD_EP_PrepareRx (pdev, - CCID_BULK_OUT_EP, - (uint8_t *)&BulkOut_Data_Buff[0], - CCID_BULK_EPOUT_SIZE); - - } /* if (dataLen == CCID_BULK_EPOUT_SIZE) ends */ - } /* if (dataLen >= CCID_BULK_EPOUT_SIZE) ends */ - } /* if (dataLen >= CCID_MESSAGE_HEADER_SIZE) ends */ - break; - - case CCID_STATE_RECEIVE_DATA: - - UsbMessageLength += dataLen; - - if (dataLen < CCID_BULK_EPOUT_SIZE) - {/* Short message, less than the EP Out Size, execute the command, - if parameter like dwLength is too big, the appropriate command will - give an error */ - - /* Full command is received, process the Command */ - CCID_ReceiveCmdHeader(pUsbMessageBuffer, dataLen); - CCID_CmdDecode(pdev); - } - else if (dataLen == CCID_BULK_EPOUT_SIZE) - { - if (UsbMessageLength < (Ccid_bulkout_data.dwLength + CCID_CMD_HEADER_SIZE)) - { - CCID_ReceiveCmdHeader(pUsbMessageBuffer, dataLen); /* Copy data */ - pUsbMessageBuffer += dataLen; - /* Increment the pointer to receive more data */ - - /* Prepare EP to Receive next Cmd */ - DCD_EP_PrepareRx (pdev, - CCID_BULK_OUT_EP, - (uint8_t *)&BulkOut_Data_Buff[0], - CCID_BULK_EPOUT_SIZE); - } - else if (UsbMessageLength == (Ccid_bulkout_data.dwLength + CCID_CMD_HEADER_SIZE)) - { - /* Full command is received, process the Command */ - CCID_ReceiveCmdHeader(pUsbMessageBuffer, dataLen); - CCID_CmdDecode(pdev); - } - else - { - /* Too long data received.... Error ! */ - Ccid_BulkState = CCID_STATE_UNCORRECT_LENGTH; - } - } - - break; - - case CCID_STATE_UNCORRECT_LENGTH: - Ccid_BulkState = CCID_STATE_IDLE; - break; - - default: - break; - } -} - -/** - * @brief CCID_CmdDecode - * Parse the commands and Proccess command - * @param pdev: device instance - * @retval None - */ -void CCID_CmdDecode(USB_CORE_HANDLE *pdev) -{ - uint8_t errorCode; - - switch (Ccid_bulkout_data.bMessageType) - { - case PC_TO_RDR_ICCPOWERON: - errorCode = PC_to_RDR_IccPowerOn(); - RDR_to_PC_DataBlock(errorCode); - break; - case PC_TO_RDR_ICCPOWEROFF: - errorCode = PC_to_RDR_IccPowerOff(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_GETSLOTSTATUS: - errorCode = PC_to_RDR_GetSlotStatus(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_XFRBLOCK: - errorCode = PC_to_RDR_XfrBlock(); - RDR_to_PC_DataBlock(errorCode); - break; - case PC_TO_RDR_GETPARAMETERS: - errorCode = PC_to_RDR_GetParameters(); - RDR_to_PC_Parameters(errorCode); - break; - case PC_TO_RDR_RESETPARAMETERS: - errorCode = PC_to_RDR_ResetParameters(); - RDR_to_PC_Parameters(errorCode); - break; - case PC_TO_RDR_SETPARAMETERS: - errorCode = PC_to_RDR_SetParameters(); - RDR_to_PC_Parameters(errorCode); - break; - case PC_TO_RDR_ESCAPE: - errorCode = PC_to_RDR_Escape(); - RDR_to_PC_Escape(errorCode); - break; - case PC_TO_RDR_ICCCLOCK: - errorCode = PC_to_RDR_IccClock(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_ABORT: - errorCode = PC_to_RDR_Abort(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_T0APDU: - errorCode = PC_TO_RDR_T0Apdu(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_MECHANICAL: - errorCode = PC_TO_RDR_Mechanical(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY: - errorCode = PC_TO_RDR_SetDataRateAndClockFrequency(); - RDR_to_PC_DataRateAndClockFrequency(errorCode); - break; - case PC_TO_RDR_SECURE: - errorCode = PC_TO_RDR_Secure(); - RDR_to_PC_DataBlock(errorCode); - break; - default: - RDR_to_PC_SlotStatus(SLOTERROR_CMD_NOT_SUPPORTED); - break; - } - - /********** Decide for all commands ***************/ - if (Ccid_BulkState == CCID_STATE_SEND_RESP) - { - CCID_Response_SendData(pdev, (uint8_t*)&Ccid_bulkin_data, - Ccid_bulkin_data.u16SizeToSend); - } -} - -/** - * @brief Transfer_Data_Request - * Prepare the request response to be sent to the host - * @param uint8_t* dataPointer: Pointer to the data buffer to send - * @param uint16_t dataLen : number of bytes to send - * @retval None - */ -void Transfer_Data_Request(uint8_t* dataPointer, uint16_t dataLen) -{ - /********** Update Global Variables ***************/ - Ccid_bulkin_data.u16SizeToSend = dataLen; - Ccid_BulkState = CCID_STATE_SEND_RESP; -} - - -/** - * @brief CCID_Response_SendData - * Send the data on bulk-in EP - * @param pdev: device instance - * @param uint8_t* buf: pointer to data buffer - * @param uint16_t len: Data Length - * @retval None - */ -static void CCID_Response_SendData(USB_CORE_HANDLE *pdev, - uint8_t* buf, - uint16_t len) -{ - DCD_EP_Tx (pdev, CCID_BULK_IN_EP, buf, len); -} - -/** - * @brief CCID_IntMessage - * Send the Interrupt-IN data to the host - * @param pdev: device instance - * @retval None - */ -void CCID_IntMessage(USB_CORE_HANDLE *pdev) -{ - /* Check if there us change in Smartcard Slot status */ - if ( CCID_IsSlotStatusChange() && CCID_IsIntrTransferComplete() ) - { - /* Check Slot Status is changed. Card is Removed/ Fitted */ - RDR_to_PC_NotifySlotChange(); - - CCID_SetIntrTransferStatus(0); /* Reset the Status */ - CCID_UpdSlotChange(0); /* Reset the Status of Slot Change */ - - DCD_EP_Tx (pdev, CCID_INTR_IN_EP, UsbIntMessageBuffer, 2); - } -} - -/** - * @brief CCID_ReceiveCmdHeader - * Receive the Data from USB BulkOut Buffer to Pointer - * @param uint8_t* pDst: destination address to copy the buffer - * @param uint8_t u8length: length of data to copy - * @retval None - */ -void CCID_ReceiveCmdHeader(uint8_t* pDst, uint8_t u8length) -{ - uint32_t Counter; - - for (Counter = 0; Counter < u8length; Counter++) - { - *pDst++ = BulkOut_Data_Buff[Counter]; - } - -} - -/** - * @brief CCID_IsIntrTransferComplete - * Provides the status of previous Interrupt transfer status - * @param None - * @retval uint8_t PrevXferComplete_IntrIn: Value of the previous transfer status - */ -uint8_t CCID_IsIntrTransferComplete (void) -{ - return PrevXferComplete_IntrIn; -} - -/** - * @brief CCID_IsIntrTransferComplete - * Set the value of the Interrupt transfer status - * @param uint8_t xfer_Status: Value of the Interrupt transfer status to set - * @retval None - */ -void CCID_SetIntrTransferStatus (uint8_t xfer_Status) -{ - PrevXferComplete_IntrIn = xfer_Status; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h deleted file mode 100644 index c71b0a3..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h +++ /dev/null @@ -1,95 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_core.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header file for the usbd_cdc_core.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CDC_CORE_H_ -#define __USB_CDC_CORE_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_desc.h" - -/* Exported defines ----------------------------------------------------------*/ - -#define USB_CDC_CONFIG_DESC_SIZ (67) -#define USB_CDC_DESC_SIZ (67-9) - -#define CDC_DESCRIPTOR_TYPE 0x21 - -#define DEVICE_CLASS_CDC 0x02 -#define DEVICE_SUBCLASS_CDC 0x00 - - -#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 -#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 -#define USB_STRING_DESCRIPTOR_TYPE 0x03 -#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 -#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 - -#define STANDARD_ENDPOINT_DESC_SIZE 0x09 - -#define CDC_DATA_IN_PACKET_SIZE CDC_DATA_MAX_PACKET_SIZE - -#define CDC_DATA_OUT_PACKET_SIZE CDC_DATA_MAX_PACKET_SIZE - -/*---------------------------------------------------------------------*/ -/* CDC definitions */ -/*---------------------------------------------------------------------*/ - -/**************************************************/ -/* CDC Requests */ -/**************************************************/ -#define SEND_ENCAPSULATED_COMMAND 0x00 -#define GET_ENCAPSULATED_RESPONSE 0x01 -#define SET_COMM_FEATURE 0x02 -#define GET_COMM_FEATURE 0x03 -#define CLEAR_COMM_FEATURE 0x04 -#define SET_LINE_CODING 0x20 -#define GET_LINE_CODING 0x21 -#define SET_CONTROL_LINE_STATE 0x22 -#define SEND_BREAK 0x23 -#define NO_CMD 0xFF - -/* Exported types ------------------------------------------------------------*/ -typedef struct _CDC_IF_PROP -{ - uint16_t (*pIf_Init) (void); - uint16_t (*pIf_DeInit) (void); - uint16_t (*pIf_Ctrl) (uint32_t Cmd, uint8_t* Buf, uint32_t Len); - uint16_t (*pIf_DataTx) (uint8_t* Buf, uint32_t Len); - uint16_t (*pIf_DataRx) (uint8_t* Buf, uint32_t Len); -} -CDC_IF_Prop_TypeDef; - -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern USBD_Class_cb_TypeDef USBD_CDC_cb; - -/* Exported functions ------------------------------------------------------- */ - -#endif /* __USB_CDC_CORE_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_if_template.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_if_template.h deleted file mode 100644 index 7cc95ef..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_if_template.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_if_template.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Header for usbd_cdc_if_template.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CDC_IF_TEMPLATE_H -#define __USBD_CDC_IF_TEMPLATE_H - -/* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" -#include "usbd_conf.h" -#include "usbd_cdc_core.h" - -/* Exported defines ----------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern CDC_IF_Prop_TypeDef TEMPLATE_fops; - -/* Exported functions ------------------------------------------------------- */ - -#endif /* __USBD_CDC_IF_TEMPLATE_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c deleted file mode 100644 index cca1134..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c +++ /dev/null @@ -1,600 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_core.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB CDC Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as CDC Device (and enumeration for each implemented memory interface) - * - OUT/IN data transfer - * - Command IN transfer (class requests management) - * - Error management - * - * @verbatim - * - * =================================================================== - * CDC Class Driver Description - * =================================================================== - * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices - * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus - * Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) - * - Requests management (as described in section 6.2 in specification) - * - Abstract Control Model compliant - * - Union Functional collection (using 1 IN endpoint for control) - * - Data interface class - - * @note - * For the Abstract Control Model, this core allows only transmitting the requests to - * lower layer dispatcher (ie. usbd_cdc_vcp.c/.h) which should manage each request and - * perform relative actions. - * - * These aspects may be enriched or modified for a specific user application. - * - * This driver doesn't implement the following aspects of the specification - * (but it is possible to manage these features with some modifications on this driver): - * - Any class-specific aspect relative to communication classes should be managed by user application. - * - All communication classes other than PSTN are not managed - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_core.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ - -/********************************************* - CDC Device library callbacks - *********************************************/ -uint8_t usbd_cdc_Init (void *pdev, uint8_t cfgidx); -uint8_t usbd_cdc_DeInit (void *pdev, uint8_t cfgidx); -uint8_t usbd_cdc_Setup (void *pdev, USB_SETUP_REQ *req); -uint8_t usbd_cdc_EP0_RxReady (void *pdev); -uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum); -uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum); -uint8_t usbd_cdc_SOF (void *pdev); - -/********************************************* - CDC specific management functions - *********************************************/ -static void Handle_USBAsynchXfer (void *pdev); -static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length); - -extern CDC_IF_Prop_TypeDef APP_FOPS; -extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; - -uint8_t usbd_cdc_OtherCfgDesc [USB_CDC_CONFIG_DESC_SIZ] ; - -static __IO uint32_t usbd_cdc_AltSet = 0; - -uint8_t USB_Rx_Buffer [CDC_DATA_MAX_PACKET_SIZE] ; - -uint8_t APP_Rx_Buffer [APP_RX_DATA_SIZE] ; - -uint8_t CmdBuff[CDC_CMD_PACKET_SZE] ; -__IO uint32_t last_packet = 0; -uint32_t APP_Rx_ptr_in = 0; -uint32_t APP_Rx_ptr_out = 0; -uint32_t APP_Rx_length = 0; - -uint8_t USB_Tx_State = 0; - -static uint32_t cdcCmd = 0xFF; -static uint32_t cdcLen = 0; - -/* CDC interface class callbacks structure */ -USBD_Class_cb_TypeDef USBD_CDC_cb = -{ - usbd_cdc_Init, - usbd_cdc_DeInit, - usbd_cdc_Setup, - NULL, /* EP0_TxSent, */ - usbd_cdc_EP0_RxReady, - usbd_cdc_DataIn, - usbd_cdc_DataOut, - usbd_cdc_SOF, - USBD_cdc_GetCfgDesc, -}; - -/* USB CDC device Configuration Descriptor */ -const uint8_t usbd_cdc_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] = -{ - /*Configuration Descriptor*/ - 0x09, /* bLength: Configuration Descriptor size */ - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ - USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ - 0x00, - 0x02, /* bNumInterfaces: 2 interface */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ - 0xC0, /* bmAttributes: self powered */ - 0x32, /* MaxPower 0 mA */ - - /*---------------------------------------------------------------------------*/ - - /*Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ - - /*Header Functional Descriptor*/ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /*Call Management Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - 0x01, /* bDataInterface: 1 */ - - /*ACM Functional Descriptor*/ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /*Union Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - 0x00, /* bMasterInterface: Communication class interface */ - 0x01, /* bSlaveInterface0: Data Class Interface */ - - /*Endpoint 2 Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SZE), - 0xFF, /* bInterval: */ - - /*---------------------------------------------------------------------------*/ - - /*Data class interface descriptor*/ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ - 0x01, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /*Endpoint OUT Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /*Endpoint IN Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_MAX_PACKET_SIZE), - 0x00 /* bInterval: ignore for Bulk transfer */ -} ; - -/* Private function ----------------------------------------------------------*/ -/** - * @brief usbd_cdc_Init - * Initialize the CDC interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -uint8_t usbd_cdc_Init (void *pdev, - uint8_t cfgidx) -{ - DCD_PMA_Config(pdev , CDC_IN_EP,USB_SNG_BUF,BULK_IN_TX_ADDRESS); - DCD_PMA_Config(pdev , CDC_CMD_EP,USB_SNG_BUF,INT_IN_TX_ADDRESS); - DCD_PMA_Config(pdev , CDC_OUT_EP,USB_SNG_BUF,BULK_OUT_RX_ADDRESS); - - /* Open EP IN */ - DCD_EP_Open(pdev, - CDC_IN_EP, - CDC_DATA_IN_PACKET_SIZE, - USB_EP_BULK); - - /* Open EP OUT */ - DCD_EP_Open(pdev, - CDC_OUT_EP, - CDC_DATA_OUT_PACKET_SIZE, - USB_EP_BULK); - - /* Open Command IN EP */ - DCD_EP_Open(pdev, - CDC_CMD_EP, - CDC_CMD_PACKET_SZE, - USB_EP_INT); - - - - /* Initialize the Interface physical components */ - APP_FOPS.pIf_Init(); - - /* Prepare Out endpoint to receive next packet */ - DCD_EP_PrepareRx(pdev, - CDC_OUT_EP, - (uint8_t*)(USB_Rx_Buffer), - CDC_DATA_OUT_PACKET_SIZE); - - return USBD_OK; -} - -/** - * @brief usbd_cdc_Init - * DeInitialize the CDC layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -uint8_t usbd_cdc_DeInit (void *pdev, - uint8_t cfgidx) -{ - /* Open EP IN */ - DCD_EP_Close(pdev, - CDC_IN_EP); - - /* Open EP OUT */ - DCD_EP_Close(pdev, - CDC_OUT_EP); - - /* Open Command IN EP */ - DCD_EP_Close(pdev, - CDC_CMD_EP); - - /* Restore default state of the Interface physical components */ - APP_FOPS.pIf_DeInit(); - - return USBD_OK; -} - -/** - * @brief usbd_cdc_Setup - * Handle the CDC specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -uint8_t usbd_cdc_Setup (void *pdev, - USB_SETUP_REQ *req) -{ - uint16_t len=USB_CDC_DESC_SIZ; - uint8_t *pbuf= (uint8_t*)usbd_cdc_CfgDesc + 9; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - /* CDC Class Requests -------------------------------*/ - case USB_REQ_TYPE_CLASS : - /* Check if the request is a data setup packet */ - if (req->wLength) - { - /* Check if the request is Device-to-Host */ - if (req->bmRequest & 0x80) - { - /* Get the data to be sent to Host from interface layer */ - APP_FOPS.pIf_Ctrl(req->bRequest, CmdBuff, req->wLength); - - /* Send the data to the host */ - USBD_CtlSendData (pdev, - CmdBuff, - req->wLength); - } - else /* Host-to-Device requeset */ - { - /* Set the value of the current command to be processed */ - cdcCmd = req->bRequest; - cdcLen = req->wLength; - - /* Prepare the reception of the buffer over EP0 - Next step: the received data will be managed in usbd_cdc_EP0_TxSent() - function. */ - USBD_CtlPrepareRx (pdev, - CmdBuff, - req->wLength); - } - } - else /* No Data request */ - { - /* Transfer the command to the interface layer */ - APP_FOPS.pIf_Ctrl(req->bRequest, NULL, 0); - } - - return USBD_OK; - - default: - USBD_CtlError (pdev, req); - return USBD_FAIL; - - - - /* Standard Requests -------------------------------*/ - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - if( (req->wValue >> 8) == CDC_DESCRIPTOR_TYPE) - { - pbuf = (uint8_t*)usbd_cdc_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM); - len = MIN(USB_CDC_DESC_SIZ , req->wLength); - } - - USBD_CtlSendData (pdev, - pbuf, - len); - break; - - case USB_REQ_GET_INTERFACE : - USBD_CtlSendData (pdev, - (uint8_t *)&usbd_cdc_AltSet, - 1); - break; - - case USB_REQ_SET_INTERFACE : - if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM) - { - usbd_cdc_AltSet = (uint8_t)(req->wValue); - } - else - { - /* Call the error management function (command will be nacked */ - USBD_CtlError (pdev, req); - } - break; - } - } - return USBD_OK; -} - -/** - * @brief usbd_cdc_EP0_RxReady - * Data received on control endpoint - * @param pdev: device device instance - * @retval status - */ -uint8_t usbd_cdc_EP0_RxReady (void *pdev) -{ - if (cdcCmd != NO_CMD) - { - /* Process the data */ - APP_FOPS.pIf_Ctrl(cdcCmd, CmdBuff, cdcLen); - - /* Reset the command variable to default value */ - cdcCmd = NO_CMD; - } - - return USBD_OK; -} - -/** - * @brief usbd_audio_DataIn - * Data sent on non-control IN endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum) -{ - uint16_t USB_Tx_ptr; - uint16_t USB_Tx_length; - - if (USB_Tx_State == 1) - { - if (APP_Rx_length == 0) - { - if (last_packet ==1) - { - last_packet =0; - - /*Send zero-length packet*/ - DCD_EP_Tx (pdev, CDC_IN_EP, 0, 0); - } - else - { - USB_Tx_State = 0; - } - } - else - { - if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE){ - USB_Tx_ptr = APP_Rx_ptr_out; - USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; - - APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE; - APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE; - } - else - { - USB_Tx_ptr = APP_Rx_ptr_out; - USB_Tx_length = APP_Rx_length; - - APP_Rx_ptr_out += APP_Rx_length; - APP_Rx_length = 0; - if (APP_Rx_length == CDC_DATA_IN_PACKET_SIZE) last_packet = 1; - } - - /* Prepare the available data buffer to be sent on IN endpoint */ - DCD_EP_Tx (pdev, - CDC_IN_EP, - (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], - USB_Tx_length); - } - } - - return USBD_OK; -} - -/** - * @brief usbd_cdc_DataOut - * Data received on non-control Out endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum) -{ - uint16_t USB_Rx_Cnt; - - /* Get the received data buffer and update the counter */ - USB_Rx_Cnt = ((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count; - - /* USB data will be immediately processed, this allow next USB traffic being - NAKed till the end of the application Xfer */ - APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt); - - /* Prepare Out endpoint to receive next packet */ - DCD_EP_PrepareRx(pdev, - CDC_OUT_EP, - (uint8_t*)(USB_Rx_Buffer), - CDC_DATA_OUT_PACKET_SIZE); - - return USBD_OK; -} - -/** - * @brief usbd_CDC_SOF - * Start Of Frame event management - * @param pdev: instance - * @param epnum: endpoint number - * @retval status - */ -uint8_t usbd_cdc_SOF (void *pdev) -{ - static uint32_t FrameCount = 0; - - if (FrameCount++ == CDC_IN_FRAME_INTERVAL) - { - /* Reset the frame counter */ - FrameCount = 0; - - /* Check the data to be sent through IN pipe */ - Handle_USBAsynchXfer(pdev); - } - - return USBD_OK; -} - -/** - * @brief Handle_USBAsynchXfer - * Send data to USB - * @param pdev: instance - * @retval None - */ -static void Handle_USBAsynchXfer (void *pdev) -{ - uint16_t USB_Tx_ptr; - uint16_t USB_Tx_length; - - if(USB_Tx_State != 1) - { - if (APP_Rx_ptr_out == APP_RX_DATA_SIZE) - { - APP_Rx_ptr_out = 0; - } - - if(APP_Rx_ptr_out == APP_Rx_ptr_in) - { - USB_Tx_State = 0; - return; - } - - if(APP_Rx_ptr_out > APP_Rx_ptr_in) /* rollback */ - { - APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out; - - } - else - { - APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out; - - } - - if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE) - { - USB_Tx_ptr = APP_Rx_ptr_out; - USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; - - APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE; - APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE; - } - else - { - USB_Tx_ptr = APP_Rx_ptr_out; - USB_Tx_length = APP_Rx_length; - - APP_Rx_ptr_out += APP_Rx_length; - APP_Rx_length = 0; - if (USB_Tx_length == CDC_DATA_IN_PACKET_SIZE) last_packet = 1; //IBA - if (APP_Rx_ptr_in == 64) APP_Rx_ptr_in=0; - } - USB_Tx_State = 1; - - DCD_EP_Tx (pdev, - CDC_IN_EP, - (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], - USB_Tx_length); - } - -} - -/** - * @brief USBD_cdc_GetCfgDesc - * Return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length) -{ - *length = sizeof (usbd_cdc_CfgDesc); - return (uint8_t*)usbd_cdc_CfgDesc; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_if_template.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_if_template.c deleted file mode 100644 index 76ddec5..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_if_template.c +++ /dev/null @@ -1,203 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_if_template.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Generic media access Layer. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_if_template.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* These are external variables imported from CDC core to be used for IN - transfer management. */ -extern uint8_t APP_Rx_Buffer []; /* Write CDC received data in this buffer. - These data will be sent over USB IN endpoint - in the CDC core functions. */ -extern uint32_t APP_Rx_ptr_in; /* Increment this pointer or roll it back to - start address when writing received data - in the buffer APP_Rx_Buffer. */ - -/* Private function prototypes -----------------------------------------------*/ -static uint16_t TEMPLATE_Init (void); -static uint16_t TEMPLATE_DeInit (void); -static uint16_t TEMPLATE_Ctrl (uint32_t Cmd, uint8_t* Buf, uint32_t Len); -static uint16_t TEMPLATE_DataTx (uint8_t* Buf, uint32_t Len); -static uint16_t TEMPLATE_DataRx (uint8_t* Buf, uint32_t Len); - -CDC_IF_Prop_TypeDef TEMPLATE_fops = -{ - TEMPLATE_Init, - TEMPLATE_DeInit, - TEMPLATE_Ctrl, - TEMPLATE_DataTx, - TEMPLATE_DataRx -}; - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief TEMPLATE_Init - * Initializes the CDC media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static uint16_t TEMPLATE_Init(void) -{ - /* - Add your initialization code here - */ - return USBD_OK; -} - -/** - * @brief TEMPLATE_DeInit - * DeInitializes the CDC media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static uint16_t TEMPLATE_DeInit(void) -{ - /* - Add your deinitialization code here - */ - return USBD_OK; -} - - -/** - * @brief TEMPLATE_Ctrl - * Manage the CDC class requests - * @param Cmd: Command code - * @param Buf: Buffer containing command data (request parameters) - * @param Len: Number of data to be sent (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static uint16_t TEMPLATE_Ctrl (uint32_t Cmd, uint8_t* Buf, uint32_t Len) -{ - switch (Cmd) - { - case SEND_ENCAPSULATED_COMMAND: - /* Add your code here */ - break; - - case GET_ENCAPSULATED_RESPONSE: - /* Add your code here */ - break; - - case SET_COMM_FEATURE: - /* Add your code here */ - break; - - case GET_COMM_FEATURE: - /* Add your code here */ - break; - - case CLEAR_COMM_FEATURE: - /* Add your code here */ - break; - - case SET_LINE_CODING: - /* Add your code here */ - break; - - case GET_LINE_CODING: - /* Add your code here */ - break; - - case SET_CONTROL_LINE_STATE: - /* Add your code here */ - break; - - case SEND_BREAK: - /* Add your code here */ - break; - - default: - break; - } - - return USBD_OK; -} - -/** - * @brief TEMPLATE_DataTx - * CDC received data to be send over USB IN endpoint are managed in - * this function. - * @param Buf: Buffer of data to be sent - * @param Len: Number of data to be sent (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static uint16_t TEMPLATE_DataTx (uint8_t* Buf, uint32_t Len) -{ - - /* Get the data to be sent */ - for (i = 0; i < Len; i++) - { - /* APP_Rx_Buffer[APP_Rx_ptr_in] = XXX_ReceiveData(XXX); */ - } - - /* Increment the in pointer */ - APP_Rx_ptr_in++; - - /* To avoid buffer overflow */ - if(APP_Rx_ptr_in == APP_RX_DATA_SIZE) - { - APP_Rx_ptr_in = 0; - } - - return USBD_OK; -} - -/** - * @brief TEMPLATE_DataRx - * Data received over USB OUT endpoint are sent over CDC interface - * through this function. - * - * @note - * This function will block any OUT packet reception on USB endpoint - * untill exiting this function. If you exit this function before transfer - * is complete on CDC interface (ie. using DMA controller) it will result - * in receiving more data while previous ones are still not sent. - * - * @param Buf: Buffer of data to be received - * @param Len: Number of data received (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static uint16_t TEMPLATE_DataRx (uint8_t* Buf, uint32_t Len) -{ - uint32_t i; - - /* Send the received buffer */ - for (i = 0; i < Len; i++) - { - /* XXXX_SendData(XXXX, *(Buf + i) ); */ - } - - return USBD_OK; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_dfu_core.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_dfu_core.h deleted file mode 100644 index 56bb040..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_dfu_core.h +++ /dev/null @@ -1,142 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_dfu_core.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header file for the usbd_dfu_core.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_DFU_CORE_H_ -#define __USB_DFU_CORE_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_dfu_mal.h" -#include "usbd_req.h" - -/* Exported defines ----------------------------------------------------------*/ -#define USB_DFU_CONFIG_DESC_SIZ (18 + (9 * USBD_ITF_MAX_NUM)) -#define USB_DFU_DESC_SIZ 9 - -#define DFU_DESCRIPTOR_TYPE 0x21 - - -/*---------------------------------------------------------------------*/ -/* DFU definitions */ -/*---------------------------------------------------------------------*/ -/**************************************************/ -/* DFU Requests DFU states */ -/**************************************************/ - - -#define STATE_appIDLE 0x00 -#define STATE_appDETACH 0x01 -#define STATE_dfuIDLE 0x02 -#define STATE_dfuDNLOAD_SYNC 0x03 -#define STATE_dfuDNBUSY 0x04 -#define STATE_dfuDNLOAD_IDLE 0x05 -#define STATE_dfuMANIFEST_SYNC 0x06 -#define STATE_dfuMANIFEST 0x07 -#define STATE_dfuMANIFEST_WAIT_RESET 0x08 -#define STATE_dfuUPLOAD_IDLE 0x09 -#define STATE_dfuERROR 0x0A - -/**************************************************/ -/* DFU Requests DFU status */ -/**************************************************/ - -#define STATUS_OK 0x00 -#define STATUS_ERRTARGET 0x01 -#define STATUS_ERRFILE 0x02 -#define STATUS_ERRWRITE 0x03 -#define STATUS_ERRERASE 0x04 -#define STATUS_ERRCHECK_ERASED 0x05 -#define STATUS_ERRPROG 0x06 -#define STATUS_ERRVERIFY 0x07 -#define STATUS_ERRADDRESS 0x08 -#define STATUS_ERRNOTDONE 0x09 -#define STATUS_ERRFIRMWARE 0x0A -#define STATUS_ERRVENDOR 0x0B -#define STATUS_ERRUSBR 0x0C -#define STATUS_ERRPOR 0x0D -#define STATUS_ERRUNKNOWN 0x0E -#define STATUS_ERRSTALLEDPKT 0x0F - -/**************************************************/ -/* DFU Requests DFU states Manifestation State */ -/**************************************************/ - -#define Manifest_complete 0x00 -#define Manifest_In_Progress 0x01 - - -/**************************************************/ -/* Special Commands with Download Request */ -/**************************************************/ - -#define CMD_GETCOMMANDS 0x00 -#define CMD_SETADDRESSPOINTER 0x21 -#define CMD_ERASE 0x41 - -/**************************************************/ -/* Other defines */ -/**************************************************/ -/* Bit Detach capable = bit 3 in bmAttributes field */ -#define DFU_DETACH_MASK (uint8_t)(1 << 4) - -/* Exported types ------------------------------------------------------------*/ -/**************************************************/ -/* DFU Requests */ -/**************************************************/ - -typedef enum _DFU_REQUESTS { - DFU_DETACH = 0, - DFU_DNLOAD = 1, - DFU_UPLOAD, - DFU_GETSTATUS, - DFU_CLRSTATUS, - DFU_GETSTATE, - DFU_ABORT -} DFU_REQUESTS; - -typedef void (*pFunction)(void); - -/* Exported macros -----------------------------------------------------------*/ -/********** Descriptor of DFU interface 0 Alternate setting n ****************/ -#define USBD_DFU_IF_DESC(n) 0x09, /* bLength: Interface Descriptor size */ \ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ - 0x00, /* bInterfaceNumber: Number of Interface */ \ - (n), /* bAlternateSetting: Alternate setting */ \ - 0x00, /* bNumEndpoints*/ \ - 0xFE, /* bInterfaceClass: Application Specific Class Code */ \ - 0x01, /* bInterfaceSubClass : Device Firmware Upgrade Code */ \ - 0x02, /* nInterfaceProtocol: DFU mode protocol */ \ - USBD_IDX_INTERFACE_STR + (n) + 1 /* iInterface: Index of string descriptor */ \ - /* 18 */ - -/* Exported variables --------------------------------------------------------*/ -extern USBD_Class_cb_TypeDef DFU_cb; - -/* Exported functions ------------------------------------------------------- */ - -#endif /* __USB_DFU_CORE_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_dfu_mal.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_dfu_mal.h deleted file mode 100644 index c0f1d48..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_dfu_mal.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_dfu_mal.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Header for usbd_dfu_mal.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __DFU_MAL_H -#define __DFU_MAL_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" -#include "usbd_dfu_core.h" - -/* Exported types ------------------------------------------------------------*/ -typedef struct _DFU_MAL_PROP -{ - const uint8_t* pStrDesc; - uint16_t (*pMAL_Init) (void); - uint16_t (*pMAL_DeInit) (void); - uint16_t (*pMAL_Erase) (uint32_t Add); - uint16_t (*pMAL_Write) (uint32_t Add, uint32_t Len); - uint8_t *(*pMAL_Read) (uint32_t Add, uint32_t Len); - uint16_t (*pMAL_CheckAdd) (uint32_t Add); - const uint32_t EraseTiming; - const uint32_t WriteTiming; -} -DFU_MAL_Prop_TypeDef; - - -/* Exported defines --------------------------------------------------------*/ -#define MAL_OK 0 -#define MAL_FAIL 1 - -/* Exported macro ------------------------------------------------------------*/ -#define _1st_BYTE(x) (uint8_t)((x)&0xFF) /* 1st addressing cycle */ -#define _2nd_BYTE(x) (uint8_t)(((x)&0xFF00)>>8) /* 2nd addressing cycle */ -#define _3rd_BYTE(x) (uint8_t)(((x)&0xFF0000)>>16) /* 3rd addressing cycle */ -#define _4th_BYTE(x) (uint8_t)(((x)&0xFF000000)>>24) /* 4th addressing cycle */ - -#define SET_POLLING_TIMING(x) buffer[1] = _1st_BYTE(x);\ - buffer[2] = _2nd_BYTE(x);\ - buffer[3] = _3rd_BYTE(x); - -/* Exported functions ------------------------------------------------------- */ -uint16_t MAL_Init (void); -uint16_t MAL_DeInit (void); -uint16_t MAL_Erase (uint32_t SectorAddress); -uint16_t MAL_Write (uint32_t SectorAddress, uint32_t DataLength); -uint8_t *MAL_Read (uint32_t SectorAddress, uint32_t DataLength); -uint16_t MAL_GetStatus(uint32_t SectorAddress ,uint8_t Cmd, uint8_t *buffer); - -extern uint8_t MAL_Buffer[XFERSIZE]; /* RAM Buffer for Downloaded Data */ - -#endif /* __DFU_MAL_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_flash_if.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_flash_if.h deleted file mode 100644 index a159240..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_flash_if.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_flash_if.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Header for usbd_flash_if.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FLASH_IF_MAL_H -#define __FLASH_IF_MAL_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_dfu_mal.h" - -/* Exported defines ----------------------------------------------------------*/ -#define FLASH_START_ADD 0x08000000 - -#define FLASH_END_ADD 0x08040000 -#define FLASH_IF_STRING (uint8_t*) "@Internal Flash /0x08000000/12*001Ka,116*001Kg" - -/* Exported types ------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern DFU_MAL_Prop_TypeDef DFU_Flash_cb; - -/* Exported functions ------------------------------------------------------- */ - -#endif /* __FLASH_IF_MAL_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_mem_if_template.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_mem_if_template.h deleted file mode 100644 index afdb472..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/inc/usbd_mem_if_template.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_mem_if_template.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Header for usbd_mem_if_template.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MEM_IF_MAL_H -#define __MEM_IF_MAL_H - -/* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" -#include "usbd_dfu_mal.h" - -/* Exported defines ----------------------------------------------------------*/ -#define MEM_START_ADD 0x00000000 /* Dummy start address */ -#define MEM_END_ADD (uint32_t)(MEM_START_ADD + (5 * 1024)) /* Dummy Size = 5KB */ - -#define MEM_IF_STRING "@Dummy Memory /0x00000000/01*002Kg,03*001Kg" - -/* Exported types ------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern DFU_MAL_Prop_TypeDef DFU_Mem_cb; - -/* Exported functions ------------------------------------------------------- */ - -#endif /* __MEM_IF_MAL_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_dfu_core.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_dfu_core.c deleted file mode 100644 index a6f47ab..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_dfu_core.c +++ /dev/null @@ -1,842 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_dfu_core.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB DFU Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as DFU Device (and enumeration for each implemented memory interface) - * - Transfers to/from memory interfaces - * - Easy-to-customize "plug-in-like" modules for adding/removing memory interfaces. - * - Error management - * - * @verbatim - * - * =================================================================== - * DFU Class Driver Description - * =================================================================== - * This driver manages the DFU class V1.1 following the "Device Class Specification for - * Device Firmware Upgrade Version 1.1 Aug 5, 2004". - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as DFU device (in DFU mode only) - * - Requests management (supporting ST DFU sub-protocol) - * - Memory operations management (Download/Upload/Erase/Detach/GetState/GetStatus) - * - DFU state machine implementation. - * - * @note - * ST DFU sub-protocol is compliant with DFU protocol and use sub-requests to manage - * memory addressing, commands processing, specific memories operations (ie. Erase) ... - * As required by the DFU specification, only endpoint 0 is used in this application. - * Other endpoints and functions may be added to the application (ie. DFU ...) - * - * These aspects may be enriched or modified for a specific user application. - * - * This driver doesn't implement the following aspects of the specification - * (but it is possible to manage these features with some modifications on this driver): - * - Manifestation Tolerant mode - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_dfu_core.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -uint8_t usbd_dfu_OtherCfgDesc[USB_DFU_CONFIG_DESC_SIZ] ; - -/* The list of Interface String descriptor pointers is defined in usbd_dfu_mal.c - file. This list can be updated whenever a memory has to be added or removed */ -extern const uint8_t* usbd_dfu_StringDesc[]; - -/* State Machine variables */ -uint8_t DeviceState; -uint8_t DeviceStatus[6]; -uint32_t Manifest_State = Manifest_complete; -/* Data Management variables */ -static uint32_t wBlockNum = 0, wlength = 0; -static uint32_t Pointer = APP_DEFAULT_ADD; /* Base Address to Erase, Program or Read */ -static __IO uint32_t usbd_dfu_AltSet = 0; - -extern uint8_t MAL_Buffer[]; - -/********************************************* - DFU Device library callbacks - *********************************************/ -static uint8_t usbd_dfu_Init (void *pdev, - uint8_t cfgidx); - -static uint8_t usbd_dfu_DeInit (void *pdev, - uint8_t cfgidx); - -static uint8_t usbd_dfu_Setup (void *pdev, - USB_SETUP_REQ *req); - -static uint8_t EP0_TxSent (void *pdev); - -static uint8_t EP0_RxReady (void *pdev); - - -static uint8_t *USBD_DFU_GetCfgDesc (uint8_t speed, - uint16_t *length); - - -static uint8_t* USBD_DFU_GetUsrStringDesc (uint8_t speed, - uint8_t index , - uint16_t *length); - - -/* DFU interface class callbacks structure */ -USBD_Class_cb_TypeDef DFU_cb = -{ - usbd_dfu_Init, - usbd_dfu_DeInit, - usbd_dfu_Setup, - EP0_TxSent, - EP0_RxReady, - NULL, /* DataIn, */ - NULL, /* DataOut, */ - NULL, /*SOF */ - USBD_DFU_GetCfgDesc, - USBD_DFU_GetUsrStringDesc, -}; - -/* USB DFU device Configuration Descriptor */ -const uint8_t usbd_dfu_CfgDesc[USB_DFU_CONFIG_DESC_SIZ] = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ - USB_DFU_CONFIG_DESC_SIZ, - /* wTotalLength: Bytes returned */ - 0x00, - 0x01, /*bNumInterfaces: 1 interface*/ - 0x01, /*bConfigurationValue: Configuration value*/ - 0x02, /*iConfiguration: Index of string descriptor describing the configuration*/ - 0xC0, /*bmAttributes: bus powered and Supports Remote Wakeup */ - 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ - /* 09 */ - - /********** Descriptor of DFU interface 0 Alternate setting 0 **************/ - USBD_DFU_IF_DESC(0), /* This interface is mandatory for all devices */ - -#if (USBD_ITF_MAX_NUM > 1) - /********** Descriptor of DFU interface 0 Alternate setting 1 **************/ - USBD_DFU_IF_DESC(1), -#endif /* (USBD_ITF_MAX_NUM > 1) */ - -#if (USBD_ITF_MAX_NUM > 2) - /********** Descriptor of DFU interface 0 Alternate setting 2 **************/ - USBD_DFU_IF_DESC(2), -#endif /* (USBD_ITF_MAX_NUM > 2) */ - -#if (USBD_ITF_MAX_NUM > 3) - /********** Descriptor of DFU interface 0 Alternate setting 3 **************/ - USBD_DFU_IF_DESC(3), -#endif /* (USBD_ITF_MAX_NUM > 3) */ - -#if (USBD_ITF_MAX_NUM > 4) - /********** Descriptor of DFU interface 0 Alternate setting 4 **************/ - USBD_DFU_IF_DESC(4), -#endif /* (USBD_ITF_MAX_NUM > 4) */ - -#if (USBD_ITF_MAX_NUM > 5) - /********** Descriptor of DFU interface 0 Alternate setting 5 **************/ - USBD_DFU_IF_DESC(5), -#endif /* (USBD_ITF_MAX_NUM > 5) */ - -#if (USBD_ITF_MAX_NUM > 6) -#error "ERROR: usbd_dfu_core.c: Modify the file to support more descriptors!" -#endif /* (USBD_ITF_MAX_NUM > 6) */ - - /******************** DFU Functional Descriptor********************/ - 0x09, /*blength = 9 Bytes*/ - DFU_DESCRIPTOR_TYPE, /* DFU Functional Descriptor*/ - 0x0B, /*bmAttribute - bitCanDnload = 1 (bit 0) - bitCanUpload = 1 (bit 1) - bitManifestationTolerant = 0 (bit 2) - bitWillDetach = 1 (bit 3) - Reserved (bit4-6) - bitAcceleratedST = 0 (bit 7)*/ - 0xFF, /*DetachTimeOut= 255 ms*/ - 0x00, - TRANSFER_SIZE_BYTES(XFERSIZE), /* TransferSize = 1024 Byte*/ - 0x1A, /* bcdDFUVersion*/ - 0x01 - /***********************************************************/ - /* 9*/ -} ; -/* Private function prototypes -----------------------------------------------*/ - -/********************************************* - DFU Requests management functions - *********************************************/ -static void DFU_Req_DETACH (void *pdev, - USB_SETUP_REQ *req); - -static void DFU_Req_DNLOAD (void *pdev, - USB_SETUP_REQ *req); - -static void DFU_Req_UPLOAD (void *pdev, - USB_SETUP_REQ *req); - -static void DFU_Req_GETSTATUS (void *pdev); - -static void DFU_Req_CLRSTATUS (void *pdev); - -static void DFU_Req_GETSTATE (void *pdev); - -static void DFU_Req_ABORT (void *pdev); - -static void DFU_LeaveDFUMode (void *pdev); - -/* Private function ----------------------------------------------------------*/ - -/** - * @brief usbd_dfu_Init - * Initializes the DFU interface. - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t usbd_dfu_Init (void *pdev, - uint8_t cfgidx) -{ - /* Initialize the MAL(Media Access Layer) */ - MAL_Init(); - - /* Initialize the state of the DFU interface */ - DeviceState = STATE_dfuIDLE; - DeviceStatus[0] = STATUS_OK; - DeviceStatus[4] = DeviceState; - - return USBD_OK; -} - -/** - * @brief usbd_dfu_Init - * De-initializes the DFU layer. - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t usbd_dfu_DeInit (void *pdev, - uint8_t cfgidx) -{ - /* Restore default state */ - DeviceState = STATE_dfuIDLE; - DeviceStatus[0] = STATUS_OK; - DeviceStatus[4] = DeviceState; - wBlockNum = 0; - wlength = 0; - - /* DeInitilialize the MAL(Media Access Layer) */ - MAL_DeInit(); - - return USBD_OK; -} - -/** - * @brief usbd_dfu_Setup - * Handles the DFU request parsing. - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t usbd_dfu_Setup (void *pdev, - USB_SETUP_REQ *req) -{ - uint16_t len = 0; - uint8_t *pbuf = NULL; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - /* DFU Class Requests -------------------------------*/ - case USB_REQ_TYPE_CLASS : - switch (req->bRequest) - { - case DFU_DNLOAD: - DFU_Req_DNLOAD(pdev, req); - break; - - case DFU_UPLOAD: - DFU_Req_UPLOAD(pdev, req); - break; - - case DFU_GETSTATUS: - DFU_Req_GETSTATUS(pdev); - break; - - case DFU_CLRSTATUS: - DFU_Req_CLRSTATUS(pdev); - break; - - case DFU_GETSTATE: - DFU_Req_GETSTATE(pdev); - break; - - case DFU_ABORT: - DFU_Req_ABORT(pdev); - break; - - case DFU_DETACH: - DFU_Req_DETACH(pdev, req); - break; - - default: - USBD_CtlError (pdev, req); - return USBD_FAIL; - } - break; - - /* Standard Requests -------------------------------*/ - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - if( (req->wValue >> 8) == DFU_DESCRIPTOR_TYPE) - { - pbuf = (uint8_t*)usbd_dfu_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM); - len = MIN(USB_DFU_DESC_SIZ , req->wLength); - } - - USBD_CtlSendData (pdev, - pbuf, - len); - break; - - case USB_REQ_GET_INTERFACE : - USBD_CtlSendData (pdev, - (uint8_t *)&usbd_dfu_AltSet, - 1); - break; - - case USB_REQ_SET_INTERFACE : - if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM) - { - usbd_dfu_AltSet = (uint8_t)(req->wValue); - } - else - { - /* Call the error management function (command will be nacked */ - USBD_CtlError (pdev, req); - } - break; - } - } - return USBD_OK; -} - -/** - * @brief EP0_TxSent - * Handles the DFU control endpoint data IN stage. - * @param pdev: device instance - * @retval status - */ -static uint8_t EP0_TxSent (void *pdev) -{ - uint32_t Addr; - USB_SETUP_REQ req; - - if (DeviceState == STATE_dfuDNBUSY) - { - /* Decode the Special Command*/ - if (wBlockNum == 0) - { - if ((MAL_Buffer[0] == CMD_GETCOMMANDS) && (wlength == 1)) - {} - else if (( MAL_Buffer[0] == CMD_SETADDRESSPOINTER ) && (wlength == 5)) - { - Pointer = MAL_Buffer[1]; - Pointer += MAL_Buffer[2] << 8; - Pointer += MAL_Buffer[3] << 16; - Pointer += MAL_Buffer[4] << 24; - } - else if (( MAL_Buffer[0] == CMD_ERASE ) && (wlength == 5)) - { - Pointer = MAL_Buffer[1]; - Pointer += MAL_Buffer[2] << 8; - Pointer += MAL_Buffer[3] << 16; - Pointer += MAL_Buffer[4] << 24; - MAL_Erase(Pointer); - } - else - { - /* Reset the global length and block number */ - wlength = 0; - wBlockNum = 0; - /* Call the error management function (command will be nacked) */ - req.bmRequest = 0; - req.wLength = 1; - USBD_CtlError (pdev, &req); - } - } - /* Regular Download Command */ - else if (wBlockNum > 1) - { - /* Decode the required address */ - Addr = ((wBlockNum - 2) * XFERSIZE) + Pointer; - - /* Preform the write operation */ - MAL_Write(Addr, wlength); - } - /* Reset the global length and block number */ - wlength = 0; - wBlockNum = 0; - - /* Update the state machine */ - DeviceState = STATE_dfuDNLOAD_SYNC; - DeviceStatus[4] = DeviceState; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; - return USBD_OK; - } - else if (DeviceState == STATE_dfuMANIFEST)/* Manifestation in progress*/ - { - /* Start leaving DFU mode */ - DFU_LeaveDFUMode(pdev); - } - - return USBD_OK; -} - -/** - * @brief EP0_RxReady - * Handles the DFU control endpoint data OUT stage. - * @param pdev: device instance - * @retval status - */ -static uint8_t EP0_RxReady (void *pdev) -{ - return USBD_OK; -} - - -/****************************************************************************** - DFU Class requests management -******************************************************************************/ -/** - * @brief DFU_Req_DETACH - * Handles the DFU DETACH request. - * @param pdev: device instance - * @param req: pointer to the request structure. - * @retval None. - */ -static void DFU_Req_DETACH(void *pdev, USB_SETUP_REQ *req) -{ - if (DeviceState == STATE_dfuIDLE || DeviceState == STATE_dfuDNLOAD_SYNC - || DeviceState == STATE_dfuDNLOAD_IDLE || DeviceState == STATE_dfuMANIFEST_SYNC - || DeviceState == STATE_dfuUPLOAD_IDLE ) - { - /* Update the state machine */ - DeviceState = STATE_dfuIDLE; - DeviceStatus[0] = STATUS_OK; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; /*bwPollTimeout=0ms*/ - DeviceStatus[4] = DeviceState; - DeviceStatus[5] = 0; /*iString*/ - wBlockNum = 0; - wlength = 0; - } - - /* Check the detach capability in the DFU functional descriptor */ - if ((usbd_dfu_CfgDesc[12 + (9 * USBD_ITF_MAX_NUM)]) & DFU_DETACH_MASK) - { - /* Perform an Attach-Detach operation on USB bus */ - DCD_DevDisconnect (pdev); - DCD_DevConnect (pdev); - } - else - { - /* Wait for the period of time specified in Detach request */ - USB_BSP_mDelay (req->wValue); - } -} - -/** - * @brief DFU_Req_DNLOAD - * Handles the DFU DNLOAD request. - * @param pdev: device instance - * @param req: pointer to the request structure - * @retval None - */ -static void DFU_Req_DNLOAD(void *pdev, USB_SETUP_REQ *req) -{ - /* Data setup request */ - if (req->wLength > 0) - { - if ((DeviceState == STATE_dfuIDLE) || (DeviceState == STATE_dfuDNLOAD_IDLE)) - { - /* Update the global length and block number */ - wBlockNum = req->wValue; - wlength = req->wLength; - - /* Update the state machine */ - DeviceState = STATE_dfuDNLOAD_SYNC; - DeviceStatus[4] = DeviceState; - - /* Prepare the reception of the buffer over EP0 */ - USBD_CtlPrepareRx (pdev, - (uint8_t*)MAL_Buffer, - wlength); - } - /* Unsupported state */ - else - { - /* Call the error management function (command will be nacked */ - USBD_CtlError (pdev, req); - } - } - /* 0 Data DNLOAD request */ - else - { - /* End of DNLOAD operation*/ - if (DeviceState == STATE_dfuDNLOAD_IDLE || DeviceState == STATE_dfuIDLE ) - { - Manifest_State = Manifest_In_Progress; - DeviceState = STATE_dfuMANIFEST_SYNC; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; - DeviceStatus[4] = DeviceState; - } - else - { - /* Call the error management function (command will be nacked */ - USBD_CtlError (pdev, req); - } - } -} - -/** - * @brief DFU_Req_UPLOAD - * Handles the DFU UPLOAD request. - * @param pdev: instance - * @param req: pointer to the request structure - * @retval status - */ -static void DFU_Req_UPLOAD(void *pdev, USB_SETUP_REQ *req) -{ - uint8_t *Phy_Addr = NULL; - uint32_t Addr = 0; - - /* Data setup request */ - if (req->wLength > 0) - { - if ((DeviceState == STATE_dfuIDLE) || (DeviceState == STATE_dfuUPLOAD_IDLE)) - { - /* Update the global langth and block number */ - wBlockNum = req->wValue; - wlength = req->wLength; - - /* DFU Get Command */ - if (wBlockNum == 0) - { - /* Update the state machine */ - DeviceState = (wlength > 3)? STATE_dfuIDLE:STATE_dfuUPLOAD_IDLE; - DeviceStatus[4] = DeviceState; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; - - /* Store the values of all supported commands */ - MAL_Buffer[0] = CMD_GETCOMMANDS; - MAL_Buffer[1] = CMD_SETADDRESSPOINTER; - MAL_Buffer[2] = CMD_ERASE; - - /* Send the status data over EP0 */ - USBD_CtlSendData (pdev, - (uint8_t *)(&(MAL_Buffer[0])), - 3); - } - else if (wBlockNum > 1) - { - DeviceState = STATE_dfuUPLOAD_IDLE ; - DeviceStatus[4] = DeviceState; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; - Addr = ((wBlockNum - 2) * XFERSIZE) + Pointer; /* Change is Accelerated*/ - - /* Return the physical address where data are stored */ - Phy_Addr = MAL_Read(Addr, wlength); - - /* Send the status data over EP0 */ - USBD_CtlSendData (pdev, - Phy_Addr, - wlength); - } - else /* unsupported wBlockNum */ - { - DeviceState = STATUS_ERRSTALLEDPKT; - DeviceStatus[4] = DeviceState; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; - - /* Call the error management function (command will be nacked */ - USBD_CtlError (pdev, req); - } - } - /* Unsupported state */ - else - { - wlength = 0; - wBlockNum = 0; - /* Call the error management function (command will be nacked */ - USBD_CtlError (pdev, req); - } - } - /* No Data setup request */ - else - { - DeviceState = STATE_dfuIDLE; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; - DeviceStatus[4] = DeviceState; - } -} - -/** - * @brief DFU_Req_GETSTATUS - * Handles the DFU GETSTATUS request. - * @param pdev: instance - * @retval status - */ -static void DFU_Req_GETSTATUS(void *pdev) -{ - switch (DeviceState) - { - case STATE_dfuDNLOAD_SYNC: - if (wlength != 0) - { - DeviceState = STATE_dfuDNBUSY; - DeviceStatus[4] = DeviceState; - if ((wBlockNum == 0) && (MAL_Buffer[0] == CMD_ERASE)) - { - MAL_GetStatus(Pointer, 0, DeviceStatus); - } - else - { - MAL_GetStatus(Pointer, 1, DeviceStatus); - } - } - else /* (wlength==0)*/ - { - DeviceState = STATE_dfuDNLOAD_IDLE; - DeviceStatus[4] = DeviceState; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; - } - break; - - case STATE_dfuMANIFEST_SYNC : - if (Manifest_State == Manifest_In_Progress) - { - DeviceState = STATE_dfuMANIFEST; - DeviceStatus[4] = DeviceState; - DeviceStatus[1] = 1; /*bwPollTimeout = 1ms*/ - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; - //break; - } - else if ((Manifest_State == Manifest_complete) && \ - ((usbd_dfu_CfgDesc[(11 + (9 * USBD_ITF_MAX_NUM))]) & 0x04)) - { - DeviceState = STATE_dfuIDLE; - DeviceStatus[4] = DeviceState; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; - //break; - } - break; - - default : - break; - } - - /* Send the status data over EP0 */ - USBD_CtlSendData (pdev, - (uint8_t *)(&(DeviceStatus[0])), - 6); -} - -/** - * @brief DFU_Req_CLRSTATUS - * Handles the DFU CLRSTATUS request. - * @param pdev: device instance - * @retval status - */ -static void DFU_Req_CLRSTATUS(void *pdev) -{ - if (DeviceState == STATE_dfuERROR) - { - DeviceState = STATE_dfuIDLE; - DeviceStatus[0] = STATUS_OK;/*bStatus*/ - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; /*bwPollTimeout=0ms*/ - DeviceStatus[4] = DeviceState;/*bState*/ - DeviceStatus[5] = 0;/*iString*/ - } - else - { /*State Error*/ - DeviceState = STATE_dfuERROR; - DeviceStatus[0] = STATUS_ERRUNKNOWN;/*bStatus*/ - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; /*bwPollTimeout=0ms*/ - DeviceStatus[4] = DeviceState;/*bState*/ - DeviceStatus[5] = 0;/*iString*/ - } -} - -/** - * @brief DFU_Req_GETSTATE - * Handles the DFU GETSTATE request. - * @param pdev: device instance - * @retval None - */ -static void DFU_Req_GETSTATE(void *pdev) -{ - /* Return the current state of the DFU interface */ - USBD_CtlSendData (pdev, - &DeviceState, - 1); -} - -/** - * @brief DFU_Req_ABORT - * Handles the DFU ABORT request. - * @param pdev: device instance - * @retval None - */ -static void DFU_Req_ABORT(void *pdev) -{ - if (DeviceState == STATE_dfuIDLE || DeviceState == STATE_dfuDNLOAD_SYNC - || DeviceState == STATE_dfuDNLOAD_IDLE || DeviceState == STATE_dfuMANIFEST_SYNC - || DeviceState == STATE_dfuUPLOAD_IDLE ) - { - DeviceState = STATE_dfuIDLE; - DeviceStatus[0] = STATUS_OK; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; /*bwPollTimeout=0ms*/ - DeviceStatus[4] = DeviceState; - DeviceStatus[5] = 0; /*iString*/ - wBlockNum = 0; - wlength = 0; - } -} - -/** - * @brief DFU_LeaveDFUMode - * Handles the sub-protocol DFU leave DFU mode request (leaves DFU mode - * and resets device to jump to user loaded code). - * @param pdev: device instance - * @retval None - */ -void DFU_LeaveDFUMode(void *pdev) -{ - Manifest_State = Manifest_complete; - - if ((usbd_dfu_CfgDesc[(11 + (9 * USBD_ITF_MAX_NUM))]) & 0x04) - { - DeviceState = STATE_dfuMANIFEST_SYNC; - DeviceStatus[4] = DeviceState; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; - return; - } - else - { - DeviceState = STATE_dfuMANIFEST_WAIT_RESET; - DeviceStatus[4] = DeviceState; - DeviceStatus[1] = 0; - DeviceStatus[2] = 0; - DeviceStatus[3] = 0; - - /* Disconnect the USB device */ - DCD_DevDisconnect (pdev); - - /* DeInitilialize the MAL(Media Access Layer) */ - MAL_DeInit(); - - /* Generate system reset to allow jumping to the user code */ - NVIC_SystemReset(); - - /* This instruction will not be reached (system reset) */ - return; - } -} - -/** - * @brief USBD_DFU_GetCfgDesc - * Returns configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_DFU_GetCfgDesc (uint8_t speed, uint16_t *length) -{ - *length = sizeof (usbd_dfu_CfgDesc); - return (uint8_t*)usbd_dfu_CfgDesc; -} - -/** - * @brief USBD_DFU_GetUsrStringDesc - * Manages the transfer of memory interfaces string descriptors. - * @param speed : current device speed - * @param index: descriptor index - * @param length : pointer data length - * @retval pointer to the descriptor table or NULL if the descriptor is not supported. - */ -static uint8_t* USBD_DFU_GetUsrStringDesc (uint8_t speed, uint8_t index , uint16_t *length) -{ - /* Check if the requested string interface is supported */ - if (index <= (USBD_IDX_INTERFACE_STR + USBD_ITF_MAX_NUM)) - { - - - USBD_GetString ((uint8_t *)usbd_dfu_StringDesc[index - USBD_IDX_INTERFACE_STR - 1], USBD_StrDesc, length); - return USBD_StrDesc; - } - /* Not supported Interface Descriptor index */ - else - { - return NULL; - } -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_dfu_mal.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_dfu_mal.c deleted file mode 100644 index c1c4d2b..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_dfu_mal.c +++ /dev/null @@ -1,256 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_dfu_mal.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Generic media access Layer. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_dfu_mal.h" -#include "usbd_flash_if.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Global Memories callback and string descriptors reference tables. - To add a new memory, modify the value of MAX_USED_MEDIA in usbd_dfu_mal.h - and add the pointer to the callback structure in this table. - Then add the pointer to the memory string descriptor in usbd_dfu_StringDesc table. - No other operation is required. */ -DFU_MAL_Prop_TypeDef* tMALTab[MAX_USED_MEDIA] = { - &DFU_Flash_cb -}; - -const uint8_t* usbd_dfu_StringDesc[MAX_USED_MEDIA] = { - FLASH_IF_STRING -}; - -/* RAM Buffer for Downloaded Data */ -uint8_t MAL_Buffer[XFERSIZE] ; - -/* Private function prototypes -----------------------------------------------*/ -static uint8_t MAL_CheckAdd (uint32_t Add); - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief MAL_Init - * Initializes the Media on the STM32 - * @param None - * @retval Result of the operation (MAL_OK in all cases) - */ -uint16_t MAL_Init(void) -{ - uint32_t memIdx = 0; - - /* Init all supported memories */ - for(memIdx = 0; memIdx < MAX_USED_MEDIA; memIdx++) - { - /* If the check address is positive, exit with the memory index */ - if (tMALTab[memIdx]->pMAL_Init != NULL) - { - tMALTab[memIdx]->pMAL_Init(); - } - } - - return MAL_OK; -} - -/** - * @brief MAL_DeInit - * DeInitializes the Media on the STM32 - * @param None - * @retval Result of the operation (MAL_OK in all cases) - */ -uint16_t MAL_DeInit(void) -{ - uint32_t memIdx = 0; - - /* Init all supported memories */ - for(memIdx = 0; memIdx < MAX_USED_MEDIA; memIdx++) - { - /* Check if the command is supported */ - if (tMALTab[memIdx]->pMAL_DeInit != NULL) - { - tMALTab[memIdx]->pMAL_DeInit(); - } - } - - return MAL_OK; -} - -/** - * @brief MAL_Erase - * Erase a sector of memory. - * @param Add: Sector address/code - * @retval Result of the operation: MAL_OK if all operations are OK else MAL_FAIL - */ -uint16_t MAL_Erase(uint32_t Add) -{ - uint32_t memIdx = MAL_CheckAdd(Add); - - /* Check if the area is protected */ - if (DFU_MAL_IS_PROTECTED_AREA(Add)) - { - return MAL_FAIL; - } - - if (memIdx < MAX_USED_MEDIA) - { - /* Check if the command is supported */ - if (tMALTab[memIdx]->pMAL_Erase != NULL) - { - return tMALTab[memIdx]->pMAL_Erase(Add); - } - else - { - return MAL_FAIL; - } - } - else - { - return MAL_FAIL; - } -} - -/** - * @brief MAL_Write - * Write sectors of memory. - * @param Add: Sector address/code - * @param Len: Number of data to be written (in bytes) - * @retval Result of the operation: MAL_OK if all operations are OK else MAL_FAIL - */ -uint16_t MAL_Write (uint32_t Add, uint32_t Len) -{ - uint32_t memIdx = MAL_CheckAdd(Add); - - /* Check if the area is protected */ - if (DFU_MAL_IS_PROTECTED_AREA(Add)) - { - return MAL_FAIL; - } - - if (memIdx < MAX_USED_MEDIA) - { - /* Check if the command is supported */ - if (tMALTab[memIdx]->pMAL_Write != NULL) - { - return tMALTab[memIdx]->pMAL_Write(Add, Len); - } - else - { - return MAL_FAIL; - } - } - else - { - return MAL_FAIL; - } -} - -/** - * @brief MAL_Read - * Read sectors of memory. - * @param Add: Sector address/code - * @param Len: Number of data to be written (in bytes) - * @retval Buffer pointer - */ -uint8_t *MAL_Read (uint32_t Add, uint32_t Len) -{ - uint32_t memIdx = MAL_CheckAdd(Add); - - if (memIdx < MAX_USED_MEDIA) - { - /* Check if the command is supported */ - if (tMALTab[memIdx]->pMAL_Read != NULL) - { - return tMALTab[memIdx]->pMAL_Read(Add, Len); - } - else - { - return MAL_Buffer; - } - } - else - { - return MAL_Buffer; - } -} - -/** - * @brief MAL_GetStatus - * Get the status of a given memory. - * @param Add: Sector address/code (allow to determine which memory will be addressed) - * @param Cmd: 0 for erase and 1 for write - * @param buffer: pointer to the buffer where the status data will be stored. - * @retval Buffer pointer - */ -uint16_t MAL_GetStatus(uint32_t Add , uint8_t Cmd, uint8_t *buffer) -{ - uint32_t memIdx = MAL_CheckAdd(Add); - - if (memIdx < MAX_USED_MEDIA) - { - if (Cmd & 0x01) - { - SET_POLLING_TIMING(tMALTab[memIdx]->EraseTiming); - } - else - { - SET_POLLING_TIMING(tMALTab[memIdx]->WriteTiming); - } - - return MAL_OK; - } - else - { - return MAL_FAIL; - } -} - -/** - * @brief MAL_CheckAdd - * Determine which memory should be managed. - * @param Add: Sector address/code (allow to determine which memory will be addressed) - * @retval Index of the addressed memory. - */ -static uint8_t MAL_CheckAdd(uint32_t Add) -{ - uint32_t memIdx = 0; - - /* Check with all supported memories */ - for(memIdx = 0; memIdx < MAX_USED_MEDIA; memIdx++) - { - /* If the check address is positive, exit with the memory index */ - if (tMALTab[memIdx]->pMAL_CheckAdd(Add) == MAL_OK) - { - return memIdx; - } - } - /* If no memory found, return MAX_USED_MEDIA */ - return (MAX_USED_MEDIA); -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_flash_if.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_flash_if.c deleted file mode 100644 index 9d45c19..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_flash_if.c +++ /dev/null @@ -1,164 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_flash_if.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Specific media access Layer for internal flash. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_flash_if.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ - -/* Private function prototypes -----------------------------------------------*/ -uint16_t FLASH_If_Init(void); -uint16_t FLASH_If_Erase (uint32_t Add); -uint16_t FLASH_If_Write (uint32_t Add, uint32_t Len); -uint8_t *FLASH_If_Read (uint32_t Add, uint32_t Len); -uint16_t FLASH_If_DeInit(void); -uint16_t FLASH_If_CheckAdd(uint32_t Add); - - -/* Private variables ---------------------------------------------------------*/ -DFU_MAL_Prop_TypeDef DFU_Flash_cb = -{ - FLASH_IF_STRING, - FLASH_If_Init, - FLASH_If_DeInit, - FLASH_If_Erase, - FLASH_If_Write, - FLASH_If_Read, - FLASH_If_CheckAdd, - 40, /* Erase Time in ms : extracted from flash memory datasheet Maximum - timming value for Sector Erase*/ - 60 /* Programming Time in ms (60us * RAM Buffer size (1024 Bytes) - extracted from flash memory datasheet Maximum timming value for 1024 bytes - Write)*/ -}; - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief FLASH_If_Init - * Memory initialization routine. - * @param None - * @retval MAL_OK if operation is successful, MAL_FAIL else. -*/ -uint16_t FLASH_If_Init(void) -{ - /* Unlock the internal flash */ - FLASH_Unlock(); - - return MAL_OK; -} - -/** - * @brief FLASH_If_DeInit - * Memory deinitialization routine. - * @param None - * @retval MAL_OK if operation is successful, MAL_FAIL else. - */ -uint16_t FLASH_If_DeInit(void) -{ - /* Lock the internal flash */ - FLASH_Lock(); - - return MAL_OK; -} - -/** - * @brief FLASH_If_Erase - * Erase sector. - * @param Add: Address to be written to. - * @retval MAL_OK if operation is successful, MAL_FAIL else. - */ -uint16_t FLASH_If_Erase(uint32_t Add) -{ - /* Call the standard Flash erase function */ - FLASH_ErasePage(Add); - - return MAL_OK; -} - -/** - * @brief FLASH_If_Write - * Memory write routine. - * @param Add: Address to be written to. - * @param Len: Number of data to be written (in bytes). - * @retval MAL_OK if operation is successful, MAL_FAIL else. - */ -uint16_t FLASH_If_Write(uint32_t Add, uint32_t Len) -{ - uint32_t idx = 0; - - if (Len & 0x3) /* Not an aligned data */ - { - for (idx = Len; idx < ((Len & 0xFFFC) + 4); idx++) - { - MAL_Buffer[idx] = 0xFF; - } - } - - /* Data received are Word multiple */ - for (idx = 0; idx < Len; idx = idx + 4) - { - FLASH_ProgramWord(Add, *(uint32_t *)(MAL_Buffer + idx)); - Add += 4; - } - return MAL_OK; -} - -/** - * @brief FLASH_If_Read - * Memory read routine. - * @param Add: Address to be read from. - * @param Len: Number of data to be read (in bytes). - * @retval Pointer to the physical address where data should be read. - */ -uint8_t *FLASH_If_Read (uint32_t Add, uint32_t Len) -{ - return (uint8_t *)(Add); -} - -/** - * @brief FLASH_If_CheckAdd - * Check if the address is an allowed address for this memory. - * @param Add: Address to be checked. - * @param Len: Number of data to be read (in bytes). - * @retval MAL_OK if the address is allowed, MAL_FAIL else. - */ -uint16_t FLASH_If_CheckAdd(uint32_t Add) -{ - if ((Add >= FLASH_START_ADD) && (Add < FLASH_END_ADD)) - { - return MAL_OK; - } - else - { - return MAL_FAIL; - } -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_mem_if_template.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_mem_if_template.c deleted file mode 100644 index 2bf838e..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/dfu/src/usbd_mem_if_template.c +++ /dev/null @@ -1,137 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_mem_if_template.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Specific media access Layer for a template memory. This file is - provided as template example showing how to implement a new memory - interface based on pre-defined API. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_mem_if_template.h" -#include "usbd_dfu_mal.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -uint16_t MEM_If_Init(void); -uint16_t MEM_If_Erase (uint32_t Add); -uint16_t MEM_If_Write (uint32_t Add, uint32_t Len); -uint8_t *MEM_If_Read (uint32_t Add, uint32_t Len); -uint16_t MEM_If_DeInit(void); -uint16_t MEM_If_CheckAdd(uint32_t Add); - -/* Private variables ---------------------------------------------------------*/ -DFU_MAL_Prop_TypeDef DFU_Mem_cb = - { - MEM_IF_STRING, - MEM_If_Init, - MEM_If_DeInit, - MEM_If_Erase, - MEM_If_Write, - MEM_If_Read, - MEM_If_CheckAdd, - 10, /* Erase Time in ms */ - 10 /* Programming Time in ms */ - }; - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief MEM_If_Init - * Memory initialization routine. - * @param None - * @retval MAL_OK if operation is successful, MAL_FAIL else. - */ -uint16_t MEM_If_Init(void) -{ - return MAL_OK; -} - -/** - * @brief MEM_If_DeInit - * Memory deinitialization routine. - * @param None - * @retval MAL_OK if operation is successful, MAL_FAIL else. - */ -uint16_t MEM_If_DeInit(void) -{ - return MAL_OK; -} - -/** - * @brief MEM_If_Erase - * Erase sector. - * @param Add: Address of sector to be erased. - * @retval MAL_OK if operation is successful, MAL_FAIL else. - */ -uint16_t MEM_If_Erase(uint32_t Add) -{ - return MAL_OK; -} - -/** - * @brief MEM_If_Write - * Memory write routine. - * @param Add: Address to be written to. - * @param Len: Number of data to be written (in bytes). - * @retval MAL_OK if operation is successful, MAL_FAIL else. - */ -uint16_t MEM_If_Write(uint32_t Add, uint32_t Len) -{ - return MAL_OK; -} - -/** - * @brief MEM_If_Read - * Memory read routine. - * @param Add: Address to be read from. - * @param Len: Number of data to be read (in bytes). - * @retval Pointer to the physical address where data should be read. - */ -uint8_t *MEM_If_Read (uint32_t Add, uint32_t Len) -{ - /* Return a valid address to avoid HardFault */ - return (uint8_t*)(MAL_Buffer); -} - -/** - * @brief MEM_If_CheckAdd - * Check if the address is an allowed address for this memory. - * @param Add: Address to be checked. - * @param Len: Number of data to be read (in bytes). - * @retval MAL_OK if the address is allowed, MAL_FAIL else. - */ -uint16_t MEM_If_CheckAdd(uint32_t Add) -{ - if ((Add >= MEM_START_ADD) && (Add < MEM_END_ADD)) - { - return MAL_OK; - } - else - { - return MAL_FAIL; - } -} -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/inc/usbd_custom_hid_core.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/inc/usbd_custom_hid_core.h deleted file mode 100644 index abe3f99..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/inc/usbd_custom_hid_core.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_hid_core.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header file for the usbd_hid_core.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_HID_CORE_H_ -#define __USB_HID_CORE_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" - -/* Exported defines ----------------------------------------------------------*/ -#define USB_HID_CONFIG_DESC_SIZ 34 -#define USB_HID_DESC_SIZ 9 -#define HID_MOUSE_REPORT_DESC_SIZE 74 - -#define HID_DESCRIPTOR_TYPE 0x21 -#define HID_REPORT_DESC 0x22 - - -#define HID_REQ_SET_PROTOCOL 0x0B -#define HID_REQ_GET_PROTOCOL 0x03 - -#define HID_REQ_SET_IDLE 0x0A -#define HID_REQ_GET_IDLE 0x02 - -#define HID_REQ_SET_REPORT 0x09 -#define HID_REQ_GET_REPORT 0x01 - -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern USBD_Class_cb_TypeDef USBD_HID_cb; - -/* Exported functions ------------------------------------------------------- */ - -uint8_t USBD_HID_SendReport (USB_CORE_HANDLE *pdev, - uint8_t *report, - uint16_t len); - -#endif /* __USB_HID_CORE_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/inc/usbd_hid_core.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/inc/usbd_hid_core.h deleted file mode 100644 index aa56024..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/inc/usbd_hid_core.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_hid_core.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header file for the usbd_hid_core.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_HID_CORE_H_ -#define __USB_HID_CORE_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" - -/* Exported defines ----------------------------------------------------------*/ -#define USB_HID_CONFIG_DESC_SIZ 34 -#define USB_HID_DESC_SIZ 9 -#define HID_MOUSE_REPORT_DESC_SIZE 74 - -#define HID_DESCRIPTOR_TYPE 0x21 -#define HID_REPORT_DESC 0x22 - - -#define HID_REQ_SET_PROTOCOL 0x0B -#define HID_REQ_GET_PROTOCOL 0x03 - -#define HID_REQ_SET_IDLE 0x0A -#define HID_REQ_GET_IDLE 0x02 - -#define HID_REQ_SET_REPORT 0x09 -#define HID_REQ_GET_REPORT 0x01 - -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern USBD_Class_cb_TypeDef USBD_HID_cb; - -/* Exported functions ------------------------------------------------------- */ - -uint8_t USBD_HID_SendReport (USB_CORE_HANDLE *pdev, - uint8_t *report, - uint16_t len); -#endif /* __USB_HID_CORE_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/src/usbd_custom_hid_core.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/src/usbd_custom_hid_core.c deleted file mode 100644 index 81e9dad..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/src/usbd_custom_hid_core.c +++ /dev/null @@ -1,622 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_hid_core.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides the HID core functions. - * - * @verbatim - * - * =================================================================== - * HID Class Description - * =================================================================== - * This module manages the HID class V1.11 following the "Device Class Definition - * for Human Interface Devices (HID) Version 1.11 Jun 27, 2001". - * This driver implements the following aspects of the specification: - * - The Boot Interface Subclass - * - The Mouse protocol - * - Usage Page : Generic Desktop - * - Usage : Custom - * - Collection : Application - * - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_custom_hid_core.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -uint8_t USBD_HID_Init (void *pdev, - uint8_t cfgidx); - -uint8_t USBD_HID_DeInit (void *pdev, - uint8_t cfgidx); - -uint8_t USBD_HID_Setup (void *pdev, - USB_SETUP_REQ *req); - -uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length); - - -uint8_t USBD_HID_DataIn (void *pdev, uint8_t epnum); - - -uint8_t USBD_HID_DataOut (void *pdev, uint8_t epnum); - - -uint8_t USBD_HID_EP0_RxReady (void *pdev); - -USBD_Class_cb_TypeDef USBD_HID_cb = -{ - USBD_HID_Init, - USBD_HID_DeInit, - USBD_HID_Setup, - NULL, /*EP0_TxSent*/ - USBD_HID_EP0_RxReady, /*EP0_RxReady*/ /* STATUS STAGE IN */ - USBD_HID_DataIn, /*DataIn*/ - USBD_HID_DataOut, /*DataOut*/ - NULL, /*SOF */ - USBD_HID_GetCfgDesc, -}; - - - -uint8_t Report_buf[2]; -uint8_t USBD_HID_Report_ID=0; -uint8_t flag = 0; -extern uint8_t PrevXferDone; - -static uint32_t USBD_HID_AltSet = 0; - -static uint32_t USBD_HID_Protocol = 0; - -static uint32_t USBD_HID_IdleState = 0; - -/* USB HID device Configuration Descriptor */ -const uint8_t USBD_HID_CfgDesc[CUSTOMHID_SIZ_CONFIG_DESC] = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ - CUSTOMHID_SIZ_CONFIG_DESC, - /* wTotalLength: Bytes returned */ - 0x00, - 0x01, /*bNumInterfaces: 1 interface*/ - 0x01, /*bConfigurationValue: Configuration value*/ - 0x00, /*iConfiguration: Index of string descriptor describing - the configuration*/ - 0xC0, /*bmAttributes: bus powered and Support Remote Wake-up */ - 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ - - /************** Descriptor of Custom HID interface ****************/ - /* 09 */ - 0x09, /*bLength: Interface Descriptor size*/ - USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ - 0x00, /*bInterfaceNumber: Number of Interface*/ - 0x00, /*bAlternateSetting: Alternate setting*/ - 0x02, /*bNumEndpoints*/ - 0x03, /*bInterfaceClass: HID*/ - 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ - 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ - 0, /*iInterface: Index of string descriptor*/ - /******************** Descriptor of Custom HID ********************/ - /* 18 */ - 0x09, /*bLength: HID Descriptor size*/ - HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ - 0x11, /*bcdHID: HID Class Spec release number*/ - 0x01, - 0x00, /*bCountryCode: Hardware target country*/ - 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ - 0x22, /*bDescriptorType*/ - CUSTOMHID_SIZ_REPORT_DESC,/*wItemLength: Total length of Report descriptor*/ - 0x00, - /******************** Descriptor of Custom HID endpoints ***********/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ - - HID_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_IN_PACKET, /* wMaxPacketSize: 2 Bytes max */ - 0x00, - 0x20, /* bInterval: Polling Interval (32 ms) */ - /* 34 */ - - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ - /* Endpoint descriptor type */ - HID_OUT_EP, /* bEndpointAddress: */ - /* Endpoint Address (OUT) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_OUT_PACKET, /* wMaxPacketSize: 2 Bytes max */ - 0x00, - 0x20, /* bInterval: Polling Interval (20 ms) */ - /* 41 */ -} ; - -const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = -{ - 0x06, 0xFF, 0x00, /* USAGE_PAGE (Vendor Page: 0xFF00) */ - 0x09, 0x01, /* USAGE (Demo Kit) */ - 0xa1, 0x01, /* COLLECTION (Application) */ - /* 6 */ - - /* Led 1 */ - 0x85, 0x01, /* REPORT_ID (1) */ - 0x09, 0x01, /* USAGE (LED 1) */ - 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ - 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ - 0x75, 0x08, /* REPORT_SIZE (8) */ - 0x95, 0x01, /* REPORT_COUNT (1) */ - 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ - - 0x85, 0x01, /* REPORT_ID (1) */ - 0x09, 0x01, /* USAGE (LED 1) */ - 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ - /* 26 */ - - /* Led 2 */ - 0x85, 0x02, /* REPORT_ID 2 */ - 0x09, 0x02, /* USAGE (LED 2) */ - 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ - 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ - 0x75, 0x08, /* REPORT_SIZE (8) */ - 0x95, 0x01, /* REPORT_COUNT (1) */ - 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ - - 0x85, 0x02, /* REPORT_ID (2) */ - 0x09, 0x02, /* USAGE (LED 2) */ - 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ - /* 46 */ - - /* Led 3 */ - 0x85, 0x03, /* REPORT_ID (3) */ - 0x09, 0x03, /* USAGE (LED 3) */ - 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ - 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ - 0x75, 0x08, /* REPORT_SIZE (8) */ - 0x95, 0x01, /* REPORT_COUNT (1) */ - 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ - - 0x85, 0x03, /* REPORT_ID (3) */ - 0x09, 0x03, /* USAGE (LED 3) */ - 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ - /* 66 */ - - /* Led 4 */ - 0x85, 0x04, /* REPORT_ID 4) */ - 0x09, 0x04, /* USAGE (LED 4) */ - 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ - 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ - 0x75, 0x08, /* REPORT_SIZE (8) */ - 0x95, 0x01, /* REPORT_COUNT (1) */ - 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ - - 0x85, 0x04, /* REPORT_ID (4) */ - 0x09, 0x04, /* USAGE (LED 4) */ - 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ - /* 86 */ - - /* key Push Button */ - 0x85, 0x05, /* REPORT_ID (5) */ - 0x09, 0x05, /* USAGE (Push Button) */ - 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ - 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ - 0x75, 0x01, /* REPORT_SIZE (1) */ - 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ - - 0x09, 0x05, /* USAGE (Push Button) */ - 0x75, 0x01, /* REPORT_SIZE (1) */ - 0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ - - 0x75, 0x07, /* REPORT_SIZE (7) */ - 0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol) */ - 0x85, 0x05, /* REPORT_ID (2) */ - - 0x75, 0x07, /* REPORT_SIZE (7) */ - 0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol) */ - /* 114 */ - - /* Tamper Push Button */ - 0x85, 0x06, /* REPORT_ID (6) */ - 0x09, 0x06, /* USAGE (Tamper Push Button) */ - 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ - 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ - 0x75, 0x01, /* REPORT_SIZE (1) */ - 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ - - 0x09, 0x06, /* USAGE (Tamper Push Button) */ - 0x75, 0x01, /* REPORT_SIZE (1) */ - 0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ - - 0x75, 0x07, /* REPORT_SIZE (7) */ - 0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol) */ - 0x85, 0x06, /* REPORT_ID (6) */ - - 0x75, 0x07, /* REPORT_SIZE (7) */ - 0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol) */ - /* 142 */ - - /* ADC IN */ - 0x85, 0x07, /* REPORT_ID (7) */ - 0x09, 0x07, /* USAGE (ADC IN) */ - 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ - 0x26, 0xff, 0x00, /* LOGICAL_MAXIMUM (255) */ - 0x75, 0x08, /* REPORT_SIZE (8) */ - 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ - 0x85, 0x07, /* REPORT_ID (7) */ - 0x09, 0x07, /* USAGE (ADC in) */ - 0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ - /* 161 */ - - 0xc0 /* END_COLLECTION */ -}; /* CustomHID_ReportDescriptor */ - -/* Private function ----------------------------------------------------------*/ -/** - * @brief USBD_HID_Init - * Initialize the HID interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -uint8_t USBD_HID_Init (void *pdev, - uint8_t cfgidx) -{ - DCD_PMA_Config(pdev , HID_IN_EP,USB_SNG_BUF,HID_IN_TX_ADDRESS); - DCD_PMA_Config(pdev , HID_OUT_EP,USB_SNG_BUF,HID_OUT_RX_ADDRESS); - - /* Open EP IN */ - DCD_EP_Open(pdev, - HID_IN_EP, - HID_IN_PACKET, - USB_EP_INT); - - /* Open EP OUT */ - DCD_EP_Open(pdev, - HID_OUT_EP, - HID_OUT_PACKET, - USB_EP_INT); - - /*Receive Data*/ - DCD_EP_PrepareRx(pdev,HID_OUT_EP,Report_buf,2); - - return USBD_OK; -} - -/** - * @brief USBD_HID_Init - * DeInitialize the HID layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -uint8_t USBD_HID_DeInit (void *pdev, - uint8_t cfgidx) -{ - /* Close HID EPs */ - DCD_EP_Close (pdev , HID_IN_EP); - DCD_EP_Close (pdev , HID_OUT_EP); - - return USBD_OK; -} - -/** - * @brief USBD_HID_Setup - * Handle the HID specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -uint8_t USBD_HID_Setup (void *pdev, - USB_SETUP_REQ *req) -{ - uint8_t USBD_HID_Report_LENGTH=0; - uint16_t len = 0; - uint8_t *pbuf = NULL; - - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS : - switch (req->bRequest) - { - case HID_REQ_SET_PROTOCOL: - USBD_HID_Protocol = (uint8_t)(req->wValue); - break; - - case HID_REQ_GET_PROTOCOL: - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_HID_Protocol, - 1); - break; - - case HID_REQ_SET_IDLE: - USBD_HID_IdleState = (uint8_t)(req->wValue >> 8); - break; - - case HID_REQ_GET_IDLE: - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_HID_IdleState, - 1); - break; - - case HID_REQ_SET_REPORT: - flag = 1; - USBD_HID_Report_ID = (uint8_t)(req->wValue); - USBD_HID_Report_LENGTH = (uint8_t)(req->wLength); - USBD_CtlPrepareRx (pdev, Report_buf, USBD_HID_Report_LENGTH); - - break; - - default: - USBD_CtlError (pdev, req); - return USBD_FAIL; - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - if( req->wValue >> 8 == HID_REPORT_DESC) - { - len = MIN(CUSTOMHID_SIZ_REPORT_DESC , req->wLength); - pbuf = (uint8_t*)CustomHID_ReportDescriptor; - } - else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE) - { - pbuf = (uint8_t*)USBD_HID_CfgDesc + 0x12; - len = MIN(USB_HID_DESC_SIZ , req->wLength); - } - - USBD_CtlSendData (pdev, - pbuf, - len); - - break; - - case USB_REQ_GET_INTERFACE : - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_HID_AltSet, - 1); - break; - - case USB_REQ_SET_INTERFACE : - USBD_HID_AltSet = (uint8_t)(req->wValue); - break; - } - } - return USBD_OK; -} - -/** - * @brief USBD_HID_SendReport - * Send HID Report - * @param pdev: device instance - * @param buff: pointer to report - * @retval status - */ -uint8_t USBD_HID_SendReport (USB_CORE_HANDLE *pdev, - uint8_t *report, - uint16_t len) -{ - /* Check if USB is configured */ - if (pdev->dev.device_status == USB_CONFIGURED ) - { - DCD_EP_Tx (pdev, HID_IN_EP, report, len); - } - return USBD_OK; -} - -/** - * @brief USBD_HID_GetCfgDesc - * return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length) -{ - *length = sizeof (USBD_HID_CfgDesc); - return (uint8_t*)USBD_HID_CfgDesc; -} - -/** - * @brief USBD_HID_DataIn - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -uint8_t USBD_HID_DataIn (void *pdev, - uint8_t epnum) -{ - if (epnum == 1) PrevXferDone = 1; - - return USBD_OK; -} - -/** - * @brief USBD_HID_DataOut - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -uint8_t USBD_HID_DataOut (void *pdev, - uint8_t epnum) -{ - - BitAction Led_State; - if (epnum == 1) - { - if (Report_buf[1] == 0) - { - Led_State = Bit_RESET; - } - else - { - Led_State = Bit_SET; - } - - switch (Report_buf[0]) - { - case 1: /* Led 1 */ - if (Led_State != Bit_RESET) - { - STM_EVAL_LEDOn(LED1); - } - else - { - STM_EVAL_LEDOff(LED1); - } - break; - - case 2: /* Led 2 */ - if (Led_State != Bit_RESET) - { - STM_EVAL_LEDOn(LED2); - } - else - { - STM_EVAL_LEDOff(LED2); - } - break; - case 3: /* Led 3 */ - if (Led_State != Bit_RESET) - { - STM_EVAL_LEDOn(LED3); - } - else - { - STM_EVAL_LEDOff(LED3); - } - break; - case 4: /* Led 4 */ - if (Led_State != Bit_RESET) - { - STM_EVAL_LEDOn(LED4); - } - else - { - STM_EVAL_LEDOff(LED4); - } - break; - default: - STM_EVAL_LEDOff(LED1); - STM_EVAL_LEDOff(LED2); - STM_EVAL_LEDOff(LED3); - STM_EVAL_LEDOff(LED4); - break; - } - } - - DCD_EP_PrepareRx(pdev,HID_IN_EP,Report_buf,2); - - return USBD_OK; -} - -/** - * @brief USBD_HID_EP0_RxReady - * Handles control request data. - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ - -uint8_t USBD_HID_EP0_RxReady(void *pdev) -{ - BitAction Led_State; - - if (flag == 1) - { - flag = 0; - if (Report_buf[1] == 0) - { - Led_State = Bit_RESET; - } - else - { - Led_State = Bit_SET; - } - - switch (Report_buf[0]) - { - case 1: /* Led 1 */ - if (Led_State != Bit_RESET) - { - STM_EVAL_LEDOn(LED1); - } - else - { - STM_EVAL_LEDOff(LED1); - } - break; - - case 2: /* Led 2 */ - if (Led_State != Bit_RESET) - { - STM_EVAL_LEDOn(LED2); - } - else - { - STM_EVAL_LEDOff(LED2); - } - break; - case 3: /* Led 3 */ - if (Led_State != Bit_RESET) - { - STM_EVAL_LEDOn(LED3); - } - else - { - STM_EVAL_LEDOff(LED3); - } - break; - case 4: /* Led 4 */ - if (Led_State != Bit_RESET) - { - STM_EVAL_LEDOn(LED4); - } - else - { - STM_EVAL_LEDOff(LED4); - } - break; - default: - STM_EVAL_LEDOff(LED1); - STM_EVAL_LEDOff(LED2); - STM_EVAL_LEDOff(LED3); - STM_EVAL_LEDOff(LED4); - break; - } - } - return USBD_OK; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/src/usbd_hid_core.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/src/usbd_hid_core.c deleted file mode 100644 index a108423..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid/src/usbd_hid_core.c +++ /dev/null @@ -1,342 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_hid_core.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides the HID core functions. - * - * @verbatim - * - * =================================================================== - * HID Class Description - * =================================================================== - * This module manages the HID class V1.11 following the "Device Class Definition - * for Human Interface Devices (HID) Version 1.11 Jun 27, 2001". - * This driver implements the following aspects of the specification: - * - The Boot Interface Subclass - * - The Mouse protocol - * - Usage Page : Generic Desktop - * - Usage : Joystick - * - Collection : Application - * - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_hid_core.h" - - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static uint8_t USBD_HID_Init (void *pdev, - uint8_t cfgidx); - -static uint8_t USBD_HID_DeInit (void *pdev, - uint8_t cfgidx); - -static uint8_t USBD_HID_Setup (void *pdev, - USB_SETUP_REQ *req); - -static uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length); - -USBD_Class_cb_TypeDef USBD_HID_cb = -{ - USBD_HID_Init, - USBD_HID_DeInit, - USBD_HID_Setup, - NULL, /*EP0_TxSent*/ - NULL, /*EP0_RxReady*/ - NULL, /*DataIn*/ - NULL, /*DataOut*/ - NULL, /*SOF */ - USBD_HID_GetCfgDesc, -}; - -static uint32_t USBD_HID_AltSet = 0; - -static uint32_t USBD_HID_Protocol = 0; - -static uint32_t USBD_HID_IdleState = 0; - -/* USB HID device Configuration Descriptor */ -const uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ - USB_HID_CONFIG_DESC_SIZ, - /* wTotalLength: Bytes returned */ - 0x00, - 0x01, /*bNumInterfaces: 1 interface*/ - 0x01, /*bConfigurationValue: Configuration value*/ - 0x00, /*iConfiguration: Index of string descriptor describing - the configuration*/ - 0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */ - 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ - - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /*bLength: Interface Descriptor size*/ - USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ - 0x00, /*bInterfaceNumber: Number of Interface*/ - 0x00, /*bAlternateSetting: Alternate setting*/ - 0x01, /*bNumEndpoints*/ - 0x03, /*bInterfaceClass: HID*/ - 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ - 0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ - 0, /*iInterface: Index of string descriptor*/ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /*bLength: HID Descriptor size*/ - HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ - 0x11, /*bcdHID: HID Class Spec release number*/ - 0x01, - 0x00, /*bCountryCode: Hardware target country*/ - 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ - 0x22, /*bDescriptorType*/ - HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /*bLength: Endpoint Descriptor size*/ - USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ - - HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/ - 0x03, /*bmAttributes: Interrupt endpoint*/ - HID_IN_PACKET, /*wMaxPacketSize: 4 Byte max */ - 0x00, - 0x0A, /*bInterval: Polling Interval (10 ms)*/ - /* 34 */ -} ; - -const uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] = -{ - 0x05, 0x01, - 0x09, 0x02, - 0xA1, 0x01, - 0x09, 0x01, - - 0xA1, 0x00, - 0x05, 0x09, - 0x19, 0x01, - 0x29, 0x03, - - 0x15, 0x00, - 0x25, 0x01, - 0x95, 0x03, - 0x75, 0x01, - - 0x81, 0x02, - 0x95, 0x01, - 0x75, 0x05, - 0x81, 0x01, - - 0x05, 0x01, - 0x09, 0x30, - 0x09, 0x31, - 0x09, 0x38, - - 0x15, 0x81, - 0x25, 0x7F, - 0x75, 0x08, - 0x95, 0x03, - - 0x81, 0x06, - 0xC0, 0x09, - 0x3c, 0x05, - 0xff, 0x09, - - 0x01, 0x15, - 0x00, 0x25, - 0x01, 0x75, - 0x01, 0x95, - - 0x02, 0xb1, - 0x22, 0x75, - 0x06, 0x95, - 0x01, 0xb1, - - 0x01, 0xc0 -}; - -/* Private function ----------------------------------------------------------*/ -/** - * @brief USBD_HID_Init - * Initialize the HID interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_HID_Init (void *pdev, - uint8_t cfgidx) -{ - DCD_PMA_Config(pdev , HID_IN_EP,USB_SNG_BUF,HID_IN_TX_ADDRESS); - - /* Open EP IN */ - DCD_EP_Open(pdev, - HID_IN_EP, - HID_IN_PACKET, - USB_EP_INT); - - /* Open EP OUT */ - DCD_EP_Open(pdev, - HID_OUT_EP, - HID_OUT_PACKET, - USB_EP_INT); - - return USBD_OK; -} - -/** - * @brief USBD_HID_Init - * DeInitialize the HID layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_HID_DeInit (void *pdev, - uint8_t cfgidx) -{ - /* Close HID EPs */ - DCD_EP_Close (pdev , HID_IN_EP); - DCD_EP_Close (pdev , HID_OUT_EP); - - - return USBD_OK; -} - -/** - * @brief USBD_HID_Setup - * Handle the HID specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_HID_Setup (void *pdev, - USB_SETUP_REQ *req) -{ - uint16_t len = 0; - uint8_t *pbuf = NULL; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS : - switch (req->bRequest) - { - case HID_REQ_SET_PROTOCOL: - USBD_HID_Protocol = (uint8_t)(req->wValue); - break; - - case HID_REQ_GET_PROTOCOL: - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_HID_Protocol, - 1); - break; - - case HID_REQ_SET_IDLE: - USBD_HID_IdleState = (uint8_t)(req->wValue >> 8); - break; - - case HID_REQ_GET_IDLE: - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_HID_IdleState, - 1); - break; - - default: - USBD_CtlError (pdev, req); - return USBD_FAIL; - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - if( req->wValue >> 8 == HID_REPORT_DESC) - { - len = MIN(HID_MOUSE_REPORT_DESC_SIZE , req->wLength); - pbuf = (uint8_t *)HID_MOUSE_ReportDesc; - } - else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE) - { - pbuf = (uint8_t *)USBD_HID_CfgDesc + 0x12; - len = MIN(USB_HID_DESC_SIZ , req->wLength); - } - - USBD_CtlSendData (pdev, - pbuf, - len); - - break; - - case USB_REQ_GET_INTERFACE : - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_HID_AltSet, - 1); - break; - - case USB_REQ_SET_INTERFACE : - USBD_HID_AltSet = (uint8_t)(req->wValue); - break; - } - } - return USBD_OK; -} - -/** - * @brief USBD_HID_SendReport - * Send HID Report - * @param pdev: device instance - * @param buff: pointer to report - * @retval status - */ -uint8_t USBD_HID_SendReport (USB_CORE_HANDLE *pdev, - uint8_t *report, - uint16_t len) -{ - /* Check if USB is configured */ - if (pdev->dev.device_status == USB_CONFIGURED ) - { - DCD_EP_Tx (pdev, HID_IN_EP, report, len); - } - return USBD_OK; -} - -/** - * @brief USBD_HID_GetCfgDesc - * return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length) -{ - *length = sizeof (USBD_HID_CfgDesc); - return (uint8_t *)USBD_HID_CfgDesc; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_cdc_wrapper/inc/usbd_hid_cdc_wrapper.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_cdc_wrapper/inc/usbd_hid_cdc_wrapper.h deleted file mode 100644 index 7f9358e..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_cdc_wrapper/inc/usbd_hid_cdc_wrapper.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_hid_cdc_wrapper.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header file for the usbd_hid_cdc_wrapper.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_HID_CDC_WRAPPER_H_ -#define __USB_HID_CDC_WRAPPER_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_custom_hid_core.h" -#include "usbd_cdc_core.h" - -/* Exported defines ----------------------------------------------------------*/ -#define HID_INTERFACE 0x0 -#define CDC_COM_INTERFACE 0x1 - -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -#define USB_HID_CDC_CONFIG_DESC_SIZ (CUSTOMHID_SIZ_CONFIG_DESC -9 + USB_CDC_CONFIG_DESC_SIZ + 8) - -/* Exported variables --------------------------------------------------------*/ -extern USBD_Class_cb_TypeDef USBD_HID_CDC_cb; - -/* Exported functions ------------------------------------------------------- */ - -#endif /* __USB_HID_CDC_WRAPPER_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_cdc_wrapper/src/usbd_hid_cdc_wrapper.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_cdc_wrapper/src/usbd_hid_cdc_wrapper.c deleted file mode 100644 index f17ec25..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_cdc_wrapper/src/usbd_hid_cdc_wrapper.c +++ /dev/null @@ -1,404 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_hid_wrapper.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file calls to the separate CDC and HID class layer handlers. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *******************************************************************************/ - /* - * =================================================================== - * composite CDC_HID - * =================================================================== */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_hid_cdc_wrapper.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* USBD_CDC_HID_Private_Variables */ -static uint8_t USBD_HID_CDC_Init (void *pdev , uint8_t cfgidx); -static uint8_t USBD_HID_CDC_DeInit (void *pdev , uint8_t cfgidx); - -/* Control Endpoints*/ -static uint8_t USBD_HID_CDC_Setup (void *pdev , USB_SETUP_REQ *req); -static uint8_t USBD_HID_CDC_EP0_RxReady (void *pdev); -/* Class Specific Endpoints*/ -static uint8_t USBD_HID_CDC_DataIn (void *pdev , uint8_t epnum); -static uint8_t USBD_HID_CDC_DataOut (void *pdev , uint8_t epnum); -static uint8_t USBD_HID_CDC_SOF (void *pdev); - -static uint8_t* USBD_HID_CDC_GetConfigDescriptor( uint8_t speed , uint16_t *length); - -/* HID_CDC_CORE_Private_Variables */ -USBD_Class_cb_TypeDef USBD_HID_CDC_cb = -{ - USBD_HID_CDC_Init, - USBD_HID_CDC_DeInit, - USBD_HID_CDC_Setup, - NULL, - USBD_HID_CDC_EP0_RxReady, - USBD_HID_CDC_DataIn, - USBD_HID_CDC_DataOut, - USBD_HID_CDC_SOF, - USBD_HID_CDC_GetConfigDescriptor, -}; - -/* USB CDC_HID device Configuration Descriptor */ -const uint8_t USBD_HID_CDC_CfgDesc[USB_HID_CDC_CONFIG_DESC_SIZ] = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ - USB_HID_CDC_CONFIG_DESC_SIZ, - /* wTotalLength: Bytes returned */ - 0x00, - 0x03, /*bNumInterfaces: 3 interfaces (2 for CDC, 1 for HID)*/ - 0x01, /*bConfigurationValue: Configuration value*/ - 0x00, /*iConfiguration: Index of string descriptor describing - the configuration*/ - 0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */ - 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ - - /************** Descriptor of CUSTOM HID interface ****************/ - /* 09 */ - 0x09, /*bLength: Interface Descriptor size*/ - USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ - HID_INTERFACE, /*bInterfaceNumber: Number of Interface*/ - 0x00, /*bAlternateSetting: Alternate setting*/ - 0x02, /*bNumEndpoints*/ - 0x03, /*bInterfaceClass: HID*/ - 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ - 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ - 0, /*iInterface: Index of string descriptor*/ - /******************** Descriptor of CUSTOM HID **************************/ - /* 18 */ - 0x09, /*bLength: HID Descriptor size*/ - HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ - 0x11, /*bcdHID: HID Class Spec release number*/ - 0x01, - 0x00, /*bCountryCode: Hardware target country*/ - 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ - 0x22, /*bDescriptorType*/ - CUSTOMHID_SIZ_REPORT_DESC,/*wItemLength: Total length of Report descriptor*/ - 0x00, - /******************** Descriptor of CUSTOM HID endpoint *********************/ - /* 27 */ - 0x07, /*bLength: Endpoint Descriptor size*/ - USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ - - HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/ - 0x03, /*bmAttributes: Interrupt endpoint*/ - HID_IN_PACKET, /*wMaxPacketSize: 2 Byte max */ - 0x00, - 0x20, /*bInterval: Polling Interval (32 ms)*/ - /* 34 */ - - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ - /* Endpoint descriptor type */ - HID_OUT_EP, /* bEndpointAddress: */ - /* Endpoint Address (OUT) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_OUT_PACKET, /* wMaxPacketSize: 2 Bytes max */ - 0x00, - 0x20, /* bInterval: Polling Interval (20 ms) */ - /* 41 */ - - /******** IAD should be positioned just before the CDC interfaces ****** - IAD to associate the two CDC interfaces */ - - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - 0x01, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /*************************** CDC interfaces *******************************/ - - /*Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - CDC_COM_INTERFACE, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x01, /* iInterface: */ - - /*Header Functional Descriptor*/ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /*Call Management Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - 0x02, /* bDataInterface: 2 */ - - /*ACM Functional Descriptor*/ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /*Union Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - 0x01, /* bMasterInterface: Communication class interface */ - 0x02, /* bSlaveInterface0: Data Class Interface */ - - /*Endpoint 2 Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SZE), - 0xFF, /* bInterval: */ - - /*---------------------------------------------------------------------------*/ - - /*Data class interface descriptor*/ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ - 0x02, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /*Endpoint OUT Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - 0x40, /* wMaxPacketSize: */ - 0x00, - 0x00, /* bInterval: ignore for Bulk transfer */ - - /*Endpoint IN Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - 0x40, /* wMaxPacketSize: */ - 0x00, - 0x00, /* bInterval */ - -}; /* USBD_HID_CDC_CfgDesc */ - -/* Private function prototypes -----------------------------------------------*/ -/********************************************* - CDC Device library callbacks -*********************************************/ -extern uint8_t usbd_cdc_Init (void *pdev, uint8_t cfgidx); -extern uint8_t usbd_cdc_DeInit (void *pdev, uint8_t cfgidx); -extern uint8_t usbd_cdc_Setup (void *pdev, USB_SETUP_REQ *req); -extern uint8_t usbd_cdc_EP0_RxReady (void *pdev); -extern uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum); -extern uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum); -extern uint8_t usbd_cdc_SOF (void *pdev); - -/********************************************* - HID Device library callbacks -*********************************************/ -extern uint8_t USBD_HID_Init (void *pdev, uint8_t cfgidx); -extern uint8_t USBD_HID_DeInit (void *pdev, uint8_t cfgidx); -extern uint8_t USBD_HID_Setup (void *pdev, USB_SETUP_REQ *req); -extern uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length); -extern uint8_t USBD_HID_DataIn (void *pdev, uint8_t epnum); -extern uint8_t USBD_HID_DataOut (void *pdev, uint8_t epnum); -extern uint8_t USBD_HID_EP0_RxReady (void *pdev); - -/* Private function ----------------------------------------------------------*/ -/** - * @brief USBD_HID_CDC_Init - * Initialize the HID & CDC interfaces - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_HID_CDC_Init (void *pdev, - uint8_t cfgidx) -{ - /* HID initialization */ - USBD_HID_Init (pdev,cfgidx); - - /* CDC initialization */ - usbd_cdc_Init (pdev,cfgidx); - - return USBD_OK; - -} - -/** - * @brief USBD_HID_Init - * DeInitialize the HID/CDC interfaces - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_HID_CDC_DeInit (void *pdev, - uint8_t cfgidx) -{ - /* HID De-initialization */ - USBD_HID_DeInit (pdev,cfgidx); - - /* CDC De-initialization */ - usbd_cdc_DeInit (pdev,cfgidx); - - - return USBD_OK; -} - -/** - * @brief USBD_HID_Setup - * Handle the HID specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_HID_CDC_Setup (void *pdev, - USB_SETUP_REQ *req) -{ - switch (req->bmRequest & USB_REQ_RECIPIENT_MASK) - { - case USB_REQ_RECIPIENT_INTERFACE: - if (req->wIndex == HID_INTERFACE) - { - return (USBD_HID_Setup (pdev, req)); - } - else - { - return (usbd_cdc_Setup(pdev, req)); - } - case USB_REQ_RECIPIENT_ENDPOINT: - if ((req->wIndex == HID_IN_EP) || (req->wIndex == HID_OUT_EP)) - { - return (USBD_HID_Setup (pdev, req)); - } - else - { - return (usbd_cdc_Setup(pdev, req)); - } - } - return USBD_OK; -} - -/** - * @brief USBD_HID_CDC_GetCfgDesc - * return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_HID_CDC_GetConfigDescriptor (uint8_t speed, uint16_t *length) -{ - *length = sizeof (USBD_HID_CDC_CfgDesc); - return (uint8_t*)USBD_HID_CDC_CfgDesc; -} - -/** - * @brief USBD_HID_CDC_DataIn - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_HID_CDC_DataIn (void *pdev, - uint8_t epnum) -{ - /*DataIN can be for CDC or HID */ - - if (epnum == (CDC_IN_EP&~0x80) ) - { - return (usbd_cdc_DataIn(pdev, epnum)); - } - else - { - return (USBD_HID_DataIn(pdev, epnum)); - } -} - -/** - * @brief USBD_HID_CDC_DataOut - * handle data OUT Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -uint8_t USBD_HID_CDC_DataOut(void *pdev , uint8_t epnum) -{ - /*DataOut can be for CDC or HID */ - - if (epnum == (CDC_OUT_EP&~0x80) ) - { - return (usbd_cdc_DataOut(pdev, epnum)); - } - else - { - return (USBD_HID_DataOut(pdev, epnum)); - } -} - -/** - * @brief USBD_HID_CDC_SOF - * handle SOF processing - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ - -uint8_t USBD_HID_CDC_SOF (void *pdev) -{ - /*SOF processing needed for CDC */ - return (usbd_cdc_SOF(pdev)); -} - -/** - * @brief USBD_HID_CDC_EP0_RxReady - * handle RxReady processing - * @param pdev: device istance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_HID_CDC_EP0_RxReady (void *pdev) -{ - /* RxReady processing needed for CDC or HID */ - (usbd_cdc_EP0_RxReady(pdev)); - (USBD_HID_EP0_RxReady(pdev)); - return USBD_OK; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_msc_wrapper/inc/usbd_hid_msc_wrapper.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_msc_wrapper/inc/usbd_hid_msc_wrapper.h deleted file mode 100644 index e3e60f2..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_msc_wrapper/inc/usbd_hid_msc_wrapper.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_hid_wrapper.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header file for the usbd_msc_hid_wrapper.c file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_HID_MSC_WRAPPER_H_ -#define __USB_HID_MSC_WRAPPER_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/* Exported defines ----------------------------------------------------------*/ -#define HID_INTERFACE 0x0 -#define MSC_INTERFACE 0x1 - -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -#define USB_HID_MSC_CONFIG_DESC_SIZ (CUSTOMHID_SIZ_CONFIG_DESC -9 + USB_MSC_CONFIG_DESC_SIZ) - -/* Exported variables --------------------------------------------------------*/ -extern USBD_Class_cb_TypeDef USBD_HID_MSC_cb; - -/* Exported functions ------------------------------------------------------- */ - - -#endif /* __USB_HID_MSC_WRAPPER_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_msc_wrapper/src/usbd_hid_msc_wrapper.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_msc_wrapper/src/usbd_hid_msc_wrapper.c deleted file mode 100644 index 1344329..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/hid_msc_wrapper/src/usbd_hid_msc_wrapper.c +++ /dev/null @@ -1,326 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_hid_wrapper.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file calls to the separate MSC and HID class layer handlers. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *****************************************************************************/ - /* - * =================================================================== - * composite MSC_HID - * =================================================================== */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_hid_msc_wrapper.h" -#include "usbd_custom_hid_core.h" -#include "usbd_msc_core.h" -#include "usbd_desc.h" -#include "usbd_req.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -static uint8_t USBD_HID_MSC_Init (void *pdev , uint8_t cfgidx); -static uint8_t USBD_HID_MSC_DeInit (void *pdev , uint8_t cfgidx); - -/* Control Endpoints*/ -static uint8_t USBD_HID_MSC_Setup (void *pdev , USB_SETUP_REQ *req); -static uint8_t USBD_HID_MSC_EP0_RxReady (void *pdev); - -/* Class Specific Endpoints*/ -static uint8_t USBD_HID_MSC_DataIn (void *pdev , uint8_t epnum); -static uint8_t USBD_HID_MSC_DataOut (void *pdev , uint8_t epnum); - -static uint8_t* USBD_HID_MSC_GetConfigDescriptor( uint8_t speed , uint16_t *length); - -USBD_Class_cb_TypeDef USBD_HID_MSC_cb = -{ - USBD_HID_MSC_Init, - USBD_HID_MSC_DeInit, - USBD_HID_MSC_Setup, - NULL, - USBD_HID_MSC_EP0_RxReady, - USBD_HID_MSC_DataIn, - USBD_HID_MSC_DataOut, - NULL, - USBD_HID_MSC_GetConfigDescriptor, -}; - - -/* USB MSC_HID device Configuration Descriptor */ -const uint8_t USBD_HID_MSC_CfgDesc[USB_HID_MSC_CONFIG_DESC_SIZ] = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ - USB_HID_MSC_CONFIG_DESC_SIZ, - /* wTotalLength: Bytes returned */ - 0x00, - 0x02, /*bNumInterfaces: 2 interfaces (1 for MSC, 1 for HID)*/ - 0x01, /*bConfigurationValue: Configuration value*/ - 0x00, /*iConfiguration: Index of string descriptor describing - the configuration*/ - 0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */ - 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ - - /************** Descriptor of CUSTOM HID interface ****************/ - /* 09 */ - 0x09, /*bLength: Interface Descriptor size*/ - USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ - HID_INTERFACE, /*bInterfaceNumber: Number of Interface*/ - 0x00, /*bAlternateSetting: Alternate setting*/ - 0x02, /*bNumEndpoints*/ - 0x03, /*bInterfaceClass: HID*/ - 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ - 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ - 0, /*iInterface: Index of string descriptor*/ - /******************** Descriptor of CUSTOM HID **************************/ - /* 18 */ - 0x09, /*bLength: HID Descriptor size*/ - HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ - 0x11, /*bcdHID: HID Class Spec release number*/ - 0x01, - 0x00, /*bCountryCode: Hardware target country*/ - 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ - 0x22, /*bDescriptorType*/ - CUSTOMHID_SIZ_REPORT_DESC,/*wItemLength: Total length of Report descriptor*/ - 0x00, - /******************** Descriptor of CUSTOM HID endpoint *********************/ - /* 27 */ - 0x07, /*bLength: Endpoint Descriptor size*/ - USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ - - HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/ - 0x03, /*bmAttributes: Interrupt endpoint*/ - HID_IN_PACKET, /*wMaxPacketSize: 2 Byte max */ - 0x00, - 0x20, /*bInterval: Polling Interval (32 ms)*/ - /* 34 */ - - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ - /* Endpoint descriptor type */ - HID_OUT_EP, /* bEndpointAddress: */ - /* Endpoint Address (OUT) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_OUT_PACKET, /* wMaxPacketSize: 2 Bytes max */ - 0x00, - 0x20, /* bInterval: Polling Interval (20 ms) */ - /* 41 */ - - /******************** Mass Storage interface ********************/ - 0x09, /* bLength: Interface Descriptor size */ - 0x04, /* bDescriptorType: */ - MSC_INTERFACE, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints*/ - 0x08, /* bInterfaceClass: MSC Class */ - 0x06, /* bInterfaceSubClass : SCSI transparent*/ - 0x50, /* nInterfaceProtocol */ - 0X01, /* iInterface: */ - /******************** Mass Storage Endpoints ********************/ - 0x07, /*Endpoint descriptor length = 7*/ - 0x05, /*Endpoint descriptor type */ - MSC_IN_EP, /*Endpoint address (IN, address 2) */ - 0x02, /*Bulk endpoint type */ - LOBYTE(MSC_MAX_PACKET), - HIBYTE(MSC_MAX_PACKET), - 0x00, /*Polling interval in milliseconds */ - - 0x07, /*Endpoint descriptor length = 7 */ - 0x05, /*Endpoint descriptor type */ - MSC_OUT_EP, /*Endpoint address (OUT, address 2) */ - 0x02, /*Bulk endpoint type */ - LOBYTE(MSC_MAX_PACKET), - HIBYTE(MSC_MAX_PACKET), - 0x00 /*Polling interval in milliseconds*/ - -}; /* USBD_HID_MSC_CfgDesc */ - -/* Private function prototypes -----------------------------------------------*/ -/********************************************* - MSC Device library callbacks -*********************************************/ -extern uint8_t USBD_MSC_Init (void *pdev, uint8_t cfgidx); -extern uint8_t USBD_MSC_DeInit (void *pdev, uint8_t cfgidx); -extern uint8_t USBD_MSC_Setup (void *pdev, USB_SETUP_REQ *req); -extern uint8_t USBD_MSC_DataIn (void *pdev, uint8_t epnum); -extern uint8_t USBD_MSC_DataOut (void *pdev, uint8_t epnum); -extern uint8_t *USBD_MSC_GetCfgDesc (uint8_t speed, uint16_t *length); -extern uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ]; - -/********************************************* - HID Device library callbacks -*********************************************/ -extern uint8_t USBD_HID_Init (void *pdev, uint8_t cfgidx); -extern uint8_t USBD_HID_DeInit (void *pdev, uint8_t cfgidx); -extern uint8_t USBD_HID_Setup (void *pdev, USB_SETUP_REQ *req); -extern uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length); -extern uint8_t USBD_HID_DataIn (void *pdev, uint8_t epnum); -extern uint8_t USBD_HID_DataOut (void *pdev, uint8_t epnum); -extern uint8_t USBD_HID_EP0_RxReady (void *pdev); - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief USBD_HID_MSC_Init - * Initialize the HID & MSC interfaces - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_HID_MSC_Init (void *pdev, - uint8_t cfgidx) -{ - /* HID initialization */ - USBD_HID_Init (pdev,cfgidx); - - /* MSC initialization */ - USBD_MSC_Init (pdev,cfgidx); - - return USBD_OK; - -} - -/** - * @brief USBD_HID_Init - * DeInitialize the HID/CDC interfaces - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_HID_MSC_DeInit (void *pdev, - uint8_t cfgidx) -{ - /* HID De-initialization */ - USBD_HID_DeInit (pdev,cfgidx); - - /* CDC De-initialization */ - USBD_MSC_DeInit (pdev,cfgidx); - - - return USBD_OK; -} - -/** - * @brief USBD_HID_Setup - * Handle the HID specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_HID_MSC_Setup (void *pdev, - USB_SETUP_REQ *req) -{ - switch (req->bmRequest & USB_REQ_RECIPIENT_MASK) - { - case USB_REQ_RECIPIENT_INTERFACE: - if (req->wIndex == HID_INTERFACE) - { - return (USBD_HID_Setup (pdev, req)); - } - else - { - return (USBD_MSC_Setup(pdev, req)); - } - case USB_REQ_RECIPIENT_ENDPOINT: - if ((req->wIndex == HID_IN_EP) || (req->wIndex == HID_OUT_EP)) - { - return (USBD_HID_Setup (pdev, req)); - } - else - { - return (USBD_MSC_Setup(pdev, req)); - } - } - return USBD_OK; -} - -/** - * @brief USBD_HID_MSC_GetCfgDesc - * return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_HID_MSC_GetConfigDescriptor (uint8_t speed, uint16_t *length) -{ - *length = sizeof (USBD_HID_MSC_CfgDesc); - return (uint8_t*)USBD_HID_MSC_CfgDesc; -} - -/** - * @brief USBD_HID_MSC_DataIn - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_HID_MSC_DataIn (void *pdev, - uint8_t epnum) -{ - /*DataIN can be for MSC or HID */ - - if (epnum == (MSC_IN_EP&~0x80) ) - { - return (USBD_MSC_DataIn(pdev, epnum)); - } - else - { - return (USBD_HID_DataIn(pdev, epnum)); - } -} - -/** - * @brief USBD_HID_MSC_DataOut - * handle data OUT Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_HID_MSC_DataOut(void *pdev , uint8_t epnum) -{ - /*DataOut can be for MSC or HID */ - - if (epnum == (MSC_OUT_EP&~0x80) ) - { - return (USBD_MSC_DataOut(pdev, epnum)); - } - else - { - return (USBD_HID_DataOut(pdev, epnum)); - } -} - -/** - * @brief USBD_HID_MSC_EP0_RxReady - * handle RxReady processing - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -uint8_t USBD_HID_MSC_EP0_RxReady (void *pdev) -{ - /*RxReady processing needed for Custom HID only*/ - return (USBD_HID_EP0_RxReady(pdev)); -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_bot.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_bot.h deleted file mode 100644 index a76b96d..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_bot.h +++ /dev/null @@ -1,116 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_bot.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header for the usbd_msc_bot.c file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_MSC_BOT_H -#define __USBD_MSC_BOT_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" -#include "usbd_msc_scsi.h" -#include "usbd_ioreq.h" -#include "usbd_msc_mem.h" - -/* Exported defines ----------------------------------------------------------*/ -#define BOT_IDLE 0 /* Idle state */ -#define BOT_DATA_OUT 1 /* Data Out state */ -#define BOT_DATA_IN 2 /* Data In state */ -#define BOT_LAST_DATA_IN 3 /* Last Data In Last */ -#define BOT_SEND_DATA 4 /* Send Immediate data */ - -#define BOT_CBW_SIGNATURE 0x43425355 -#define BOT_CSW_SIGNATURE 0x53425355 -#define BOT_CBW_LENGTH 31 -#define BOT_CSW_LENGTH 13 - -/* CSW Status Definitions */ -#define CSW_CMD_PASSED 0x00 -#define CSW_CMD_FAILED 0x01 -#define CSW_PHASE_ERROR 0x02 - -/* BOT Status */ -#define BOT_STATE_NORMAL 0 -#define BOT_STATE_RECOVERY 1 -#define BOT_STATE_ERROR 2 - - -#define DIR_IN 0 -#define DIR_OUT 1 -#define BOTH_DIR 2 - -/* Exported types ------------------------------------------------------------*/ -typedef struct _MSC_BOT_CBW -{ - uint32_t dSignature; - uint32_t dTag; - uint32_t dDataLength; - uint8_t bmFlags; - uint8_t bLUN; - uint8_t bCBLength; - uint8_t CB[16]; -} -MSC_BOT_CBW_TypeDef; - - -typedef struct _MSC_BOT_CSW -{ - uint32_t dSignature; - uint32_t dTag; - uint32_t dDataResidue; - uint8_t bStatus; -} -MSC_BOT_CSW_TypeDef; - -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern uint8_t MSC_BOT_Data[]; -extern uint16_t MSC_BOT_DataLen; -extern uint8_t MSC_BOT_State; -extern uint8_t MSC_BOT_BurstMode; -extern MSC_BOT_CBW_TypeDef MSC_BOT_cbw; -extern MSC_BOT_CSW_TypeDef MSC_BOT_csw; - -/* Exported functions ------------------------------------------------------- */ -void MSC_BOT_Init (USB_CORE_HANDLE *pdev); -void MSC_BOT_Reset (USB_CORE_HANDLE *pdev); -void MSC_BOT_DeInit (USB_CORE_HANDLE *pdev); -void MSC_BOT_DataIn (USB_CORE_HANDLE *pdev, - uint8_t epnum); - -void MSC_BOT_DataOut (USB_CORE_HANDLE *pdev, - uint8_t epnum); - -void MSC_BOT_SendCSW (USB_CORE_HANDLE *pdev, - uint8_t CSW_Status); - -void MSC_BOT_CplClrFeature (USB_CORE_HANDLE *pdev, - uint8_t epnum); - -#endif /* __USBD_MSC_BOT_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_core.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_core.h deleted file mode 100644 index 9ffc4a9..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_core.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_core.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header for the usbd_msc_core.c file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef _USB_MSC_CORE_H_ -#define _USB_MSC_CORE_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" -#include "usbd_msc_bot.h" - -/* Exported defines ----------------------------------------------------------*/ -#define BOT_GET_MAX_LUN 0xFE -#define BOT_RESET 0xFF -#define USB_MSC_CONFIG_DESC_SIZ 32 - -#define MSC_EPIN_SIZE MSC_MAX_PACKET -#define MSC_EPOUT_SIZE MSC_MAX_PACKET - -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern USBD_Class_cb_TypeDef USBD_MSC_cb; - -/* Exported functions ------------------------------------------------------- */ - -#endif /* _USB_MSC_CORE_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_data.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_data.h deleted file mode 100644 index 47885ed..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_data.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_data.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header for the usbd_msc_data.c file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ - -#ifndef _USBD_MSC_DATA_H_ -#define _USBD_MSC_DATA_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" - -/* Exported defines ----------------------------------------------------------*/ -#define MODE_SENSE6_LEN 8 -#define MODE_SENSE10_LEN 8 -#define LENGTH_INQUIRY_PAGE00 7 -#define LENGTH_FORMAT_CAPACITIES 20 - -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern const uint8_t MSC_Page00_Inquiry_Data[]; -extern const uint8_t MSC_Mode_Sense6_data[]; -extern const uint8_t MSC_Mode_Sense10_data[]; - -/* Exported functions ------------------------------------------------------- */ - -#endif /* _USBD_MSC_DATA_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_mem.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_mem.h deleted file mode 100644 index 0b6bc74..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_mem.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_mem.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header for the STORAGE DISK file file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_MEM_H -#define __USBD_MEM_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" - -/* Exported defines ----------------------------------------------------------*/ -#define USBD_STD_INQUIRY_LENGTH 36 - -/* Exported types ------------------------------------------------------------*/ -typedef struct _USBD_STORAGE -{ - int8_t (* Init) (uint8_t lun); - int8_t (* GetCapacity) (uint8_t lun, uint32_t *block_num, uint32_t *block_size); - int8_t (* IsReady) (uint8_t lun); - int8_t (* IsWriteProtected) (uint8_t lun); - int8_t (* Read) (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); - int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); - int8_t (* GetMaxLun)(void); - int8_t *pInquiry; - -}USBD_STORAGE_cb_TypeDef; - -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -extern USBD_STORAGE_cb_TypeDef *USBD_STORAGE_fops; - - -#endif /* __USBD_MEM_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_scsi.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_scsi.h deleted file mode 100644 index ca6dded..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_scsi.h +++ /dev/null @@ -1,145 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_scsi.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header for the usbd_msc_scsi.c file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_MSC_SCSI_H -#define __USBD_MSC_SCSI_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_msc_data.h" -#include "usbd_msc_bot.h" - -/* Exported defines ----------------------------------------------------------*/ -#define SENSE_LIST_DEEPTH 4 - -/* SCSI Commands */ -#define SCSI_FORMAT_UNIT 0x04 -#define SCSI_INQUIRY 0x12 -#define SCSI_MODE_SELECT6 0x15 -#define SCSI_MODE_SELECT10 0x55 -#define SCSI_MODE_SENSE6 0x1A -#define SCSI_MODE_SENSE10 0x5A -#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1E -#define SCSI_READ6 0x08 -#define SCSI_READ10 0x28 -#define SCSI_READ12 0xA8 -#define SCSI_READ16 0x88 - -#define SCSI_READ_CAPACITY10 0x25 -#define SCSI_READ_CAPACITY16 0x9E - -#define SCSI_REQUEST_SENSE 0x03 -#define SCSI_START_STOP_UNIT 0x1B -#define SCSI_TEST_UNIT_READY 0x00 -#define SCSI_WRITE6 0x0A -#define SCSI_WRITE10 0x2A -#define SCSI_WRITE12 0xAA -#define SCSI_WRITE16 0x8A - -#define SCSI_VERIFY10 0x2F -#define SCSI_VERIFY12 0xAF -#define SCSI_VERIFY16 0x8F - -#define SCSI_SEND_DIAGNOSTIC 0x1D -#define SCSI_READ_FORMAT_CAPACITIES 0x23 - -#define NO_SENSE 0 -#define RECOVERED_ERROR 1 -#define NOT_READY 2 -#define MEDIUM_ERROR 3 -#define HARDWARE_ERROR 4 -#define ILLEGAL_REQUEST 5 -#define UNIT_ATTENTION 6 -#define DATA_PROTECT 7 -#define BLANK_CHECK 8 -#define VENDOR_SPECIFIC 9 -#define COPY_ABORTED 10 -#define ABORTED_COMMAND 11 -#define VOLUME_OVERFLOW 13 -#define MISCOMPARE 14 - - -#define INVALID_CDB 0x20 -#define INVALID_FIELED_IN_COMMAND 0x24 -#define PARAMETER_LIST_LENGTH_ERROR 0x1A -#define INVALID_FIELD_IN_PARAMETER_LIST 0x26 -#define ADDRESS_OUT_OF_RANGE 0x21 -#define MEDIUM_NOT_PRESENT 0x3A -#define MEDIUM_HAVE_CHANGED 0x28 -#define WRITE_PROTECTED 0x27 -#define UNRECOVERED_READ_ERROR 0x11 -#define WRITE_FAULT 0x03 - -#define READ_FORMAT_CAPACITY_DATA_LEN 0x0C -#define READ_CAPACITY10_DATA_LEN 0x08 -#define MODE_SENSE10_DATA_LEN 0x08 -#define MODE_SENSE6_DATA_LEN 0x04 -#define REQUEST_SENSE_DATA_LEN 0x12 -#define STANDARD_INQUIRY_DATA_LEN 0x24 -#define BLKVFY 0x04 - -/* Exported types ------------------------------------------------------------*/ -typedef struct _SENSE_ITEM { - char Skey; - union { - struct _ASCs { - char ASC; - char ASCQ; - }b; - unsigned int ASC; - char *pData; - } w; -} SCSI_Sense_TypeDef; - -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern uint8_t Page00_Inquiry_Data[]; -extern uint8_t Standard_Inquiry_Data[]; -extern uint8_t Standard_Inquiry_Data2[]; -extern uint8_t Mode_Sense6_data[]; -extern uint8_t Mode_Sense10_data[]; -extern uint8_t Scsi_Sense_Data[]; -extern uint8_t ReadCapacity10_Data[]; -extern uint8_t ReadFormatCapacity_Data []; - -extern SCSI_Sense_TypeDef SCSI_Sense [SENSE_LIST_DEEPTH]; -extern uint8_t SCSI_Sense_Head; -extern uint8_t SCSI_Sense_Tail; -/* Exported functions ------------------------------------------------------- */ -int8_t SCSI_ProcessCmd(USB_CORE_HANDLE *pdev, - uint8_t lun, - uint8_t *cmd); - -void SCSI_SenseCode(uint8_t lun, - uint8_t sKey, - uint8_t ASC); - - -#endif /* __USBD_MSC_SCSI_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c deleted file mode 100644 index a362446..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c +++ /dev/null @@ -1,319 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_bot.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the BOT protocol core functions. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_msc_bot.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -uint16_t MSC_BOT_DataLen; -uint8_t MSC_BOT_State; -uint8_t MSC_BOT_Status; - -uint8_t MSC_BOT_Data[MSC_MEDIA_PACKET] ; - -MSC_BOT_CBW_TypeDef MSC_BOT_cbw ; - -MSC_BOT_CSW_TypeDef MSC_BOT_csw ; - -/* Private function prototypes -----------------------------------------------*/ -static void MSC_BOT_CBW_Decode (USB_CORE_HANDLE *pdev); - -static void MSC_BOT_SendData (USB_CORE_HANDLE *pdev, - uint8_t* pbuf, - uint16_t len); - -static void MSC_BOT_Abort(USB_CORE_HANDLE *pdev); - -/* Private functions ---------------------------------------------------------*/ -/** - * @brief MSC_BOT_Init - * Initialize the BOT Process - * @param pdev: device instance - * @retval None - */ -void MSC_BOT_Init (USB_CORE_HANDLE *pdev) -{ - MSC_BOT_State = BOT_IDLE; - MSC_BOT_Status = BOT_STATE_NORMAL; - USBD_STORAGE_fops->Init(0); - - /* Prepare EP to Receive First BOT Cmd */ - DCD_EP_PrepareRx (pdev, - MSC_OUT_EP, - (uint8_t *)&MSC_BOT_cbw, - BOT_CBW_LENGTH); -} - -/** - * @brief MSC_BOT_Reset - * Reset the BOT Machine - * @param pdev: device instance - * @retval None - */ -void MSC_BOT_Reset (USB_CORE_HANDLE *pdev) -{ - MSC_BOT_State = BOT_IDLE; - MSC_BOT_Status = BOT_STATE_RECOVERY; - /* Prepare EP to Receive First BOT Cmd */ - DCD_EP_PrepareRx (pdev, - MSC_OUT_EP, - (uint8_t *)&MSC_BOT_cbw, - BOT_CBW_LENGTH); -} - -/** - * @brief MSC_BOT_DeInit - * Uninitialize the BOT Machine - * @param pdev: device instance - * @retval None - */ -void MSC_BOT_DeInit (USB_CORE_HANDLE *pdev) -{ - MSC_BOT_State = BOT_IDLE; -} - -/** - * @brief MSC_BOT_DataIn - * Handle BOT IN data stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval None - */ -void MSC_BOT_DataIn (USB_CORE_HANDLE *pdev, - uint8_t epnum) -{ - - switch (MSC_BOT_State) - { - case BOT_DATA_IN: - if(SCSI_ProcessCmd(pdev, - MSC_BOT_cbw.bLUN, - &MSC_BOT_cbw.CB[0]) < 0) - { - MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED); - } - break; - - case BOT_SEND_DATA: - case BOT_LAST_DATA_IN: - MSC_BOT_SendCSW (pdev, CSW_CMD_PASSED); - - break; - - default: - break; - } -} -/** - * @brief MSC_BOT_DataOut - * Process MSC OUT data - * @param pdev: device instance - * @param epnum: endpoint index - * @retval None - */ -void MSC_BOT_DataOut (USB_CORE_HANDLE *pdev, - uint8_t epnum) -{ - - switch (MSC_BOT_State) - { - case BOT_IDLE: - MSC_BOT_CBW_Decode(pdev); - break; - - case BOT_DATA_OUT: - - if(SCSI_ProcessCmd(pdev, - MSC_BOT_cbw.bLUN, - &MSC_BOT_cbw.CB[0]) < 0) - { - MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED); - } - - break; - - default: - break; - } - -} - -/** - * @brief MSC_BOT_CBW_Decode - * Decode the CBW command and set the BOT state machine accordingly - * @param pdev: device instance - * @retval None - */ -static void MSC_BOT_CBW_Decode (USB_CORE_HANDLE *pdev) -{ - - MSC_BOT_csw.dTag = MSC_BOT_cbw.dTag; - MSC_BOT_csw.dDataResidue = MSC_BOT_cbw.dDataLength; - - if ((USBD_GetRxCount (pdev ,MSC_OUT_EP) != BOT_CBW_LENGTH) || - (MSC_BOT_cbw.dSignature != BOT_CBW_SIGNATURE)|| - (MSC_BOT_cbw.bLUN > 1) || - (MSC_BOT_cbw.bCBLength < 1) || - (MSC_BOT_cbw.bCBLength > 16)) - { - - SCSI_SenseCode(MSC_BOT_cbw.bLUN, - ILLEGAL_REQUEST, - INVALID_CDB); - MSC_BOT_Status = BOT_STATE_ERROR; - MSC_BOT_Abort(pdev); - - } - else - { - if(SCSI_ProcessCmd(pdev, - MSC_BOT_cbw.bLUN, - &MSC_BOT_cbw.CB[0]) < 0) - { - MSC_BOT_Abort(pdev); - } - /*Burst xfer handled internally*/ - else if ((MSC_BOT_State != BOT_DATA_IN) && - (MSC_BOT_State != BOT_DATA_OUT) && - (MSC_BOT_State != BOT_LAST_DATA_IN)) - { - if (MSC_BOT_DataLen > 0) - { - MSC_BOT_SendData(pdev, - MSC_BOT_Data, - MSC_BOT_DataLen); - } - else if (MSC_BOT_DataLen == 0) - { - MSC_BOT_SendCSW (pdev, - CSW_CMD_PASSED); - } - } - } -} - -/** - * @brief MSC_BOT_SendData - * Send the requested data - * @param pdev: device instance - * @param buf: pointer to data buffer - * @param len: Data Length - * @retval None - */ -static void MSC_BOT_SendData(USB_CORE_HANDLE *pdev, - uint8_t* buf, - uint16_t len) -{ - - len = MIN (MSC_BOT_cbw.dDataLength, len); - MSC_BOT_csw.dDataResidue -= len; - MSC_BOT_csw.bStatus = CSW_CMD_PASSED; - MSC_BOT_State = BOT_SEND_DATA; - - DCD_EP_Tx (pdev, MSC_IN_EP, buf, len); -} - -/** - * @brief MSC_BOT_SendCSW - * Send the Command Status Wrapper - * @param pdev: device instance - * @param status : CSW status - * @retval None - */ -void MSC_BOT_SendCSW (USB_CORE_HANDLE *pdev, - uint8_t CSW_Status) -{ - MSC_BOT_csw.dSignature = BOT_CSW_SIGNATURE; - MSC_BOT_csw.bStatus = CSW_Status; - MSC_BOT_State = BOT_IDLE; - - DCD_EP_Tx (pdev, - MSC_IN_EP, - (uint8_t *)&MSC_BOT_csw, - BOT_CSW_LENGTH); - - /* Prepare EP to Receive next Cmd */ - DCD_EP_PrepareRx (pdev, - MSC_OUT_EP, - (uint8_t *)&MSC_BOT_cbw, - BOT_CBW_LENGTH); - -} - -/** - * @brief MSC_BOT_Abort - * Abort the current transfer - * @param pdev: device instance - * @retval status - */ - -static void MSC_BOT_Abort (USB_CORE_HANDLE *pdev) -{ - - if ((MSC_BOT_cbw.bmFlags == 0) && - (MSC_BOT_cbw.dDataLength != 0) && - (MSC_BOT_Status == BOT_STATE_NORMAL) ) - { - DCD_EP_Stall(pdev, MSC_OUT_EP ); - } - DCD_EP_Stall(pdev, MSC_IN_EP); - - if(MSC_BOT_Status == BOT_STATE_ERROR) - { - DCD_EP_PrepareRx (pdev, - MSC_OUT_EP, - (uint8_t *)&MSC_BOT_cbw, - BOT_CBW_LENGTH); - } -} - -/** - * @brief MSC_BOT_CplClrFeature - * Complete the clear feature request - * @param pdev: device instance - * @param epnum: endpoint index - * @retval None - */ - -void MSC_BOT_CplClrFeature (USB_CORE_HANDLE *pdev, uint8_t epnum) -{ - if(MSC_BOT_Status == BOT_STATE_ERROR )/* Bad CBW Signature */ - { - DCD_EP_Stall(pdev, MSC_IN_EP); - MSC_BOT_Status = BOT_STATE_NORMAL; - } - else if(((epnum & 0x80) == 0x80) && ( MSC_BOT_Status != BOT_STATE_RECOVERY)) - { - MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED); - } - -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c deleted file mode 100644 index b5c4169..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c +++ /dev/null @@ -1,310 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_core.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the MSC core functions. - * - * @verbatim - * - * =================================================================== - * MSC Class Description - * =================================================================== - * This module manages the MSC class V1.0 following the "Universal - * Serial Bus Mass Storage Class (MSC) Bulk-Only Transport (BOT) Version 1.0 - * Sep. 31, 1999". - * This driver implements the following aspects of the specification: - * - Bulk-Only Transport protocol - * - Subclass : SCSI transparent command set (ref. SCSI Primary Commands - 3 (SPC-3)) - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_msc_core.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -uint8_t USBD_MSC_Init (void *pdev, - uint8_t cfgidx); - -uint8_t USBD_MSC_DeInit (void *pdev, - uint8_t cfgidx); - -uint8_t USBD_MSC_Setup (void *pdev, - USB_SETUP_REQ *req); - -uint8_t USBD_MSC_DataIn (void *pdev, - uint8_t epnum); - - -uint8_t USBD_MSC_DataOut (void *pdev, - uint8_t epnum); - -uint8_t *USBD_MSC_GetCfgDesc (uint8_t speed, - uint16_t *length); - -USBD_Class_cb_TypeDef USBD_MSC_cb = -{ - USBD_MSC_Init, - USBD_MSC_DeInit, - USBD_MSC_Setup, - NULL, /*EP0_TxSent*/ - NULL, /*EP0_RxReady*/ - USBD_MSC_DataIn, - USBD_MSC_DataOut, - NULL, /*SOF */ - USBD_MSC_GetCfgDesc, -}; - -/* USB Mass storage device Configuration Descriptor */ -/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ -const uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_MSC_CONFIG_DESC_SIZ, - - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: */ - 0x04, /* iConfiguration: */ - 0xC0, /* bmAttributes: */ - 0x32, /* MaxPower 100 mA */ - - /******************** Mass Storage interface ********************/ - 0x09, /* bLength: Interface Descriptor size */ - 0x04, /* bDescriptorType: */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints*/ - 0x08, /* bInterfaceClass: MSC Class */ - 0x06, /* bInterfaceSubClass : SCSI transparent*/ - 0x50, /* nInterfaceProtocol */ - 0x05, /* iInterface: */ - /******************** Mass Storage Endpoints ********************/ - 0x07, /*Endpoint descriptor length = 7*/ - 0x05, /*Endpoint descriptor type */ - MSC_IN_EP, /*Endpoint address (IN, address 1) */ - 0x02, /*Bulk endpoint type */ - LOBYTE(MSC_MAX_PACKET), - HIBYTE(MSC_MAX_PACKET), - 0x00, /*Polling interval in milliseconds */ - 0x07, /*Endpoint descriptor length = 7 */ - 0x05, /*Endpoint descriptor type */ - MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ - 0x02, /*Bulk endpoint type */ - LOBYTE(MSC_MAX_PACKET), - HIBYTE(MSC_MAX_PACKET), - 0x00 /*Polling interval in milliseconds*/ -}; -static uint8_t USBD_MSC_MaxLun = 0; - -static uint8_t USBD_MSC_AltSet = 0; - -/* Private function ----------------------------------------------------------*/ -/** - * @brief USBD_MSC_Init - * Initialize the mass storage configuration - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status - */ -uint8_t USBD_MSC_Init (void *pdev, - uint8_t cfgidx) -{ - DCD_PMA_Config(pdev , MSC_IN_EP,USB_SNG_BUF,MSC_IN_TX_ADDRESS); - DCD_PMA_Config(pdev , MSC_OUT_EP,USB_SNG_BUF,MSC_OUT_RX_ADDRESS); - - /* Open EP IN */ - DCD_EP_Open(pdev, - MSC_IN_EP, - MSC_EPIN_SIZE, - USB_EP_BULK); - - /* Open EP OUT */ - DCD_EP_Open(pdev, - MSC_OUT_EP, - MSC_EPOUT_SIZE, - USB_EP_BULK); - - /* Init the BOT layer */ - MSC_BOT_Init(pdev); - - return USBD_OK; -} - -/** - * @brief USBD_MSC_DeInit - * DeInitilaize the mass storage configuration - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status - */ -uint8_t USBD_MSC_DeInit (void *pdev, - uint8_t cfgidx) -{ - /* Close MSC EPs */ - DCD_EP_Close (pdev , MSC_IN_EP); - DCD_EP_Close (pdev , MSC_OUT_EP); - - /* Un Init the BOT layer */ - MSC_BOT_DeInit(pdev); - return USBD_OK; -} -/** - * @brief USBD_MSC_Setup - * Handle the MSC specific requests - * @param pdev: device instance - * @param req: USB request - * @retval status - */ -uint8_t USBD_MSC_Setup (void *pdev, USB_SETUP_REQ *req) -{ - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - - /* Class request */ - case USB_REQ_TYPE_CLASS : - switch (req->bRequest) - { - case BOT_GET_MAX_LUN : - - if((req->wValue == 0) && - (req->wLength == 1) && - ((req->bmRequest & 0x80) == 0x80)) - { - USBD_MSC_MaxLun = USBD_STORAGE_fops->GetMaxLun(); - if(USBD_MSC_MaxLun > 0) - { - USBD_CtlSendData (pdev, - &USBD_MSC_MaxLun, - 1); - } - else - { - USBD_CtlError(pdev , req); - return USBD_FAIL; - } - } - else - { - USBD_CtlError(pdev , req); - return USBD_FAIL; - } - break; - - case BOT_RESET : - if((req->wValue == 0) && - (req->wLength == 0) && - ((req->bmRequest & 0x80) != 0x80)) - { - MSC_BOT_Reset(pdev); - } - else - { - USBD_CtlError(pdev , req); - return USBD_FAIL; - } - break; - - default: - USBD_CtlError(pdev , req); - return USBD_FAIL; - } - break; - /* Interface & Endpoint request */ - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_INTERFACE : - USBD_CtlSendData (pdev, - &USBD_MSC_AltSet, - 1); - break; - - case USB_REQ_SET_INTERFACE : - USBD_MSC_AltSet = (uint8_t)(req->wValue); - break; - - case USB_REQ_CLEAR_FEATURE: - - /* Handle BOT error */ - MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex); - break; - - } - break; - - default: - break; - } - return USBD_OK; -} - -/** - * @brief USBD_MSC_DataIn - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -uint8_t USBD_MSC_DataIn (void *pdev, - uint8_t epnum) -{ - MSC_BOT_DataIn(pdev , epnum); - return USBD_OK; -} - -/** - * @brief USBD_MSC_DataOut - * handle data OUT Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -uint8_t USBD_MSC_DataOut (void *pdev, - uint8_t epnum) -{ - MSC_BOT_DataOut(pdev , epnum); - return USBD_OK; -} - -/** - * @brief USBD_MSC_GetCfgDesc - * return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_MSC_GetCfgDesc (uint8_t speed, uint16_t *length) -{ - *length = sizeof (USBD_MSC_CfgDesc); - return (uint8_t *)USBD_MSC_CfgDesc; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c deleted file mode 100644 index 716248a..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c +++ /dev/null @@ -1,71 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_data.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the vital inquiry pages and sense data. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_msc_data.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* USB Mass storage Page 0 Inquiry Data */ -const uint8_t MSC_Page00_Inquiry_Data[] = {//7 - 0x00, - 0x00, - 0x00, - (LENGTH_INQUIRY_PAGE00 - 4), - 0x00, - 0x80, - 0x83 -}; -/* USB Mass storage sense 6 Data */ -const uint8_t MSC_Mode_Sense6_data[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00 -}; -/* USB Mass storage sense 10 Data */ -const uint8_t MSC_Mode_Sense10_data[] = { - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00 -}; - -/* Private function prototypes -----------------------------------------------*/ -/* Private function ----------------------------------------------------------*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c deleted file mode 100644 index e7d2900..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c +++ /dev/null @@ -1,661 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_scsi.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the USBD SCSI layer functions. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_msc_scsi.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -SCSI_Sense_TypeDef SCSI_Sense [SENSE_LIST_DEEPTH]; -uint8_t SCSI_Sense_Head; -uint8_t SCSI_Sense_Tail; - -uint32_t SCSI_blk_size; -uint32_t SCSI_blk_nbr; - -uint32_t SCSI_blk_addr; -uint32_t SCSI_blk_len; - -USB_CORE_HANDLE *cdev; - -/* Private function prototypes -----------------------------------------------*/ -static int8_t SCSI_TestUnitReady(uint8_t lun, uint8_t *params); -static int8_t SCSI_Inquiry(uint8_t lun, uint8_t *params); -static int8_t SCSI_ReadFormatCapacity(uint8_t lun, uint8_t *params); -static int8_t SCSI_ReadCapacity10(uint8_t lun, uint8_t *params); -static int8_t SCSI_RequestSense (uint8_t lun, uint8_t *params); -static int8_t SCSI_StartStopUnit(uint8_t lun, uint8_t *params); -static int8_t SCSI_ModeSense6 (uint8_t lun, uint8_t *params); -static int8_t SCSI_ModeSense10 (uint8_t lun, uint8_t *params); -static int8_t SCSI_Write10(uint8_t lun , uint8_t *params); -static int8_t SCSI_Read10(uint8_t lun , uint8_t *params); -static int8_t SCSI_Verify10(uint8_t lun, uint8_t *params); -static int8_t SCSI_CheckAddressRange (uint8_t lun , - uint32_t blk_offset , - uint16_t blk_nbr); -static int8_t SCSI_ProcessRead (uint8_t lun); - -static int8_t SCSI_ProcessWrite (uint8_t lun); - -/* Private function ----------------------------------------------------------*/ -/** - * @brief SCSI_ProcessCmd - * Process SCSI commands - * @param pdev: device instance - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ -int8_t SCSI_ProcessCmd(USB_CORE_HANDLE *pdev, - uint8_t lun, - uint8_t *params) -{ - cdev = pdev; - - switch (params[0]) - { - case SCSI_TEST_UNIT_READY: - return SCSI_TestUnitReady(lun, params); - - case SCSI_REQUEST_SENSE: - return SCSI_RequestSense (lun, params); - case SCSI_INQUIRY: - return SCSI_Inquiry(lun, params); - - case SCSI_START_STOP_UNIT: - return SCSI_StartStopUnit(lun, params); - - case SCSI_ALLOW_MEDIUM_REMOVAL: - return SCSI_StartStopUnit(lun, params); - - case SCSI_MODE_SENSE6: - return SCSI_ModeSense6 (lun, params); - - case SCSI_MODE_SENSE10: - return SCSI_ModeSense10 (lun, params); - - case SCSI_READ_FORMAT_CAPACITIES: - return SCSI_ReadFormatCapacity(lun, params); - - case SCSI_READ_CAPACITY10: - return SCSI_ReadCapacity10(lun, params); - - case SCSI_READ10: - return SCSI_Read10(lun, params); - - case SCSI_WRITE10: - return SCSI_Write10(lun, params); - - case SCSI_VERIFY10: - return SCSI_Verify10(lun, params); - - default: - SCSI_SenseCode(lun, - ILLEGAL_REQUEST, - INVALID_CDB); - return -1; - } -} - - -/** - * @brief SCSI_TestUnitReady - * Process SCSI Test Unit Ready Command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ -static int8_t SCSI_TestUnitReady(uint8_t lun, uint8_t *params) -{ - - /* case 9 : Hi > D0 */ - if (MSC_BOT_cbw.dDataLength != 0) - { - SCSI_SenseCode(MSC_BOT_cbw.bLUN, - ILLEGAL_REQUEST, - INVALID_CDB); - return -1; - } - - if(USBD_STORAGE_fops->IsReady(lun) !=0 ) - { - SCSI_SenseCode(lun, - NOT_READY, - MEDIUM_NOT_PRESENT); - return -1; - } - MSC_BOT_DataLen = 0; - return 0; -} - -/** - * @brief SCSI_Inquiry - * Process Inquiry command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ -static int8_t SCSI_Inquiry(uint8_t lun, uint8_t *params) -{ - uint8_t* pPage; - uint16_t len; - - if (params[1] & 0x01)/*Evpd is set*/ - { - pPage = (uint8_t *)MSC_Page00_Inquiry_Data; - len = LENGTH_INQUIRY_PAGE00; - } - else - { - - pPage = (uint8_t *)&USBD_STORAGE_fops->pInquiry[lun * USBD_STD_INQUIRY_LENGTH]; - len = pPage[4] + 5; - - if (params[4] <= len) - { - len = params[4]; - } - } - MSC_BOT_DataLen = len; - - while (len) - { - len--; - MSC_BOT_Data[len] = pPage[len]; - } - return 0; -} - -/** - * @brief SCSI_ReadCapacity10 - * Process Read Capacity 10 command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ -static int8_t SCSI_ReadCapacity10(uint8_t lun, uint8_t *params) -{ - - if(USBD_STORAGE_fops->GetCapacity(lun, &SCSI_blk_nbr, &SCSI_blk_size) != 0) - { - SCSI_SenseCode(lun, - NOT_READY, - MEDIUM_NOT_PRESENT); - return -1; - } - else - { - - MSC_BOT_Data[0] = (uint8_t)((SCSI_blk_nbr - 1) >> 24); - MSC_BOT_Data[1] = (uint8_t)((SCSI_blk_nbr - 1) >> 16); - MSC_BOT_Data[2] = (uint8_t)((SCSI_blk_nbr - 1) >> 8); - MSC_BOT_Data[3] = (uint8_t)(SCSI_blk_nbr - 1); - - MSC_BOT_Data[4] = (uint8_t)(SCSI_blk_size >> 24); - MSC_BOT_Data[5] = (uint8_t)(SCSI_blk_size >> 16); - MSC_BOT_Data[6] = (uint8_t)(SCSI_blk_size >> 8); - MSC_BOT_Data[7] = (uint8_t)(SCSI_blk_size); - - MSC_BOT_DataLen = 8; - return 0; - } -} -/** - * @brief SCSI_ReadFormatCapacity - * Process Read Format Capacity command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ -static int8_t SCSI_ReadFormatCapacity(uint8_t lun, uint8_t *params) -{ - - uint32_t blk_size; - uint32_t blk_nbr; - uint16_t i; - - for(i=0 ; i < 12 ; i++) - { - MSC_BOT_Data[i] = 0; - } - - if(USBD_STORAGE_fops->GetCapacity(lun, &blk_nbr, &blk_size) != 0) - { - SCSI_SenseCode(lun, - NOT_READY, - MEDIUM_NOT_PRESENT); - return (-1); - } - else - { - MSC_BOT_Data[3] = 0x08; - MSC_BOT_Data[4] = (uint8_t)((blk_nbr - 1) >> 24); - MSC_BOT_Data[5] = (uint8_t)((blk_nbr - 1) >> 16); - MSC_BOT_Data[6] = (uint8_t)((blk_nbr - 1) >> 8); - MSC_BOT_Data[7] = (uint8_t)(blk_nbr - 1); - - MSC_BOT_Data[8] = 0x02; - MSC_BOT_Data[9] = (uint8_t)(blk_size >> 16); - MSC_BOT_Data[10] = (uint8_t)(blk_size >> 8); - MSC_BOT_Data[11] = (uint8_t)(blk_size); - - MSC_BOT_DataLen = 12; - return 0; - } -} -/** - * @brief SCSI_ModeSense6 - * Process Mode Sense6 command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ -static int8_t SCSI_ModeSense6 (uint8_t lun, uint8_t *params) -{ - - uint16_t len = 8 ; - MSC_BOT_DataLen = len; - - while (len) - { - len--; - MSC_BOT_Data[len] = MSC_Mode_Sense6_data[len]; - } - return 0; -} - -/** - * @brief SCSI_ModeSense10 - * Process Mode Sense10 command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ -static int8_t SCSI_ModeSense10 (uint8_t lun, uint8_t *params) -{ - uint16_t len = 8; - - MSC_BOT_DataLen = len; - - while (len) - { - len--; - MSC_BOT_Data[len] = MSC_Mode_Sense10_data[len]; - } - return 0; -} - -/** - * @brief SCSI_RequestSense - * Process Request Sense command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ - -static int8_t SCSI_RequestSense (uint8_t lun, uint8_t *params) -{ - uint8_t i; - - for(i=0 ; i < REQUEST_SENSE_DATA_LEN ; i++) - { - MSC_BOT_Data[i] = 0; - } - - MSC_BOT_Data[0] = 0x70; - MSC_BOT_Data[7] = REQUEST_SENSE_DATA_LEN - 6; - - if((SCSI_Sense_Head != SCSI_Sense_Tail)) { - - MSC_BOT_Data[2] = SCSI_Sense[SCSI_Sense_Head].Skey; - MSC_BOT_Data[12] = SCSI_Sense[SCSI_Sense_Head].w.b.ASCQ; - MSC_BOT_Data[13] = SCSI_Sense[SCSI_Sense_Head].w.b.ASC; - SCSI_Sense_Head++; - - if (SCSI_Sense_Head == SENSE_LIST_DEEPTH) - { - SCSI_Sense_Head = 0; - } - } - MSC_BOT_DataLen = REQUEST_SENSE_DATA_LEN; - - if (params[4] <= REQUEST_SENSE_DATA_LEN) - { - MSC_BOT_DataLen = params[4]; - } - return 0; -} - -/** - * @brief SCSI_SenseCode - * Load the last error code in the error list - * @param lun: Logical unit number - * @param sKey: Sense Key - * @param ASC: Additional Sense Key - * @retval none - - */ -void SCSI_SenseCode(uint8_t lun, uint8_t sKey, uint8_t ASC) -{ - SCSI_Sense[SCSI_Sense_Tail].Skey = sKey; - SCSI_Sense[SCSI_Sense_Tail].w.ASC = ASC << 8; - SCSI_Sense_Tail++; - if (SCSI_Sense_Tail == SENSE_LIST_DEEPTH) - { - SCSI_Sense_Tail = 0; - } -} -/** - * @brief SCSI_StartStopUnit - * Process Start Stop Unit command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ -static int8_t SCSI_StartStopUnit(uint8_t lun, uint8_t *params) -{ - MSC_BOT_DataLen = 0; - return 0; -} - -/** - * @brief SCSI_Read10 - * Process Read10 command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ -static int8_t SCSI_Read10(uint8_t lun , uint8_t *params) -{ - if(MSC_BOT_State == BOT_IDLE) /* Idle */ - { - - /* case 10 : Ho <> Di */ - - if ((MSC_BOT_cbw.bmFlags & 0x80) != 0x80) - { - SCSI_SenseCode(MSC_BOT_cbw.bLUN, - ILLEGAL_REQUEST, - INVALID_CDB); - return -1; - } - - if(USBD_STORAGE_fops->IsReady(lun) !=0 ) - { - SCSI_SenseCode(lun, - NOT_READY, - MEDIUM_NOT_PRESENT); - return -1; - } - - SCSI_blk_addr = (params[2] << 24) | \ - (params[3] << 16) | \ - (params[4] << 8) | \ - params[5]; - - SCSI_blk_len = (params[7] << 8) | \ - params[8]; - - - - if( SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0) - { - return -1; /* error */ - } - - MSC_BOT_State = BOT_DATA_IN; - SCSI_blk_addr *= SCSI_blk_size; - SCSI_blk_len *= SCSI_blk_size; - - /* cases 4,5 : Hi <> Dn */ - if (MSC_BOT_cbw.dDataLength != SCSI_blk_len) - { - SCSI_SenseCode(MSC_BOT_cbw.bLUN, - ILLEGAL_REQUEST, - INVALID_CDB); - return -1; - } - } - MSC_BOT_DataLen = MSC_MEDIA_PACKET; - - return SCSI_ProcessRead(lun); -} - -/** - * @brief SCSI_Write10 - * Process Write10 command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ - -static int8_t SCSI_Write10 (uint8_t lun , uint8_t *params) -{ - if (MSC_BOT_State == BOT_IDLE) /* Idle */ - { - - /* case 8 : Hi <> Do */ - - if ((MSC_BOT_cbw.bmFlags & 0x80) == 0x80) - { - SCSI_SenseCode(MSC_BOT_cbw.bLUN, - ILLEGAL_REQUEST, - INVALID_CDB); - return -1; - } - - /* Check whether Media is ready */ - if(USBD_STORAGE_fops->IsReady(lun) !=0 ) - { - SCSI_SenseCode(lun, - NOT_READY, - MEDIUM_NOT_PRESENT); - return -1; - } - - /* Check If media is write-protected */ - if(USBD_STORAGE_fops->IsWriteProtected(lun) !=0 ) - { - SCSI_SenseCode(lun, - NOT_READY, - WRITE_PROTECTED); - return -1; - } - - - SCSI_blk_addr = (params[2] << 24) | \ - (params[3] << 16) | \ - (params[4] << 8) | \ - params[5]; - SCSI_blk_len = (params[7] << 8) | \ - params[8]; - - /* check if LBA address is in the right range */ - if(SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0) - { - return -1; /* error */ - } - - SCSI_blk_addr *= SCSI_blk_size; - SCSI_blk_len *= SCSI_blk_size; - - /* cases 3,11,13 : Hn,Ho <> D0 */ - if (MSC_BOT_cbw.dDataLength != SCSI_blk_len) - { - SCSI_SenseCode(MSC_BOT_cbw.bLUN, - ILLEGAL_REQUEST, - INVALID_CDB); - return -1; - } - - /* Prepare EP to receive first data packet */ - MSC_BOT_State = BOT_DATA_OUT; - DCD_EP_PrepareRx (cdev, - MSC_OUT_EP, - MSC_BOT_Data, - MIN (SCSI_blk_len, MSC_MEDIA_PACKET)); - } - else /* Write Process ongoing */ - { - return SCSI_ProcessWrite(lun); - } - return 0; -} - - -/** - * @brief SCSI_Verify10 - * Process Verify10 command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ - -static int8_t SCSI_Verify10(uint8_t lun , uint8_t *params){ - if ((params[1]& 0x02) == 0x02) - { - SCSI_SenseCode (lun, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); - return -1; /* Error, Verify Mode Not supported*/ - } - - if(SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0) - { - return -1; /* error */ - } - MSC_BOT_DataLen = 0; - return 0; -} - -/** - * @brief SCSI_CheckAddressRange - * Check address range - * @param lun: Logical unit number - * @param blk_offset: first block address - * @param blk_nbr: number of block to be processed - * @retval status - */ -static int8_t SCSI_CheckAddressRange (uint8_t lun , uint32_t blk_offset , uint16_t blk_nbr) -{ - - if ((blk_offset + blk_nbr) > SCSI_blk_nbr ) - { - SCSI_SenseCode(lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); - return -1; - } - return 0; -} - -/** - * @brief SCSI_ProcessRead - * Handle Read Process - * @param lun: Logical unit number - * @retval status - */ -static int8_t SCSI_ProcessRead (uint8_t lun) -{ - uint32_t len; - - len = MIN(SCSI_blk_len , MSC_MEDIA_PACKET); - - if( USBD_STORAGE_fops->Read(lun , - MSC_BOT_Data, - SCSI_blk_addr / SCSI_blk_size, - len / SCSI_blk_size) < 0) - { - - SCSI_SenseCode(lun, HARDWARE_ERROR, UNRECOVERED_READ_ERROR); - return -1; - } - - - DCD_EP_Tx (cdev, - MSC_IN_EP, - MSC_BOT_Data, - len); - - - SCSI_blk_addr += len; - SCSI_blk_len -= len; - - /* case 6 : Hi = Di */ - MSC_BOT_csw.dDataResidue -= len; - - if (SCSI_blk_len == 0) - { - MSC_BOT_State = BOT_LAST_DATA_IN; - } - return 0; -} - -/** - * @brief SCSI_ProcessWrite - * Handle Write Process - * @param lun: Logical unit number - * @retval status - */ - -static int8_t SCSI_ProcessWrite (uint8_t lun) -{ - uint32_t len; - - len = MIN(SCSI_blk_len , MSC_MEDIA_PACKET); - - if(USBD_STORAGE_fops->Write(lun , - MSC_BOT_Data, - SCSI_blk_addr / SCSI_blk_size, - len / SCSI_blk_size) < 0) - { - SCSI_SenseCode(lun, HARDWARE_ERROR, WRITE_FAULT); - return -1; - } - - - SCSI_blk_addr += len; - SCSI_blk_len -= len; - - /* case 12 : Ho = Do */ - MSC_BOT_csw.dDataResidue -= len; - - if (SCSI_blk_len == 0) - { - MSC_BOT_SendCSW (cdev, CSW_CMD_PASSED); - } - else - { - /* Prepare EP to Receive next packet */ - DCD_EP_PrepareRx (cdev, - MSC_OUT_EP, - MSC_BOT_Data, - MIN (SCSI_blk_len, MSC_MEDIA_PACKET)); - } - - return 0; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_storage_template.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_storage_template.c deleted file mode 100644 index 6b56841..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_storage_template.c +++ /dev/null @@ -1,175 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_storage_template.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Memory management layer - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_msc_mem.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define STORAGE_LUN_NBR 1 -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* USB Mass storage Standard Inquiry Data */ -const int8_t STORAGE_Inquirydata[] = {//36 - - /* LUN 0 */ - 0x00, - 0x80, - 0x02, - 0x02, - (USBD_STD_INQUIRY_LENGTH - 5), - 0x00, - 0x00, - 0x00, - 'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */ - 'P', 'r', 'o', 'd', 'u', 't', ' ', ' ', /* Product : 16 Bytes */ - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - '0', '.', '0' ,'1', /* Version : 4 Bytes */ -}; - -USBD_STORAGE_cb_TypeDef USBD_MICRO_SDIO_fops = -{ - STORAGE_Init, - STORAGE_GetCapacity, - STORAGE_IsReady, - STORAGE_IsWriteProtected, - STORAGE_Read, - STORAGE_Write, - STORAGE_GetMaxLun, - STORAGE_Inquirydata, - -}; - -USBD_STORAGE_cb_TypeDef *USBD_STORAGE_fops = &USBD_MICRO_SDIO_fops; - -/* Private function prototypes -----------------------------------------------*/ -int8_t STORAGE_Init (uint8_t lun); - -int8_t STORAGE_GetCapacity (uint8_t lun, - uint32_t *block_num, - uint16_t *block_size); - -int8_t STORAGE_IsReady (uint8_t lun); - -int8_t STORAGE_IsWriteProtected (uint8_t lun); - -int8_t STORAGE_Read (uint8_t lun, - uint8_t *buf, - uint32_t blk_addr, - uint16_t blk_len); - -int8_t STORAGE_Write (uint8_t lun, - uint8_t *buf, - uint32_t blk_addr, - uint16_t blk_len); - -int8_t STORAGE_GetMaxLun (void); - -/* Private functions ---------------------------------------------------------*/ -/** - * @brief Initialize the storage medium - * @param lun : logical unit number - * @retval Status - */ -int8_t STORAGE_Init (uint8_t lun) -{ - return (0); -} - -/** - * @brief return medium capacity and block size - * @param lun : logical unit number - * @param block_num : number of physical block - * @param block_size : size of a physical block - * @retval Status - */ -int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint16_t *block_size) -{ - return (0); -} - -/** - * @brief check whether the medium is ready - * @param lun : logical unit number - * @retval Status - */ -int8_t STORAGE_IsReady (uint8_t lun) -{ - return (0); -} - -/** - * @brief check whether the medium is write-protected - * @param lun : logical unit number - * @retval Status - */ -int8_t STORAGE_IsWriteProtected (uint8_t lun) -{ - return 0; -} - -/** - * @brief Read data from the medium - * @param lun : logical unit number - * @param buf : Pointer to the buffer to save data - * @param blk_addr : address of 1st block to be read - * @param blk_len : nmber of blocks to be read - * @retval Status - */ -int8_t STORAGE_Read (uint8_t lun, - uint8_t *buf, - uint32_t blk_addr, - uint16_t blk_len) -{ - return 0; -} -/** - * @brief Write data to the medium - * @param lun : logical unit number - * @param buf : Pointer to the buffer to write from - * @param blk_addr : address of 1st block to be written - * @param blk_len : nmber of blocks to be read - * @retval Status - */ -int8_t STORAGE_Write (uint8_t lun, - uint8_t *buf, - uint32_t blk_addr, - uint16_t blk_len) -{ - return (0); -} -/** - * @brief Return number of supported logical unit - * @param None - * @retval number of logical unit - */ -int8_t STORAGE_GetMaxLun (void) -{ - return (STORAGE_LUN_NBR - 1); -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_conf_template.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_conf_template.h deleted file mode 100644 index e225398..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_conf_template.h +++ /dev/null @@ -1,159 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_conf_template.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief usb device configuration template file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CONF__H__ -#define __USBD_CONF__H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" -#include "audio_app_conf.h" /* Audio example Include*/ - -/* Exported defines ----------------------------------------------------------*/ -/*Common Defines*/ -#define USBD_SELF_POWERED -#define USBD_CFG_MAX_NUM 1 - -/*Audio Class user defines*/ -#define AUDIO_TOTAL_IF_NUM 0x02 -#define USBD_ITF_MAX_NUM 1 -#define USB_MAX_STR_DESC_SIZ 200 -#define AUDIO_OUT_EP 0x01 - -/*CCID Class user defines*/ -#define USBD_ITF_MAX_NUM 1 -#define USB_MAX_STR_DESC_SIZ 64 -#define USB_SUPPORT_USER_STRING_DESC -#define CCID_BULK_IN_EP 0x81 -#define CCID_BULK_OUT_EP 0x01 -#define CCID_INTR_IN_EP 0x82 -#define CCID_BULK_EP_MAX_PACKET 64 -#define CCID_INTR_EP_MAX_PACKET 8 - -/*Composite HID + CDC Classes user defines*/ -#define USBD_ITF_MAX_NUM 1 -#define USB_MAX_STR_DESC_SIZ 64 -#define CUSTOMHID_SIZ_REPORT_DESC 163 -#define CUSTOMHID_SIZ_CONFIG_DESC 41 -#define HID_IN_EP 0x81 -#define HID_OUT_EP 0x01 - -/*2 Bytes max*/ -#define HID_IN_PACKET 2 -#define HID_OUT_PACKET 2 -#define CDC_IN_EP 0x83 /* EP1 for data IN */ -#define CDC_OUT_EP 0x03 /* EP3 for data OUT */ -#define CDC_CMD_EP 0x82 /* EP2 for CDC commands */ - -/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrate and performance. */ -#define CDC_DATA_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */ -#define CDC_CMD_PACKET_SZE 8 /* Control Endpoint Packet size */ -#define CDC_IN_FRAME_INTERVAL 5 /* Number of frames between IN transfers */ -#define APP_RX_DATA_SIZE 2048 /* Total size of IN buffer: APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 - should be > CDC_IN_FRAME_INTERVAL */ -#define APP_FOPS VCP_fops - -/*Composite HID + MSC Class user defines*/ -#define USBD_ITF_MAX_NUM 1 -#define USB_MAX_STR_DESC_SIZ 64 -#define CUSTOMHID_SIZ_REPORT_DESC 163 -#define CUSTOMHID_SIZ_CONFIG_DESC 41 -#define HID_IN_EP 0x81 -#define HID_OUT_EP 0x01 -/*2 Bytes max*/ -#define HID_IN_PACKET 2 -#define HID_OUT_PACKET 2 -#define MSC_IN_EP 0x82 -#define MSC_OUT_EP 0x02 -#define MSC_MAX_PACKET 64 -#define MSC_MEDIA_PACKET 512 - -/*Custom HID Class user defines*/ -#define USBD_ITF_MAX_NUM 1 -#define USB_MAX_STR_DESC_SIZ 64 -#define CUSTOMHID_SIZ_REPORT_DESC 163 -#define CUSTOMHID_SIZ_CONFIG_DESC 41 -#define HID_IN_EP 0x81 -#define HID_OUT_EP 0x01 -#define HID_IN_PACKET 2 -#define HID_OUT_PACKET 2 - -/*DFU Class user defines*/ -#define USBD_ITF_MAX_NUM MAX_USED_MEDIA -#define USB_MAX_STR_DESC_SIZ 200 -#define USB_SUPPORT_USER_STRING_DESC -#define XFERSIZE 1024 /* Max DFU Packet Size = 1024 bytes */ -#define DFU_IN_EP 0x80 -#define DFU_OUT_EP 0x00 - /* Maximum number of supported media (Flash) */ -#define MAX_USED_MEDIA 1 -/* Flash memory address from where user application will be loaded - This address represents the DFU code protected against write and erase operations.*/ -#define APP_DEFAULT_ADD 0x08003000 -#define DFU_MAL_IS_PROTECTED_AREA(add) (uint8_t)(((add >= 0x08000000) && (add < (APP_DEFAULT_ADD)))? 1:0) -#define TRANSFER_SIZE_BYTES(sze) ((uint8_t)(sze)), /* XFERSIZEB0 */\ - ((uint8_t)(sze >> 8)) /* XFERSIZEB1 */ - -/*HID Class user defines*/ -#define USBD_ITF_MAX_NUM 1 -#define USB_MAX_STR_DESC_SIZ 64 -#define USB_SUPPORT_USER_STRING_DESC -#define HID_IN_EP 0x81 -#define HID_OUT_EP 0x01 -#define HID_IN_PACKET 4 -#define HID_OUT_PACKET 4 - -/*MSC Class user defines*/ -#define USBD_ITF_MAX_NUM 1 -#define USB_MAX_STR_DESC_SIZ 64 -#define MSC_IN_EP 0x81 -#define MSC_OUT_EP 0x02 -#define MSC_MAX_PACKET 64 -#define MSC_MEDIA_PACKET 512 - -/*VCP Class user defines*/ -#define USBD_ITF_MAX_NUM 1 -#define USB_MAX_STR_DESC_SIZ 255 -#define CDC_IN_EP 0x81 /* EP1 for data IN */ -#define CDC_OUT_EP 0x03 /* EP3 for data OUT */ -#define CDC_CMD_EP 0x82 /* EP2 for CDC commands */ -/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrate and performance. */ -#define CDC_DATA_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */ -#define CDC_CMD_PACKET_SZE 8 /* Control Endpoint Packet size */ -#define CDC_IN_FRAME_INTERVAL 5 /* Number of frames between IN transfers */ -#define APP_RX_DATA_SIZE 2048 /* Total size of IN buffer: - APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL */ -#define APP_FOPS VCP_fops - -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#endif /* __USBD_CONF__H__ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_core.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_core.h deleted file mode 100644 index 094c050..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_core.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_core.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Header file for usbd_core.c - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CORE_H -#define __USBD_CORE_H - -/* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" -#include "usb_dcd_int.h" - -/* Exported defines ----------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -typedef enum { - USBD_OK = 0, - USBD_BUSY, - USBD_FAIL, -}USBD_Status; -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void USBD_Init(USB_CORE_HANDLE *pdev, - USBD_DEVICE *pDevice, - USBD_Class_cb_TypeDef *class_cb, - USBD_Usr_cb_TypeDef *usr_cb); - -USBD_Status USBD_DeInit(USB_CORE_HANDLE *pdev); - -USBD_Status USBD_ClrCfg(USB_CORE_HANDLE *pdev, uint8_t cfgidx); - -USBD_Status USBD_SetCfg(USB_CORE_HANDLE *pdev, uint8_t cfgidx); - -#endif /* __USBD_CORE_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_def.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_def.h deleted file mode 100644 index e993039..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_def.h +++ /dev/null @@ -1,100 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_def.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief general defines for the usb device library - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_DEF_H -#define __USBD_DEF_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" -#include "stdbool.h" - -/* Exported defines ----------------------------------------------------------*/ -#ifndef NULL - #define NULL 0 -#endif - -#define USB_LEN_DEV_QUALIFIER_DESC 0x0A -#define USB_LEN_CFG_DESC 0x09 - -#define USBD_IDX_LANGID_STR 0x00 -#define USBD_IDX_MFC_STR 0x01 -#define USBD_IDX_PRODUCT_STR 0x02 -#define USBD_IDX_SERIAL_STR 0x03 -#define USBD_IDX_CONFIG_STR 0x04 -#define USBD_IDX_INTERFACE_STR 0x05 - -#define USB_REQ_TYPE_STANDARD 0x00 -#define USB_REQ_TYPE_CLASS 0x20 -#define USB_REQ_TYPE_MASK 0x60 - -#define USB_REQ_RECIPIENT_DEVICE 0x00 -#define USB_REQ_RECIPIENT_INTERFACE 0x01 -#define USB_REQ_RECIPIENT_ENDPOINT 0x02 -#define USB_REQ_RECIPIENT_MASK 0x03 - -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -#define USB_REQ_SET_FEATURE 0x03 -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B - -#define USB_DESC_TYPE_DEVICE 1 -#define USB_DESC_TYPE_CONFIGURATION 2 -#define USB_DESC_TYPE_STRING 3 -#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 -#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 -#define USB_DESC_TYPE_BOS 0xF - - -#define USB_CONFIG_REMOTE_WAKEUP 2 -#define USB_CONFIG_SELF_POWERED 1 - -#define USB_FEATURE_EP_HALT 0 -#define USB_FEATURE_REMOTE_WAKEUP 1 -#define USB_FEATURE_TEST_MODE 2 - -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ - (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) - -#define LOBYTE(x) ((uint8_t)(x & 0x00FF)) -#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) - -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - - -#endif /* __USBD_DEF_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_ioreq.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_ioreq.h deleted file mode 100644 index ed9c29b..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_ioreq.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ioreq.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header file for the usbd_ioreq.c file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_IOREQ_H_ -#define __USBD_IOREQ_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" -#include "usbd_core.h" - -/* Exported defines ----------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -USBD_Status USBD_CtlSendData (USB_CORE_HANDLE *pdev, - uint8_t *buf, - uint16_t len); - -USBD_Status USBD_CtlContinueSendData (USB_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len); - -USBD_Status USBD_CtlPrepareRx (USB_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len); - -USBD_Status USBD_CtlContinueRx (USB_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len); - -USBD_Status USBD_CtlSendStatus (USB_CORE_HANDLE *pdev); - -USBD_Status USBD_CtlReceiveStatus (USB_CORE_HANDLE *pdev); - -uint16_t USBD_GetRxCount (USB_CORE_HANDLE *pdev , - uint8_t epnum); - - -#endif /* __USBD_IOREQ_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_pwr.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_pwr.h deleted file mode 100644 index fc966af..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_pwr.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_pwr.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Header file for usbd_pwr.c - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_PWR_H__ -#define __USBD_PWR_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" -#include "usb_bsp.h" - -/* Exported defines ----------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -typedef enum _RESUME_STATE -{ - RESUME_EXTERNAL, - RESUME_INTERNAL, -#ifdef LPM_ENABLED - L1_RESUME_INTERNAL, -#endif - RESUME_LATER, - RESUME_WAIT, - RESUME_START, - RESUME_ON, - RESUME_OFF, - RESUME_ESOF -} RESUME_STATE; - -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern USB_CORE_HANDLE USB_Device_dev; - -/* Exported functions ------------------------------------------------------- */ -void Suspend(void); -void Resume_Init(void); -void Resume(RESUME_STATE eResumeSetVal); -void Leave_LowPowerMode(void); - -#endif /*__USBD_PWR_H__*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_req.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_req.h deleted file mode 100644 index 7e53ea6..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_req.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief header file for the usbd_req.c file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ - -#ifndef __USB_REQUEST_H_ -#define __USB_REQUEST_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" -#include "usbd_desc.h" - -/* Exported defines ----------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -USBD_Status USBD_StdDevReq (USB_CORE_HANDLE *pdev, USB_SETUP_REQ *req); -USBD_Status USBD_StdItfReq (USB_CORE_HANDLE *pdev, USB_SETUP_REQ *req); -USBD_Status USBD_StdEPReq (USB_CORE_HANDLE *pdev, USB_SETUP_REQ *req); -void USBD_ParseSetupRequest( USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -void USBD_CtlError( USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); - -#endif /* __USB_REQUEST_H_ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_usr.h b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_usr.h deleted file mode 100644 index 6f9ada2..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_usr.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_usr.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief Header file for usbd_usr.c - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_USR_H__ -#define __USBD_USR_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" - -/* Exported defines ----------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern USBD_Usr_cb_TypeDef USR_cb; - -/* Exported functions ------------------------------------------------------- */ -void USBD_USR_Init(void); -void USBD_USR_DeviceReset (uint8_t speed); -void USBD_USR_DeviceConfigured (void); -void USBD_USR_DeviceSuspended(void); -void USBD_USR_DeviceResumed(void); - -#endif /*__USBD_USR_H__*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_core.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_core.c deleted file mode 100644 index 5ae1d06..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_core.c +++ /dev/null @@ -1,366 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_core.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the USBD core functions. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" -#include "usbd_req.h" -#include "usbd_ioreq.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -extern uint32_t ADDRESS; - -/* Private function prototypes -----------------------------------------------*/ -static uint8_t USBD_SetupStage(USB_CORE_HANDLE *pdev); -static uint8_t USBD_DataOutStage(USB_CORE_HANDLE *pdev , uint8_t epnum); -static uint8_t USBD_DataInStage(USB_CORE_HANDLE *pdev , uint8_t epnum); -static uint8_t USBD_SOF(USB_CORE_HANDLE *pdev); -static uint8_t USBD_Reset(USB_CORE_HANDLE *pdev); -static uint8_t USBD_Suspend(USB_CORE_HANDLE *pdev); -static uint8_t USBD_Resume(USB_CORE_HANDLE *pdev); - -USBD_DCD_INT_cb_TypeDef USBD_DCD_INT_cb = -{ - USBD_DataOutStage, - USBD_DataInStage, - USBD_SetupStage, - USBD_SOF, - USBD_Reset, - USBD_Suspend, - USBD_Resume, - -}; - -USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops = &USBD_DCD_INT_cb; - -/* Private functions ---------------------------------------------------------*/ -/** - * @brief USBD_Init - * Initializes the device stack and load the class driver - * @param pdev: device instance - * @param class_cb: Class callback structure address - * @param usr_cb: User callback structure address - * @retval None - */ -void USBD_Init(USB_CORE_HANDLE *pdev, - USBD_DEVICE *pDevice, - USBD_Class_cb_TypeDef *class_cb, - USBD_Usr_cb_TypeDef *usr_cb) -{ - /* Hardware Init */ - USB_BSP_Init(pdev); - - USBD_DeInit(pdev); - - /*Register class and user callbacks */ - pdev->dev.class_cb = class_cb; - pdev->dev.usr_cb = usr_cb; - pdev->dev.usr_device = pDevice; - - /* Update the serial number string descriptor with the data from the unique ID*/ - Get_SerialNum(); - - /* set USB DEVICE core params */ - DCD_Init(pdev); - - /* Upon Init call usr callback */ - pdev->dev.usr_cb->Init(); - - /* Enable Interrupts */ - USB_BSP_EnableInterrupt(pdev); - - /* Enable the pull-up */ -#ifdef INTERNAL_PULLUP - DCD_DevConnect(pdev); -#else - USB_BSP_DevConnect(pdev); -#endif -} - -/** - * @brief USBD_DeInit - * Re-Initialize th device library - * @param pdev: device instance - * @retval status: status - */ -USBD_Status USBD_DeInit(USB_CORE_HANDLE *pdev) -{ - /* Software Init */ - - return USBD_OK; -} - -/** - * @brief USBD_SetupStage - * Handle the setup stage - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_SetupStage(USB_CORE_HANDLE *pdev) -{ - USB_SETUP_REQ req; - - USBD_ParseSetupRequest(pdev , &req); - - switch (req.bmRequest & 0x1F) - { - case USB_REQ_RECIPIENT_DEVICE: - USBD_StdDevReq (pdev, &req); - break; - - case USB_REQ_RECIPIENT_INTERFACE: - USBD_StdItfReq(pdev, &req); - break; - - case USB_REQ_RECIPIENT_ENDPOINT: - USBD_StdEPReq(pdev, &req); - break; - - default: - DCD_EP_Stall(pdev , req.bmRequest & 0x80); - break; - } - return USBD_OK; -} - -/** - * @brief USBD_DataOutStage - * Handle data out stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_DataOutStage(USB_CORE_HANDLE *pdev , uint8_t epnum) -{ - USB_EP *ep; - - if(epnum == 0) - { - ep = &pdev->dev.out_ep[0]; - if ( pdev->dev.device_state == USB_EP0_DATA_OUT) - { - if(ep->rem_data_len > ep->maxpacket) - { - ep->rem_data_len -= ep->maxpacket; - - USBD_CtlContinueRx (pdev, - ep->xfer_buff, - MIN(ep->rem_data_len ,ep->maxpacket)); - } - else - { - if((pdev->dev.class_cb->EP0_RxReady != NULL)&& - (pdev->dev.device_status == USB_CONFIGURED)) - { - pdev->dev.class_cb->EP0_RxReady(pdev); - } - USBD_CtlSendStatus(pdev); - } - } - } - else if((pdev->dev.class_cb->DataOut != NULL)&& - (pdev->dev.device_status == USB_CONFIGURED)) - { - pdev->dev.class_cb->DataOut(pdev, epnum); - } - return USBD_OK; -} - -/** - * @brief USBD_DataInStage - * Handle data in stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_DataInStage(USB_CORE_HANDLE *pdev , uint8_t epnum) -{ - USB_EP *ep; - - if(epnum == 0) - { - ep = &pdev->dev.in_ep[0]; - if ( pdev->dev.device_state == USB_EP0_DATA_IN) - { - if(ep->rem_data_len > ep->maxpacket) - { - ep->rem_data_len -= ep->maxpacket; - USBD_CtlContinueSendData (pdev, - ep->xfer_buff, - ep->rem_data_len); - } - else - { /* last packet is MPS multiple, so send ZLP packet */ - if((ep->total_data_len % ep->maxpacket == 0) && - (ep->total_data_len >= ep->maxpacket) && - (ep->total_data_len < ep->ctl_data_len )) - { - - USBD_CtlContinueSendData(pdev , NULL, 0); - ep->ctl_data_len = 0; - } - else - { - if((pdev->dev.class_cb->EP0_TxSent != NULL)&& - (pdev->dev.device_status == USB_CONFIGURED)) - { - pdev->dev.class_cb->EP0_TxSent(pdev); - } - USBD_CtlReceiveStatus(pdev); - } - } - } - else if ((pdev->dev.device_state == USB_EP0_STATUS_IN)&& (ADDRESS!=0)) - { - - DCD_EP_SetAddress(pdev, ADDRESS); - ADDRESS = 0; - } - } - else if((pdev->dev.class_cb->DataIn != NULL)&& - (pdev->dev.device_status == USB_CONFIGURED)) - { - pdev->dev.class_cb->DataIn(pdev, epnum); - } - return USBD_OK; -} - -/** - * @brief USBD_Reset - * Handle Reset event - * @param pdev: device instance - * @retval status - */ - -static uint8_t USBD_Reset(USB_CORE_HANDLE *pdev) -{ - - DCD_PMA_Config(pdev , 0x00 ,USB_SNG_BUF, ENDP0_RX_ADDRESS); - DCD_PMA_Config(pdev , 0x80 ,USB_SNG_BUF, ENDP0_TX_ADDRESS); - - /* Open EP0 OUT */ - DCD_EP_Open(pdev, - 0x00, - USB_MAX_EP0_SIZE, - EP_TYPE_CTRL); - - /* Open EP0 IN */ - DCD_EP_Open(pdev, - 0x80, - USB_MAX_EP0_SIZE, - EP_TYPE_CTRL); - - /* Upon Reset call user call back */ - pdev->dev.device_status = USB_DEFAULT; - pdev->dev.usr_cb->DeviceReset(pdev->dev.speed); - - return USBD_OK; -} - -/** - * @brief USBD_Resume - * Handle Resume event - * @param pdev: device instance - * @retval status - */ - -static uint8_t USBD_Resume(USB_CORE_HANDLE *pdev) -{ - /* Upon Resume call user call back */ - pdev->dev.usr_cb->DeviceResumed(); - pdev->dev.device_status = pdev->dev.device_old_status; - return USBD_OK; -} - - -/** - * @brief USBD_Suspend - * Handle Suspend event - * @param pdev: device instance - * @retval status - */ - -static uint8_t USBD_Suspend(USB_CORE_HANDLE *pdev) -{ - pdev->dev.device_old_status = pdev->dev.device_status; - /*Device is in Suspended State*/ - pdev->dev.device_status = USB_SUSPENDED; - /* Upon Resume call user call back */ - pdev->dev.usr_cb->DeviceSuspended(); - return USBD_OK; -} - - -/** - * @brief USBD_SOF - * Handle SOF event - * @param pdev: device instance - * @retval status - */ - -static uint8_t USBD_SOF(USB_CORE_HANDLE *pdev) -{ - if(pdev->dev.class_cb->SOF) - { - pdev->dev.class_cb->SOF(pdev); - } - return USBD_OK; -} -/** - * @brief USBD_SetCfg - * Configure device and start the interface - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status - */ - -USBD_Status USBD_SetCfg(USB_CORE_HANDLE *pdev, uint8_t cfgidx) -{ - pdev->dev.class_cb->Init(pdev, cfgidx); - - /* Upon set config call user call back */ - pdev->dev.usr_cb->DeviceConfigured(); - return USBD_OK; -} - -/** - * @brief USBD_ClrCfg - * Clear current configuration - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status: USBD_Status - */ -USBD_Status USBD_ClrCfg(USB_CORE_HANDLE *pdev, uint8_t cfgidx) -{ - pdev->dev.class_cb->DeInit(pdev, cfgidx); - return USBD_OK; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_ioreq.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_ioreq.c deleted file mode 100644 index 181c9dd..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_ioreq.c +++ /dev/null @@ -1,175 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ioreq.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides the IO requests APIs for control endpoints. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** - * @brief USBD_CtlSendData - * send data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be sent - * @retval status - */ -USBD_Status USBD_CtlSendData (USB_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len) -{ - USBD_Status ret = USBD_OK; - - pdev->dev.in_ep[0].total_data_len = len; - pdev->dev.in_ep[0].rem_data_len = len; - pdev->dev.device_state = USB_EP0_DATA_IN; - - DCD_EP_Tx (pdev, 0, pbuf, len); - - return ret; -} - -/** - * @brief USBD_CtlContinueSendData - * continue sending data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be sent - * @retval status - */ -USBD_Status USBD_CtlContinueSendData (USB_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len) -{ - USBD_Status ret = USBD_OK; - - DCD_EP_Tx (pdev, 0, pbuf, len); - - - return ret; -} - -/** - * @brief USBD_CtlPrepareRx - * receive data on the ctl pipe - * @param pdev: USB device instance - * @param buff: pointer to data buffer - * @param len: length of data to be received - * @retval status - */ -USBD_Status USBD_CtlPrepareRx (USB_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len) -{ - USBD_Status ret = USBD_OK; - - pdev->dev.out_ep[0].total_data_len = len; - pdev->dev.out_ep[0].rem_data_len = len; - pdev->dev.device_state = USB_EP0_DATA_OUT; - - DCD_EP_PrepareRx (pdev, - 0, - pbuf, - len); - - - return ret; -} - -/** - * @brief USBD_CtlContinueRx - * continue receive data on the ctl pipe - * @param pdev: USB device instance - * @param buff: pointer to data buffer - * @param len: length of data to be received - * @retval status - */ -USBD_Status USBD_CtlContinueRx (USB_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len) -{ - USBD_Status ret = USBD_OK; - - DCD_EP_PrepareRx (pdev, - 0, - pbuf, - len); - return ret; -} -/** - * @brief USBD_CtlSendStatus - * send zero length packet on the ctl pipe - * @param pdev: USB device instance - * @retval status - */ -USBD_Status USBD_CtlSendStatus (USB_CORE_HANDLE *pdev) -{ - USBD_Status ret = USBD_OK; - pdev->dev.device_state = USB_EP0_STATUS_IN; - DCD_EP_Tx (pdev, - 0, - NULL, - 0); - return ret; -} - -/** - * @brief USBD_CtlReceiveStatus - * receive zero length packet on the ctl pipe - * @param pdev: USB device instance - * @retval status - */ -USBD_Status USBD_CtlReceiveStatus (USB_CORE_HANDLE *pdev) -{ - USBD_Status ret = USBD_OK; - pdev->dev.device_state = USB_EP0_STATUS_OUT; - DCD_EP_PrepareRx ( pdev, - 0, - NULL, - 0); - - return ret; -} - - -/** - * @brief USBD_GetRxCount - * returns the received data length - * @param pdev: USB device instance - * epnum: endpoint index - * @retval Rx Data blength - */ -uint16_t USBD_GetRxCount (USB_CORE_HANDLE *pdev , uint8_t epnum) -{ - return pdev->dev.out_ep[epnum].xfer_count; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_req.c b/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_req.c deleted file mode 100644 index e75340b..0000000 --- a/attic/NHC-Link042/STM32F0x2_USB-FS-Device_Lib V1.0.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_req.c +++ /dev/null @@ -1,693 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides the standard USB requests following chapter 9. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -uint32_t ADDRESS=0; -uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ] ; - -/* Private function prototypes -----------------------------------------------*/ -static void USBD_GetDescriptor(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_SetAddress(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_SetConfig(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_GetConfig(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_GetStatus(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_SetFeature(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_ClrFeature(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static uint8_t USBD_GetLen(uint8_t *buf); - -/* Private functions ---------------------------------------------------------*/ -/** - * @brief USBD_StdDevReq - * Handle standard usb device requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -USBD_Status USBD_StdDevReq (USB_CORE_HANDLE *pdev, USB_SETUP_REQ *req) -{ - USBD_Status ret = USBD_OK; - - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - - USBD_GetDescriptor (pdev, req) ; - break; - - case USB_REQ_SET_ADDRESS: - USBD_SetAddress(pdev, req); - break; - - case USB_REQ_SET_CONFIGURATION: - USBD_SetConfig (pdev , req); - break; - - case USB_REQ_GET_CONFIGURATION: - USBD_GetConfig (pdev , req); - break; - - case USB_REQ_GET_STATUS: - USBD_GetStatus (pdev , req); - break; - - - case USB_REQ_SET_FEATURE: - USBD_SetFeature (pdev , req); - break; - - case USB_REQ_CLEAR_FEATURE: - USBD_ClrFeature (pdev , req); - break; - - default: - USBD_CtlError(pdev , req); - break; - } - - return ret; -} - -/** - * @brief USBD_StdItfReq - * Handle standard usb interface requests - * @param pdev: USB device instance - * @param req: usb request - * @retval status - */ -USBD_Status USBD_StdItfReq (USB_CORE_HANDLE *pdev, USB_SETUP_REQ *req) -{ - USBD_Status ret = USBD_OK; - - switch (pdev->dev.device_status) - { - case USB_CONFIGURED: - - if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM) - { - ret = (USBD_Status) (pdev->dev.class_cb->Setup (pdev, req)); - - if((req->wLength == 0)&& (ret == USBD_OK)) - { - USBD_CtlSendStatus(pdev); - } - } - else - { - USBD_CtlError(pdev , req); - } - break; - - default: - USBD_CtlError(pdev , req); - break; - } - return ret; -} - -/** - * @brief USBD_StdEPReq - * Handle standard usb endpoint requests - * @param pdev: USB device instance - * @param req: usb request - * @retval status - */ -USBD_Status USBD_StdEPReq (USB_CORE_HANDLE *pdev, USB_SETUP_REQ *req) -{ - - uint8_t ep_addr; - uint32_t USBD_ep_status = 0; - USBD_Status ret = USBD_OK; - - ep_addr = LOBYTE(req->wIndex); - - switch (req->bRequest) - { - case USB_REQ_SET_FEATURE : - - switch (pdev->dev.device_status) - { - case USB_ADDRESSED: - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - DCD_EP_Stall(pdev , ep_addr); - } - break; - - case USB_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - DCD_EP_Stall(pdev , ep_addr); - - } - } - pdev->dev.class_cb->Setup (pdev, req); - USBD_CtlSendStatus(pdev); - - break; - - default: - USBD_CtlError(pdev , req); - break; - } - break; - - case USB_REQ_CLEAR_FEATURE : - - switch (pdev->dev.device_status) - { - case USB_ADDRESSED: - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - DCD_EP_Stall(pdev , ep_addr); - } - break; - - case USB_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - DCD_EP_ClrStall(pdev , ep_addr); - } - } - pdev->dev.class_cb->Setup (pdev, req); - USBD_CtlSendStatus(pdev); - break; - - default: - USBD_CtlError(pdev , req); - break; - } - break; - - case USB_REQ_GET_STATUS: - switch (pdev->dev.device_status) - { - case USB_ADDRESSED: - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - DCD_EP_Stall(pdev , ep_addr); - } - break; - - case USB_CONFIGURED: - - if ((ep_addr & 0x80)== 0x80) - { - if(pdev->dev.in_ep[ep_addr & 0x7F].is_stall) - { - USBD_ep_status = 0x0001; - } - else - { - USBD_ep_status = 0x0000; - } - } - else if ((ep_addr & 0x80)== 0x00) - { - if(pdev->dev.out_ep[ep_addr].is_stall) - { - USBD_ep_status = 0x0001; - } - - else - { - USBD_ep_status = 0x0000; - } - } - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_ep_status, - 2); - break; - - default: - USBD_CtlError(pdev , req); - break; - } - break; - - default: - break; - } - return ret; -} -/** - * @brief USBD_GetDescriptor - * Handle Get Descriptor requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_GetDescriptor(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - uint16_t len; - uint8_t *pbuf; - - switch (req->wValue >> 8) - { -#ifdef LPM_ENABLED - case USB_DESC_TYPE_BOS: - pbuf = pdev->dev.usr_device->GetBOSDescriptor(pdev->dev.speed, &len); - break; -#endif - case USB_DESC_TYPE_DEVICE: - pbuf = pdev->dev.usr_device->GetDeviceDescriptor(pdev->dev.speed, &len); - if (req->wLength == 64) - { - len = 8; - } - break; - - case USB_DESC_TYPE_CONFIGURATION: - pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->dev.speed, &len); - pdev->dev.pConfig_descriptor = pbuf; - break; - - case USB_DESC_TYPE_STRING: - switch ((uint8_t)(req->wValue)) - { - case USBD_IDX_LANGID_STR: - pbuf = pdev->dev.usr_device->GetLangIDStrDescriptor(pdev->dev.speed, &len); - break; - - case USBD_IDX_MFC_STR: - pbuf = pdev->dev.usr_device->GetManufacturerStrDescriptor(pdev->dev.speed, &len); - break; - - case USBD_IDX_PRODUCT_STR: - pbuf = pdev->dev.usr_device->GetProductStrDescriptor(pdev->dev.speed, &len); - break; - - case USBD_IDX_SERIAL_STR: - pbuf = pdev->dev.usr_device->GetSerialStrDescriptor(pdev->dev.speed, &len); - break; - - case USBD_IDX_CONFIG_STR: - pbuf = pdev->dev.usr_device->GetConfigurationStrDescriptor(pdev->dev.speed, &len); - break; - - case USBD_IDX_INTERFACE_STR: - pbuf = pdev->dev.usr_device->GetInterfaceStrDescriptor(pdev->dev.speed, &len); - break; - - default: -#ifdef USB_SUPPORT_USER_STRING_DESC - pbuf = pdev->dev.class_cb->GetUsrStrDescriptor(pdev->dev.speed, (req->wValue) , &len); - break; -#else - USBD_CtlError(pdev , req); - return; -#endif /* USBD_CtlError(pdev , req); */ - } - break; - case USB_DESC_TYPE_DEVICE_QUALIFIER: - USBD_CtlError(pdev , req); - return; - - case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: - USBD_CtlError(pdev , req); - return; - default: - USBD_CtlError(pdev , req); - return; - } - - if((len != 0)&& (req->wLength != 0)) - { - - len = MIN(len , req->wLength); - - USBD_CtlSendData (pdev, - pbuf, - len); - } - -} - -/** - * @brief USBD_SetAddress - * Set device address - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_SetAddress(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - uint8_t dev_addr; - - if ((req->wIndex == 0) && (req->wLength == 0)) - { - dev_addr = (uint8_t)(req->wValue) & 0x7F; - - if (pdev->dev.device_status == USB_CONFIGURED) - { - USBD_CtlError(pdev , req); - } - else - { - pdev->dev.device_address = dev_addr; - ADDRESS = dev_addr; - USBD_CtlSendStatus(pdev); - - if (dev_addr != 0) - { - pdev->dev.device_status = USB_ADDRESSED; - } - else - { - pdev->dev.device_status = USB_DEFAULT; - } - } - } - else - { - USBD_CtlError(pdev , req); - } -} - -/** - * @brief USBD_SetConfig - * Handle Set device configuration request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_SetConfig(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - - static uint8_t cfgidx; - - cfgidx = (uint8_t)(req->wValue); - - if (cfgidx > USBD_CFG_MAX_NUM ) - { - USBD_CtlError(pdev , req); - } - else - { - switch (pdev->dev.device_status) - { - case USB_ADDRESSED: - if (cfgidx) - { - pdev->dev.device_config = cfgidx; - pdev->dev.device_status = USB_CONFIGURED; - USBD_SetCfg(pdev , cfgidx); - USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - case USB_CONFIGURED: - if (cfgidx == 0) - { - pdev->dev.device_status = USB_ADDRESSED; - pdev->dev.device_config = cfgidx; - USBD_ClrCfg(pdev , cfgidx); - USBD_CtlSendStatus(pdev); - } - else if (cfgidx != pdev->dev.device_config) - { - /* Clear old configuration */ - USBD_ClrCfg(pdev , pdev->dev.device_config); - - /* set new configuration */ - pdev->dev.device_config = cfgidx; - USBD_SetCfg(pdev , cfgidx); - USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev , req); - break; - } - } -} - -/** - * @brief USBD_GetConfig - * Handle Get device configuration request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_GetConfig(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - uint32_t USBD_default_cfg = 0; - - if (req->wLength != 1) - { - USBD_CtlError(pdev , req); - } - else - { - switch (pdev->dev.device_status ) - { - case USB_ADDRESSED: - - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_default_cfg, - 1); - break; - - case USB_CONFIGURED: - - USBD_CtlSendData (pdev, - &pdev->dev.device_config, - 1); - break; - - default: - USBD_CtlError(pdev , req); - break; - } - } -} - -/** - * @brief USBD_GetStatus - * Handle Get Status request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_GetStatus(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - uint32_t USBD_cfg_status = 0; - switch (pdev->dev.device_status) - { - case USB_ADDRESSED: - case USB_CONFIGURED: - -#ifdef USBD_SELF_POWERED - USBD_cfg_status = USB_CONFIG_SELF_POWERED; -#else - USBD_cfg_status = 0x00; -#endif - - if (pdev->dev.DevRemoteWakeup) - { - USBD_cfg_status |= USB_CONFIG_REMOTE_WAKEUP; - } - - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_cfg_status, - 2); - break; - - default : - USBD_CtlError(pdev , req); - break; - } -} - - -/** - * @brief USBD_SetFeature - * Handle Set device feature request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_SetFeature(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev.DevRemoteWakeup = 1; - pdev->dev.class_cb->Setup (pdev, req); - USBD_CtlSendStatus(pdev); - } -} - - -/** - * @brief USBD_ClrFeature - * Handle clear device feature request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_ClrFeature(USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - switch (pdev->dev.device_status) - { - case USB_ADDRESSED: - case USB_CONFIGURED: - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev.DevRemoteWakeup = 0; - pdev->dev.class_cb->Setup (pdev, req); - USBD_CtlSendStatus(pdev); - } - break; - - default : - USBD_CtlError(pdev , req); - break; - } -} - -/** - * @brief USBD_ParseSetupRequest - * Copy buffer into setup structure - * @param pdev: device instance - * @param req: usb request - * @retval None - */ - -void USBD_ParseSetupRequest( USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet); - req->bRequest = *(uint8_t *) (pdev->dev.setup_packet + 1); - req->wValue = SWAPBYTE (pdev->dev.setup_packet + 2); - req->wIndex = SWAPBYTE (pdev->dev.setup_packet + 4); - req->wLength = SWAPBYTE (pdev->dev.setup_packet + 6); - - pdev->dev.in_ep[0].ctl_data_len = req->wLength ; - pdev->dev.device_state = USB_EP0_SETUP; -} - -/** - * @brief USBD_CtlError - * Handle USB low level Error - * @param pdev: device instance - * @param req: usb request - * @retval None - */ - -void USBD_CtlError( USB_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - DCD_EP_Stall(pdev , 0); -} - - -/** - * @brief USBD_GetString - * Convert Ascii string into unicode one - * @param desc : descriptor buffer - * @param unicode : Formatted string buffer (unicode) - * @param len : descriptor length - * @retval None - */ -void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) -{ - uint8_t idx = 0; - - if (desc != NULL) - { - *len = USBD_GetLen(desc) * 2 + 2; - unicode[idx++] = *len; - unicode[idx++] = USB_DESC_TYPE_STRING; - - while (*desc != NULL) - { - unicode[idx++] = *desc++; - unicode[idx++] = 0x00; - } - } -} - -/** - * @brief USBD_GetLen - * return the string length - * @param buf : pointer to the ascii string buffer - * @retval string length - */ -static uint8_t USBD_GetLen(uint8_t *buf) -{ - uint8_t len = 0; - - while (*buf != NULL) - { - len++; - buf++; - } - - return len; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/User/NHC_WCH_SDI.c b/attic/NHC-Link042/User/NHC_WCH_SDI.c deleted file mode 100644 index 8a94e80..0000000 --- a/attic/NHC-Link042/User/NHC_WCH_SDI.c +++ /dev/null @@ -1,430 +0,0 @@ -#include "NHC_WCH_SDI.h" - -/* - 1-Wire WCH (CH32V003) debug protocol - Ngo Hung Cuong - http://vidieukhien.org - ngohungcuong@gmail.com - - Based on STM32F042 -*/ - -static uint16_t u16Capture[100]; -static uint8_t u8Data[100]; - -#define SDI_1 GPIOA->BSRR = 0x00002000 -#define SDI_0 GPIOA->BRR = 0x00002000 -#define SDI_IN (GPIOA->IDR & 0x00002000) - -#define H_VAL 1 -#define L_VAL 32 -#define IN_VAL 4 - -void NHC_Delay_Us(uint16_t u16Delay); -void NHC_Delay_Ms(uint32_t u32Delay); - -void NHC_Delay_Us(uint16_t u16Delay) -{ - uint16_t u16Tmp; - - u16Tmp = u16Delay * 48; - TIM16->CNT = 0; - while (TIM16->CNT < u16Tmp) - { - } -} - -void NHC_Delay_Ms(uint32_t u32Delay) -{ - - while (u32Delay) - { - NHC_Delay_Us(500); - NHC_Delay_Us(500); - --u32Delay; - } -} - -void NHC_WchSdi_Init(void) -{ - GPIO_InitTypeDef gpioInit; - TIM_TimeBaseInitTypeDef timInit; - - //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); - RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16, ENABLE); - - timInit.TIM_ClockDivision = TIM_CKD_DIV1; - timInit.TIM_CounterMode = TIM_CounterMode_Up; - timInit.TIM_Period = 0xffff; - timInit.TIM_Prescaler = 1 - 1; - timInit.TIM_RepetitionCounter = 0; - - TIM_TimeBaseInit(TIM16, &timInit); - TIM_Cmd(TIM16, ENABLE); - - GPIO_SetBits(GPIOA, GPIO_Pin_13); - gpioInit.GPIO_Mode = GPIO_Mode_OUT; - gpioInit.GPIO_OType = GPIO_OType_OD; - gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL; - gpioInit.GPIO_Pin = GPIO_Pin_13; - gpioInit.GPIO_Speed = GPIO_Speed_Level_3; - GPIO_Init(GPIOA, &gpioInit); - - SDI_1; - NHC_Delay_Ms(1); - SDI_0; - NHC_Delay_Us(36); - SDI_1; -} - -void NHC_WchSdi_Exit(void) -{ - GPIO_InitTypeDef gpioInit; - - GPIO_SetBits(GPIOA, GPIO_Pin_13); - gpioInit.GPIO_Mode = GPIO_Mode_IN; - gpioInit.GPIO_OType = GPIO_OType_OD; - gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL; - gpioInit.GPIO_Pin = GPIO_Pin_13; - gpioInit.GPIO_Speed = GPIO_Speed_Level_3; - GPIO_Init(GPIOA, &gpioInit); - - TIM_DeInit(TIM16); - TIM_Cmd(TIM16, DISABLE); -} - -void NHC_WchSdi_Write(uint8_t u8Address, uint32_t u32Data) -{ - uint32_t i; - uint8_t *p; - - u8Data[0] = 1; - - for (i = 0; i < 7; ++i) - { - if (u8Address & 0x40) - { - u8Data[i + 1] = 1; - } - else - { - u8Data[i + 1] = 0; - } - u8Address <<= 1; - } - - u8Data[8] = 1; - - for (i = 0; i < 32; ++i) - { - if (u32Data & 0x80000000) - { - u8Data[i + 9] = 1; - } - else - { - u8Data[i + 9] = 0; - } - u32Data <<= 1; - } - - p = u8Data; - - for (i = 0; i < 41; ++i) - { - if (*p++) - { - SDI_0; - TIM16->CNT = 0; - while (TIM16->CNT < H_VAL) - { - } - SDI_1; - TIM16->CNT = 0; - while (TIM16->CNT < H_VAL) - { - } - } - else - { - SDI_0; - TIM16->CNT = 0; - while (TIM16->CNT < L_VAL) - { - } - SDI_1; - TIM16->CNT = 0; - while (TIM16->CNT < H_VAL) - { - } - } - } - - NHC_Delay_Us(2); -} - -uint32_t NHC_WchSdi_Read(uint8_t u8Address, uint32_t *pu32Data) -{ - uint32_t i; - uint32_t u32Tmp; - uint8_t *p; - uint16_t *pu16; - - u8Data[0] = 1; - for (i = 0; i < 7; ++i) - { - if (u8Address & 0x40) - { - u8Data[i + 1] = 1; - } - else - { - u8Data[i + 1] = 0; - } - u8Address <<= 1; - } - u8Data[8] = 0; - - p = u8Data; - - for (i = 0; i < 9; ++i) - { - if (*p++) - { - SDI_0; - TIM16->CNT = 0; - while (TIM16->CNT < H_VAL) - { - } - SDI_1; - TIM16->CNT = 0; - while (TIM16->CNT < H_VAL) - { - } - } - else - { - SDI_0; - TIM16->CNT = 0; - while (TIM16->CNT < L_VAL) - { - } - SDI_1; - TIM16->CNT = 0; - while (TIM16->CNT < H_VAL) - { - } - } - } - - pu16 = u16Capture; - - for (i = 0; i < 32; ++i) - { - SDI_0; - TIM16->CNT = 0; - while (TIM16->CNT < H_VAL) - { - } - SDI_1; - TIM16->CNT = 0; - while (1) - { - if (SDI_IN) - { - *pu16++ = TIM16->CNT; - break; - } - if (TIM16->CNT > 144) - { - return 0; - } - } - } - - u32Tmp = 0; - - for (i = 0; i < 32; ++i) - { - u32Tmp <<= 1; - if (u16Capture[i] < IN_VAL) - { - u32Tmp |= 0x01; - } - } - - *pu32Data = u32Tmp; - - NHC_Delay_Us(2); - return 1; -} - -uint32_t NHC_WchSdi_WriteMem(uint32_t u32Address, uint32_t u32Data, uint8_t u8Width) -{ - uint32_t u32Tmp; - uint32_t i; - - u32Tmp = 2; - - if(u8Width == 8) - { - u32Tmp = 0; - } - else if (u8Width == 16) - { - u32Tmp = 1; - } - else if (u8Width == 32) - { - u32Tmp = 2; - } - else if (u8Width == 64) - { - u32Tmp = 3; - } - else if (u8Width == 128) - { - u32Tmp = 4; - } - - u32Tmp <<= 12; - - NHC_WchSdi_Write(0x20, 0x00728023 | u32Tmp); //cho nay can thay doi - NHC_WchSdi_Write(0x21, 0x00100073); - NHC_WchSdi_Write(0x04, u32Address); - NHC_WchSdi_Write(0x17, 0x00231005); - for (i = 0; i < 1000; ++i) - { - if (NHC_WchSdi_Read(0x16, &u32Tmp)) - { - if (!(u32Tmp & (1 << 12))) - { - break; - } - } - } - if (i == 1000) - { - return 0; - } - if (u32Tmp & (7 << 8)) - { - return 0; - } - NHC_WchSdi_Write(0x04, u32Data); - NHC_WchSdi_Write(0x17, 0x00271007); - for (i = 0; i < 1000; ++i) - { - if (NHC_WchSdi_Read(0x16, &u32Tmp)) - { - if (!(u32Tmp & (1 << 12))) - { - break; - } - } - } - if (i == 1000) - { - return 0; - } - if (u32Tmp & (7 << 8)) - { - return 0; - } - - return 1; -} - -uint32_t NHC_WchSdi_ReadMem(uint32_t u32Address, uint32_t *pu32Data, uint8_t u8Width) -{ - uint32_t u32Tmp; - uint32_t i; - - u32Tmp = 2; - - if(u8Width == 8) - { - u32Tmp = 0; - } - else if (u8Width == 16) - { - u32Tmp = 1; - } - else if (u8Width == 32) - { - u32Tmp = 2; - } - else if (u8Width == 64) - { - u32Tmp = 3; - } - else if (u8Width == 128) - { - u32Tmp = 4; - } - - u32Tmp <<= 12; - - //NHC_WchSdi_Write(0x10, 0x80000001); - //NHC_WchSdi_Write(0x10, 0x80000001); - //NHC_WchSdi_Write(0x10, 0x00000001); - NHC_WchSdi_Write(0x20, 0x00028303 | u32Tmp); //cho nay can thay doi - NHC_WchSdi_Write(0x21, 0x00100073); - NHC_WchSdi_Write(0x04, u32Address); - NHC_WchSdi_Write(0x17, 0x00271005); - for (i = 0; i < 1000; ++i) - { - if (NHC_WchSdi_Read(0x16, &u32Tmp)) - { - if (!(u32Tmp & (1 << 12))) - { - break; - } - } - } - if (i == 1000) - { - //day loi len - *pu32Data = 0xffffffff; - return 0; - } - if (u32Tmp & (7 << 8)) - { - //day loi len - *pu32Data = u32Tmp; - return 0; - } - - NHC_WchSdi_Write(0x17, 0x00221006); - for (i = 0; i < 1000; ++i) - { - if (NHC_WchSdi_Read(0x16, &u32Tmp)) - { - if (!(u32Tmp & (1 << 12))) - { - break; - } - } - } - if (i == 1000) - { - *pu32Data = 0xffffffff; - return 0; - } - if (u32Tmp & (7 << 8)) - { - *pu32Data = u32Tmp; - return 0; - } - - if (!NHC_WchSdi_Read(0x04, &u32Tmp)) - { - *pu32Data = 0x00000000; - return 0; - } - - *pu32Data = u32Tmp; - - return 1; -} diff --git a/attic/NHC-Link042/User/NHC_WCH_SDI.h b/attic/NHC-Link042/User/NHC_WCH_SDI.h deleted file mode 100644 index dd6797c..0000000 --- a/attic/NHC-Link042/User/NHC_WCH_SDI.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef NHC_WCH_SDI_H_ -#define NHC_WCH_SDI_H_ - -#include "stm32f0xx.h" - -/* - 1-Wire WCH (CH32V003) debug protocol - Ngo Hung Cuong - http://vidieukhien.org - ngohungcuong@gmail.com - - Based on STM32F042 -*/ - -#define WCH_SDI_DATA0 0x04 -#define WCH_SDI_DATA1 0x05 -#define WCH_SDI_DMCONTROL 0x10 -#define WCH_SDI_DMSTATUS 0x11 -#define WCH_SDI_HARTINFO 0x12 -#define WCH_SDI_ABSTRACTCS 0x16 -#define WCH_SDI_COMMAND 0x17 -#define WCH_SDI_ABSTRACTAUTO 0x18 -#define WCH_SDI_PROGBUFF0 0x20 -#define WCH_SDI_PROGBUFF1 0x21 -#define WCH_SDI_PROGBUFF2 0x22 -#define WCH_SDI_PROGBUFF3 0x23 -#define WCH_SDI_PROGBUFF4 0x24 -#define WCH_SDI_PROGBUFF5 0x25 -#define WCH_SDI_PROGBUFF6 0x26 -#define WCH_SDI_PROGBUFF7 0x27 -#define WCH_SDI_HALTSUM0 0x40 - -#define WCH_SDI_CPBR 0x7C -#define WCH_SDI_CFGR 0x7D -#define WCH_SDI_SHDWCFGR 0x7E - -#define R32_FLASH_BASE 0x40022000 -#define R32_FLASH_ACTLR 0x40022000 -#define R32_FLASH_KEYR 0x40022004 -#define R32_FLASH_OBKEYR 0x40022008 -#define R32_FLASH_STATR 0x4002200C -#define R32_FLASH_CTLR 0x40022010 -#define R32_FLASH_ADDR 0x40022014 -#define R32_FLASH_OBR 0x4002201C -#define R32_FLASH_WPR 0x40022020 -#define R32_FLASH_MODEKEYR 0x40022024 -#define R32_FLASH_BOOT_MODEKEYR 0x40022028 - -void NHC_WchSdi_Init(void); -void NHC_WchSdi_Exit(void); -void NHC_WchSdi_Write(uint8_t u8Address, uint32_t u32Data); -uint32_t NHC_WchSdi_Read(uint8_t u8Address, uint32_t *pu32Data); - -uint32_t NHC_WchSdi_WriteMem(uint32_t u32Address, uint32_t u32Data, uint8_t u8Width); -uint32_t NHC_WchSdi_ReadMem(uint32_t u32Address, uint32_t *pu32Data, uint8_t u8Width); - -#endif diff --git a/attic/NHC-Link042/User/config.h b/attic/NHC-Link042/User/config.h deleted file mode 100644 index 2485c65..0000000 --- a/attic/NHC-Link042/User/config.h +++ /dev/null @@ -1,7 +0,0 @@ -#define TAMPER_BUTTON_PIN GPIO_Pin_13 -#define TAMPER_BUTTON_GPIO_PORT GPIOC -#define TAMPER_BUTTON_GPIO_CLK RCC_APB2Periph_GPIOC -#define TAMPER_BUTTON_EXTI_LINE EXTI_Line13 -#define TAMPER_BUTTON_EXTI_PORT_SOURCE GPIO_PortSourceGPIOC -#define TAMPER_BUTTON_EXTI_PIN_SOURCE GPIO_PinSource13 -#define TAMPER_BUTTON_EXTI_IRQn EXTI4_15_IRQn diff --git a/attic/NHC-Link042/User/it.c b/attic/NHC-Link042/User/it.c deleted file mode 100644 index e69de29..0000000 diff --git a/attic/NHC-Link042/User/main.c b/attic/NHC-Link042/User/main.c deleted file mode 100644 index da605db..0000000 --- a/attic/NHC-Link042/User/main.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "stm32f0xx.h" -#include "usbd_usr.h" -#include "usbd_desc.h" - -extern USBD_Class_cb_TypeDef USBD_HID_cb; -USB_CORE_HANDLE USB_Device_dev ; - -GPIO_InitTypeDef gpioInit; - -int main(void) { - - RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN; - // remap pins to enable USB - SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP; - - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); - - USBD_Init(&USB_Device_dev, - &USR_desc, - &USBD_HID_cb, - &USR_cb); - - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); - gpioInit.GPIO_Mode = GPIO_Mode_OUT; - gpioInit.GPIO_OType = GPIO_OType_PP; - gpioInit.GPIO_Pin = GPIO_Pin_1; - gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL; - gpioInit.GPIO_Speed = GPIO_Speed_Level_3; - - GPIO_Init(GPIOA, &gpioInit); - GPIO_ResetBits(GPIOA, GPIO_Pin_1); - - while(1) { - - } -} diff --git a/attic/NHC-Link042/User/stm32_it.c b/attic/NHC-Link042/User/stm32_it.c deleted file mode 100644 index b1b432a..0000000 --- a/attic/NHC-Link042/User/stm32_it.c +++ /dev/null @@ -1,182 +0,0 @@ -/** - ****************************************************************************** - * @file stm32_it.c - * @author MCD Application Team - * @version V1.0.0 - * @date 31-January-2014 - * @brief Main Interrupt Service Routines. - * This file provides template for all exceptions handler and peripherals - * interrupt service routine. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - - -/* Includes ------------------------------------------------------------------*/ -#include "stm32_it.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************/ -/* Cortex-M0 Processor Exceptions Handlers */ -/******************************************************************************/ - -/** - * @brief This function handles NMI exception. - * @param None - * @retval None - */ -void NMI_Handler(void) -{ -} - -/** - * @brief This function handles Hard Fault exception. - * @param None - * @retval None - */ -void HardFault_Handler(void) -{ - /* Go to infinite loop when Hard Fault exception occurs */ - while (1) - { - } -} - -/** - * @brief This function handles SVCall exception. - * @param None - * @retval None - */ -void SVC_Handler(void) -{ -} - -/** - * @brief This function handles PendSVC exception. - * @param None - * @retval None - */ -void PendSV_Handler(void) -{ -} - -/** - * @brief This function handles SysTick Handler. - * @param None - * @retval None - */ -void SysTick_Handler(void) -{ -} - -/** - * @brief This function handles USB FS Handler. - * @param None - * @retval None - */ -void USB_IRQHandler(void) -{ - USB_Istr(); -} - -/** - * @brief This function handles EXTI14_15_IRQ Handler. - * @param None - * @retval None - */ -void EXTI4_15_IRQHandler(void) -{ - - if (EXTI_GetITStatus(TAMPER_BUTTON_EXTI_LINE) != RESET) - { - /* - if((PrevXferDone) && (USB_Device_dev.dev.device_status==USB_CONFIGURED)) - { - Send_Buffer[0] = 0x06; - - if (STM_EVAL_PBGetState(BUTTON_TAMPER) == Bit_RESET) - { - Send_Buffer[1] = 0x01; - } - else - { - Send_Buffer[1] = 0x00; - } - - USBD_HID_SendReport (&USB_Device_dev, Send_Buffer, 2); - PrevXferDone = 0; - } - */ - /* Clear the EXTI line pending bit */ - EXTI_ClearITPendingBit(TAMPER_BUTTON_EXTI_LINE); - } -} - -/** - * @brief This function handles DMA1_Channel1 Handler. - * @param None - * @retval None - */ -void DMA1_Channel1_IRQHandler(void) -{ - /* - Send_Buffer[0] = 0x07; - - if((ADC_ConvertedValueX >>4) - (ADC_ConvertedValueX_1 >>4) > 4) - { - if ((PrevXferDone) && (USB_Device_dev.dev.device_status == USB_CONFIGURED)) - { - Send_Buffer[1] = (uint8_t)(ADC_ConvertedValueX >>4); - - //USBD_HID_SendReport (&USB_Device_dev, Send_Buffer, 2); - - ADC_ConvertedValueX_1 = ADC_ConvertedValueX; - PrevXferDone = 0; - } - } - */ - /* Test DMA1 TC flag */ - //while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET ); - - //DMA_ClearFlag(DMA1_FLAG_TC1); -} - -/******************************************************************************/ -/* STM32F0xx Peripherals Interrupt Handlers */ -/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ -/* available peripheral interrupt handler's name please refer to the startup */ -/* file (startup_stm32f072.s). */ -/******************************************************************************/ - -/** - * @brief This function handles PPP interrupt request. - * @param None - * @retval None - */ -/*void PPP_IRQHandler(void) -{ -}*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/User/stm32_it.h b/attic/NHC-Link042/User/stm32_it.h deleted file mode 100644 index 6f6922c..0000000 --- a/attic/NHC-Link042/User/stm32_it.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - ****************************************************************************** - * @file stm32_it.h - * @author MCD Application Team - * @version V1.0.0 - * @date 31-January-2014 - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32_IT_H -#define __STM32_IT_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -//#include "usbd_custom_hid_core.h" - -#include "stm32f0xx.h" -#include "config.h" -#include "usbd_usr.h" -#include "usbd_desc.h" -//#include "vdclass.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -void NMI_Handler(void); -void HardFault_Handler(void); -void SVC_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); -void USB_IRQHandler(void); -void EXTI4_15_IRQHandler(void); -void DMA1_Channel1_IRQHandler(void); -#ifdef __cplusplus -} -#endif - -#endif /* __STM32_IT_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/User/stm32f0xx_conf.h b/attic/NHC-Link042/User/stm32f0xx_conf.h deleted file mode 100644 index 4754231..0000000 --- a/attic/NHC-Link042/User/stm32f0xx_conf.h +++ /dev/null @@ -1,83 +0,0 @@ -/** - ****************************************************************************** - * @file Project/STM32F0xx_StdPeriph_Templates/stm32f0xx_conf.h - * @author MCD Application Team - * @version V1.4.0 - * @date 24-July-2014 - * @brief Library configuration file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F0XX_CONF_H -#define __STM32F0XX_CONF_H - -/* Includes ------------------------------------------------------------------*/ -/* Comment the line below to disable peripheral header file inclusion */ -#include "stm32f0xx_adc.h" -#include "stm32f0xx_can.h" -#include "stm32f0xx_cec.h" -#include "stm32f0xx_crc.h" -#include "stm32f0xx_crs.h" -#include "stm32f0xx_comp.h" -#include "stm32f0xx_dac.h" -#include "stm32f0xx_dbgmcu.h" -#include "stm32f0xx_dma.h" -#include "stm32f0xx_exti.h" -#include "stm32f0xx_flash.h" -#include "stm32f0xx_gpio.h" -#include "stm32f0xx_syscfg.h" -#include "stm32f0xx_i2c.h" -#include "stm32f0xx_iwdg.h" -#include "stm32f0xx_pwr.h" -#include "stm32f0xx_rcc.h" -#include "stm32f0xx_rtc.h" -#include "stm32f0xx_spi.h" -#include "stm32f0xx_tim.h" -#include "stm32f0xx_usart.h" -#include "stm32f0xx_wwdg.h" -#include "stm32f0xx_misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Uncomment the line below to expanse the "assert_param" macro in the - Standard Peripheral Library drivers code */ -/* #define USE_FULL_ASSERT 1 */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT - -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function which reports - * the name of the source file and the source line number of the call - * that failed. If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0) -#endif /* USE_FULL_ASSERT */ - -#endif /* __STM32F0XX_CONF_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/User/system_stm32f0xx.c b/attic/NHC-Link042/User/system_stm32f0xx.c deleted file mode 100644 index 4816ad9..0000000 --- a/attic/NHC-Link042/User/system_stm32f0xx.c +++ /dev/null @@ -1,331 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32f0xx.c - * @author MCD Application Team - * @version V1.0.1 - * @date 15-March-2015 - * @brief CMSIS Cortex-M0 Device Peripheral Access Layer System Source File. - * This file contains the system clock configuration for STM32F0xx devices, - * and is generated by the clock configuration tool - * STM32f0xx_Clock_Configuration_V1.0.1.xls - * - * 1. This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier - * and Divider factors, AHB/APBx prescalers and Flash settings), - * depending on the configuration made in the clock xls tool. - * This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f0xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * 2. After each device reset the HSI (8 MHz Range) is used as system clock source. - * Then SystemInit() function is called, in "startup_stm32f0xx.s" file, to - * configure the system clock before to branch to main program. - * - * 3. If the system clock source selected by user fails to startup, the SystemInit() - * function will do nothing and HSI still used as system clock source. User can - * add some code to deal with this issue inside the SetSysClock() function. - * - * 4. The default value of HSE crystal is set to 8MHz, refer to "HSE_VALUE" define - * in "stm32f0xx.h" file. When HSE is used as system clock source, directly or - * through PLL, and you are using different crystal you have to adapt the HSE - * value to your own configuration. - * - * 5. This file configures the system clock as follows: - *============================================================================= - *============================================================================= - * System Clock source | PLL(HSI) - *----------------------------------------------------------------------------- - * SYSCLK(Hz) | 48000000 - *----------------------------------------------------------------------------- - * HCLK(Hz) | 48000000 - *----------------------------------------------------------------------------- - * AHB Prescaler | 1 - *----------------------------------------------------------------------------- - * APB Prescaler | 1 - *----------------------------------------------------------------------------- - * HSE Frequency(Hz) | NA - *---------------------------------------------------------------------------- - * PLLMUL | 12 - *----------------------------------------------------------------------------- - * PREDIV | 2 - *----------------------------------------------------------------------------- - * Flash Latency(WS) | 1 - *----------------------------------------------------------------------------- - * Prefetch Buffer | ON - *----------------------------------------------------------------------------- - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f0xx_system - * @{ - */ - -/** @addtogroup STM32F0xx_System_Private_Includes - * @{ - */ - -#include "stm32f0xx.h" - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Defines - * @{ - */ -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Variables - * @{ - */ -uint32_t SystemCoreClock = 48000000; -__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_FunctionPrototypes - * @{ - */ - -static void SetSysClock(void); - -/** - * @} - */ - -/** @addtogroup STM32F0xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system. - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemCoreClock variable. - * @param None - * @retval None - */ -void SystemInit (void) -{ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */ - RCC->CFGR &= (uint32_t)0xF8FFB80C; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */ - RCC->CFGR &= (uint32_t)0xFFC0FFFF; - - /* Reset PREDIV1[3:0] bits */ - RCC->CFGR2 &= (uint32_t)0xFFFFFFF0; - - /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */ - RCC->CFGR3 &= (uint32_t)0xFFFFFEAC; - - /* Reset HSI14 bit */ - RCC->CR2 &= (uint32_t)0xFFFFFFFE; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - - /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */ - SetSysClock(); -} - -/** - * @brief Update SystemCoreClock according to Clock Register Values - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f0xx.h file (default value - * 8 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f0xx.h file (default value - * 8 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * @param None - * @retval None - */ -void SystemCoreClockUpdate (void) -{ - uint32_t tmp = 0, pllmull = 0, pllsource = 0, prediv1factor = 0; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock */ - /* Get PLL clock source and multiplication factor ----------------------*/ - pllmull = RCC->CFGR & RCC_CFGR_PLLMULL; - pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; - pllmull = ( pllmull >> 18) + 2; - - if (pllsource == 0x00) - { - /* HSI oscillator clock divided by 2 selected as PLL clock entry */ - SystemCoreClock = (HSI_VALUE >> 1) * pllmull; - } - else - { - prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1; - /* HSE oscillator clock selected as PREDIV1 clock entry */ - SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; - } - break; - default: /* HSI used as system clock */ - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK clock frequency ----------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK clock frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @brief Configures the System clock frequency, AHB/APBx prescalers and Flash - * settings. - * @note This function should be called only once the RCC clock configuration - * is reset to the default reset state (done in SystemInit() function). - * @param None - * @retval None - */ -static void SetSysClock(void) -{ -/******************************************************************************/ -/* PLL (clocked by HSI) used as System clock source */ -/******************************************************************************/ - - /* At this stage the HSI is already enabled and used as System clock source */ - - /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/ - - /* Enable Prefetch Buffer and set Flash Latency */ - FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY; - - /* HCLK = SYSCLK / 1 */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK = HCLK / 1 */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1; - - /* PLL configuration */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL12); - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL) - { - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/attic/NHC-Link042/User/usb_bsp.c b/attic/NHC-Link042/User/usb_bsp.c deleted file mode 100644 index 287fec8..0000000 --- a/attic/NHC-Link042/User/usb_bsp.c +++ /dev/null @@ -1,183 +0,0 @@ -/** - ****************************************************************************** - * @file usb_bsp.c - * @author MCD Application Team - * @version V1.0.0 - * @date 31-January-2014 - * @brief This file Provides Device Core configuration Functions - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_bsp.h" -#include "config.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -#if defined USB_CLOCK_SOURCE_CRS - static void CRS_Config(void); -#endif /* USB_CLOCK_SOURCE_CRS */ - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Initialize BSP configurations - * @param None - * @retval None - */ - -void USB_BSP_Init(USB_CORE_HANDLE *pdev) -{ - //EXTI_InitTypeDef EXTI_InitStructure; - - /* Enable USB clock */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); - -#if defined USB_CLOCK_SOURCE_CRS - - /*For using CRS, you need to do the following: - - Enable HSI48 (managed by the SystemInit() function at the application startup) - - Select HSI48 as USB clock - - Enable CRS clock - - Set AUTOTRIMEN - - Set CEN - */ - - /* Select HSI48 as USB clock */ - RCC_USBCLKConfig(RCC_USBCLK_HSI48); - - /* Configure the Clock Recovery System */ - CRS_Config(); -#else - /* Configure PLL to be used as USB clock: - - Enable HSE external clock (for this example the system is clocked by HSI48 - managed by the SystemInit() function at the application startup) - - Enable PLL - - Select PLL as USB clock */ - /* Enable HSE */ - RCC_HSEConfig(RCC_HSE_ON); - - /* Wait till HSE is ready */ - while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) - {} - - /* Enable PLL */ - RCC_PLLCmd(ENABLE); - - /* Wait till PLL is ready */ - while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) - {} - - /* Configure USBCLK from PLL clock */ - RCC_USBCLKConfig(RCC_USBCLK_PLLCLK); -#endif /*USB_CLOCK_SOURCE_CRS */ - - /* Configure the Tamper button in EXTI mode */ - //STM_EVAL_PBInit(BUTTON_TAMPER, Mode_EXTI); - //---------------------------------------------------------------------------- - //ngo hung cuong - /* Configure Tamper EXTI line to generate an interrupt on rising & falling edges */ - /* - EXTI_InitStructure.EXTI_Line = TAMPER_BUTTON_EXTI_LINE; - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; - EXTI_InitStructure.EXTI_LineCmd = ENABLE; - EXTI_Init(&EXTI_InitStructure); - */ - /* Clear the Tamper EXTI line pending bit */ - EXTI_ClearITPendingBit(TAMPER_BUTTON_EXTI_LINE); - -#ifdef USB_DEVICE_LOW_PWR_MGMT_SUPPORT - - /* Enable the PWR clock */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); - - /* EXTI line 18 is connected to the USB Wakeup from suspend event */ - EXTI_ClearITPendingBit(EXTI_Line18); - EXTI_InitStructure.EXTI_Line = EXTI_Line18; - /*Must Configure the EXTI Line 18 to be sensitive to rising edge*/ - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_LineCmd = ENABLE; - EXTI_Init(&EXTI_InitStructure); -#endif /*USB_DEVICE_LOW_PWR_MGMT_SUPPORT */ - -} - -void USB_BSP_DevConnect(USB_CORE_HANDLE *pdev) { - //khoi tao chan keo USB -} - - -/** - * @brief Enable USB Global interrupt - * @param None - * @retval None - */ -void USB_BSP_EnableInterrupt(USB_CORE_HANDLE *pdev) -{ - NVIC_InitTypeDef NVIC_InitStructure; - - /* Enable the USB interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = USB_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - /* Enable the Tamper EXTI line Interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = TAMPER_BUTTON_EXTI_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - /* Enable the DMA1 Channel1 Interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPriority = 2; - NVIC_Init(&NVIC_InitStructure); -} - -#if defined USB_CLOCK_SOURCE_CRS - -/** - * @brief Configure CRS peripheral to automatically trim the HSI - * oscillator according to USB SOF - * @param None - * @retval None - */ -static void CRS_Config(void) -{ - /*Enable CRS Clock*/ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_CRS, ENABLE); - - /* Select USB SOF as synchronization source */ - CRS_SynchronizationSourceConfig(CRS_SYNCSource_USB); - - /*Enables the automatic hardware adjustment of TRIM bits: AUTOTRIMEN:*/ - CRS_AutomaticCalibrationCmd(ENABLE); - - /*Enables the oscillator clock for frequency error counter CEN*/ - CRS_FrequencyErrorCounterCmd(ENABLE); -} -#endif - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/User/usb_conf.h b/attic/NHC-Link042/User/usb_conf.h deleted file mode 100644 index da72e7b..0000000 --- a/attic/NHC-Link042/User/usb_conf.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - ****************************************************************************** - * @file usb_conf.h - * @author MCD Application Team - * @version V1.0.0 - * @date 31-January-2014 - * @brief General low level driver configuration - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CONF__H__ -#define __USB_CONF__H__ - -/* Includes ------------------------------------------------------------------*/ - -#include "stm32f0xx.h" -//#include "stm32072b_eval.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Select D+ pullup: internal or external */ -#ifdef USE_STM32072B_EVAL - /* When using STM32072B_EVAL board the internal pullup must be enabled */ - //#define INTERNAL_PULLUP - //chu y da thay doi cho nay - //vi dung tro treo ngoai nen khong can cho nay - //================================================= -#endif - -/* Define if Low power mode is enabled; it allows entering the device into STOP mode - following USB Suspend event, and wakes up after the USB wakeup event is received. */ -/* #define USB_DEVICE_LOW_PWR_MGMT_SUPPORT */ - -/* Configure the USB clock source as HSI48 with Clock Recovery System(CRS)*/ -//#define USB_CLOCK_SOURCE_CRS -//======================================================================================= -//ngo hung cuong -//======================================================================================= - -/* Endpoints used by the device */ -#define EP_NUM (2) /* EP0 + EP1 (IN/OUT) For HID */ - -/* buffer table base address */ -#define BTABLE_ADDRESS (0x000) - -/* EP0, RX/TX buffers base address */ -#define ENDP0_RX_ADDRESS (0x40) -#define ENDP0_TX_ADDRESS (0x80) - -/* EP1 Tx buffer base address */ -#define HID_IN_TX_ADDRESS (0x150) - -/* EP1 Rx buffer base address */ -#define HID_OUT_RX_ADDRESS (0x160) - -#define VD_IN_EP 0x81 -#define VD_OUT_EP 0x01 - -#define VD_IN_PACKET 64 -#define VD_OUT_PACKET 64 - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#endif /* __USB_CONF__H__ */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/User/usbd_conf.h b/attic/NHC-Link042/User/usbd_conf.h deleted file mode 100644 index 16e1753..0000000 --- a/attic/NHC-Link042/User/usbd_conf.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_conf.h - * @author MCD Application Team - * @version V1.0.0 - * @date 31-January-2014 - * @brief USB Device configuration file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CONF__H__ -#define __USBD_CONF__H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -#define USBD_CFG_MAX_NUM 1 -#define USBD_ITF_MAX_NUM 1 -#define USB_MAX_STR_DESC_SIZ 64 -#define USBD_SELF_POWERED - -#define CUSTOMHID_SIZ_REPORT_DESC 163 -#define CUSTOMHID_SIZ_CONFIG_DESC 41 - -#define HID_IN_EP 0x81 -#define HID_OUT_EP 0x01 - -#define HID_IN_PACKET 2 -#define HID_OUT_PACKET 2 - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#endif /* __USBD_CONF__H__ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - -/** -* @} -*/ - diff --git a/attic/NHC-Link042/User/usbd_desc.c b/attic/NHC-Link042/User/usbd_desc.c deleted file mode 100644 index f46dabf..0000000 --- a/attic/NHC-Link042/User/usbd_desc.c +++ /dev/null @@ -1,257 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_desc.c - * @author MCD Application Team - * @version V1.0.0 - * @date 31-January-2014 - * @brief This file provides the USBD descriptors and string formating method. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_desc.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define USBD_VID 0x1986 -#define USBD_PID 0x0034 - -#define USBD_LANGID_STRING 0x409 -#define USBD_MANUFACTURER_STRING "Hung Cuong Electronics" - -#define USBD_PRODUCT_FS_STRING "NHC-Link042" - -#define USBD_CONFIGURATION_FS_STRING "NHC-Link042" -#define USBD_INTERFACE_FS_STRING "NHC-Link042" - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -char USBD_SERIALNUMBER_FS_STRING[26]; - -USBD_DEVICE USR_desc = -{ - USBD_USR_DeviceDescriptor, - USBD_USR_LangIDStrDescriptor, - USBD_USR_ManufacturerStrDescriptor, - USBD_USR_ProductStrDescriptor, - USBD_USR_SerialStrDescriptor, - USBD_USR_ConfigStrDescriptor, - USBD_USR_InterfaceStrDescriptor, -}; - -/* USB Standard Device Descriptor */ -const uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] = -{ - 0x12, /*bLength */ - USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ - 0x00, /*bcdUSB */ - 0x02, - 0x00, /*bDeviceClass*/ - 0x00, /*bDeviceSubClass*/ - 0x00, /*bDeviceProtocol*/ - USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ - LOBYTE(USBD_VID), /*idVendor*/ - HIBYTE(USBD_VID), /*idVendor*/ - LOBYTE(USBD_PID), /*idVendor*/ - HIBYTE(USBD_PID), /*idVendor*/ - 0x00, /*bcdDevice rel. 2.00*/ - 0x02, - USBD_IDX_MFC_STR, /*Index of manufacturer string*/ - USBD_IDX_PRODUCT_STR, /*Index of product string*/ - USBD_IDX_SERIAL_STR, /*Index of serial number string*/ - USBD_CFG_MAX_NUM /*bNumConfigurations*/ -} ; /* USB_DeviceDescriptor */ - -/* USB Standard Device Descriptor */ -const uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; - -/* USB Standard Device Descriptor */ -const uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID] = -{ - USB_SIZ_STRING_LANGID, - USB_DESC_TYPE_STRING, - LOBYTE(USBD_LANGID_STRING), - HIBYTE(USBD_LANGID_STRING), -}; - -uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] = -{ - USB_SIZ_STRING_SERIAL, /* bLength */ - USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ - '0', 0, '9', 0, '8', 0, '9', 0, '6', 0, '9', 0, '6', 0, '9', 0, '7', 0, '1', 0 -}; - -/* Private function prototypes -----------------------------------------------*/ -//static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len); - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief return the device descriptor - * @param speed : current device speed - * @param length : pointer to data length variable - * @retval pointer to descriptor buffer - */ -uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length) -{ - *length = sizeof(USBD_DeviceDesc); - return (uint8_t*)USBD_DeviceDesc; -} - -/** - * @brief return the LangID string descriptor - * @param speed : current device speed - * @param length : pointer to data length variable - * @retval pointer to descriptor buffer - */ -uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length) -{ - *length = sizeof(USBD_LangIDDesc); - return (uint8_t*)USBD_LangIDDesc; -} - -/** - * @brief return the product string descriptor - * @param speed : current device speed - * @param length : pointer to data length variable - * @retval pointer to descriptor buffer - */ -uint8_t * USBD_USR_ProductStrDescriptor( uint8_t speed , uint16_t *length) -{ - USBD_GetString ( (uint8_t*)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length); - return USBD_StrDesc; -} - -/** - * @brief return the manufacturer string descriptor - * @param speed : current device speed - * @param length : pointer to data length variable - * @retval pointer to descriptor buffer - */ -uint8_t * USBD_USR_ManufacturerStrDescriptor( uint8_t speed , uint16_t *length) -{ - USBD_GetString ( (uint8_t*)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); - return USBD_StrDesc; -} - -/** - * @brief return the serial number string descriptor - * @param speed : current device speed - * @param length : pointer to data length variable - * @retval pointer to descriptor buffer - */ -uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length) -{ - *length = USB_SIZ_STRING_SERIAL; - return USBD_StringSerial; -} - -/** - * @brief return the configuration string descriptor - * @param speed : current device speed - * @param length : pointer to data length variable - * @retval pointer to descriptor buffer - */ -uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length) -{ - USBD_GetString ( (uint8_t*)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length); - return USBD_StrDesc; -} - - -/** - * @brief return the interface string descriptor - * @param speed : current device speed - * @param length : pointer to data length variable - * @retval pointer to descriptor buffer - */ -uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length) -{ - USBD_GetString ( (uint8_t*)USBD_INTERFACE_FS_STRING, USBD_StrDesc, length); - return USBD_StrDesc; -} - -/** - * @brief Create the serial number string descriptor - * @param None - * @retval None - */ -void Get_SerialNum(void) -{ -#if 0 - uint32_t Device_Serial0, Device_Serial1, Device_Serial2; - - Device_Serial0 = *(uint32_t*)Device1_Identifier; - Device_Serial1 = *(uint32_t*)Device2_Identifier; - Device_Serial2 = *(uint32_t*)Device3_Identifier; - - Device_Serial0 += Device_Serial2; - - if (Device_Serial0 != 0) - { - IntToUnicode (Device_Serial0, &USBD_StringSerial[2] ,8); - IntToUnicode (Device_Serial1, &USBD_StringSerial[18] ,4); - } -#endif -} - -/** - * @brief Convert Hex 32Bits value into char - * @param value: value to convert - * @param pbuf: pointer to the buffer - * @param len: buffer length - * @retval None - */ -#if 0 -static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len) -{ - uint8_t idx = 0; - - for( idx = 0 ; idx < len ; idx ++) - { - if( ((value >> 28)) < 0xA ) - { - pbuf[ 2* idx] = (value >> 28) + '0'; - } - else - { - pbuf[2* idx] = (value >> 28) + 'A' - 10; - } - - value = value << 4; - - pbuf[ 2* idx + 1] = 0; - } -} -#endif - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/User/usbd_desc.h b/attic/NHC-Link042/User/usbd_desc.h deleted file mode 100644 index 7948aad..0000000 --- a/attic/NHC-Link042/User/usbd_desc.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_desc.h - * @author MCD Application Team - * @version V1.0.0 - * @date 31-January-2014 - * @brief header file for the usbd_desc.c file - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ - -#ifndef __USB_DESC_H -#define __USB_DESC_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" - - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 -#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 -#define USB_STRING_DESCRIPTOR_TYPE 0x03 -#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 -#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 -#define USB_SIZ_DEVICE_DESC 18 -#define USB_SIZ_STRING_LANGID 4 -#define USB_SIZ_STRING_SERIAL 22 - -#define Device1_Identifier (0x1FFFF7AC) -#define Device2_Identifier (0x1FFFF7B0) -#define Device3_Identifier (0x1FFFF7B4) - -/* Exported macro ------------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -extern uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ]; -extern uint8_t USBD_OtherSpeedCfgDesc[USB_LEN_CFG_DESC]; -extern USBD_DEVICE USR_desc; -extern uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL]; - -/* Exported functions ------------------------------------------------------- */ -void Get_SerialNum(void); -uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_ManufacturerStrDescriptor ( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_ProductStrDescriptor ( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length); - -#ifdef USB_SUPPORT_USER_STRING_DESC -uint8_t * USBD_USR_USRStringDesc (uint8_t speed, uint8_t idx , uint16_t *length); -#endif /* USB_SUPPORT_USER_STRING_DESC */ - -#endif /* __USBD_DESC_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/User/usbd_pwr.c b/attic/NHC-Link042/User/usbd_pwr.c deleted file mode 100644 index 89eecfa..0000000 --- a/attic/NHC-Link042/User/usbd_pwr.c +++ /dev/null @@ -1,233 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_pwr.c - * @author MCD Application Team - * @version V1.0.0 - * @date 31-January-2014 - * @brief This file provides functions for power management - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_pwr.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -struct -{ - __IO RESUME_STATE eState; - __IO uint8_t bESOFcnt; -} -ResumeS; - - __IO uint32_t remotewakeupon=0; - -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Sets suspend mode operating conditions - * @param None - * @retval USB_SUCCESS - */ -void Suspend(void) -{ - uint16_t wCNTR; - - /*Store CNTR value */ - wCNTR = _GetCNTR(); - /* Set FSUSP bit in USB_CNTR register*/ - wCNTR |= CNTR_FSUSP; - _SetCNTR(wCNTR); - - /* force low-power mode in the macrocell */ - wCNTR = _GetCNTR(); - wCNTR |= CNTR_LPMODE; - _SetCNTR(wCNTR); - -#ifdef USB_DEVICE_LOW_PWR_MGMT_SUPPORT - - /* enter system in STOP mode, only when wakeup flag in not set */ - if((_GetISTR()&ISTR_WKUP)==0) - { - /*Enter STOP mode with SLEEPONEXIT*/ - PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_SLEEPONEXIT); - } - else - { - /* Clear Wakeup flag */ - _SetISTR(CLR_WKUP); - /* clear FSUSP to abort entry in suspend mode */ - wCNTR = _GetCNTR(); - wCNTR&=~CNTR_FSUSP; - _SetCNTR(wCNTR); - } -#endif -} - -/** - * @brief Handles wake-up restoring normal operations - * @param None - * @retval USB_SUCCESS - */ -void Resume_Init(void) -{ - uint16_t wCNTR; - - /* ------------------ ONLY WITH BUS-POWERED DEVICES ---------------------- */ - /* restart the clocks */ - /* ... */ - - /* CNTR_LPMODE = 0 */ - wCNTR = _GetCNTR(); - wCNTR &= (~CNTR_LPMODE); - _SetCNTR(wCNTR); -#ifdef USB_DEVICE_LOW_PWR_MGMT_SUPPORT - /* restore full power */ - /* ... on connected devices */ - Leave_LowPowerMode(); -#endif - /* reset FSUSP bit */ - _SetCNTR(IMR_MSK); - -} - - -/** - * @brief Provides the state machine handling resume operations and - * timing sequence. The control is based on the Resume structure - * variables and on the ESOF interrupt calling this subroutine - * without changing machine state. - * @param a state machine value (RESUME_STATE) - * RESUME_ESOF doesn't change ResumeS.eState allowing - * decrementing of the ESOF counter in different states. - * @retval Status - */ -void Resume(RESUME_STATE eResumeSetVal) -{ - uint16_t wCNTR; - - if (eResumeSetVal != RESUME_ESOF) - ResumeS.eState = eResumeSetVal; - switch (ResumeS.eState) - { - case RESUME_EXTERNAL: - -if (remotewakeupon ==0) - { - Resume_Init(); - ResumeS.eState = RESUME_OFF; - } - else /* RESUME detected during the RemoteWAkeup signalling => keep RemoteWakeup handling*/ - { - ResumeS.eState = RESUME_ON; - } - break; - case RESUME_INTERNAL: - Resume_Init(); - ResumeS.eState = RESUME_START; - remotewakeupon = 1; - break; - case RESUME_LATER: - ResumeS.bESOFcnt = 2; - ResumeS.eState = RESUME_WAIT; - break; - case RESUME_WAIT: - ResumeS.bESOFcnt--; - if (ResumeS.bESOFcnt == 0) - ResumeS.eState = RESUME_START; - break; - case RESUME_START: - wCNTR = _GetCNTR(); - wCNTR |= CNTR_RESUME; - _SetCNTR(wCNTR); - ResumeS.eState = RESUME_ON; - ResumeS.bESOFcnt = 10; - break; - case RESUME_ON: - ResumeS.bESOFcnt--; - if (ResumeS.bESOFcnt == 0) - { - wCNTR = _GetCNTR(); - wCNTR &= (~CNTR_RESUME); - _SetCNTR(wCNTR); - ResumeS.eState = RESUME_OFF; - remotewakeupon = 0; - } - break; - case RESUME_OFF: - case RESUME_ESOF: - default: - ResumeS.eState = RESUME_OFF; - break; - } -} - -/** - * @brief Restores system clocks and power while exiting suspend mode - * @param None - * @retval None - */ -void Leave_LowPowerMode(void) -{ -#if defined USB_CLOCK_SOURCE_CRS - /* Enable HSI48 oscillator */ - RCC_HSI48Cmd(ENABLE); - - /* Wait till HSI48RDYF is set */ - while(RCC_GetFlagStatus(RCC_FLAG_HSI48RDY) == RESET) - { - } - /* Select HSI48 as system clock source */ - RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI48); - -#else - - /* After wake-up from STOP mode restore system clock (system clock = PLL clock - from HSE source )*/ - /* Enable HSE */ - RCC_HSEConfig(RCC_HSE_ON); - - /* Wait till HSE is ready */ - while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) - {} - - /* Enable PLL */ - RCC_PLLCmd(ENABLE); - - /* Wait till PLL is ready */ - while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) - {} - - /* Select PLL as system clock source */ - RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); - - /* Wait till PLL is used as system clock source */ - while (RCC_GetSYSCLKSource() != 0x08) - {} -#endif /* USB_CLOCK_SOURCE_CRS */ - - /*Low Power Sleep on Exit Disabled*/ - NVIC_SystemLPConfig(NVIC_LP_SLEEPONEXIT, DISABLE); -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/NHC-Link042/User/usbd_usr.c b/attic/NHC-Link042/User/usbd_usr.c deleted file mode 100644 index 1aa74a5..0000000 --- a/attic/NHC-Link042/User/usbd_usr.c +++ /dev/null @@ -1,118 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_usr.c - * @author MCD Application Team - * @version V1.0.0 - * @date 31-January-2014 - * @brief This file contains user callback structure for USB events Management - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_usr.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -//#define ADC1_DR_Address 0x40012440 - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -USBD_Usr_cb_TypeDef USR_cb = -{ - USBD_USR_Init, - USBD_USR_DeviceReset, - USBD_USR_DeviceConfigured, - USBD_USR_DeviceSuspended, - USBD_USR_DeviceResumed, -}; - -//uint32_t ADC_ConvertedValueX = 0; -//uint32_t ADC_ConvertedValueX_1 = 0; - -/* Private function prototypes -----------------------------------------------*/ -//static void ADC_Configuration(void); - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Device lib initialization - * @param None - * @retval None - */ -void USBD_USR_Init(void) -{ - /* Initialize LEDs */ - //STM_EVAL_LEDInit(LED1); - //STM_EVAL_LEDInit(LED2); - //STM_EVAL_LEDInit(LED3); - //STM_EVAL_LEDInit(LED4); - - /* Configure the ADC*/ - //ADC_Configuration(); - -} - -/** - * @brief Reset Event - * @param speed : device speed - * @retval None - */ -void USBD_USR_DeviceReset(uint8_t speed ) -{ -} - -/** - * @brief Configuration Event - * @param None - * @retval None - */ -void USBD_USR_DeviceConfigured (void) -{ -} - -/** - * @brief Device suspend Event - * @param None - * @retval None - */ -void USBD_USR_DeviceSuspended(void) -{ -} - - -/** - * @brief Device resume Event - * @param None - * @retval None - */ -void USBD_USR_DeviceResumed(void) -{ -} - -/** - * @brief ADC_Configuration -* Configure the ADC - * @param None - * @retval None - */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/attic/ch32v003evt/LICENSE b/attic/ch32v003evt/LICENSE deleted file mode 100644 index e637ef0..0000000 --- a/attic/ch32v003evt/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -All documents from WCH are under the following license. This works for any of -their code. I've done the best I can to extract only the definitions to put into -this folder, but depending on jurisdiction, the code in this folder may actually -taint MIT or BSD licsned code. - -/********************************** (C) COPYRIGHT ******************************* - * Author : WCH - ********************************************************************************* - * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. - * Attention: This software (modified or not) and binary are used for - * microcontroller manufactured by Nanjing Qinheng Microelectronics. - *******************************************************************************/ diff --git a/attic/ch32v003evt/ch32v003.ld b/attic/ch32v003evt/ch32v003.ld deleted file mode 100644 index d3d2728..0000000 --- a/attic/ch32v003evt/ch32v003.ld +++ /dev/null @@ -1,159 +0,0 @@ -ENTRY( InterruptVector ) - -__stack_size = 256; - -PROVIDE( _stack_size = __stack_size ); - -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 16K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 2K -} - -SECTIONS -{ - .init : - { - _sinit = .; - . = ALIGN(4); - KEEP(*(SORT_NONE(.init))) - . = ALIGN(4); - _einit = .; - } >FLASH AT>FLASH - - .text : - { - . = ALIGN(4); - *(.text) - *(.text.*) - *(.rodata) - *(.rodata*) - *(.gnu.linkonce.t.*) - . = ALIGN(4); - } >FLASH AT>FLASH - - .fini : - { - KEEP(*(SORT_NONE(.fini))) - . = ALIGN(4); - } >FLASH AT>FLASH - - PROVIDE( _etext = . ); - PROVIDE( _eitcm = . ); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH AT>FLASH - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH AT>FLASH - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH AT>FLASH - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >FLASH AT>FLASH - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >FLASH AT>FLASH - - .dalign : - { - . = ALIGN(4); - PROVIDE(_data_vma = .); - } >RAM AT>FLASH - - .dlalign : - { - . = ALIGN(4); - PROVIDE(_data_lma = .); - } >FLASH AT>FLASH - - .data : - { - . = ALIGN(4); - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.sdata2*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - . = ALIGN(4); - PROVIDE( _edata = .); - } >RAM AT>FLASH - - .bss : - { - . = ALIGN(4); - PROVIDE( _sbss = .); - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss*) - *(.gnu.linkonce.b.*) - *(COMMON*) - . = ALIGN(4); - PROVIDE( _ebss = .); - } >RAM AT>FLASH - - PROVIDE( _end = _ebss); - PROVIDE( end = . ); - - .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = ALIGN(4); - PROVIDE(_susrstack = . ); - . = . + __stack_size; - PROVIDE( _eusrstack = .); - } >RAM - -} - - - diff --git a/attic/ch32v003evt/ch32v00x.h b/attic/ch32v003evt/ch32v00x.h deleted file mode 100644 index 915968b..0000000 --- a/attic/ch32v003evt/ch32v00x.h +++ /dev/null @@ -1,2402 +0,0 @@ -/********************************** (C) COPYRIGHT ******************************* - * File Name : ch32v00x.h - * Author : WCH - * Version : V1.0.0 - * Date : 2022/08/08 - * Description : CH32V00x Device Peripheral Access Layer Header File. - ********************************************************************************* - * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. - * Attention: This software (modified or not) and binary are used for - * microcontroller manufactured by Nanjing Qinheng Microelectronics. - *******************************************************************************/ -#ifndef __CH32V00x_H -#define __CH32V00x_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define __MPU_PRESENT 0 /* Other CH32 devices does not provide an MPU */ -#define __Vendor_SysTickConfig 0 /* Set to 1 if different SysTick Config is used */ - -#define HSE_VALUE ((uint32_t)24000000) /* Value of the External oscillator in Hz */ - -/* In the following line adjust the External High Speed oscillator (HSE) Startup Timeout value */ -#define HSE_STARTUP_TIMEOUT ((uint16_t)0x2000) /* Time out for HSE start up */ - -#define HSI_VALUE ((uint32_t)24000000) /* Value of the Internal oscillator in Hz */ - - -/* Interrupt Number Definition, according to the selected device */ -typedef enum IRQn -{ - /****** RISC-V Processor Exceptions Numbers *******************************************************/ - NonMaskableInt_IRQn = 2, /* 2 Non Maskable Interrupt */ - EXC_IRQn = 3, /* 3 Exception Interrupt */ - SysTicK_IRQn = 12, /* 12 System timer Interrupt */ - Software_IRQn = 14, /* 14 software Interrupt */ - - /****** RISC-V specific Interrupt Numbers *********************************************************/ - WWDG_IRQn = 16, /* Window WatchDog Interrupt */ - PVD_IRQn = 17, /* PVD through EXTI Line detection Interrupt */ - FLASH_IRQn = 18, /* FLASH global Interrupt */ - RCC_IRQn = 19, /* RCC global Interrupt */ - EXTI7_0_IRQn = 20, /* External Line[7:0] Interrupts */ - AWU_IRQn = 21, /* AWU global Interrupt */ - DMA1_Channel1_IRQn = 22, /* DMA1 Channel 1 global Interrupt */ - DMA1_Channel2_IRQn = 23, /* DMA1 Channel 2 global Interrupt */ - DMA1_Channel3_IRQn = 24, /* DMA1 Channel 3 global Interrupt */ - DMA1_Channel4_IRQn = 25, /* DMA1 Channel 4 global Interrupt */ - DMA1_Channel5_IRQn = 26, /* DMA1 Channel 5 global Interrupt */ - DMA1_Channel6_IRQn = 27, /* DMA1 Channel 6 global Interrupt */ - DMA1_Channel7_IRQn = 28, /* DMA1 Channel 7 global Interrupt */ - ADC_IRQn = 29, /* ADC global Interrupt */ - I2C1_EV_IRQn = 30, /* I2C1 Event Interrupt */ - I2C1_ER_IRQn = 31, /* I2C1 Error Interrupt */ - USART1_IRQn = 32, /* USART1 global Interrupt */ - SPI1_IRQn = 33, /* SPI1 global Interrupt */ - TIM1_BRK_IRQn = 34, /* TIM1 Break Interrupt */ - TIM1_UP_IRQn = 35, /* TIM1 Update Interrupt */ - TIM1_TRG_COM_IRQn = 36, /* TIM1 Trigger and Commutation Interrupt */ - TIM1_CC_IRQn = 37, /* TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 38, /* TIM2 global Interrupt */ - -} IRQn_Type; - -#define HardFault_IRQn EXC_IRQn - -#include <stdint.h> -#include <core_riscv.h> -#include <system_ch32v00x.h> - -/* Standard Peripheral Library old definitions (maintained for legacy purpose) */ -#define HSI_Value HSI_VALUE -#define HSE_Value HSE_VALUE -#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT - -/* Analog to Digital Converter */ -typedef struct -{ - __IO uint32_t STATR; - __IO uint32_t CTLR1; - __IO uint32_t CTLR2; - __IO uint32_t SAMPTR1; - __IO uint32_t SAMPTR2; - __IO uint32_t IOFR1; - __IO uint32_t IOFR2; - __IO uint32_t IOFR3; - __IO uint32_t IOFR4; - __IO uint32_t WDHTR; - __IO uint32_t WDLTR; - __IO uint32_t RSQR1; - __IO uint32_t RSQR2; - __IO uint32_t RSQR3; - __IO uint32_t ISQR; - __IO uint32_t IDATAR1; - __IO uint32_t IDATAR2; - __IO uint32_t IDATAR3; - __IO uint32_t IDATAR4; - __IO uint32_t RDATAR; - __IO uint32_t DLYR; -} ADC_TypeDef; - -/* Debug MCU */ -typedef struct -{ - __IO uint32_t CFGR0; - __IO uint32_t CFGR1; -} DBGMCU_TypeDef; - -/* DMA Controller */ -typedef struct -{ - __IO uint32_t CFGR; - __IO uint32_t CNTR; - __IO uint32_t PADDR; - __IO uint32_t MADDR; -} DMA_Channel_TypeDef; - -typedef struct -{ - __IO uint32_t INTFR; - __IO uint32_t INTFCR; -} DMA_TypeDef; - -/* External Interrupt/Event Controller */ -typedef struct -{ - __IO uint32_t INTENR; - __IO uint32_t EVENR; - __IO uint32_t RTENR; - __IO uint32_t FTENR; - __IO uint32_t SWIEVR; - __IO uint32_t INTFR; -} EXTI_TypeDef; - -/* FLASH Registers */ -typedef struct -{ - __IO uint32_t ACTLR; - __IO uint32_t KEYR; - __IO uint32_t OBKEYR; - __IO uint32_t STATR; - __IO uint32_t CTLR; - __IO uint32_t ADDR; - __IO uint32_t RESERVED; - __IO uint32_t OBR; - __IO uint32_t WPR; - __IO uint32_t MODEKEYR; - __IO uint32_t BOOT_MODEKEYR; -} FLASH_TypeDef; - -/* Option Bytes Registers */ -typedef struct -{ - __IO uint16_t RDPR; - __IO uint16_t USER; - __IO uint16_t Data0; - __IO uint16_t Data1; - __IO uint16_t WRPR0; - __IO uint16_t WRPR1; -} OB_TypeDef; - -/* General Purpose I/O */ -typedef struct -{ - __IO uint32_t CFGLR; - __IO uint32_t CFGHR; - __IO uint32_t INDR; - __IO uint32_t OUTDR; - __IO uint32_t BSHR; - __IO uint32_t BCR; - __IO uint32_t LCKR; -} GPIO_TypeDef; - -/* Alternate Function I/O */ -typedef struct -{ - uint32_t RESERVED0; - __IO uint32_t PCFR1; - __IO uint32_t EXTICR; -} AFIO_TypeDef; - -/* Inter Integrated Circuit Interface */ -typedef struct -{ - __IO uint16_t CTLR1; - uint16_t RESERVED0; - __IO uint16_t CTLR2; - uint16_t RESERVED1; - __IO uint16_t OADDR1; - uint16_t RESERVED2; - __IO uint16_t OADDR2; - uint16_t RESERVED3; - __IO uint16_t DATAR; - uint16_t RESERVED4; - __IO uint16_t STAR1; - uint16_t RESERVED5; - __IO uint16_t STAR2; - uint16_t RESERVED6; - __IO uint16_t CKCFGR; - uint16_t RESERVED7; -} I2C_TypeDef; - -/* Independent WatchDog */ -typedef struct -{ - __IO uint32_t CTLR; - __IO uint32_t PSCR; - __IO uint32_t RLDR; - __IO uint32_t STATR; -} IWDG_TypeDef; - -/* Power Control */ -typedef struct -{ - __IO uint32_t CTLR; - __IO uint32_t CSR; - __IO uint32_t AWUCSR; - __IO uint32_t AWUWR; - __IO uint32_t AWUPSC; -} PWR_TypeDef; - -/* Reset and Clock Control */ -typedef struct -{ - __IO uint32_t CTLR; - __IO uint32_t CFGR0; - __IO uint32_t INTR; - __IO uint32_t APB2PRSTR; - __IO uint32_t APB1PRSTR; - __IO uint32_t AHBPCENR; - __IO uint32_t APB2PCENR; - __IO uint32_t APB1PCENR; - __IO uint32_t RESERVED0; - __IO uint32_t RSTSCKR; -} RCC_TypeDef; - -/* Serial Peripheral Interface */ -typedef struct -{ - __IO uint16_t CTLR1; - uint16_t RESERVED0; - __IO uint16_t CTLR2; - uint16_t RESERVED1; - __IO uint16_t STATR; - uint16_t RESERVED2; - __IO uint16_t DATAR; - uint16_t RESERVED3; - __IO uint16_t CRCR; - uint16_t RESERVED4; - __IO uint16_t RCRCR; - uint16_t RESERVED5; - __IO uint16_t TCRCR; - uint16_t RESERVED6; - uint32_t RESERVED7; - uint32_t RESERVED8; - __IO uint16_t HSCR; - uint16_t RESERVED9; -} SPI_TypeDef; - -/* TIM */ -typedef struct -{ - __IO uint16_t CTLR1; - uint16_t RESERVED0; - __IO uint16_t CTLR2; - uint16_t RESERVED1; - __IO uint16_t SMCFGR; - uint16_t RESERVED2; - __IO uint16_t DMAINTENR; - uint16_t RESERVED3; - __IO uint16_t INTFR; - uint16_t RESERVED4; - __IO uint16_t SWEVGR; - uint16_t RESERVED5; - __IO uint16_t CHCTLR1; - uint16_t RESERVED6; - __IO uint16_t CHCTLR2; - uint16_t RESERVED7; - __IO uint16_t CCER; - uint16_t RESERVED8; - __IO uint16_t CNT; - uint16_t RESERVED9; - __IO uint16_t PSC; - uint16_t RESERVED10; - __IO uint16_t ATRLR; - uint16_t RESERVED11; - __IO uint16_t RPTCR; - uint16_t RESERVED12; - __IO uint32_t CH1CVR; - __IO uint32_t CH2CVR; - __IO uint32_t CH3CVR; - __IO uint32_t CH4CVR; - __IO uint16_t BDTR; - uint16_t RESERVED13; - __IO uint16_t DMACFGR; - uint16_t RESERVED14; - __IO uint16_t DMAADR; - uint16_t RESERVED15; -} TIM_TypeDef; - -/* Universal Synchronous Asynchronous Receiver Transmitter */ -typedef struct -{ - __IO uint16_t STATR; - uint16_t RESERVED0; - __IO uint16_t DATAR; - uint16_t RESERVED1; - __IO uint16_t BRR; - uint16_t RESERVED2; - __IO uint16_t CTLR1; - uint16_t RESERVED3; - __IO uint16_t CTLR2; - uint16_t RESERVED4; - __IO uint16_t CTLR3; - uint16_t RESERVED5; - __IO uint16_t GPR; - uint16_t RESERVED6; -} USART_TypeDef; - -/* Window WatchDog */ -typedef struct -{ - __IO uint32_t CTLR; - __IO uint32_t CFGR; - __IO uint32_t STATR; -} WWDG_TypeDef; - -/* Enhanced Registers */ -typedef struct -{ - __IO uint32_t EXTEN_CTR; -} EXTEN_TypeDef; - -/* Peripheral memory map */ -#define FLASH_BASE ((uint32_t)0x08000000) /* FLASH base address in the alias region */ -#define SRAM_BASE ((uint32_t)0x20000000) /* SRAM base address in the alias region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /* Peripheral base address in the alias region */ - -#define APB1PERIPH_BASE (PERIPH_BASE) -#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) -#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) - -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000) - -#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) -#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) -#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) -#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) -#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) -#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) -#define USART1_BASE (APB2PERIPH_BASE + 0x3800) - -#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) -#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) -#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) -#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) -#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) -#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) -#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) -#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) -#define RCC_BASE (AHBPERIPH_BASE + 0x1000) - -#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) /* Flash registers base address */ -#define OB_BASE ((uint32_t)0x1FFFF800) /* Flash Option Bytes base address */ -#define EXTEN_BASE ((uint32_t)0x40023800) - -/* Peripheral declaration */ -#define TIM2 ((TIM_TypeDef *)TIM2_BASE) -#define WWDG ((WWDG_TypeDef *)WWDG_BASE) -#define IWDG ((IWDG_TypeDef *)IWDG_BASE) -#define I2C1 ((I2C_TypeDef *)I2C1_BASE) -#define PWR ((PWR_TypeDef *)PWR_BASE) -#define AFIO ((AFIO_TypeDef *)AFIO_BASE) -#define EXTI ((EXTI_TypeDef *)EXTI_BASE) -#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) -#define GPIOC ((GPIO_TypeDef *)GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *)GPIOD_BASE) -#define ADC1 ((ADC_TypeDef *)ADC1_BASE) -#define TIM1 ((TIM_TypeDef *)TIM1_BASE) -#define SPI1 ((SPI_TypeDef *)SPI1_BASE) -#define USART1 ((USART_TypeDef *)USART1_BASE) -#define DMA1 ((DMA_TypeDef *)DMA1_BASE) -#define DMA1_Channel1 ((DMA_Channel_TypeDef *)DMA1_Channel1_BASE) -#define DMA1_Channel2 ((DMA_Channel_TypeDef *)DMA1_Channel2_BASE) -#define DMA1_Channel3 ((DMA_Channel_TypeDef *)DMA1_Channel3_BASE) -#define DMA1_Channel4 ((DMA_Channel_TypeDef *)DMA1_Channel4_BASE) -#define DMA1_Channel5 ((DMA_Channel_TypeDef *)DMA1_Channel5_BASE) -#define DMA1_Channel6 ((DMA_Channel_TypeDef *)DMA1_Channel6_BASE) -#define DMA1_Channel7 ((DMA_Channel_TypeDef *)DMA1_Channel7_BASE) -#define RCC ((RCC_TypeDef *)RCC_BASE) -#define FLASH ((FLASH_TypeDef *)FLASH_R_BASE) -#define OB ((OB_TypeDef *)OB_BASE) -#define EXTEN ((EXTEN_TypeDef *)EXTEN_BASE) - -/******************************************************************************/ -/* Peripheral Registers Bits Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* Analog to Digital Converter */ -/******************************************************************************/ - -/******************** Bit definition for ADC_STATR register ********************/ -#define ADC_AWD ((uint8_t)0x01) /* Analog watchdog flag */ -#define ADC_EOC ((uint8_t)0x02) /* End of conversion */ -#define ADC_JEOC ((uint8_t)0x04) /* Injected channel end of conversion */ -#define ADC_JSTRT ((uint8_t)0x08) /* Injected channel Start flag */ -#define ADC_STRT ((uint8_t)0x10) /* Regular channel Start flag */ - -/******************* Bit definition for ADC_CTLR1 register ********************/ -#define ADC_AWDCH ((uint32_t)0x0000001F) /* AWDCH[4:0] bits (Analog watchdog channel select bits) */ -#define ADC_AWDCH_0 ((uint32_t)0x00000001) /* Bit 0 */ -#define ADC_AWDCH_1 ((uint32_t)0x00000002) /* Bit 1 */ -#define ADC_AWDCH_2 ((uint32_t)0x00000004) /* Bit 2 */ -#define ADC_AWDCH_3 ((uint32_t)0x00000008) /* Bit 3 */ -#define ADC_AWDCH_4 ((uint32_t)0x00000010) /* Bit 4 */ - -#define ADC_EOCIE ((uint32_t)0x00000020) /* Interrupt enable for EOC */ -#define ADC_AWDIE ((uint32_t)0x00000040) /* Analog Watchdog interrupt enable */ -#define ADC_JEOCIE ((uint32_t)0x00000080) /* Interrupt enable for injected channels */ -#define ADC_SCAN ((uint32_t)0x00000100) /* Scan mode */ -#define ADC_AWDSGL ((uint32_t)0x00000200) /* Enable the watchdog on a single channel in scan mode */ -#define ADC_JAUTO ((uint32_t)0x00000400) /* Automatic injected group conversion */ -#define ADC_DISCEN ((uint32_t)0x00000800) /* Discontinuous mode on regular channels */ -#define ADC_JDISCEN ((uint32_t)0x00001000) /* Discontinuous mode on injected channels */ - -#define ADC_DISCNUM ((uint32_t)0x0000E000) /* DISCNUM[2:0] bits (Discontinuous mode channel count) */ -#define ADC_DISCNUM_0 ((uint32_t)0x00002000) /* Bit 0 */ -#define ADC_DISCNUM_1 ((uint32_t)0x00004000) /* Bit 1 */ -#define ADC_DISCNUM_2 ((uint32_t)0x00008000) /* Bit 2 */ - -#define ADC_DUALMOD ((uint32_t)0x000F0000) /* DUALMOD[3:0] bits (Dual mode selection) */ -#define ADC_DUALMOD_0 ((uint32_t)0x00010000) /* Bit 0 */ -#define ADC_DUALMOD_1 ((uint32_t)0x00020000) /* Bit 1 */ -#define ADC_DUALMOD_2 ((uint32_t)0x00040000) /* Bit 2 */ -#define ADC_DUALMOD_3 ((uint32_t)0x00080000) /* Bit 3 */ - -#define ADC_JAWDEN ((uint32_t)0x00400000) /* Analog watchdog enable on injected channels */ -#define ADC_AWDEN ((uint32_t)0x00800000) /* Analog watchdog enable on regular channels */ - -/******************* Bit definition for ADC_CTLR2 register ********************/ -#define ADC_ADON ((uint32_t)0x00000001) /* A/D Converter ON / OFF */ -#define ADC_CONT ((uint32_t)0x00000002) /* Continuous Conversion */ -#define ADC_CAL ((uint32_t)0x00000004) /* A/D Calibration */ -#define ADC_RSTCAL ((uint32_t)0x00000008) /* Reset Calibration */ -#define ADC_DMA ((uint32_t)0x00000100) /* Direct Memory access mode */ -#define ADC_ALIGN ((uint32_t)0x00000800) /* Data Alignment */ - -#define ADC_JEXTSEL ((uint32_t)0x00007000) /* JEXTSEL[2:0] bits (External event select for injected group) */ -#define ADC_JEXTSEL_0 ((uint32_t)0x00001000) /* Bit 0 */ -#define ADC_JEXTSEL_1 ((uint32_t)0x00002000) /* Bit 1 */ -#define ADC_JEXTSEL_2 ((uint32_t)0x00004000) /* Bit 2 */ - -#define ADC_JEXTTRIG ((uint32_t)0x00008000) /* External Trigger Conversion mode for injected channels */ - -#define ADC_EXTSEL ((uint32_t)0x000E0000) /* EXTSEL[2:0] bits (External Event Select for regular group) */ -#define ADC_EXTSEL_0 ((uint32_t)0x00020000) /* Bit 0 */ -#define ADC_EXTSEL_1 ((uint32_t)0x00040000) /* Bit 1 */ -#define ADC_EXTSEL_2 ((uint32_t)0x00080000) /* Bit 2 */ - -#define ADC_EXTTRIG ((uint32_t)0x00100000) /* External Trigger Conversion mode for regular channels */ -#define ADC_JSWSTART ((uint32_t)0x00200000) /* Start Conversion of injected channels */ -#define ADC_SWSTART ((uint32_t)0x00400000) /* Start Conversion of regular channels */ -#define ADC_TSVREFE ((uint32_t)0x00800000) /* Temperature Sensor and VREFINT Enable */ - -/****************** Bit definition for ADC_SAMPTR1 register *******************/ -#define ADC_SMP10 ((uint32_t)0x00000007) /* SMP10[2:0] bits (Channel 10 Sample time selection) */ -#define ADC_SMP10_0 ((uint32_t)0x00000001) /* Bit 0 */ -#define ADC_SMP10_1 ((uint32_t)0x00000002) /* Bit 1 */ -#define ADC_SMP10_2 ((uint32_t)0x00000004) /* Bit 2 */ - -#define ADC_SMP11 ((uint32_t)0x00000038) /* SMP11[2:0] bits (Channel 11 Sample time selection) */ -#define ADC_SMP11_0 ((uint32_t)0x00000008) /* Bit 0 */ -#define ADC_SMP11_1 ((uint32_t)0x00000010) /* Bit 1 */ -#define ADC_SMP11_2 ((uint32_t)0x00000020) /* Bit 2 */ - -#define ADC_SMP12 ((uint32_t)0x000001C0) /* SMP12[2:0] bits (Channel 12 Sample time selection) */ -#define ADC_SMP12_0 ((uint32_t)0x00000040) /* Bit 0 */ -#define ADC_SMP12_1 ((uint32_t)0x00000080) /* Bit 1 */ -#define ADC_SMP12_2 ((uint32_t)0x00000100) /* Bit 2 */ - -#define ADC_SMP13 ((uint32_t)0x00000E00) /* SMP13[2:0] bits (Channel 13 Sample time selection) */ -#define ADC_SMP13_0 ((uint32_t)0x00000200) /* Bit 0 */ -#define ADC_SMP13_1 ((uint32_t)0x00000400) /* Bit 1 */ -#define ADC_SMP13_2 ((uint32_t)0x00000800) /* Bit 2 */ - -#define ADC_SMP14 ((uint32_t)0x00007000) /* SMP14[2:0] bits (Channel 14 Sample time selection) */ -#define ADC_SMP14_0 ((uint32_t)0x00001000) /* Bit 0 */ -#define ADC_SMP14_1 ((uint32_t)0x00002000) /* Bit 1 */ -#define ADC_SMP14_2 ((uint32_t)0x00004000) /* Bit 2 */ - -#define ADC_SMP15 ((uint32_t)0x00038000) /* SMP15[2:0] bits (Channel 15 Sample time selection) */ -#define ADC_SMP15_0 ((uint32_t)0x00008000) /* Bit 0 */ -#define ADC_SMP15_1 ((uint32_t)0x00010000) /* Bit 1 */ -#define ADC_SMP15_2 ((uint32_t)0x00020000) /* Bit 2 */ - -#define ADC_SMP16 ((uint32_t)0x001C0000) /* SMP16[2:0] bits (Channel 16 Sample time selection) */ -#define ADC_SMP16_0 ((uint32_t)0x00040000) /* Bit 0 */ -#define ADC_SMP16_1 ((uint32_t)0x00080000) /* Bit 1 */ -#define ADC_SMP16_2 ((uint32_t)0x00100000) /* Bit 2 */ - -#define ADC_SMP17 ((uint32_t)0x00E00000) /* SMP17[2:0] bits (Channel 17 Sample time selection) */ -#define ADC_SMP17_0 ((uint32_t)0x00200000) /* Bit 0 */ -#define ADC_SMP17_1 ((uint32_t)0x00400000) /* Bit 1 */ -#define ADC_SMP17_2 ((uint32_t)0x00800000) /* Bit 2 */ - -/****************** Bit definition for ADC_SAMPTR2 register *******************/ -#define ADC_SMP0 ((uint32_t)0x00000007) /* SMP0[2:0] bits (Channel 0 Sample time selection) */ -#define ADC_SMP0_0 ((uint32_t)0x00000001) /* Bit 0 */ -#define ADC_SMP0_1 ((uint32_t)0x00000002) /* Bit 1 */ -#define ADC_SMP0_2 ((uint32_t)0x00000004) /* Bit 2 */ - -#define ADC_SMP1 ((uint32_t)0x00000038) /* SMP1[2:0] bits (Channel 1 Sample time selection) */ -#define ADC_SMP1_0 ((uint32_t)0x00000008) /* Bit 0 */ -#define ADC_SMP1_1 ((uint32_t)0x00000010) /* Bit 1 */ -#define ADC_SMP1_2 ((uint32_t)0x00000020) /* Bit 2 */ - -#define ADC_SMP2 ((uint32_t)0x000001C0) /* SMP2[2:0] bits (Channel 2 Sample time selection) */ -#define ADC_SMP2_0 ((uint32_t)0x00000040) /* Bit 0 */ -#define ADC_SMP2_1 ((uint32_t)0x00000080) /* Bit 1 */ -#define ADC_SMP2_2 ((uint32_t)0x00000100) /* Bit 2 */ - -#define ADC_SMP3 ((uint32_t)0x00000E00) /* SMP3[2:0] bits (Channel 3 Sample time selection) */ -#define ADC_SMP3_0 ((uint32_t)0x00000200) /* Bit 0 */ -#define ADC_SMP3_1 ((uint32_t)0x00000400) /* Bit 1 */ -#define ADC_SMP3_2 ((uint32_t)0x00000800) /* Bit 2 */ - -#define ADC_SMP4 ((uint32_t)0x00007000) /* SMP4[2:0] bits (Channel 4 Sample time selection) */ -#define ADC_SMP4_0 ((uint32_t)0x00001000) /* Bit 0 */ -#define ADC_SMP4_1 ((uint32_t)0x00002000) /* Bit 1 */ -#define ADC_SMP4_2 ((uint32_t)0x00004000) /* Bit 2 */ - -#define ADC_SMP5 ((uint32_t)0x00038000) /* SMP5[2:0] bits (Channel 5 Sample time selection) */ -#define ADC_SMP5_0 ((uint32_t)0x00008000) /* Bit 0 */ -#define ADC_SMP5_1 ((uint32_t)0x00010000) /* Bit 1 */ -#define ADC_SMP5_2 ((uint32_t)0x00020000) /* Bit 2 */ - -#define ADC_SMP6 ((uint32_t)0x001C0000) /* SMP6[2:0] bits (Channel 6 Sample time selection) */ -#define ADC_SMP6_0 ((uint32_t)0x00040000) /* Bit 0 */ -#define ADC_SMP6_1 ((uint32_t)0x00080000) /* Bit 1 */ -#define ADC_SMP6_2 ((uint32_t)0x00100000) /* Bit 2 */ - -#define ADC_SMP7 ((uint32_t)0x00E00000) /* SMP7[2:0] bits (Channel 7 Sample time selection) */ -#define ADC_SMP7_0 ((uint32_t)0x00200000) /* Bit 0 */ -#define ADC_SMP7_1 ((uint32_t)0x00400000) /* Bit 1 */ -#define ADC_SMP7_2 ((uint32_t)0x00800000) /* Bit 2 */ - -#define ADC_SMP8 ((uint32_t)0x07000000) /* SMP8[2:0] bits (Channel 8 Sample time selection) */ -#define ADC_SMP8_0 ((uint32_t)0x01000000) /* Bit 0 */ -#define ADC_SMP8_1 ((uint32_t)0x02000000) /* Bit 1 */ -#define ADC_SMP8_2 ((uint32_t)0x04000000) /* Bit 2 */ - -#define ADC_SMP9 ((uint32_t)0x38000000) /* SMP9[2:0] bits (Channel 9 Sample time selection) */ -#define ADC_SMP9_0 ((uint32_t)0x08000000) /* Bit 0 */ -#define ADC_SMP9_1 ((uint32_t)0x10000000) /* Bit 1 */ -#define ADC_SMP9_2 ((uint32_t)0x20000000) /* Bit 2 */ - -/****************** Bit definition for ADC_IOFR1 register *******************/ -#define ADC_JOFFSET1 ((uint16_t)0x0FFF) /* Data offset for injected channel 1 */ - -/****************** Bit definition for ADC_IOFR2 register *******************/ -#define ADC_JOFFSET2 ((uint16_t)0x0FFF) /* Data offset for injected channel 2 */ - -/****************** Bit definition for ADC_IOFR3 register *******************/ -#define ADC_JOFFSET3 ((uint16_t)0x0FFF) /* Data offset for injected channel 3 */ - -/****************** Bit definition for ADC_IOFR4 register *******************/ -#define ADC_JOFFSET4 ((uint16_t)0x0FFF) /* Data offset for injected channel 4 */ - -/******************* Bit definition for ADC_WDHTR register ********************/ -#define ADC_HT ((uint16_t)0x0FFF) /* Analog watchdog high threshold */ - -/******************* Bit definition for ADC_WDLTR register ********************/ -#define ADC_LT ((uint16_t)0x0FFF) /* Analog watchdog low threshold */ - -/******************* Bit definition for ADC_RSQR1 register *******************/ -#define ADC_SQ13 ((uint32_t)0x0000001F) /* SQ13[4:0] bits (13th conversion in regular sequence) */ -#define ADC_SQ13_0 ((uint32_t)0x00000001) /* Bit 0 */ -#define ADC_SQ13_1 ((uint32_t)0x00000002) /* Bit 1 */ -#define ADC_SQ13_2 ((uint32_t)0x00000004) /* Bit 2 */ -#define ADC_SQ13_3 ((uint32_t)0x00000008) /* Bit 3 */ -#define ADC_SQ13_4 ((uint32_t)0x00000010) /* Bit 4 */ - -#define ADC_SQ14 ((uint32_t)0x000003E0) /* SQ14[4:0] bits (14th conversion in regular sequence) */ -#define ADC_SQ14_0 ((uint32_t)0x00000020) /* Bit 0 */ -#define ADC_SQ14_1 ((uint32_t)0x00000040) /* Bit 1 */ -#define ADC_SQ14_2 ((uint32_t)0x00000080) /* Bit 2 */ -#define ADC_SQ14_3 ((uint32_t)0x00000100) /* Bit 3 */ -#define ADC_SQ14_4 ((uint32_t)0x00000200) /* Bit 4 */ - -#define ADC_SQ15 ((uint32_t)0x00007C00) /* SQ15[4:0] bits (15th conversion in regular sequence) */ -#define ADC_SQ15_0 ((uint32_t)0x00000400) /* Bit 0 */ -#define ADC_SQ15_1 ((uint32_t)0x00000800) /* Bit 1 */ -#define ADC_SQ15_2 ((uint32_t)0x00001000) /* Bit 2 */ -#define ADC_SQ15_3 ((uint32_t)0x00002000) /* Bit 3 */ -#define ADC_SQ15_4 ((uint32_t)0x00004000) /* Bit 4 */ - -#define ADC_SQ16 ((uint32_t)0x000F8000) /* SQ16[4:0] bits (16th conversion in regular sequence) */ -#define ADC_SQ16_0 ((uint32_t)0x00008000) /* Bit 0 */ -#define ADC_SQ16_1 ((uint32_t)0x00010000) /* Bit 1 */ -#define ADC_SQ16_2 ((uint32_t)0x00020000) /* Bit 2 */ -#define ADC_SQ16_3 ((uint32_t)0x00040000) /* Bit 3 */ -#define ADC_SQ16_4 ((uint32_t)0x00080000) /* Bit 4 */ - -#define ADC_L ((uint32_t)0x00F00000) /* L[3:0] bits (Regular channel sequence length) */ -#define ADC_L_0 ((uint32_t)0x00100000) /* Bit 0 */ -#define ADC_L_1 ((uint32_t)0x00200000) /* Bit 1 */ -#define ADC_L_2 ((uint32_t)0x00400000) /* Bit 2 */ -#define ADC_L_3 ((uint32_t)0x00800000) /* Bit 3 */ - -/******************* Bit definition for ADC_RSQR2 register *******************/ -#define ADC_SQ7 ((uint32_t)0x0000001F) /* SQ7[4:0] bits (7th conversion in regular sequence) */ -#define ADC_SQ7_0 ((uint32_t)0x00000001) /* Bit 0 */ -#define ADC_SQ7_1 ((uint32_t)0x00000002) /* Bit 1 */ -#define ADC_SQ7_2 ((uint32_t)0x00000004) /* Bit 2 */ -#define ADC_SQ7_3 ((uint32_t)0x00000008) /* Bit 3 */ -#define ADC_SQ7_4 ((uint32_t)0x00000010) /* Bit 4 */ - -#define ADC_SQ8 ((uint32_t)0x000003E0) /* SQ8[4:0] bits (8th conversion in regular sequence) */ -#define ADC_SQ8_0 ((uint32_t)0x00000020) /* Bit 0 */ -#define ADC_SQ8_1 ((uint32_t)0x00000040) /* Bit 1 */ -#define ADC_SQ8_2 ((uint32_t)0x00000080) /* Bit 2 */ -#define ADC_SQ8_3 ((uint32_t)0x00000100) /* Bit 3 */ -#define ADC_SQ8_4 ((uint32_t)0x00000200) /* Bit 4 */ - -#define ADC_SQ9 ((uint32_t)0x00007C00) /* SQ9[4:0] bits (9th conversion in regular sequence) */ -#define ADC_SQ9_0 ((uint32_t)0x00000400) /* Bit 0 */ -#define ADC_SQ9_1 ((uint32_t)0x00000800) /* Bit 1 */ -#define ADC_SQ9_2 ((uint32_t)0x00001000) /* Bit 2 */ -#define ADC_SQ9_3 ((uint32_t)0x00002000) /* Bit 3 */ -#define ADC_SQ9_4 ((uint32_t)0x00004000) /* Bit 4 */ - -#define ADC_SQ10 ((uint32_t)0x000F8000) /* SQ10[4:0] bits (10th conversion in regular sequence) */ -#define ADC_SQ10_0 ((uint32_t)0x00008000) /* Bit 0 */ -#define ADC_SQ10_1 ((uint32_t)0x00010000) /* Bit 1 */ -#define ADC_SQ10_2 ((uint32_t)0x00020000) /* Bit 2 */ -#define ADC_SQ10_3 ((uint32_t)0x00040000) /* Bit 3 */ -#define ADC_SQ10_4 ((uint32_t)0x00080000) /* Bit 4 */ - -#define ADC_SQ11 ((uint32_t)0x01F00000) /* SQ11[4:0] bits (11th conversion in regular sequence) */ -#define ADC_SQ11_0 ((uint32_t)0x00100000) /* Bit 0 */ -#define ADC_SQ11_1 ((uint32_t)0x00200000) /* Bit 1 */ -#define ADC_SQ11_2 ((uint32_t)0x00400000) /* Bit 2 */ -#define ADC_SQ11_3 ((uint32_t)0x00800000) /* Bit 3 */ -#define ADC_SQ11_4 ((uint32_t)0x01000000) /* Bit 4 */ - -#define ADC_SQ12 ((uint32_t)0x3E000000) /* SQ12[4:0] bits (12th conversion in regular sequence) */ -#define ADC_SQ12_0 ((uint32_t)0x02000000) /* Bit 0 */ -#define ADC_SQ12_1 ((uint32_t)0x04000000) /* Bit 1 */ -#define ADC_SQ12_2 ((uint32_t)0x08000000) /* Bit 2 */ -#define ADC_SQ12_3 ((uint32_t)0x10000000) /* Bit 3 */ -#define ADC_SQ12_4 ((uint32_t)0x20000000) /* Bit 4 */ - -/******************* Bit definition for ADC_RSQR3 register *******************/ -#define ADC_SQ1 ((uint32_t)0x0000001F) /* SQ1[4:0] bits (1st conversion in regular sequence) */ -#define ADC_SQ1_0 ((uint32_t)0x00000001) /* Bit 0 */ -#define ADC_SQ1_1 ((uint32_t)0x00000002) /* Bit 1 */ -#define ADC_SQ1_2 ((uint32_t)0x00000004) /* Bit 2 */ -#define ADC_SQ1_3 ((uint32_t)0x00000008) /* Bit 3 */ -#define ADC_SQ1_4 ((uint32_t)0x00000010) /* Bit 4 */ - -#define ADC_SQ2 ((uint32_t)0x000003E0) /* SQ2[4:0] bits (2nd conversion in regular sequence) */ -#define ADC_SQ2_0 ((uint32_t)0x00000020) /* Bit 0 */ -#define ADC_SQ2_1 ((uint32_t)0x00000040) /* Bit 1 */ -#define ADC_SQ2_2 ((uint32_t)0x00000080) /* Bit 2 */ -#define ADC_SQ2_3 ((uint32_t)0x00000100) /* Bit 3 */ -#define ADC_SQ2_4 ((uint32_t)0x00000200) /* Bit 4 */ - -#define ADC_SQ3 ((uint32_t)0x00007C00) /* SQ3[4:0] bits (3rd conversion in regular sequence) */ -#define ADC_SQ3_0 ((uint32_t)0x00000400) /* Bit 0 */ -#define ADC_SQ3_1 ((uint32_t)0x00000800) /* Bit 1 */ -#define ADC_SQ3_2 ((uint32_t)0x00001000) /* Bit 2 */ -#define ADC_SQ3_3 ((uint32_t)0x00002000) /* Bit 3 */ -#define ADC_SQ3_4 ((uint32_t)0x00004000) /* Bit 4 */ - -#define ADC_SQ4 ((uint32_t)0x000F8000) /* SQ4[4:0] bits (4th conversion in regular sequence) */ -#define ADC_SQ4_0 ((uint32_t)0x00008000) /* Bit 0 */ -#define ADC_SQ4_1 ((uint32_t)0x00010000) /* Bit 1 */ -#define ADC_SQ4_2 ((uint32_t)0x00020000) /* Bit 2 */ -#define ADC_SQ4_3 ((uint32_t)0x00040000) /* Bit 3 */ -#define ADC_SQ4_4 ((uint32_t)0x00080000) /* Bit 4 */ - -#define ADC_SQ5 ((uint32_t)0x01F00000) /* SQ5[4:0] bits (5th conversion in regular sequence) */ -#define ADC_SQ5_0 ((uint32_t)0x00100000) /* Bit 0 */ -#define ADC_SQ5_1 ((uint32_t)0x00200000) /* Bit 1 */ -#define ADC_SQ5_2 ((uint32_t)0x00400000) /* Bit 2 */ -#define ADC_SQ5_3 ((uint32_t)0x00800000) /* Bit 3 */ -#define ADC_SQ5_4 ((uint32_t)0x01000000) /* Bit 4 */ - -#define ADC_SQ6 ((uint32_t)0x3E000000) /* SQ6[4:0] bits (6th conversion in regular sequence) */ -#define ADC_SQ6_0 ((uint32_t)0x02000000) /* Bit 0 */ -#define ADC_SQ6_1 ((uint32_t)0x04000000) /* Bit 1 */ -#define ADC_SQ6_2 ((uint32_t)0x08000000) /* Bit 2 */ -#define ADC_SQ6_3 ((uint32_t)0x10000000) /* Bit 3 */ -#define ADC_SQ6_4 ((uint32_t)0x20000000) /* Bit 4 */ - -/******************* Bit definition for ADC_ISQR register *******************/ -#define ADC_JSQ1 ((uint32_t)0x0000001F) /* JSQ1[4:0] bits (1st conversion in injected sequence) */ -#define ADC_JSQ1_0 ((uint32_t)0x00000001) /* Bit 0 */ -#define ADC_JSQ1_1 ((uint32_t)0x00000002) /* Bit 1 */ -#define ADC_JSQ1_2 ((uint32_t)0x00000004) /* Bit 2 */ -#define ADC_JSQ1_3 ((uint32_t)0x00000008) /* Bit 3 */ -#define ADC_JSQ1_4 ((uint32_t)0x00000010) /* Bit 4 */ - -#define ADC_JSQ2 ((uint32_t)0x000003E0) /* JSQ2[4:0] bits (2nd conversion in injected sequence) */ -#define ADC_JSQ2_0 ((uint32_t)0x00000020) /* Bit 0 */ -#define ADC_JSQ2_1 ((uint32_t)0x00000040) /* Bit 1 */ -#define ADC_JSQ2_2 ((uint32_t)0x00000080) /* Bit 2 */ -#define ADC_JSQ2_3 ((uint32_t)0x00000100) /* Bit 3 */ -#define ADC_JSQ2_4 ((uint32_t)0x00000200) /* Bit 4 */ - -#define ADC_JSQ3 ((uint32_t)0x00007C00) /* JSQ3[4:0] bits (3rd conversion in injected sequence) */ -#define ADC_JSQ3_0 ((uint32_t)0x00000400) /* Bit 0 */ -#define ADC_JSQ3_1 ((uint32_t)0x00000800) /* Bit 1 */ -#define ADC_JSQ3_2 ((uint32_t)0x00001000) /* Bit 2 */ -#define ADC_JSQ3_3 ((uint32_t)0x00002000) /* Bit 3 */ -#define ADC_JSQ3_4 ((uint32_t)0x00004000) /* Bit 4 */ - -#define ADC_JSQ4 ((uint32_t)0x000F8000) /* JSQ4[4:0] bits (4th conversion in injected sequence) */ -#define ADC_JSQ4_0 ((uint32_t)0x00008000) /* Bit 0 */ -#define ADC_JSQ4_1 ((uint32_t)0x00010000) /* Bit 1 */ -#define ADC_JSQ4_2 ((uint32_t)0x00020000) /* Bit 2 */ -#define ADC_JSQ4_3 ((uint32_t)0x00040000) /* Bit 3 */ -#define ADC_JSQ4_4 ((uint32_t)0x00080000) /* Bit 4 */ - -#define ADC_JL ((uint32_t)0x00300000) /* JL[1:0] bits (Injected Sequence length) */ -#define ADC_JL_0 ((uint32_t)0x00100000) /* Bit 0 */ -#define ADC_JL_1 ((uint32_t)0x00200000) /* Bit 1 */ - -/******************* Bit definition for ADC_IDATAR1 register *******************/ -#define ADC_IDATAR1_JDATA ((uint16_t)0xFFFF) /* Injected data */ - -/******************* Bit definition for ADC_IDATAR2 register *******************/ -#define ADC_IDATAR2_JDATA ((uint16_t)0xFFFF) /* Injected data */ - -/******************* Bit definition for ADC_IDATAR3 register *******************/ -#define ADC_IDATAR3_JDATA ((uint16_t)0xFFFF) /* Injected data */ - -/******************* Bit definition for ADC_IDATAR4 register *******************/ -#define ADC_IDATAR4_JDATA ((uint16_t)0xFFFF) /* Injected data */ - -/******************** Bit definition for ADC_RDATAR register ********************/ -#define ADC_RDATAR_DATA ((uint32_t)0x0000FFFF) /* Regular data */ -#define ADC_RDATAR_ADC2DATA ((uint32_t)0xFFFF0000) /* ADC2 data */ - -/******************************************************************************/ -/* DMA Controller */ -/******************************************************************************/ - -/******************* Bit definition for DMA_INTFR register ********************/ -#define DMA_GIF1 ((uint32_t)0x00000001) /* Channel 1 Global interrupt flag */ -#define DMA_TCIF1 ((uint32_t)0x00000002) /* Channel 1 Transfer Complete flag */ -#define DMA_HTIF1 ((uint32_t)0x00000004) /* Channel 1 Half Transfer flag */ -#define DMA_TEIF1 ((uint32_t)0x00000008) /* Channel 1 Transfer Error flag */ -#define DMA_GIF2 ((uint32_t)0x00000010) /* Channel 2 Global interrupt flag */ -#define DMA_TCIF2 ((uint32_t)0x00000020) /* Channel 2 Transfer Complete flag */ -#define DMA_HTIF2 ((uint32_t)0x00000040) /* Channel 2 Half Transfer flag */ -#define DMA_TEIF2 ((uint32_t)0x00000080) /* Channel 2 Transfer Error flag */ -#define DMA_GIF3 ((uint32_t)0x00000100) /* Channel 3 Global interrupt flag */ -#define DMA_TCIF3 ((uint32_t)0x00000200) /* Channel 3 Transfer Complete flag */ -#define DMA_HTIF3 ((uint32_t)0x00000400) /* Channel 3 Half Transfer flag */ -#define DMA_TEIF3 ((uint32_t)0x00000800) /* Channel 3 Transfer Error flag */ -#define DMA_GIF4 ((uint32_t)0x00001000) /* Channel 4 Global interrupt flag */ -#define DMA_TCIF4 ((uint32_t)0x00002000) /* Channel 4 Transfer Complete flag */ -#define DMA_HTIF4 ((uint32_t)0x00004000) /* Channel 4 Half Transfer flag */ -#define DMA_TEIF4 ((uint32_t)0x00008000) /* Channel 4 Transfer Error flag */ -#define DMA_GIF5 ((uint32_t)0x00010000) /* Channel 5 Global interrupt flag */ -#define DMA_TCIF5 ((uint32_t)0x00020000) /* Channel 5 Transfer Complete flag */ -#define DMA_HTIF5 ((uint32_t)0x00040000) /* Channel 5 Half Transfer flag */ -#define DMA_TEIF5 ((uint32_t)0x00080000) /* Channel 5 Transfer Error flag */ -#define DMA_GIF6 ((uint32_t)0x00100000) /* Channel 6 Global interrupt flag */ -#define DMA_TCIF6 ((uint32_t)0x00200000) /* Channel 6 Transfer Complete flag */ -#define DMA_HTIF6 ((uint32_t)0x00400000) /* Channel 6 Half Transfer flag */ -#define DMA_TEIF6 ((uint32_t)0x00800000) /* Channel 6 Transfer Error flag */ -#define DMA_GIF7 ((uint32_t)0x01000000) /* Channel 7 Global interrupt flag */ -#define DMA_TCIF7 ((uint32_t)0x02000000) /* Channel 7 Transfer Complete flag */ -#define DMA_HTIF7 ((uint32_t)0x04000000) /* Channel 7 Half Transfer flag */ -#define DMA_TEIF7 ((uint32_t)0x08000000) /* Channel 7 Transfer Error flag */ - -/******************* Bit definition for DMA_INTFCR register *******************/ -#define DMA_CGIF1 ((uint32_t)0x00000001) /* Channel 1 Global interrupt clear */ -#define DMA_CTCIF1 ((uint32_t)0x00000002) /* Channel 1 Transfer Complete clear */ -#define DMA_CHTIF1 ((uint32_t)0x00000004) /* Channel 1 Half Transfer clear */ -#define DMA_CTEIF1 ((uint32_t)0x00000008) /* Channel 1 Transfer Error clear */ -#define DMA_CGIF2 ((uint32_t)0x00000010) /* Channel 2 Global interrupt clear */ -#define DMA_CTCIF2 ((uint32_t)0x00000020) /* Channel 2 Transfer Complete clear */ -#define DMA_CHTIF2 ((uint32_t)0x00000040) /* Channel 2 Half Transfer clear */ -#define DMA_CTEIF2 ((uint32_t)0x00000080) /* Channel 2 Transfer Error clear */ -#define DMA_CGIF3 ((uint32_t)0x00000100) /* Channel 3 Global interrupt clear */ -#define DMA_CTCIF3 ((uint32_t)0x00000200) /* Channel 3 Transfer Complete clear */ -#define DMA_CHTIF3 ((uint32_t)0x00000400) /* Channel 3 Half Transfer clear */ -#define DMA_CTEIF3 ((uint32_t)0x00000800) /* Channel 3 Transfer Error clear */ -#define DMA_CGIF4 ((uint32_t)0x00001000) /* Channel 4 Global interrupt clear */ -#define DMA_CTCIF4 ((uint32_t)0x00002000) /* Channel 4 Transfer Complete clear */ -#define DMA_CHTIF4 ((uint32_t)0x00004000) /* Channel 4 Half Transfer clear */ -#define DMA_CTEIF4 ((uint32_t)0x00008000) /* Channel 4 Transfer Error clear */ -#define DMA_CGIF5 ((uint32_t)0x00010000) /* Channel 5 Global interrupt clear */ -#define DMA_CTCIF5 ((uint32_t)0x00020000) /* Channel 5 Transfer Complete clear */ -#define DMA_CHTIF5 ((uint32_t)0x00040000) /* Channel 5 Half Transfer clear */ -#define DMA_CTEIF5 ((uint32_t)0x00080000) /* Channel 5 Transfer Error clear */ -#define DMA_CGIF6 ((uint32_t)0x00100000) /* Channel 6 Global interrupt clear */ -#define DMA_CTCIF6 ((uint32_t)0x00200000) /* Channel 6 Transfer Complete clear */ -#define DMA_CHTIF6 ((uint32_t)0x00400000) /* Channel 6 Half Transfer clear */ -#define DMA_CTEIF6 ((uint32_t)0x00800000) /* Channel 6 Transfer Error clear */ -#define DMA_CGIF7 ((uint32_t)0x01000000) /* Channel 7 Global interrupt clear */ -#define DMA_CTCIF7 ((uint32_t)0x02000000) /* Channel 7 Transfer Complete clear */ -#define DMA_CHTIF7 ((uint32_t)0x04000000) /* Channel 7 Half Transfer clear */ -#define DMA_CTEIF7 ((uint32_t)0x08000000) /* Channel 7 Transfer Error clear */ - -/******************* Bit definition for DMA_CFGR1 register *******************/ -#define DMA_CFGR1_EN ((uint16_t)0x0001) /* Channel enable*/ -#define DMA_CFGR1_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ -#define DMA_CFGR1_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ -#define DMA_CFGR1_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ -#define DMA_CFGR1_DIR ((uint16_t)0x0010) /* Data transfer direction */ -#define DMA_CFGR1_CIRC ((uint16_t)0x0020) /* Circular mode */ -#define DMA_CFGR1_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ -#define DMA_CFGR1_MINC ((uint16_t)0x0080) /* Memory increment mode */ - -#define DMA_CFGR1_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CFGR1_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ -#define DMA_CFGR1_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ - -#define DMA_CFGR1_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ -#define DMA_CFGR1_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ -#define DMA_CFGR1_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ - -#define DMA_CFGR1_PL ((uint16_t)0x3000) /* PL[1:0] bits(Channel Priority level) */ -#define DMA_CFGR1_PL_0 ((uint16_t)0x1000) /* Bit 0 */ -#define DMA_CFGR1_PL_1 ((uint16_t)0x2000) /* Bit 1 */ - -#define DMA_CFGR1_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ - -/******************* Bit definition for DMA_CFGR2 register *******************/ -#define DMA_CFGR2_EN ((uint16_t)0x0001) /* Channel enable */ -#define DMA_CFGR2_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ -#define DMA_CFGR2_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ -#define DMA_CFGR2_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ -#define DMA_CFGR2_DIR ((uint16_t)0x0010) /* Data transfer direction */ -#define DMA_CFGR2_CIRC ((uint16_t)0x0020) /* Circular mode */ -#define DMA_CFGR2_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ -#define DMA_CFGR2_MINC ((uint16_t)0x0080) /* Memory increment mode */ - -#define DMA_CFGR2_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CFGR2_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ -#define DMA_CFGR2_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ - -#define DMA_CFGR2_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ -#define DMA_CFGR2_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ -#define DMA_CFGR2_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ - -#define DMA_CFGR2_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ -#define DMA_CFGR2_PL_0 ((uint16_t)0x1000) /* Bit 0 */ -#define DMA_CFGR2_PL_1 ((uint16_t)0x2000) /* Bit 1 */ - -#define DMA_CFGR2_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ - -/******************* Bit definition for DMA_CFGR3 register *******************/ -#define DMA_CFGR3_EN ((uint16_t)0x0001) /* Channel enable */ -#define DMA_CFGR3_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ -#define DMA_CFGR3_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ -#define DMA_CFGR3_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ -#define DMA_CFGR3_DIR ((uint16_t)0x0010) /* Data transfer direction */ -#define DMA_CFGR3_CIRC ((uint16_t)0x0020) /* Circular mode */ -#define DMA_CFGR3_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ -#define DMA_CFGR3_MINC ((uint16_t)0x0080) /* Memory increment mode */ - -#define DMA_CFGR3_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CFGR3_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ -#define DMA_CFGR3_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ - -#define DMA_CFGR3_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ -#define DMA_CFGR3_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ -#define DMA_CFGR3_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ - -#define DMA_CFGR3_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ -#define DMA_CFGR3_PL_0 ((uint16_t)0x1000) /* Bit 0 */ -#define DMA_CFGR3_PL_1 ((uint16_t)0x2000) /* Bit 1 */ - -#define DMA_CFGR3_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ - -/******************* Bit definition for DMA_CFG4 register *******************/ -#define DMA_CFG4_EN ((uint16_t)0x0001) /* Channel enable */ -#define DMA_CFG4_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ -#define DMA_CFG4_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ -#define DMA_CFG4_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ -#define DMA_CFG4_DIR ((uint16_t)0x0010) /* Data transfer direction */ -#define DMA_CFG4_CIRC ((uint16_t)0x0020) /* Circular mode */ -#define DMA_CFG4_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ -#define DMA_CFG4_MINC ((uint16_t)0x0080) /* Memory increment mode */ - -#define DMA_CFG4_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CFG4_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ -#define DMA_CFG4_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ - -#define DMA_CFG4_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ -#define DMA_CFG4_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ -#define DMA_CFG4_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ - -#define DMA_CFG4_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ -#define DMA_CFG4_PL_0 ((uint16_t)0x1000) /* Bit 0 */ -#define DMA_CFG4_PL_1 ((uint16_t)0x2000) /* Bit 1 */ - -#define DMA_CFG4_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ - -/****************** Bit definition for DMA_CFG5 register *******************/ -#define DMA_CFG5_EN ((uint16_t)0x0001) /* Channel enable */ -#define DMA_CFG5_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ -#define DMA_CFG5_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ -#define DMA_CFG5_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ -#define DMA_CFG5_DIR ((uint16_t)0x0010) /* Data transfer direction */ -#define DMA_CFG5_CIRC ((uint16_t)0x0020) /* Circular mode */ -#define DMA_CFG5_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ -#define DMA_CFG5_MINC ((uint16_t)0x0080) /* Memory increment mode */ - -#define DMA_CFG5_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CFG5_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ -#define DMA_CFG5_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ - -#define DMA_CFG5_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ -#define DMA_CFG5_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ -#define DMA_CFG5_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ - -#define DMA_CFG5_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ -#define DMA_CFG5_PL_0 ((uint16_t)0x1000) /* Bit 0 */ -#define DMA_CFG5_PL_1 ((uint16_t)0x2000) /* Bit 1 */ - -#define DMA_CFG5_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode enable */ - -/******************* Bit definition for DMA_CFG6 register *******************/ -#define DMA_CFG6_EN ((uint16_t)0x0001) /* Channel enable */ -#define DMA_CFG6_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ -#define DMA_CFG6_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ -#define DMA_CFG6_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ -#define DMA_CFG6_DIR ((uint16_t)0x0010) /* Data transfer direction */ -#define DMA_CFG6_CIRC ((uint16_t)0x0020) /* Circular mode */ -#define DMA_CFG6_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ -#define DMA_CFG6_MINC ((uint16_t)0x0080) /* Memory increment mode */ - -#define DMA_CFG6_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CFG6_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ -#define DMA_CFG6_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ - -#define DMA_CFG6_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ -#define DMA_CFG6_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ -#define DMA_CFG6_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ - -#define DMA_CFG6_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ -#define DMA_CFG6_PL_0 ((uint16_t)0x1000) /* Bit 0 */ -#define DMA_CFG6_PL_1 ((uint16_t)0x2000) /* Bit 1 */ - -#define DMA_CFG6_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ - -/******************* Bit definition for DMA_CFG7 register *******************/ -#define DMA_CFG7_EN ((uint16_t)0x0001) /* Channel enable */ -#define DMA_CFG7_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ -#define DMA_CFG7_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ -#define DMA_CFG7_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ -#define DMA_CFG7_DIR ((uint16_t)0x0010) /* Data transfer direction */ -#define DMA_CFG7_CIRC ((uint16_t)0x0020) /* Circular mode */ -#define DMA_CFG7_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ -#define DMA_CFG7_MINC ((uint16_t)0x0080) /* Memory increment mode */ - -#define DMA_CFG7_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CFG7_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ -#define DMA_CFG7_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ - -#define DMA_CFG7_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ -#define DMA_CFG7_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ -#define DMA_CFG7_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ - -#define DMA_CFG7_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ -#define DMA_CFG7_PL_0 ((uint16_t)0x1000) /* Bit 0 */ -#define DMA_CFG7_PL_1 ((uint16_t)0x2000) /* Bit 1 */ - -#define DMA_CFG7_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode enable */ - -/****************** Bit definition for DMA_CNTR1 register ******************/ -#define DMA_CNTR1_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ - -/****************** Bit definition for DMA_CNTR2 register ******************/ -#define DMA_CNTR2_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ - -/****************** Bit definition for DMA_CNTR3 register ******************/ -#define DMA_CNTR3_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ - -/****************** Bit definition for DMA_CNTR4 register ******************/ -#define DMA_CNTR4_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ - -/****************** Bit definition for DMA_CNTR5 register ******************/ -#define DMA_CNTR5_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ - -/****************** Bit definition for DMA_CNTR6 register ******************/ -#define DMA_CNTR6_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ - -/****************** Bit definition for DMA_CNTR7 register ******************/ -#define DMA_CNTR7_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ - -/****************** Bit definition for DMA_PADDR1 register *******************/ -#define DMA_PADDR1_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ - -/****************** Bit definition for DMA_PADDR2 register *******************/ -#define DMA_PADDR2_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ - -/****************** Bit definition for DMA_PADDR3 register *******************/ -#define DMA_PADDR3_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ - -/****************** Bit definition for DMA_PADDR4 register *******************/ -#define DMA_PADDR4_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ - -/****************** Bit definition for DMA_PADDR5 register *******************/ -#define DMA_PADDR5_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ - -/****************** Bit definition for DMA_PADDR6 register *******************/ -#define DMA_PADDR6_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ - -/****************** Bit definition for DMA_PADDR7 register *******************/ -#define DMA_PADDR7_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ - -/****************** Bit definition for DMA_MADDR1 register *******************/ -#define DMA_MADDR1_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ - -/****************** Bit definition for DMA_MADDR2 register *******************/ -#define DMA_MADDR2_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ - -/****************** Bit definition for DMA_MADDR3 register *******************/ -#define DMA_MADDR3_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ - -/****************** Bit definition for DMA_MADDR4 register *******************/ -#define DMA_MADDR4_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ - -/****************** Bit definition for DMA_MADDR5 register *******************/ -#define DMA_MADDR5_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ - -/****************** Bit definition for DMA_MADDR6 register *******************/ -#define DMA_MADDR6_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ - -/****************** Bit definition for DMA_MADDR7 register *******************/ -#define DMA_MADDR7_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ - -/******************************************************************************/ -/* External Interrupt/Event Controller */ -/******************************************************************************/ - -/******************* Bit definition for EXTI_INTENR register *******************/ -#define EXTI_INTENR_MR0 ((uint32_t)0x00000001) /* Interrupt Mask on line 0 */ -#define EXTI_INTENR_MR1 ((uint32_t)0x00000002) /* Interrupt Mask on line 1 */ -#define EXTI_INTENR_MR2 ((uint32_t)0x00000004) /* Interrupt Mask on line 2 */ -#define EXTI_INTENR_MR3 ((uint32_t)0x00000008) /* Interrupt Mask on line 3 */ -#define EXTI_INTENR_MR4 ((uint32_t)0x00000010) /* Interrupt Mask on line 4 */ -#define EXTI_INTENR_MR5 ((uint32_t)0x00000020) /* Interrupt Mask on line 5 */ -#define EXTI_INTENR_MR6 ((uint32_t)0x00000040) /* Interrupt Mask on line 6 */ -#define EXTI_INTENR_MR7 ((uint32_t)0x00000080) /* Interrupt Mask on line 7 */ -#define EXTI_INTENR_MR8 ((uint32_t)0x00000100) /* Interrupt Mask on line 8 */ -#define EXTI_INTENR_MR9 ((uint32_t)0x00000200) /* Interrupt Mask on line 9 */ - -/******************* Bit definition for EXTI_EVENR register *******************/ -#define EXTI_EVENR_MR0 ((uint32_t)0x00000001) /* Event Mask on line 0 */ -#define EXTI_EVENR_MR1 ((uint32_t)0x00000002) /* Event Mask on line 1 */ -#define EXTI_EVENR_MR2 ((uint32_t)0x00000004) /* Event Mask on line 2 */ -#define EXTI_EVENR_MR3 ((uint32_t)0x00000008) /* Event Mask on line 3 */ -#define EXTI_EVENR_MR4 ((uint32_t)0x00000010) /* Event Mask on line 4 */ -#define EXTI_EVENR_MR5 ((uint32_t)0x00000020) /* Event Mask on line 5 */ -#define EXTI_EVENR_MR6 ((uint32_t)0x00000040) /* Event Mask on line 6 */ -#define EXTI_EVENR_MR7 ((uint32_t)0x00000080) /* Event Mask on line 7 */ -#define EXTI_EVENR_MR8 ((uint32_t)0x00000100) /* Event Mask on line 8 */ -#define EXTI_EVENR_MR9 ((uint32_t)0x00000200) /* Event Mask on line 9 */ - -/****************** Bit definition for EXTI_RTENR register *******************/ -#define EXTI_RTENR_TR0 ((uint32_t)0x00000001) /* Rising trigger event configuration bit of line 0 */ -#define EXTI_RTENR_TR1 ((uint32_t)0x00000002) /* Rising trigger event configuration bit of line 1 */ -#define EXTI_RTENR_TR2 ((uint32_t)0x00000004) /* Rising trigger event configuration bit of line 2 */ -#define EXTI_RTENR_TR3 ((uint32_t)0x00000008) /* Rising trigger event configuration bit of line 3 */ -#define EXTI_RTENR_TR4 ((uint32_t)0x00000010) /* Rising trigger event configuration bit of line 4 */ -#define EXTI_RTENR_TR5 ((uint32_t)0x00000020) /* Rising trigger event configuration bit of line 5 */ -#define EXTI_RTENR_TR6 ((uint32_t)0x00000040) /* Rising trigger event configuration bit of line 6 */ -#define EXTI_RTENR_TR7 ((uint32_t)0x00000080) /* Rising trigger event configuration bit of line 7 */ -#define EXTI_RTENR_TR8 ((uint32_t)0x00000100) /* Rising trigger event configuration bit of line 8 */ -#define EXTI_RTENR_TR9 ((uint32_t)0x00000200) /* Rising trigger event configuration bit of line 9 */ - -/****************** Bit definition for EXTI_FTENR register *******************/ -#define EXTI_FTENR_TR0 ((uint32_t)0x00000001) /* Falling trigger event configuration bit of line 0 */ -#define EXTI_FTENR_TR1 ((uint32_t)0x00000002) /* Falling trigger event configuration bit of line 1 */ -#define EXTI_FTENR_TR2 ((uint32_t)0x00000004) /* Falling trigger event configuration bit of line 2 */ -#define EXTI_FTENR_TR3 ((uint32_t)0x00000008) /* Falling trigger event configuration bit of line 3 */ -#define EXTI_FTENR_TR4 ((uint32_t)0x00000010) /* Falling trigger event configuration bit of line 4 */ -#define EXTI_FTENR_TR5 ((uint32_t)0x00000020) /* Falling trigger event configuration bit of line 5 */ -#define EXTI_FTENR_TR6 ((uint32_t)0x00000040) /* Falling trigger event configuration bit of line 6 */ -#define EXTI_FTENR_TR7 ((uint32_t)0x00000080) /* Falling trigger event configuration bit of line 7 */ -#define EXTI_FTENR_TR8 ((uint32_t)0x00000100) /* Falling trigger event configuration bit of line 8 */ -#define EXTI_FTENR_TR9 ((uint32_t)0x00000200) /* Falling trigger event configuration bit of line 9 */ - -/****************** Bit definition for EXTI_SWIEVR register ******************/ -#define EXTI_SWIEVR_SWIEVR0 ((uint32_t)0x00000001) /* Software Interrupt on line 0 */ -#define EXTI_SWIEVR_SWIEVR1 ((uint32_t)0x00000002) /* Software Interrupt on line 1 */ -#define EXTI_SWIEVR_SWIEVR2 ((uint32_t)0x00000004) /* Software Interrupt on line 2 */ -#define EXTI_SWIEVR_SWIEVR3 ((uint32_t)0x00000008) /* Software Interrupt on line 3 */ -#define EXTI_SWIEVR_SWIEVR4 ((uint32_t)0x00000010) /* Software Interrupt on line 4 */ -#define EXTI_SWIEVR_SWIEVR5 ((uint32_t)0x00000020) /* Software Interrupt on line 5 */ -#define EXTI_SWIEVR_SWIEVR6 ((uint32_t)0x00000040) /* Software Interrupt on line 6 */ -#define EXTI_SWIEVR_SWIEVR7 ((uint32_t)0x00000080) /* Software Interrupt on line 7 */ -#define EXTI_SWIEVR_SWIEVR8 ((uint32_t)0x00000100) /* Software Interrupt on line 8 */ -#define EXTI_SWIEVR_SWIEVR9 ((uint32_t)0x00000200) /* Software Interrupt on line 9 */ - -/******************* Bit definition for EXTI_INTFR register ********************/ -#define EXTI_INTF_INTF0 ((uint32_t)0x00000001) /* Pending bit for line 0 */ -#define EXTI_INTF_INTF1 ((uint32_t)0x00000002) /* Pending bit for line 1 */ -#define EXTI_INTF_INTF2 ((uint32_t)0x00000004) /* Pending bit for line 2 */ -#define EXTI_INTF_INTF3 ((uint32_t)0x00000008) /* Pending bit for line 3 */ -#define EXTI_INTF_INTF4 ((uint32_t)0x00000010) /* Pending bit for line 4 */ -#define EXTI_INTF_INTF5 ((uint32_t)0x00000020) /* Pending bit for line 5 */ -#define EXTI_INTF_INTF6 ((uint32_t)0x00000040) /* Pending bit for line 6 */ -#define EXTI_INTF_INTF7 ((uint32_t)0x00000080) /* Pending bit for line 7 */ -#define EXTI_INTF_INTF8 ((uint32_t)0x00000100) /* Pending bit for line 8 */ -#define EXTI_INTF_INTF9 ((uint32_t)0x00000200) /* Pending bit for line 9 */ - -/******************************************************************************/ -/* FLASH and Option Bytes Registers */ -/******************************************************************************/ - -/******************* Bit definition for FLASH_ACTLR register ******************/ -#define FLASH_ACTLR_LATENCY ((uint8_t)0x03) /* LATENCY[2:0] bits (Latency) */ -#define FLASH_ACTLR_LATENCY_0 ((uint8_t)0x00) /* Bit 0 */ -#define FLASH_ACTLR_LATENCY_1 ((uint8_t)0x01) /* Bit 0 */ -#define FLASH_ACTLR_LATENCY_2 ((uint8_t)0x02) /* Bit 1 */ - -/****************** Bit definition for FLASH_KEYR register ******************/ -#define FLASH_KEYR_FKEYR ((uint32_t)0xFFFFFFFF) /* FPEC Key */ - -/***************** Bit definition for FLASH_OBKEYR register ****************/ -#define FLASH_OBKEYR_OBKEYR ((uint32_t)0xFFFFFFFF) /* Option Byte Key */ - -/****************** Bit definition for FLASH_STATR register *******************/ -#define FLASH_STATR_BSY ((uint8_t)0x01) /* Busy */ -#define FLASH_STATR_WRPRTERR ((uint8_t)0x10) /* Write Protection Error */ -#define FLASH_STATR_EOP ((uint8_t)0x20) /* End of operation */ - -/******************* Bit definition for FLASH_CTLR register *******************/ -#define FLASH_CTLR_PG ((uint16_t)0x0001) /* Programming */ -#define FLASH_CTLR_PER ((uint16_t)0x0002) /* Page Erase 1KByte*/ -#define FLASH_CTLR_MER ((uint16_t)0x0004) /* Mass Erase */ -#define FLASH_CTLR_OPTPG ((uint16_t)0x0010) /* Option Byte Programming */ -#define FLASH_CTLR_OPTER ((uint16_t)0x0020) /* Option Byte Erase */ -#define FLASH_CTLR_STRT ((uint16_t)0x0040) /* Start */ -#define FLASH_CTLR_LOCK ((uint16_t)0x0080) /* Lock */ -#define FLASH_CTLR_OPTWRE ((uint16_t)0x0200) /* Option Bytes Write Enable */ -#define FLASH_CTLR_ERRIE ((uint16_t)0x0400) /* Error Interrupt Enable */ -#define FLASH_CTLR_EOPIE ((uint16_t)0x1000) /* End of operation interrupt enable */ -#define FLASH_CTLR_PAGE_PG ((uint16_t)0x00010000) /* Page Programming 64Byte */ -#define FLASH_CTLR_PAGE_ER ((uint16_t)0x00020000) /* Page Erase 64Byte */ -#define FLASH_CTLR_BUF_LOAD ((uint16_t)0x00040000) /* Buffer Load */ -#define FLASH_CTLR_BUF_RST ((uint16_t)0x00080000) /* Buffer Reset */ - -/******************* Bit definition for FLASH_ADDR register *******************/ -#define FLASH_ADDR_FAR ((uint32_t)0xFFFFFFFF) /* Flash Address */ - -/****************** Bit definition for FLASH_OBR register *******************/ -#define FLASH_OBR_OPTERR ((uint16_t)0x0001) /* Option Byte Error */ -#define FLASH_OBR_RDPRT ((uint16_t)0x0002) /* Read protection */ - -#define FLASH_OBR_USER ((uint16_t)0x03FC) /* User Option Bytes */ -#define FLASH_OBR_WDG_SW ((uint16_t)0x0004) /* WDG_SW */ -#define FLASH_OBR_nRST_STOP ((uint16_t)0x0008) /* nRST_STOP */ -#define FLASH_OBR_nRST_STDBY ((uint16_t)0x0010) /* nRST_STDBY */ -#define FLASH_OBR_RST_MODE ((uint16_t)0x0060) /* RST_MODE */ - -/****************** Bit definition for FLASH_WPR register ******************/ -#define FLASH_WPR_WRP ((uint32_t)0xFFFFFFFF) /* Write Protect */ - -/****************** Bit definition for FLASH_RDPR register *******************/ -#define FLASH_RDPR_RDPR ((uint32_t)0x000000FF) /* Read protection option byte */ -#define FLASH_RDPR_nRDPR ((uint32_t)0x0000FF00) /* Read protection complemented option byte */ - -/****************** Bit definition for FLASH_USER register ******************/ -#define FLASH_USER_USER ((uint32_t)0x00FF0000) /* User option byte */ -#define FLASH_USER_nUSER ((uint32_t)0xFF000000) /* User complemented option byte */ - -/****************** Bit definition for FLASH_Data0 register *****************/ -#define FLASH_Data0_Data0 ((uint32_t)0x000000FF) /* User data storage option byte */ -#define FLASH_Data0_nData0 ((uint32_t)0x0000FF00) /* User data storage complemented option byte */ - -/****************** Bit definition for FLASH_Data1 register *****************/ -#define FLASH_Data1_Data1 ((uint32_t)0x00FF0000) /* User data storage option byte */ -#define FLASH_Data1_nData1 ((uint32_t)0xFF000000) /* User data storage complemented option byte */ - -/****************** Bit definition for FLASH_WRPR0 register ******************/ -#define FLASH_WRPR0_WRPR0 ((uint32_t)0x000000FF) /* Flash memory write protection option bytes */ -#define FLASH_WRPR0_nWRPR0 ((uint32_t)0x0000FF00) /* Flash memory write protection complemented option bytes */ - -/****************** Bit definition for FLASH_WRPR1 register ******************/ -#define FLASH_WRPR1_WRPR1 ((uint32_t)0x00FF0000) /* Flash memory write protection option bytes */ -#define FLASH_WRPR1_nWRPR1 ((uint32_t)0xFF000000) /* Flash memory write protection complemented option bytes */ - - -/******************************************************************************/ -/* General Purpose and Alternate Function I/O */ -/******************************************************************************/ - -/******************* Bit definition for GPIO_CFGLR register *******************/ -#define GPIO_CFGLR_MODE ((uint32_t)0x33333333) /* Port x mode bits */ - -#define GPIO_CFGLR_MODE0 ((uint32_t)0x00000003) /* MODE0[1:0] bits (Port x mode bits, pin 0) */ -#define GPIO_CFGLR_MODE0_0 ((uint32_t)0x00000001) /* Bit 0 */ -#define GPIO_CFGLR_MODE0_1 ((uint32_t)0x00000002) /* Bit 1 */ - -#define GPIO_CFGLR_MODE1 ((uint32_t)0x00000030) /* MODE1[1:0] bits (Port x mode bits, pin 1) */ -#define GPIO_CFGLR_MODE1_0 ((uint32_t)0x00000010) /* Bit 0 */ -#define GPIO_CFGLR_MODE1_1 ((uint32_t)0x00000020) /* Bit 1 */ - -#define GPIO_CFGLR_MODE2 ((uint32_t)0x00000300) /* MODE2[1:0] bits (Port x mode bits, pin 2) */ -#define GPIO_CFGLR_MODE2_0 ((uint32_t)0x00000100) /* Bit 0 */ -#define GPIO_CFGLR_MODE2_1 ((uint32_t)0x00000200) /* Bit 1 */ - -#define GPIO_CFGLR_MODE3 ((uint32_t)0x00003000) /* MODE3[1:0] bits (Port x mode bits, pin 3) */ -#define GPIO_CFGLR_MODE3_0 ((uint32_t)0x00001000) /* Bit 0 */ -#define GPIO_CFGLR_MODE3_1 ((uint32_t)0x00002000) /* Bit 1 */ - -#define GPIO_CFGLR_MODE4 ((uint32_t)0x00030000) /* MODE4[1:0] bits (Port x mode bits, pin 4) */ -#define GPIO_CFGLR_MODE4_0 ((uint32_t)0x00010000) /* Bit 0 */ -#define GPIO_CFGLR_MODE4_1 ((uint32_t)0x00020000) /* Bit 1 */ - -#define GPIO_CFGLR_MODE5 ((uint32_t)0x00300000) /* MODE5[1:0] bits (Port x mode bits, pin 5) */ -#define GPIO_CFGLR_MODE5_0 ((uint32_t)0x00100000) /* Bit 0 */ -#define GPIO_CFGLR_MODE5_1 ((uint32_t)0x00200000) /* Bit 1 */ - -#define GPIO_CFGLR_MODE6 ((uint32_t)0x03000000) /* MODE6[1:0] bits (Port x mode bits, pin 6) */ -#define GPIO_CFGLR_MODE6_0 ((uint32_t)0x01000000) /* Bit 0 */ -#define GPIO_CFGLR_MODE6_1 ((uint32_t)0x02000000) /* Bit 1 */ - -#define GPIO_CFGLR_MODE7 ((uint32_t)0x30000000) /* MODE7[1:0] bits (Port x mode bits, pin 7) */ -#define GPIO_CFGLR_MODE7_0 ((uint32_t)0x10000000) /* Bit 0 */ -#define GPIO_CFGLR_MODE7_1 ((uint32_t)0x20000000) /* Bit 1 */ - -#define GPIO_CFGLR_CNF ((uint32_t)0xCCCCCCCC) /* Port x configuration bits */ - -#define GPIO_CFGLR_CNF0 ((uint32_t)0x0000000C) /* CNF0[1:0] bits (Port x configuration bits, pin 0) */ -#define GPIO_CFGLR_CNF0_0 ((uint32_t)0x00000004) /* Bit 0 */ -#define GPIO_CFGLR_CNF0_1 ((uint32_t)0x00000008) /* Bit 1 */ - -#define GPIO_CFGLR_CNF1 ((uint32_t)0x000000C0) /* CNF1[1:0] bits (Port x configuration bits, pin 1) */ -#define GPIO_CFGLR_CNF1_0 ((uint32_t)0x00000040) /* Bit 0 */ -#define GPIO_CFGLR_CNF1_1 ((uint32_t)0x00000080) /* Bit 1 */ - -#define GPIO_CFGLR_CNF2 ((uint32_t)0x00000C00) /* CNF2[1:0] bits (Port x configuration bits, pin 2) */ -#define GPIO_CFGLR_CNF2_0 ((uint32_t)0x00000400) /* Bit 0 */ -#define GPIO_CFGLR_CNF2_1 ((uint32_t)0x00000800) /* Bit 1 */ - -#define GPIO_CFGLR_CNF3 ((uint32_t)0x0000C000) /* CNF3[1:0] bits (Port x configuration bits, pin 3) */ -#define GPIO_CFGLR_CNF3_0 ((uint32_t)0x00004000) /* Bit 0 */ -#define GPIO_CFGLR_CNF3_1 ((uint32_t)0x00008000) /* Bit 1 */ - -#define GPIO_CFGLR_CNF4 ((uint32_t)0x000C0000) /* CNF4[1:0] bits (Port x configuration bits, pin 4) */ -#define GPIO_CFGLR_CNF4_0 ((uint32_t)0x00040000) /* Bit 0 */ -#define GPIO_CFGLR_CNF4_1 ((uint32_t)0x00080000) /* Bit 1 */ - -#define GPIO_CFGLR_CNF5 ((uint32_t)0x00C00000) /* CNF5[1:0] bits (Port x configuration bits, pin 5) */ -#define GPIO_CFGLR_CNF5_0 ((uint32_t)0x00400000) /* Bit 0 */ -#define GPIO_CFGLR_CNF5_1 ((uint32_t)0x00800000) /* Bit 1 */ - -#define GPIO_CFGLR_CNF6 ((uint32_t)0x0C000000) /* CNF6[1:0] bits (Port x configuration bits, pin 6) */ -#define GPIO_CFGLR_CNF6_0 ((uint32_t)0x04000000) /* Bit 0 */ -#define GPIO_CFGLR_CNF6_1 ((uint32_t)0x08000000) /* Bit 1 */ - -#define GPIO_CFGLR_CNF7 ((uint32_t)0xC0000000) /* CNF7[1:0] bits (Port x configuration bits, pin 7) */ -#define GPIO_CFGLR_CNF7_0 ((uint32_t)0x40000000) /* Bit 0 */ -#define GPIO_CFGLR_CNF7_1 ((uint32_t)0x80000000) /* Bit 1 */ - -/******************* Bit definition for GPIO_CFGHR register *******************/ -#define GPIO_CFGHR_MODE ((uint32_t)0x33333333) /* Port x mode bits */ - -#define GPIO_CFGHR_MODE8 ((uint32_t)0x00000003) /* MODE8[1:0] bits (Port x mode bits, pin 8) */ -#define GPIO_CFGHR_MODE8_0 ((uint32_t)0x00000001) /* Bit 0 */ -#define GPIO_CFGHR_MODE8_1 ((uint32_t)0x00000002) /* Bit 1 */ - -#define GPIO_CFGHR_MODE9 ((uint32_t)0x00000030) /* MODE9[1:0] bits (Port x mode bits, pin 9) */ -#define GPIO_CFGHR_MODE9_0 ((uint32_t)0x00000010) /* Bit 0 */ -#define GPIO_CFGHR_MODE9_1 ((uint32_t)0x00000020) /* Bit 1 */ - -#define GPIO_CFGHR_MODE10 ((uint32_t)0x00000300) /* MODE10[1:0] bits (Port x mode bits, pin 10) */ -#define GPIO_CFGHR_MODE10_0 ((uint32_t)0x00000100) /* Bit 0 */ -#define GPIO_CFGHR_MODE10_1 ((uint32_t)0x00000200) /* Bit 1 */ - -#define GPIO_CFGHR_MODE11 ((uint32_t)0x00003000) /* MODE11[1:0] bits (Port x mode bits, pin 11) */ -#define GPIO_CFGHR_MODE11_0 ((uint32_t)0x00001000) /* Bit 0 */ -#define GPIO_CFGHR_MODE11_1 ((uint32_t)0x00002000) /* Bit 1 */ - -#define GPIO_CFGHR_MODE12 ((uint32_t)0x00030000) /* MODE12[1:0] bits (Port x mode bits, pin 12) */ -#define GPIO_CFGHR_MODE12_0 ((uint32_t)0x00010000) /* Bit 0 */ -#define GPIO_CFGHR_MODE12_1 ((uint32_t)0x00020000) /* Bit 1 */ - -#define GPIO_CFGHR_MODE13 ((uint32_t)0x00300000) /* MODE13[1:0] bits (Port x mode bits, pin 13) */ -#define GPIO_CFGHR_MODE13_0 ((uint32_t)0x00100000) /* Bit 0 */ -#define GPIO_CFGHR_MODE13_1 ((uint32_t)0x00200000) /* Bit 1 */ - -#define GPIO_CFGHR_MODE14 ((uint32_t)0x03000000) /* MODE14[1:0] bits (Port x mode bits, pin 14) */ -#define GPIO_CFGHR_MODE14_0 ((uint32_t)0x01000000) /* Bit 0 */ -#define GPIO_CFGHR_MODE14_1 ((uint32_t)0x02000000) /* Bit 1 */ - -#define GPIO_CFGHR_MODE15 ((uint32_t)0x30000000) /* MODE15[1:0] bits (Port x mode bits, pin 15) */ -#define GPIO_CFGHR_MODE15_0 ((uint32_t)0x10000000) /* Bit 0 */ -#define GPIO_CFGHR_MODE15_1 ((uint32_t)0x20000000) /* Bit 1 */ - -#define GPIO_CFGHR_CNF ((uint32_t)0xCCCCCCCC) /* Port x configuration bits */ - -#define GPIO_CFGHR_CNF8 ((uint32_t)0x0000000C) /* CNF8[1:0] bits (Port x configuration bits, pin 8) */ -#define GPIO_CFGHR_CNF8_0 ((uint32_t)0x00000004) /* Bit 0 */ -#define GPIO_CFGHR_CNF8_1 ((uint32_t)0x00000008) /* Bit 1 */ - -#define GPIO_CFGHR_CNF9 ((uint32_t)0x000000C0) /* CNF9[1:0] bits (Port x configuration bits, pin 9) */ -#define GPIO_CFGHR_CNF9_0 ((uint32_t)0x00000040) /* Bit 0 */ -#define GPIO_CFGHR_CNF9_1 ((uint32_t)0x00000080) /* Bit 1 */ - -#define GPIO_CFGHR_CNF10 ((uint32_t)0x00000C00) /* CNF10[1:0] bits (Port x configuration bits, pin 10) */ -#define GPIO_CFGHR_CNF10_0 ((uint32_t)0x00000400) /* Bit 0 */ -#define GPIO_CFGHR_CNF10_1 ((uint32_t)0x00000800) /* Bit 1 */ - -#define GPIO_CFGHR_CNF11 ((uint32_t)0x0000C000) /* CNF11[1:0] bits (Port x configuration bits, pin 11) */ -#define GPIO_CFGHR_CNF11_0 ((uint32_t)0x00004000) /* Bit 0 */ -#define GPIO_CFGHR_CNF11_1 ((uint32_t)0x00008000) /* Bit 1 */ - -#define GPIO_CFGHR_CNF12 ((uint32_t)0x000C0000) /* CNF12[1:0] bits (Port x configuration bits, pin 12) */ -#define GPIO_CFGHR_CNF12_0 ((uint32_t)0x00040000) /* Bit 0 */ -#define GPIO_CFGHR_CNF12_1 ((uint32_t)0x00080000) /* Bit 1 */ - -#define GPIO_CFGHR_CNF13 ((uint32_t)0x00C00000) /* CNF13[1:0] bits (Port x configuration bits, pin 13) */ -#define GPIO_CFGHR_CNF13_0 ((uint32_t)0x00400000) /* Bit 0 */ -#define GPIO_CFGHR_CNF13_1 ((uint32_t)0x00800000) /* Bit 1 */ - -#define GPIO_CFGHR_CNF14 ((uint32_t)0x0C000000) /* CNF14[1:0] bits (Port x configuration bits, pin 14) */ -#define GPIO_CFGHR_CNF14_0 ((uint32_t)0x04000000) /* Bit 0 */ -#define GPIO_CFGHR_CNF14_1 ((uint32_t)0x08000000) /* Bit 1 */ - -#define GPIO_CFGHR_CNF15 ((uint32_t)0xC0000000) /* CNF15[1:0] bits (Port x configuration bits, pin 15) */ -#define GPIO_CFGHR_CNF15_0 ((uint32_t)0x40000000) /* Bit 0 */ -#define GPIO_CFGHR_CNF15_1 ((uint32_t)0x80000000) /* Bit 1 */ - -/******************* Bit definition for GPIO_INDR register *******************/ -#define GPIO_INDR_IDR0 ((uint16_t)0x0001) /* Port input data, bit 0 */ -#define GPIO_INDR_IDR1 ((uint16_t)0x0002) /* Port input data, bit 1 */ -#define GPIO_INDR_IDR2 ((uint16_t)0x0004) /* Port input data, bit 2 */ -#define GPIO_INDR_IDR3 ((uint16_t)0x0008) /* Port input data, bit 3 */ -#define GPIO_INDR_IDR4 ((uint16_t)0x0010) /* Port input data, bit 4 */ -#define GPIO_INDR_IDR5 ((uint16_t)0x0020) /* Port input data, bit 5 */ -#define GPIO_INDR_IDR6 ((uint16_t)0x0040) /* Port input data, bit 6 */ -#define GPIO_INDR_IDR7 ((uint16_t)0x0080) /* Port input data, bit 7 */ -#define GPIO_INDR_IDR8 ((uint16_t)0x0100) /* Port input data, bit 8 */ -#define GPIO_INDR_IDR9 ((uint16_t)0x0200) /* Port input data, bit 9 */ -#define GPIO_INDR_IDR10 ((uint16_t)0x0400) /* Port input data, bit 10 */ -#define GPIO_INDR_IDR11 ((uint16_t)0x0800) /* Port input data, bit 11 */ -#define GPIO_INDR_IDR12 ((uint16_t)0x1000) /* Port input data, bit 12 */ -#define GPIO_INDR_IDR13 ((uint16_t)0x2000) /* Port input data, bit 13 */ -#define GPIO_INDR_IDR14 ((uint16_t)0x4000) /* Port input data, bit 14 */ -#define GPIO_INDR_IDR15 ((uint16_t)0x8000) /* Port input data, bit 15 */ - -/******************* Bit definition for GPIO_OUTDR register *******************/ -#define GPIO_OUTDR_ODR0 ((uint16_t)0x0001) /* Port output data, bit 0 */ -#define GPIO_OUTDR_ODR1 ((uint16_t)0x0002) /* Port output data, bit 1 */ -#define GPIO_OUTDR_ODR2 ((uint16_t)0x0004) /* Port output data, bit 2 */ -#define GPIO_OUTDR_ODR3 ((uint16_t)0x0008) /* Port output data, bit 3 */ -#define GPIO_OUTDR_ODR4 ((uint16_t)0x0010) /* Port output data, bit 4 */ -#define GPIO_OUTDR_ODR5 ((uint16_t)0x0020) /* Port output data, bit 5 */ -#define GPIO_OUTDR_ODR6 ((uint16_t)0x0040) /* Port output data, bit 6 */ -#define GPIO_OUTDR_ODR7 ((uint16_t)0x0080) /* Port output data, bit 7 */ -#define GPIO_OUTDR_ODR8 ((uint16_t)0x0100) /* Port output data, bit 8 */ -#define GPIO_OUTDR_ODR9 ((uint16_t)0x0200) /* Port output data, bit 9 */ -#define GPIO_OUTDR_ODR10 ((uint16_t)0x0400) /* Port output data, bit 10 */ -#define GPIO_OUTDR_ODR11 ((uint16_t)0x0800) /* Port output data, bit 11 */ -#define GPIO_OUTDR_ODR12 ((uint16_t)0x1000) /* Port output data, bit 12 */ -#define GPIO_OUTDR_ODR13 ((uint16_t)0x2000) /* Port output data, bit 13 */ -#define GPIO_OUTDR_ODR14 ((uint16_t)0x4000) /* Port output data, bit 14 */ -#define GPIO_OUTDR_ODR15 ((uint16_t)0x8000) /* Port output data, bit 15 */ - -/****************** Bit definition for GPIO_BSHR register *******************/ -#define GPIO_BSHR_BS0 ((uint32_t)0x00000001) /* Port x Set bit 0 */ -#define GPIO_BSHR_BS1 ((uint32_t)0x00000002) /* Port x Set bit 1 */ -#define GPIO_BSHR_BS2 ((uint32_t)0x00000004) /* Port x Set bit 2 */ -#define GPIO_BSHR_BS3 ((uint32_t)0x00000008) /* Port x Set bit 3 */ -#define GPIO_BSHR_BS4 ((uint32_t)0x00000010) /* Port x Set bit 4 */ -#define GPIO_BSHR_BS5 ((uint32_t)0x00000020) /* Port x Set bit 5 */ -#define GPIO_BSHR_BS6 ((uint32_t)0x00000040) /* Port x Set bit 6 */ -#define GPIO_BSHR_BS7 ((uint32_t)0x00000080) /* Port x Set bit 7 */ -#define GPIO_BSHR_BS8 ((uint32_t)0x00000100) /* Port x Set bit 8 */ -#define GPIO_BSHR_BS9 ((uint32_t)0x00000200) /* Port x Set bit 9 */ -#define GPIO_BSHR_BS10 ((uint32_t)0x00000400) /* Port x Set bit 10 */ -#define GPIO_BSHR_BS11 ((uint32_t)0x00000800) /* Port x Set bit 11 */ -#define GPIO_BSHR_BS12 ((uint32_t)0x00001000) /* Port x Set bit 12 */ -#define GPIO_BSHR_BS13 ((uint32_t)0x00002000) /* Port x Set bit 13 */ -#define GPIO_BSHR_BS14 ((uint32_t)0x00004000) /* Port x Set bit 14 */ -#define GPIO_BSHR_BS15 ((uint32_t)0x00008000) /* Port x Set bit 15 */ - -#define GPIO_BSHR_BR0 ((uint32_t)0x00010000) /* Port x Reset bit 0 */ -#define GPIO_BSHR_BR1 ((uint32_t)0x00020000) /* Port x Reset bit 1 */ -#define GPIO_BSHR_BR2 ((uint32_t)0x00040000) /* Port x Reset bit 2 */ -#define GPIO_BSHR_BR3 ((uint32_t)0x00080000) /* Port x Reset bit 3 */ -#define GPIO_BSHR_BR4 ((uint32_t)0x00100000) /* Port x Reset bit 4 */ -#define GPIO_BSHR_BR5 ((uint32_t)0x00200000) /* Port x Reset bit 5 */ -#define GPIO_BSHR_BR6 ((uint32_t)0x00400000) /* Port x Reset bit 6 */ -#define GPIO_BSHR_BR7 ((uint32_t)0x00800000) /* Port x Reset bit 7 */ -#define GPIO_BSHR_BR8 ((uint32_t)0x01000000) /* Port x Reset bit 8 */ -#define GPIO_BSHR_BR9 ((uint32_t)0x02000000) /* Port x Reset bit 9 */ -#define GPIO_BSHR_BR10 ((uint32_t)0x04000000) /* Port x Reset bit 10 */ -#define GPIO_BSHR_BR11 ((uint32_t)0x08000000) /* Port x Reset bit 11 */ -#define GPIO_BSHR_BR12 ((uint32_t)0x10000000) /* Port x Reset bit 12 */ -#define GPIO_BSHR_BR13 ((uint32_t)0x20000000) /* Port x Reset bit 13 */ -#define GPIO_BSHR_BR14 ((uint32_t)0x40000000) /* Port x Reset bit 14 */ -#define GPIO_BSHR_BR15 ((uint32_t)0x80000000) /* Port x Reset bit 15 */ - -/******************* Bit definition for GPIO_BCR register *******************/ -#define GPIO_BCR_BR0 ((uint16_t)0x0001) /* Port x Reset bit 0 */ -#define GPIO_BCR_BR1 ((uint16_t)0x0002) /* Port x Reset bit 1 */ -#define GPIO_BCR_BR2 ((uint16_t)0x0004) /* Port x Reset bit 2 */ -#define GPIO_BCR_BR3 ((uint16_t)0x0008) /* Port x Reset bit 3 */ -#define GPIO_BCR_BR4 ((uint16_t)0x0010) /* Port x Reset bit 4 */ -#define GPIO_BCR_BR5 ((uint16_t)0x0020) /* Port x Reset bit 5 */ -#define GPIO_BCR_BR6 ((uint16_t)0x0040) /* Port x Reset bit 6 */ -#define GPIO_BCR_BR7 ((uint16_t)0x0080) /* Port x Reset bit 7 */ -#define GPIO_BCR_BR8 ((uint16_t)0x0100) /* Port x Reset bit 8 */ -#define GPIO_BCR_BR9 ((uint16_t)0x0200) /* Port x Reset bit 9 */ -#define GPIO_BCR_BR10 ((uint16_t)0x0400) /* Port x Reset bit 10 */ -#define GPIO_BCR_BR11 ((uint16_t)0x0800) /* Port x Reset bit 11 */ -#define GPIO_BCR_BR12 ((uint16_t)0x1000) /* Port x Reset bit 12 */ -#define GPIO_BCR_BR13 ((uint16_t)0x2000) /* Port x Reset bit 13 */ -#define GPIO_BCR_BR14 ((uint16_t)0x4000) /* Port x Reset bit 14 */ -#define GPIO_BCR_BR15 ((uint16_t)0x8000) /* Port x Reset bit 15 */ - -/****************** Bit definition for GPIO_LCKR register *******************/ -#define GPIO_LCK0 ((uint32_t)0x00000001) /* Port x Lock bit 0 */ -#define GPIO_LCK1 ((uint32_t)0x00000002) /* Port x Lock bit 1 */ -#define GPIO_LCK2 ((uint32_t)0x00000004) /* Port x Lock bit 2 */ -#define GPIO_LCK3 ((uint32_t)0x00000008) /* Port x Lock bit 3 */ -#define GPIO_LCK4 ((uint32_t)0x00000010) /* Port x Lock bit 4 */ -#define GPIO_LCK5 ((uint32_t)0x00000020) /* Port x Lock bit 5 */ -#define GPIO_LCK6 ((uint32_t)0x00000040) /* Port x Lock bit 6 */ -#define GPIO_LCK7 ((uint32_t)0x00000080) /* Port x Lock bit 7 */ -#define GPIO_LCK8 ((uint32_t)0x00000100) /* Port x Lock bit 8 */ -#define GPIO_LCK9 ((uint32_t)0x00000200) /* Port x Lock bit 9 */ -#define GPIO_LCK10 ((uint32_t)0x00000400) /* Port x Lock bit 10 */ -#define GPIO_LCK11 ((uint32_t)0x00000800) /* Port x Lock bit 11 */ -#define GPIO_LCK12 ((uint32_t)0x00001000) /* Port x Lock bit 12 */ -#define GPIO_LCK13 ((uint32_t)0x00002000) /* Port x Lock bit 13 */ -#define GPIO_LCK14 ((uint32_t)0x00004000) /* Port x Lock bit 14 */ -#define GPIO_LCK15 ((uint32_t)0x00008000) /* Port x Lock bit 15 */ -#define GPIO_LCKK ((uint32_t)0x00010000) /* Lock key */ - -/****************** Bit definition for AFIO_PCFR1register *******************/ -#define AFIO_PCFR1_SPI1_REMAP ((uint32_t)0x00000001) /* SPI1 remapping */ -#define AFIO_PCFR1_I2C1_REMAP ((uint32_t)0x00000002) /* I2C1 remapping */ -#define AFIO_PCFR1_USART1_REMAP ((uint32_t)0x00000004) /* USART1 remapping */ -#define AFIO_PCFR1_USART2_REMAP ((uint32_t)0x00000008) /* USART2 remapping */ - -#define AFIO_PCFR1_USART3_REMAP ((uint32_t)0x00000030) /* USART3_REMAP[1:0] bits (USART3 remapping) */ -#define AFIO_PCFR1_USART3_REMAP_0 ((uint32_t)0x00000010) /* Bit 0 */ -#define AFIO_PCFR1_USART3_REMAP_1 ((uint32_t)0x00000020) /* Bit 1 */ - -#define AFIO_PCFR1_USART3_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */ -#define AFIO_PCFR1_USART3_REMAP_PARTIALREMAP ((uint32_t)0x00000010) /* Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */ -#define AFIO_PCFR1_USART3_REMAP_FULLREMAP ((uint32_t)0x00000030) /* Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */ - -#define AFIO_PCFR1_TIM1_REMAP ((uint32_t)0x000000C0) /* TIM1_REMAP[1:0] bits (TIM1 remapping) */ -#define AFIO_PCFR1_TIM1_REMAP_0 ((uint32_t)0x00000040) /* Bit 0 */ -#define AFIO_PCFR1_TIM1_REMAP_1 ((uint32_t)0x00000080) /* Bit 1 */ - -#define AFIO_PCFR1_TIM1_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */ -#define AFIO_PCFR1_TIM1_REMAP_PARTIALREMAP ((uint32_t)0x00000040) /* Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */ -#define AFIO_PCFR1_TIM1_REMAP_FULLREMAP ((uint32_t)0x000000C0) /* Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */ - -#define AFIO_PCFR1_TIM2_REMAP ((uint32_t)0x00000300) /* TIM2_REMAP[1:0] bits (TIM2 remapping) */ -#define AFIO_PCFR1_TIM2_REMAP_0 ((uint32_t)0x00000100) /* Bit 0 */ -#define AFIO_PCFR1_TIM2_REMAP_1 ((uint32_t)0x00000200) /* Bit 1 */ - -#define AFIO_PCFR1_TIM2_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */ -#define AFIO_PCFR1_TIM2_REMAP_PARTIALREMAP1 ((uint32_t)0x00000100) /* Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */ -#define AFIO_PCFR1_TIM2_REMAP_PARTIALREMAP2 ((uint32_t)0x00000200) /* Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */ -#define AFIO_PCFR1_TIM2_REMAP_FULLREMAP ((uint32_t)0x00000300) /* Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */ - -#define AFIO_PCFR1_TIM3_REMAP ((uint32_t)0x00000C00) /* TIM3_REMAP[1:0] bits (TIM3 remapping) */ -#define AFIO_PCFR1_TIM3_REMAP_0 ((uint32_t)0x00000400) /* Bit 0 */ -#define AFIO_PCFR1_TIM3_REMAP_1 ((uint32_t)0x00000800) /* Bit 1 */ - -#define AFIO_PCFR1_TIM3_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */ -#define AFIO_PCFR1_TIM3_REMAP_PARTIALREMAP ((uint32_t)0x00000800) /* Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */ -#define AFIO_PCFR1_TIM3_REMAP_FULLREMAP ((uint32_t)0x00000C00) /* Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */ - -#define AFIO_PCFR1_TIM4_REMAP ((uint32_t)0x00001000) /* TIM4_REMAP bit (TIM4 remapping) */ - -#define AFIO_PCFR1_CAN_REMAP ((uint32_t)0x00006000) /* CAN_REMAP[1:0] bits (CAN Alternate function remapping) */ -#define AFIO_PCFR1_CAN_REMAP_0 ((uint32_t)0x00002000) /* Bit 0 */ -#define AFIO_PCFR1_CAN_REMAP_1 ((uint32_t)0x00004000) /* Bit 1 */ - -#define AFIO_PCFR1_CAN_REMAP_REMAP1 ((uint32_t)0x00000000) /* CANRX mapped to PA11, CANTX mapped to PA12 */ -#define AFIO_PCFR1_CAN_REMAP_REMAP2 ((uint32_t)0x00004000) /* CANRX mapped to PB8, CANTX mapped to PB9 */ -#define AFIO_PCFR1_CAN_REMAP_REMAP3 ((uint32_t)0x00006000) /* CANRX mapped to PD0, CANTX mapped to PD1 */ - -#define AFIO_PCFR1_PA12_REMAP ((uint32_t)0x00008000) /* Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ -#define AFIO_PCFR1_TIM5CH4_IREMAP ((uint32_t)0x00010000) /* TIM5 Channel4 Internal Remap */ -#define AFIO_PCFR1_ADC1_ETRGINJ_REMAP ((uint32_t)0x00020000) /* ADC 1 External Trigger Injected Conversion remapping */ -#define AFIO_PCFR1_ADC1_ETRGREG_REMAP ((uint32_t)0x00040000) /* ADC 1 External Trigger Regular Conversion remapping */ -#define AFIO_PCFR1_ADC2_ETRGINJ_REMAP ((uint32_t)0x00080000) /* ADC 2 External Trigger Injected Conversion remapping */ -#define AFIO_PCFR1_ADC2_ETRGREG_REMAP ((uint32_t)0x00100000) /* ADC 2 External Trigger Regular Conversion remapping */ - -#define AFIO_PCFR1_SWJ_CFG ((uint32_t)0x07000000) /* SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ -#define AFIO_PCFR1_SWJ_CFG_0 ((uint32_t)0x01000000) /* Bit 0 */ -#define AFIO_PCFR1_SWJ_CFG_1 ((uint32_t)0x02000000) /* Bit 1 */ -#define AFIO_PCFR1_SWJ_CFG_2 ((uint32_t)0x04000000) /* Bit 2 */ - -#define AFIO_PCFR1_SWJ_CFG_RESET ((uint32_t)0x00000000) /* Full SWJ (JTAG-DP + SW-DP) : Reset State */ -#define AFIO_PCFR1_SWJ_CFG_NOJNTRST ((uint32_t)0x01000000) /* Full SWJ (JTAG-DP + SW-DP) but without JNTRST */ -#define AFIO_PCFR1_SWJ_CFG_JTAGDISABLE ((uint32_t)0x02000000) /* JTAG-DP Disabled and SW-DP Enabled */ -#define AFIO_PCFR1_SWJ_CFG_DISABLE ((uint32_t)0x04000000) /* JTAG-DP Disabled and SW-DP Disabled */ - -/***************** Bit definition for AFIO_EXTICR1 register *****************/ -#define AFIO_EXTICR1_EXTI0 ((uint16_t)0x000F) /* EXTI 0 configuration */ -#define AFIO_EXTICR1_EXTI1 ((uint16_t)0x00F0) /* EXTI 1 configuration */ -#define AFIO_EXTICR1_EXTI2 ((uint16_t)0x0F00) /* EXTI 2 configuration */ -#define AFIO_EXTICR1_EXTI3 ((uint16_t)0xF000) /* EXTI 3 configuration */ - -#define AFIO_EXTICR1_EXTI0_PA ((uint16_t)0x0000) /* PA[0] pin */ -#define AFIO_EXTICR1_EXTI0_PB ((uint16_t)0x0001) /* PB[0] pin */ -#define AFIO_EXTICR1_EXTI0_PC ((uint16_t)0x0002) /* PC[0] pin */ -#define AFIO_EXTICR1_EXTI0_PD ((uint16_t)0x0003) /* PD[0] pin */ -#define AFIO_EXTICR1_EXTI0_PE ((uint16_t)0x0004) /* PE[0] pin */ -#define AFIO_EXTICR1_EXTI0_PF ((uint16_t)0x0005) /* PF[0] pin */ -#define AFIO_EXTICR1_EXTI0_PG ((uint16_t)0x0006) /* PG[0] pin */ - -#define AFIO_EXTICR1_EXTI1_PA ((uint16_t)0x0000) /* PA[1] pin */ -#define AFIO_EXTICR1_EXTI1_PB ((uint16_t)0x0010) /* PB[1] pin */ -#define AFIO_EXTICR1_EXTI1_PC ((uint16_t)0x0020) /* PC[1] pin */ -#define AFIO_EXTICR1_EXTI1_PD ((uint16_t)0x0030) /* PD[1] pin */ -#define AFIO_EXTICR1_EXTI1_PE ((uint16_t)0x0040) /* PE[1] pin */ -#define AFIO_EXTICR1_EXTI1_PF ((uint16_t)0x0050) /* PF[1] pin */ -#define AFIO_EXTICR1_EXTI1_PG ((uint16_t)0x0060) /* PG[1] pin */ - -#define AFIO_EXTICR1_EXTI2_PA ((uint16_t)0x0000) /* PA[2] pin */ -#define AFIO_EXTICR1_EXTI2_PB ((uint16_t)0x0100) /* PB[2] pin */ -#define AFIO_EXTICR1_EXTI2_PC ((uint16_t)0x0200) /* PC[2] pin */ -#define AFIO_EXTICR1_EXTI2_PD ((uint16_t)0x0300) /* PD[2] pin */ -#define AFIO_EXTICR1_EXTI2_PE ((uint16_t)0x0400) /* PE[2] pin */ -#define AFIO_EXTICR1_EXTI2_PF ((uint16_t)0x0500) /* PF[2] pin */ -#define AFIO_EXTICR1_EXTI2_PG ((uint16_t)0x0600) /* PG[2] pin */ - -#define AFIO_EXTICR1_EXTI3_PA ((uint16_t)0x0000) /* PA[3] pin */ -#define AFIO_EXTICR1_EXTI3_PB ((uint16_t)0x1000) /* PB[3] pin */ -#define AFIO_EXTICR1_EXTI3_PC ((uint16_t)0x2000) /* PC[3] pin */ -#define AFIO_EXTICR1_EXTI3_PD ((uint16_t)0x3000) /* PD[3] pin */ -#define AFIO_EXTICR1_EXTI3_PE ((uint16_t)0x4000) /* PE[3] pin */ -#define AFIO_EXTICR1_EXTI3_PF ((uint16_t)0x5000) /* PF[3] pin */ -#define AFIO_EXTICR1_EXTI3_PG ((uint16_t)0x6000) /* PG[3] pin */ - -/******************************************************************************/ -/* Independent WATCHDOG */ -/******************************************************************************/ - -/******************* Bit definition for IWDG_CTLR register ********************/ -#define IWDG_KEY ((uint16_t)0xFFFF) /* Key value (write only, read 0000h) */ - -/******************* Bit definition for IWDG_PSCR register ********************/ -#define IWDG_PR ((uint8_t)0x07) /* PR[2:0] (Prescaler divider) */ -#define IWDG_PR_0 ((uint8_t)0x01) /* Bit 0 */ -#define IWDG_PR_1 ((uint8_t)0x02) /* Bit 1 */ -#define IWDG_PR_2 ((uint8_t)0x04) /* Bit 2 */ - -/******************* Bit definition for IWDG_RLDR register *******************/ -#define IWDG_RL ((uint16_t)0x0FFF) /* Watchdog counter reload value */ - -/******************* Bit definition for IWDG_STATR register ********************/ -#define IWDG_PVU ((uint8_t)0x01) /* Watchdog prescaler value update */ -#define IWDG_RVU ((uint8_t)0x02) /* Watchdog counter reload value update */ - -/******************************************************************************/ -/* Inter-integrated Circuit Interface */ -/******************************************************************************/ - -/******************* Bit definition for I2C_CTLR1 register ********************/ -#define I2C_CTLR1_PE ((uint16_t)0x0001) /* Peripheral Enable */ -#define I2C_CTLR1_SMBUS ((uint16_t)0x0002) /* SMBus Mode */ -#define I2C_CTLR1_SMBTYPE ((uint16_t)0x0008) /* SMBus Type */ -#define I2C_CTLR1_ENARP ((uint16_t)0x0010) /* ARP Enable */ -#define I2C_CTLR1_ENPEC ((uint16_t)0x0020) /* PEC Enable */ -#define I2C_CTLR1_ENGC ((uint16_t)0x0040) /* General Call Enable */ -#define I2C_CTLR1_NOSTRETCH ((uint16_t)0x0080) /* Clock Stretching Disable (Slave mode) */ -#define I2C_CTLR1_START ((uint16_t)0x0100) /* Start Generation */ -#define I2C_CTLR1_STOP ((uint16_t)0x0200) /* Stop Generation */ -#define I2C_CTLR1_ACK ((uint16_t)0x0400) /* Acknowledge Enable */ -#define I2C_CTLR1_POS ((uint16_t)0x0800) /* Acknowledge/PEC Position (for data reception) */ -#define I2C_CTLR1_PEC ((uint16_t)0x1000) /* Packet Error Checking */ -#define I2C_CTLR1_ALERT ((uint16_t)0x2000) /* SMBus Alert */ -#define I2C_CTLR1_SWRST ((uint16_t)0x8000) /* Software Reset */ - -/******************* Bit definition for I2C_CTLR2 register ********************/ -#define I2C_CTLR2_FREQ ((uint16_t)0x003F) /* FREQ[5:0] bits (Peripheral Clock Frequency) */ -#define I2C_CTLR2_FREQ_0 ((uint16_t)0x0001) /* Bit 0 */ -#define I2C_CTLR2_FREQ_1 ((uint16_t)0x0002) /* Bit 1 */ -#define I2C_CTLR2_FREQ_2 ((uint16_t)0x0004) /* Bit 2 */ -#define I2C_CTLR2_FREQ_3 ((uint16_t)0x0008) /* Bit 3 */ -#define I2C_CTLR2_FREQ_4 ((uint16_t)0x0010) /* Bit 4 */ -#define I2C_CTLR2_FREQ_5 ((uint16_t)0x0020) /* Bit 5 */ - -#define I2C_CTLR2_ITERREN ((uint16_t)0x0100) /* Error Interrupt Enable */ -#define I2C_CTLR2_ITEVTEN ((uint16_t)0x0200) /* Event Interrupt Enable */ -#define I2C_CTLR2_ITBUFEN ((uint16_t)0x0400) /* Buffer Interrupt Enable */ -#define I2C_CTLR2_DMAEN ((uint16_t)0x0800) /* DMA Requests Enable */ -#define I2C_CTLR2_LAST ((uint16_t)0x1000) /* DMA Last Transfer */ - -/******************* Bit definition for I2C_OADDR1 register *******************/ -#define I2C_OADDR1_ADD1_7 ((uint16_t)0x00FE) /* Interface Address */ -#define I2C_OADDR1_ADD8_9 ((uint16_t)0x0300) /* Interface Address */ - -#define I2C_OADDR1_ADD0 ((uint16_t)0x0001) /* Bit 0 */ -#define I2C_OADDR1_ADD1 ((uint16_t)0x0002) /* Bit 1 */ -#define I2C_OADDR1_ADD2 ((uint16_t)0x0004) /* Bit 2 */ -#define I2C_OADDR1_ADD3 ((uint16_t)0x0008) /* Bit 3 */ -#define I2C_OADDR1_ADD4 ((uint16_t)0x0010) /* Bit 4 */ -#define I2C_OADDR1_ADD5 ((uint16_t)0x0020) /* Bit 5 */ -#define I2C_OADDR1_ADD6 ((uint16_t)0x0040) /* Bit 6 */ -#define I2C_OADDR1_ADD7 ((uint16_t)0x0080) /* Bit 7 */ -#define I2C_OADDR1_ADD8 ((uint16_t)0x0100) /* Bit 8 */ -#define I2C_OADDR1_ADD9 ((uint16_t)0x0200) /* Bit 9 */ - -#define I2C_OADDR1_ADDMODE ((uint16_t)0x8000) /* Addressing Mode (Slave mode) */ - -/******************* Bit definition for I2C_OADDR2 register *******************/ -#define I2C_OADDR2_ENDUAL ((uint8_t)0x01) /* Dual addressing mode enable */ -#define I2C_OADDR2_ADD2 ((uint8_t)0xFE) /* Interface address */ - -/******************** Bit definition for I2C_DATAR register ********************/ -#define I2C_DR_DATAR ((uint8_t)0xFF) /* 8-bit Data Register */ - -/******************* Bit definition for I2C_STAR1 register ********************/ -#define I2C_STAR1_SB ((uint16_t)0x0001) /* Start Bit (Master mode) */ -#define I2C_STAR1_ADDR ((uint16_t)0x0002) /* Address sent (master mode)/matched (slave mode) */ -#define I2C_STAR1_BTF ((uint16_t)0x0004) /* Byte Transfer Finished */ -#define I2C_STAR1_ADD10 ((uint16_t)0x0008) /* 10-bit header sent (Master mode) */ -#define I2C_STAR1_STOPF ((uint16_t)0x0010) /* Stop detection (Slave mode) */ -#define I2C_STAR1_RXNE ((uint16_t)0x0040) /* Data Register not Empty (receivers) */ -#define I2C_STAR1_TXE ((uint16_t)0x0080) /* Data Register Empty (transmitters) */ -#define I2C_STAR1_BERR ((uint16_t)0x0100) /* Bus Error */ -#define I2C_STAR1_ARLO ((uint16_t)0x0200) /* Arbitration Lost (master mode) */ -#define I2C_STAR1_AF ((uint16_t)0x0400) /* Acknowledge Failure */ -#define I2C_STAR1_OVR ((uint16_t)0x0800) /* Overrun/Underrun */ -#define I2C_STAR1_PECERR ((uint16_t)0x1000) /* PEC Error in reception */ -#define I2C_STAR1_TIMEOUT ((uint16_t)0x4000) /* Timeout or Tlow Error */ -#define I2C_STAR1_SMBALERT ((uint16_t)0x8000) /* SMBus Alert */ - -/******************* Bit definition for I2C_STAR2 register ********************/ -#define I2C_STAR2_MSL ((uint16_t)0x0001) /* Master/Slave */ -#define I2C_STAR2_BUSY ((uint16_t)0x0002) /* Bus Busy */ -#define I2C_STAR2_TRA ((uint16_t)0x0004) /* Transmitter/Receiver */ -#define I2C_STAR2_GENCALL ((uint16_t)0x0010) /* General Call Address (Slave mode) */ -#define I2C_STAR2_SMBDEFAULT ((uint16_t)0x0020) /* SMBus Device Default Address (Slave mode) */ -#define I2C_STAR2_SMBHOST ((uint16_t)0x0040) /* SMBus Host Header (Slave mode) */ -#define I2C_STAR2_DUALF ((uint16_t)0x0080) /* Dual Flag (Slave mode) */ -#define I2C_STAR2_PEC ((uint16_t)0xFF00) /* Packet Error Checking Register */ - -/******************* Bit definition for I2C_CKCFGR register ********************/ -#define I2C_CKCFGR_CCR ((uint16_t)0x0FFF) /* Clock Control Register in Fast/Standard mode (Master mode) */ -#define I2C_CKCFGR_DUTY ((uint16_t)0x4000) /* Fast Mode Duty Cycle */ -#define I2C_CKCFGR_FS ((uint16_t)0x8000) /* I2C Master Mode Selection */ - -/******************************************************************************/ -/* Power Control */ -/******************************************************************************/ - -/******************** Bit definition for PWR_CTLR register ********************/ -#define PWR_CTLR_LPDS ((uint16_t)0x0001) /* Low-Power Deepsleep */ -#define PWR_CTLR_PDDS ((uint16_t)0x0002) /* Power Down Deepsleep */ -#define PWR_CTLR_CWUF ((uint16_t)0x0004) /* Clear Wakeup Flag */ -#define PWR_CTLR_CSBF ((uint16_t)0x0008) /* Clear Standby Flag */ -#define PWR_CTLR_PVDE ((uint16_t)0x0010) /* Power Voltage Detector Enable */ - -#define PWR_CTLR_PLS ((uint16_t)0x00E0) /* PLS[2:0] bits (PVD Level Selection) */ -#define PWR_CTLR_PLS_0 ((uint16_t)0x0020) /* Bit 0 */ -#define PWR_CTLR_PLS_1 ((uint16_t)0x0040) /* Bit 1 */ -#define PWR_CTLR_PLS_2 ((uint16_t)0x0080) /* Bit 2 */ - -#define PWR_CTLR_PLS_2V2 ((uint16_t)0x0000) /* PVD level 2.2V */ -#define PWR_CTLR_PLS_2V3 ((uint16_t)0x0020) /* PVD level 2.3V */ -#define PWR_CTLR_PLS_2V4 ((uint16_t)0x0040) /* PVD level 2.4V */ -#define PWR_CTLR_PLS_2V5 ((uint16_t)0x0060) /* PVD level 2.5V */ -#define PWR_CTLR_PLS_2V6 ((uint16_t)0x0080) /* PVD level 2.6V */ -#define PWR_CTLR_PLS_2V7 ((uint16_t)0x00A0) /* PVD level 2.7V */ -#define PWR_CTLR_PLS_2V8 ((uint16_t)0x00C0) /* PVD level 2.8V */ -#define PWR_CTLR_PLS_2V9 ((uint16_t)0x00E0) /* PVD level 2.9V */ - -#define PWR_CTLR_DBP ((uint16_t)0x0100) /* Disable Backup Domain write protection */ - -/******************* Bit definition for PWR_CSR register ********************/ -#define PWR_CSR_WUF ((uint16_t)0x0001) /* Wakeup Flag */ -#define PWR_CSR_SBF ((uint16_t)0x0002) /* Standby Flag */ -#define PWR_CSR_PVDO ((uint16_t)0x0004) /* PVD Output */ -#define PWR_CSR_EWUP ((uint16_t)0x0100) /* Enable WKUP pin */ - -/******************************************************************************/ -/* Reset and Clock Control */ -/******************************************************************************/ - -/******************** Bit definition for RCC_CTLR register ********************/ -#define RCC_HSION ((uint32_t)0x00000001) /* Internal High Speed clock enable */ -#define RCC_HSIRDY ((uint32_t)0x00000002) /* Internal High Speed clock ready flag */ -#define RCC_HSITRIM ((uint32_t)0x000000F8) /* Internal High Speed clock trimming */ -#define RCC_HSICAL ((uint32_t)0x0000FF00) /* Internal High Speed clock Calibration */ -#define RCC_HSEON ((uint32_t)0x00010000) /* External High Speed clock enable */ -#define RCC_HSERDY ((uint32_t)0x00020000) /* External High Speed clock ready flag */ -#define RCC_HSEBYP ((uint32_t)0x00040000) /* External High Speed clock Bypass */ -#define RCC_CSSON ((uint32_t)0x00080000) /* Clock Security System enable */ -#define RCC_PLLON ((uint32_t)0x01000000) /* PLL enable */ -#define RCC_PLLRDY ((uint32_t)0x02000000) /* PLL clock ready flag */ - -/******************* Bit definition for RCC_CFGR0 register *******************/ -#define RCC_SW ((uint32_t)0x00000003) /* SW[1:0] bits (System clock Switch) */ -#define RCC_SW_0 ((uint32_t)0x00000001) /* Bit 0 */ -#define RCC_SW_1 ((uint32_t)0x00000002) /* Bit 1 */ - -#define RCC_SW_HSI ((uint32_t)0x00000000) /* HSI selected as system clock */ -#define RCC_SW_HSE ((uint32_t)0x00000001) /* HSE selected as system clock */ -#define RCC_SW_PLL ((uint32_t)0x00000002) /* PLL selected as system clock */ - -#define RCC_SWS ((uint32_t)0x0000000C) /* SWS[1:0] bits (System Clock Switch Status) */ -#define RCC_SWS_0 ((uint32_t)0x00000004) /* Bit 0 */ -#define RCC_SWS_1 ((uint32_t)0x00000008) /* Bit 1 */ - -#define RCC_SWS_HSI ((uint32_t)0x00000000) /* HSI oscillator used as system clock */ -#define RCC_SWS_HSE ((uint32_t)0x00000004) /* HSE oscillator used as system clock */ -#define RCC_SWS_PLL ((uint32_t)0x00000008) /* PLL used as system clock */ - -#define RCC_HPRE ((uint32_t)0x000000F0) /* HPRE[3:0] bits (AHB prescaler) */ -#define RCC_HPRE_0 ((uint32_t)0x00000010) /* Bit 0 */ -#define RCC_HPRE_1 ((uint32_t)0x00000020) /* Bit 1 */ -#define RCC_HPRE_2 ((uint32_t)0x00000040) /* Bit 2 */ -#define RCC_HPRE_3 ((uint32_t)0x00000080) /* Bit 3 */ - -#define RCC_HPRE_DIV1 ((uint32_t)0x00000000) /* SYSCLK not divided */ -#define RCC_HPRE_DIV2 ((uint32_t)0x00000010) /* SYSCLK divided by 2 */ -#define RCC_HPRE_DIV3 ((uint32_t)0x00000020) /* SYSCLK divided by 3 */ -#define RCC_HPRE_DIV4 ((uint32_t)0x00000030) /* SYSCLK divided by 4 */ -#define RCC_HPRE_DIV5 ((uint32_t)0x00000040) /* SYSCLK divided by 5 */ -#define RCC_HPRE_DIV6 ((uint32_t)0x00000050) /* SYSCLK divided by 6 */ -#define RCC_HPRE_DIV7 ((uint32_t)0x00000060) /* SYSCLK divided by 7 */ -#define RCC_HPRE_DIV8 ((uint32_t)0x00000070) /* SYSCLK divided by 8 */ -#define RCC_HPRE_DIV16 ((uint32_t)0x000000B0) /* SYSCLK divided by 16 */ -#define RCC_HPRE_DIV32 ((uint32_t)0x000000C0) /* SYSCLK divided by 32 */ -#define RCC_HPRE_DIV64 ((uint32_t)0x000000D0) /* SYSCLK divided by 64 */ -#define RCC_HPRE_DIV128 ((uint32_t)0x000000E0) /* SYSCLK divided by 128 */ -#define RCC_HPRE_DIV256 ((uint32_t)0x000000F0) /* SYSCLK divided by 256 */ - -#define RCC_PPRE1 ((uint32_t)0x00000700) /* PRE1[2:0] bits (APB1 prescaler) */ -#define RCC_PPRE1_0 ((uint32_t)0x00000100) /* Bit 0 */ -#define RCC_PPRE1_1 ((uint32_t)0x00000200) /* Bit 1 */ -#define RCC_PPRE1_2 ((uint32_t)0x00000400) /* Bit 2 */ - -#define RCC_PPRE1_DIV1 ((uint32_t)0x00000000) /* HCLK not divided */ -#define RCC_PPRE1_DIV2 ((uint32_t)0x00000400) /* HCLK divided by 2 */ -#define RCC_PPRE1_DIV4 ((uint32_t)0x00000500) /* HCLK divided by 4 */ -#define RCC_PPRE1_DIV8 ((uint32_t)0x00000600) /* HCLK divided by 8 */ -#define RCC_PPRE1_DIV16 ((uint32_t)0x00000700) /* HCLK divided by 16 */ - -#define RCC_PPRE2 ((uint32_t)0x00003800) /* PRE2[2:0] bits (APB2 prescaler) */ -#define RCC_PPRE2_0 ((uint32_t)0x00000800) /* Bit 0 */ -#define RCC_PPRE2_1 ((uint32_t)0x00001000) /* Bit 1 */ -#define RCC_PPRE2_2 ((uint32_t)0x00002000) /* Bit 2 */ - -#define RCC_PPRE2_DIV1 ((uint32_t)0x00000000) /* HCLK not divided */ -#define RCC_PPRE2_DIV2 ((uint32_t)0x00002000) /* HCLK divided by 2 */ -#define RCC_PPRE2_DIV4 ((uint32_t)0x00002800) /* HCLK divided by 4 */ -#define RCC_PPRE2_DIV8 ((uint32_t)0x00003000) /* HCLK divided by 8 */ -#define RCC_PPRE2_DIV16 ((uint32_t)0x00003800) /* HCLK divided by 16 */ - -#define RCC_ADCPRE ((uint32_t)0x0000C000) /* ADCPRE[1:0] bits (ADC prescaler) */ -#define RCC_ADCPRE_0 ((uint32_t)0x00004000) /* Bit 0 */ -#define RCC_ADCPRE_1 ((uint32_t)0x00008000) /* Bit 1 */ - -#define RCC_ADCPRE_DIV2 ((uint32_t)0x00000000) /* PCLK2 divided by 2 */ -#define RCC_ADCPRE_DIV4 ((uint32_t)0x00004000) /* PCLK2 divided by 4 */ -#define RCC_ADCPRE_DIV6 ((uint32_t)0x00008000) /* PCLK2 divided by 6 */ -#define RCC_ADCPRE_DIV8 ((uint32_t)0x0000C000) /* PCLK2 divided by 8 */ - -#define RCC_PLLSRC ((uint32_t)0x00010000) /* PLL entry clock source */ - -#define RCC_PLLXTPRE ((uint32_t)0x00020000) /* HSE divider for PLL entry */ - -#define RCC_PLLMULL ((uint32_t)0x003C0000) /* PLLMUL[3:0] bits (PLL multiplication factor) */ -#define RCC_PLLMULL_0 ((uint32_t)0x00040000) /* Bit 0 */ -#define RCC_PLLMULL_1 ((uint32_t)0x00080000) /* Bit 1 */ -#define RCC_PLLMULL_2 ((uint32_t)0x00100000) /* Bit 2 */ -#define RCC_PLLMULL_3 ((uint32_t)0x00200000) /* Bit 3 */ - -#define RCC_PLLSRC_HSI_Mul2 ((uint32_t)0x00000000) /* HSI clock*2 selected as PLL entry clock source */ -#define RCC_PLLSRC_HSE_Mul2 ((uint32_t)0x00010000) /* HSE clock*2 selected as PLL entry clock source */ - -#define RCC_PLLXTPRE_HSE ((uint32_t)0x00000000) /* HSE clock not divided for PLL entry */ -#define RCC_PLLXTPRE_HSE_Div2 ((uint32_t)0x00020000) /* HSE clock divided by 2 for PLL entry */ - -#define RCC_PLLMULL2 ((uint32_t)0x00000000) /* PLL input clock*2 */ -#define RCC_PLLMULL3 ((uint32_t)0x00040000) /* PLL input clock*3 */ -#define RCC_PLLMULL4 ((uint32_t)0x00080000) /* PLL input clock*4 */ -#define RCC_PLLMULL5 ((uint32_t)0x000C0000) /* PLL input clock*5 */ -#define RCC_PLLMULL6 ((uint32_t)0x00100000) /* PLL input clock*6 */ -#define RCC_PLLMULL7 ((uint32_t)0x00140000) /* PLL input clock*7 */ -#define RCC_PLLMULL8 ((uint32_t)0x00180000) /* PLL input clock*8 */ -#define RCC_PLLMULL9 ((uint32_t)0x001C0000) /* PLL input clock*9 */ -#define RCC_PLLMULL10 ((uint32_t)0x00200000) /* PLL input clock10 */ -#define RCC_PLLMULL11 ((uint32_t)0x00240000) /* PLL input clock*11 */ -#define RCC_PLLMULL12 ((uint32_t)0x00280000) /* PLL input clock*12 */ -#define RCC_PLLMULL13 ((uint32_t)0x002C0000) /* PLL input clock*13 */ -#define RCC_PLLMULL14 ((uint32_t)0x00300000) /* PLL input clock*14 */ -#define RCC_PLLMULL15 ((uint32_t)0x00340000) /* PLL input clock*15 */ -#define RCC_PLLMULL16 ((uint32_t)0x00380000) /* PLL input clock*16 */ -#define RCC_USBPRE ((uint32_t)0x00400000) /* USB Device prescaler */ - -#define RCC_CFGR0_MCO ((uint32_t)0x07000000) /* MCO[2:0] bits (Microcontroller Clock Output) */ -#define RCC_MCO_0 ((uint32_t)0x01000000) /* Bit 0 */ -#define RCC_MCO_1 ((uint32_t)0x02000000) /* Bit 1 */ -#define RCC_MCO_2 ((uint32_t)0x04000000) /* Bit 2 */ - -#define RCC_MCO_NOCLOCK ((uint32_t)0x00000000) /* No clock */ -#define RCC_CFGR0_MCO_SYSCLK ((uint32_t)0x04000000) /* System clock selected as MCO source */ -#define RCC_CFGR0_MCO_HSI ((uint32_t)0x05000000) /* HSI clock selected as MCO source */ -#define RCC_CFGR0_MCO_HSE ((uint32_t)0x06000000) /* HSE clock selected as MCO source */ -#define RCC_CFGR0_MCO_PLL ((uint32_t)0x07000000) /* PLL clock divided by 2 selected as MCO source */ - -/******************* Bit definition for RCC_INTR register ********************/ -#define RCC_LSIRDYF ((uint32_t)0x00000001) /* LSI Ready Interrupt flag */ -#define RCC_LSERDYF ((uint32_t)0x00000002) /* LSE Ready Interrupt flag */ -#define RCC_HSIRDYF ((uint32_t)0x00000004) /* HSI Ready Interrupt flag */ -#define RCC_HSERDYF ((uint32_t)0x00000008) /* HSE Ready Interrupt flag */ -#define RCC_PLLRDYF ((uint32_t)0x00000010) /* PLL Ready Interrupt flag */ -#define RCC_CSSF ((uint32_t)0x00000080) /* Clock Security System Interrupt flag */ -#define RCC_LSIRDYIE ((uint32_t)0x00000100) /* LSI Ready Interrupt Enable */ -#define RCC_LSERDYIE ((uint32_t)0x00000200) /* LSE Ready Interrupt Enable */ -#define RCC_HSIRDYIE ((uint32_t)0x00000400) /* HSI Ready Interrupt Enable */ -#define RCC_HSERDYIE ((uint32_t)0x00000800) /* HSE Ready Interrupt Enable */ -#define RCC_PLLRDYIE ((uint32_t)0x00001000) /* PLL Ready Interrupt Enable */ -#define RCC_LSIRDYC ((uint32_t)0x00010000) /* LSI Ready Interrupt Clear */ -#define RCC_LSERDYC ((uint32_t)0x00020000) /* LSE Ready Interrupt Clear */ -#define RCC_HSIRDYC ((uint32_t)0x00040000) /* HSI Ready Interrupt Clear */ -#define RCC_HSERDYC ((uint32_t)0x00080000) /* HSE Ready Interrupt Clear */ -#define RCC_PLLRDYC ((uint32_t)0x00100000) /* PLL Ready Interrupt Clear */ -#define RCC_CSSC ((uint32_t)0x00800000) /* Clock Security System Interrupt Clear */ - -/***************** Bit definition for RCC_APB2PRSTR register *****************/ -#define RCC_AFIORST ((uint32_t)0x00000001) /* Alternate Function I/O reset */ -#define RCC_IOPARST ((uint32_t)0x00000004) /* I/O port A reset */ -#define RCC_IOPBRST ((uint32_t)0x00000008) /* I/O port B reset */ -#define RCC_IOPCRST ((uint32_t)0x00000010) /* I/O port C reset */ -#define RCC_IOPDRST ((uint32_t)0x00000020) /* I/O port D reset */ -#define RCC_ADC1RST ((uint32_t)0x00000200) /* ADC 1 interface reset */ - -#define RCC_ADC2RST ((uint32_t)0x00000400) /* ADC 2 interface reset */ - -#define RCC_TIM1RST ((uint32_t)0x00000800) /* TIM1 Timer reset */ -#define RCC_SPI1RST ((uint32_t)0x00001000) /* SPI 1 reset */ -#define RCC_USART1RST ((uint32_t)0x00004000) /* USART1 reset */ - -#define RCC_IOPERST ((uint32_t)0x00000040) /* I/O port E reset */ - -/***************** Bit definition for RCC_APB1PRSTR register *****************/ -#define RCC_TIM2RST ((uint32_t)0x00000001) /* Timer 2 reset */ -#define RCC_TIM3RST ((uint32_t)0x00000002) /* Timer 3 reset */ -#define RCC_WWDGRST ((uint32_t)0x00000800) /* Window Watchdog reset */ -#define RCC_USART2RST ((uint32_t)0x00020000) /* USART 2 reset */ -#define RCC_I2C1RST ((uint32_t)0x00200000) /* I2C 1 reset */ - -#define RCC_CAN1RST ((uint32_t)0x02000000) /* CAN1 reset */ - -#define RCC_BKPRST ((uint32_t)0x08000000) /* Backup interface reset */ -#define RCC_PWRRST ((uint32_t)0x10000000) /* Power interface reset */ - -#define RCC_TIM4RST ((uint32_t)0x00000004) /* Timer 4 reset */ -#define RCC_SPI2RST ((uint32_t)0x00004000) /* SPI 2 reset */ -#define RCC_USART3RST ((uint32_t)0x00040000) /* USART 3 reset */ -#define RCC_I2C2RST ((uint32_t)0x00400000) /* I2C 2 reset */ - -#define RCC_USBRST ((uint32_t)0x00800000) /* USB Device reset */ - -/****************** Bit definition for RCC_AHBPCENR register ******************/ -#define RCC_DMA1EN ((uint16_t)0x0001) /* DMA1 clock enable */ -#define RCC_SRAMEN ((uint16_t)0x0004) /* SRAM interface clock enable */ -#define RCC_FLITFEN ((uint16_t)0x0010) /* FLITF clock enable */ -#define RCC_CRCEN ((uint16_t)0x0040) /* CRC clock enable */ -#define RCC_USBHD ((uint16_t)0x1000) - -/****************** Bit definition for RCC_APB2PCENR register *****************/ -#define RCC_AFIOEN ((uint32_t)0x00000001) /* Alternate Function I/O clock enable */ -#define RCC_IOPAEN ((uint32_t)0x00000004) /* I/O port A clock enable */ -#define RCC_IOPBEN ((uint32_t)0x00000008) /* I/O port B clock enable */ -#define RCC_IOPCEN ((uint32_t)0x00000010) /* I/O port C clock enable */ -#define RCC_IOPDEN ((uint32_t)0x00000020) /* I/O port D clock enable */ -#define RCC_ADC1EN ((uint32_t)0x00000200) /* ADC 1 interface clock enable */ - -#define RCC_ADC2EN ((uint32_t)0x00000400) /* ADC 2 interface clock enable */ - -#define RCC_TIM1EN ((uint32_t)0x00000800) /* TIM1 Timer clock enable */ -#define RCC_SPI1EN ((uint32_t)0x00001000) /* SPI 1 clock enable */ -#define RCC_USART1EN ((uint32_t)0x00004000) /* USART1 clock enable */ - -/***************** Bit definition for RCC_APB1PCENR register ******************/ -#define RCC_TIM2EN ((uint32_t)0x00000001) /* Timer 2 clock enabled*/ -#define RCC_TIM3EN ((uint32_t)0x00000002) /* Timer 3 clock enable */ -#define RCC_WWDGEN ((uint32_t)0x00000800) /* Window Watchdog clock enable */ -#define RCC_USART2EN ((uint32_t)0x00020000) /* USART 2 clock enable */ -#define RCC_I2C1EN ((uint32_t)0x00200000) /* I2C 1 clock enable */ - -#define RCC_BKPEN ((uint32_t)0x08000000) /* Backup interface clock enable */ -#define RCC_PWREN ((uint32_t)0x10000000) /* Power interface clock enable */ - -#define RCC_USBEN ((uint32_t)0x00800000) /* USB Device clock enable */ - -/******************* Bit definition for RCC_RSTSCKR register ********************/ -#define RCC_LSION ((uint32_t)0x00000001) /* Internal Low Speed oscillator enable */ -#define RCC_LSIRDY ((uint32_t)0x00000002) /* Internal Low Speed oscillator Ready */ -#define RCC_RMVF ((uint32_t)0x01000000) /* Remove reset flag */ -#define RCC_PINRSTF ((uint32_t)0x04000000) /* PIN reset flag */ -#define RCC_PORRSTF ((uint32_t)0x08000000) /* POR/PDR reset flag */ -#define RCC_SFTRSTF ((uint32_t)0x10000000) /* Software Reset flag */ -#define RCC_IWDGRSTF ((uint32_t)0x20000000) /* Independent Watchdog reset flag */ -#define RCC_WWDGRSTF ((uint32_t)0x40000000) /* Window watchdog reset flag */ -#define RCC_LPWRRSTF ((uint32_t)0x80000000) /* Low-Power reset flag */ - -/******************************************************************************/ -/* Serial Peripheral Interface */ -/******************************************************************************/ - -/******************* Bit definition for SPI_CTLR1 register ********************/ -#define SPI_CTLR1_CPHA ((uint16_t)0x0001) /* Clock Phase */ -#define SPI_CTLR1_CPOL ((uint16_t)0x0002) /* Clock Polarity */ -#define SPI_CTLR1_MSTR ((uint16_t)0x0004) /* Master Selection */ - -#define SPI_CTLR1_BR ((uint16_t)0x0038) /* BR[2:0] bits (Baud Rate Control) */ -#define SPI_CTLR1_BR_0 ((uint16_t)0x0008) /* Bit 0 */ -#define SPI_CTLR1_BR_1 ((uint16_t)0x0010) /* Bit 1 */ -#define SPI_CTLR1_BR_2 ((uint16_t)0x0020) /* Bit 2 */ - -#define SPI_CTLR1_SPE ((uint16_t)0x0040) /* SPI Enable */ -#define SPI_CTLR1_SSI ((uint16_t)0x0100) /* Internal slave select */ -#define SPI_CTLR1_SSM ((uint16_t)0x0200) /* Software slave management */ -#define SPI_CTLR1_RXONLY ((uint16_t)0x0400) /* Receive only */ -#define SPI_CTLR1_DFF ((uint16_t)0x0800) /* Data Frame Format */ -#define SPI_CTLR1_CRCNEXT ((uint16_t)0x1000) /* Transmit CRC next */ -#define SPI_CTLR1_CRCEN ((uint16_t)0x2000) /* Hardware CRC calculation enable */ -#define SPI_CTLR1_BIDIOE ((uint16_t)0x4000) /* Output enable in bidirectional mode */ -#define SPI_CTLR1_BIDIMODE ((uint16_t)0x8000) /* Bidirectional data mode enable */ - -/******************* Bit definition for SPI_CTLR2 register ********************/ -#define SPI_CTLR2_RXDMAEN ((uint8_t)0x01) /* Rx Buffer DMA Enable */ -#define SPI_CTLR2_TXDMAEN ((uint8_t)0x02) /* Tx Buffer DMA Enable */ -#define SPI_CTLR2_SSOE ((uint8_t)0x04) /* SS Output Enable */ -#define SPI_CTLR2_ERRIE ((uint8_t)0x20) /* Error Interrupt Enable */ -#define SPI_CTLR2_RXNEIE ((uint8_t)0x40) /* RX buffer Not Empty Interrupt Enable */ -#define SPI_CTLR2_TXEIE ((uint8_t)0x80) /* Tx buffer Empty Interrupt Enable */ - -/******************** Bit definition for SPI_STATR register ********************/ -#define SPI_STATR_RXNE ((uint8_t)0x01) /* Receive buffer Not Empty */ -#define SPI_STATR_TXE ((uint8_t)0x02) /* Transmit buffer Empty */ -#define SPI_STATR_CHSIDE ((uint8_t)0x04) /* Channel side */ -#define SPI_STATR_UDR ((uint8_t)0x08) /* Underrun flag */ -#define SPI_STATR_CRCERR ((uint8_t)0x10) /* CRC Error flag */ -#define SPI_STATR_MODF ((uint8_t)0x20) /* Mode fault */ -#define SPI_STATR_OVR ((uint8_t)0x40) /* Overrun flag */ -#define SPI_STATR_BSY ((uint8_t)0x80) /* Busy flag */ - -/******************** Bit definition for SPI_DATAR register ********************/ -#define SPI_DATAR_DR ((uint16_t)0xFFFF) /* Data Register */ - -/******************* Bit definition for SPI_CRCR register ******************/ -#define SPI_CRCR_CRCPOLY ((uint16_t)0xFFFF) /* CRC polynomial register */ - -/****************** Bit definition for SPI_RCRCR register ******************/ -#define SPI_RCRCR_RXCRC ((uint16_t)0xFFFF) /* Rx CRC Register */ - -/****************** Bit definition for SPI_TCRCR register ******************/ -#define SPI_TCRCR_TXCRC ((uint16_t)0xFFFF) /* Tx CRC Register */ - -/******************************************************************************/ -/* TIM */ -/******************************************************************************/ - -/******************* Bit definition for TIM_CTLR1 register ********************/ -#define TIM_CEN ((uint16_t)0x0001) /* Counter enable */ -#define TIM_UDIS ((uint16_t)0x0002) /* Update disable */ -#define TIM_URS ((uint16_t)0x0004) /* Update request source */ -#define TIM_OPM ((uint16_t)0x0008) /* One pulse mode */ -#define TIM_DIR ((uint16_t)0x0010) /* Direction */ - -#define TIM_CMS ((uint16_t)0x0060) /* CMS[1:0] bits (Center-aligned mode selection) */ -#define TIM_CMS_0 ((uint16_t)0x0020) /* Bit 0 */ -#define TIM_CMS_1 ((uint16_t)0x0040) /* Bit 1 */ - -#define TIM_ARPE ((uint16_t)0x0080) /* Auto-reload preload enable */ - -#define TIM_CTLR1_CKD ((uint16_t)0x0300) /* CKD[1:0] bits (clock division) */ -#define TIM_CKD_0 ((uint16_t)0x0100) /* Bit 0 */ -#define TIM_CKD_1 ((uint16_t)0x0200) /* Bit 1 */ - -/******************* Bit definition for TIM_CTLR2 register ********************/ -#define TIM_CCPC ((uint16_t)0x0001) /* Capture/Compare Preloaded Control */ -#define TIM_CCUS ((uint16_t)0x0004) /* Capture/Compare Control Update Selection */ -#define TIM_CCDS ((uint16_t)0x0008) /* Capture/Compare DMA Selection */ - -#define TIM_MMS ((uint16_t)0x0070) /* MMS[2:0] bits (Master Mode Selection) */ -#define TIM_MMS_0 ((uint16_t)0x0010) /* Bit 0 */ -#define TIM_MMS_1 ((uint16_t)0x0020) /* Bit 1 */ -#define TIM_MMS_2 ((uint16_t)0x0040) /* Bit 2 */ - -#define TIM_TI1S ((uint16_t)0x0080) /* TI1 Selection */ -#define TIM_OIS1 ((uint16_t)0x0100) /* Output Idle state 1 (OC1 output) */ -#define TIM_OIS1N ((uint16_t)0x0200) /* Output Idle state 1 (OC1N output) */ -#define TIM_OIS2 ((uint16_t)0x0400) /* Output Idle state 2 (OC2 output) */ -#define TIM_OIS2N ((uint16_t)0x0800) /* Output Idle state 2 (OC2N output) */ -#define TIM_OIS3 ((uint16_t)0x1000) /* Output Idle state 3 (OC3 output) */ -#define TIM_OIS3N ((uint16_t)0x2000) /* Output Idle state 3 (OC3N output) */ -#define TIM_OIS4 ((uint16_t)0x4000) /* Output Idle state 4 (OC4 output) */ - -/******************* Bit definition for TIM_SMCFGR register *******************/ -#define TIM_SMS ((uint16_t)0x0007) /* SMS[2:0] bits (Slave mode selection) */ -#define TIM_SMS_0 ((uint16_t)0x0001) /* Bit 0 */ -#define TIM_SMS_1 ((uint16_t)0x0002) /* Bit 1 */ -#define TIM_SMS_2 ((uint16_t)0x0004) /* Bit 2 */ - -#define TIM_TS ((uint16_t)0x0070) /* TS[2:0] bits (Trigger selection) */ -#define TIM_TS_0 ((uint16_t)0x0010) /* Bit 0 */ -#define TIM_TS_1 ((uint16_t)0x0020) /* Bit 1 */ -#define TIM_TS_2 ((uint16_t)0x0040) /* Bit 2 */ - -#define TIM_MSM ((uint16_t)0x0080) /* Master/slave mode */ - -#define TIM_ETF ((uint16_t)0x0F00) /* ETF[3:0] bits (External trigger filter) */ -#define TIM_ETF_0 ((uint16_t)0x0100) /* Bit 0 */ -#define TIM_ETF_1 ((uint16_t)0x0200) /* Bit 1 */ -#define TIM_ETF_2 ((uint16_t)0x0400) /* Bit 2 */ -#define TIM_ETF_3 ((uint16_t)0x0800) /* Bit 3 */ - -#define TIM_ETPS ((uint16_t)0x3000) /* ETPS[1:0] bits (External trigger prescaler) */ -#define TIM_ETPS_0 ((uint16_t)0x1000) /* Bit 0 */ -#define TIM_ETPS_1 ((uint16_t)0x2000) /* Bit 1 */ - -#define TIM_ECE ((uint16_t)0x4000) /* External clock enable */ -#define TIM_ETP ((uint16_t)0x8000) /* External trigger polarity */ - -/******************* Bit definition for TIM_DMAINTENR register *******************/ -#define TIM_UIE ((uint16_t)0x0001) /* Update interrupt enable */ -#define TIM_CC1IE ((uint16_t)0x0002) /* Capture/Compare 1 interrupt enable */ -#define TIM_CC2IE ((uint16_t)0x0004) /* Capture/Compare 2 interrupt enable */ -#define TIM_CC3IE ((uint16_t)0x0008) /* Capture/Compare 3 interrupt enable */ -#define TIM_CC4IE ((uint16_t)0x0010) /* Capture/Compare 4 interrupt enable */ -#define TIM_COMIE ((uint16_t)0x0020) /* COM interrupt enable */ -#define TIM_TIE ((uint16_t)0x0040) /* Trigger interrupt enable */ -#define TIM_BIE ((uint16_t)0x0080) /* Break interrupt enable */ -#define TIM_UDE ((uint16_t)0x0100) /* Update DMA request enable */ -#define TIM_CC1DE ((uint16_t)0x0200) /* Capture/Compare 1 DMA request enable */ -#define TIM_CC2DE ((uint16_t)0x0400) /* Capture/Compare 2 DMA request enable */ -#define TIM_CC3DE ((uint16_t)0x0800) /* Capture/Compare 3 DMA request enable */ -#define TIM_CC4DE ((uint16_t)0x1000) /* Capture/Compare 4 DMA request enable */ -#define TIM_COMDE ((uint16_t)0x2000) /* COM DMA request enable */ -#define TIM_TDE ((uint16_t)0x4000) /* Trigger DMA request enable */ - -/******************** Bit definition for TIM_INTFR register ********************/ -#define TIM_UIF ((uint16_t)0x0001) /* Update interrupt Flag */ -#define TIM_CC1IF ((uint16_t)0x0002) /* Capture/Compare 1 interrupt Flag */ -#define TIM_CC2IF ((uint16_t)0x0004) /* Capture/Compare 2 interrupt Flag */ -#define TIM_CC3IF ((uint16_t)0x0008) /* Capture/Compare 3 interrupt Flag */ -#define TIM_CC4IF ((uint16_t)0x0010) /* Capture/Compare 4 interrupt Flag */ -#define TIM_COMIF ((uint16_t)0x0020) /* COM interrupt Flag */ -#define TIM_TIF ((uint16_t)0x0040) /* Trigger interrupt Flag */ -#define TIM_BIF ((uint16_t)0x0080) /* Break interrupt Flag */ -#define TIM_CC1OF ((uint16_t)0x0200) /* Capture/Compare 1 Overcapture Flag */ -#define TIM_CC2OF ((uint16_t)0x0400) /* Capture/Compare 2 Overcapture Flag */ -#define TIM_CC3OF ((uint16_t)0x0800) /* Capture/Compare 3 Overcapture Flag */ -#define TIM_CC4OF ((uint16_t)0x1000) /* Capture/Compare 4 Overcapture Flag */ - -/******************* Bit definition for TIM_SWEVGR register ********************/ -#define TIM_UG ((uint8_t)0x01) /* Update Generation */ -#define TIM_CC1G ((uint8_t)0x02) /* Capture/Compare 1 Generation */ -#define TIM_CC2G ((uint8_t)0x04) /* Capture/Compare 2 Generation */ -#define TIM_CC3G ((uint8_t)0x08) /* Capture/Compare 3 Generation */ -#define TIM_CC4G ((uint8_t)0x10) /* Capture/Compare 4 Generation */ -#define TIM_COMG ((uint8_t)0x20) /* Capture/Compare Control Update Generation */ -#define TIM_TG ((uint8_t)0x40) /* Trigger Generation */ -#define TIM_BG ((uint8_t)0x80) /* Break Generation */ - -/****************** Bit definition for TIM_CHCTLR1 register *******************/ -#define TIM_CC1S ((uint16_t)0x0003) /* CC1S[1:0] bits (Capture/Compare 1 Selection) */ -#define TIM_CC1S_0 ((uint16_t)0x0001) /* Bit 0 */ -#define TIM_CC1S_1 ((uint16_t)0x0002) /* Bit 1 */ - -#define TIM_OC1FE ((uint16_t)0x0004) /* Output Compare 1 Fast enable */ -#define TIM_OC1PE ((uint16_t)0x0008) /* Output Compare 1 Preload enable */ - -#define TIM_OC1M ((uint16_t)0x0070) /* OC1M[2:0] bits (Output Compare 1 Mode) */ -#define TIM_OC1M_0 ((uint16_t)0x0010) /* Bit 0 */ -#define TIM_OC1M_1 ((uint16_t)0x0020) /* Bit 1 */ -#define TIM_OC1M_2 ((uint16_t)0x0040) /* Bit 2 */ - -#define TIM_OC1CE ((uint16_t)0x0080) /* Output Compare 1Clear Enable */ - -#define TIM_CC2S ((uint16_t)0x0300) /* CC2S[1:0] bits (Capture/Compare 2 Selection) */ -#define TIM_CC2S_0 ((uint16_t)0x0100) /* Bit 0 */ -#define TIM_CC2S_1 ((uint16_t)0x0200) /* Bit 1 */ - -#define TIM_OC2FE ((uint16_t)0x0400) /* Output Compare 2 Fast enable */ -#define TIM_OC2PE ((uint16_t)0x0800) /* Output Compare 2 Preload enable */ - -#define TIM_OC2M ((uint16_t)0x7000) /* OC2M[2:0] bits (Output Compare 2 Mode) */ -#define TIM_OC2M_0 ((uint16_t)0x1000) /* Bit 0 */ -#define TIM_OC2M_1 ((uint16_t)0x2000) /* Bit 1 */ -#define TIM_OC2M_2 ((uint16_t)0x4000) /* Bit 2 */ - -#define TIM_OC2CE ((uint16_t)0x8000) /* Output Compare 2 Clear Enable */ - -#define TIM_IC1PSC ((uint16_t)0x000C) /* IC1PSC[1:0] bits (Input Capture 1 Prescaler) */ -#define TIM_IC1PSC_0 ((uint16_t)0x0004) /* Bit 0 */ -#define TIM_IC1PSC_1 ((uint16_t)0x0008) /* Bit 1 */ - -#define TIM_IC1F ((uint16_t)0x00F0) /* IC1F[3:0] bits (Input Capture 1 Filter) */ -#define TIM_IC1F_0 ((uint16_t)0x0010) /* Bit 0 */ -#define TIM_IC1F_1 ((uint16_t)0x0020) /* Bit 1 */ -#define TIM_IC1F_2 ((uint16_t)0x0040) /* Bit 2 */ -#define TIM_IC1F_3 ((uint16_t)0x0080) /* Bit 3 */ - -#define TIM_IC2PSC ((uint16_t)0x0C00) /* IC2PSC[1:0] bits (Input Capture 2 Prescaler) */ -#define TIM_IC2PSC_0 ((uint16_t)0x0400) /* Bit 0 */ -#define TIM_IC2PSC_1 ((uint16_t)0x0800) /* Bit 1 */ - -#define TIM_IC2F ((uint16_t)0xF000) /* IC2F[3:0] bits (Input Capture 2 Filter) */ -#define TIM_IC2F_0 ((uint16_t)0x1000) /* Bit 0 */ -#define TIM_IC2F_1 ((uint16_t)0x2000) /* Bit 1 */ -#define TIM_IC2F_2 ((uint16_t)0x4000) /* Bit 2 */ -#define TIM_IC2F_3 ((uint16_t)0x8000) /* Bit 3 */ - -/****************** Bit definition for TIM_CHCTLR2 register *******************/ -#define TIM_CC3S ((uint16_t)0x0003) /* CC3S[1:0] bits (Capture/Compare 3 Selection) */ -#define TIM_CC3S_0 ((uint16_t)0x0001) /* Bit 0 */ -#define TIM_CC3S_1 ((uint16_t)0x0002) /* Bit 1 */ - -#define TIM_OC3FE ((uint16_t)0x0004) /* Output Compare 3 Fast enable */ -#define TIM_OC3PE ((uint16_t)0x0008) /* Output Compare 3 Preload enable */ - -#define TIM_OC3M ((uint16_t)0x0070) /* OC3M[2:0] bits (Output Compare 3 Mode) */ -#define TIM_OC3M_0 ((uint16_t)0x0010) /* Bit 0 */ -#define TIM_OC3M_1 ((uint16_t)0x0020) /* Bit 1 */ -#define TIM_OC3M_2 ((uint16_t)0x0040) /* Bit 2 */ - -#define TIM_OC3CE ((uint16_t)0x0080) /* Output Compare 3 Clear Enable */ - -#define TIM_CC4S ((uint16_t)0x0300) /* CC4S[1:0] bits (Capture/Compare 4 Selection) */ -#define TIM_CC4S_0 ((uint16_t)0x0100) /* Bit 0 */ -#define TIM_CC4S_1 ((uint16_t)0x0200) /* Bit 1 */ - -#define TIM_OC4FE ((uint16_t)0x0400) /* Output Compare 4 Fast enable */ -#define TIM_OC4PE ((uint16_t)0x0800) /* Output Compare 4 Preload enable */ - -#define TIM_OC4M ((uint16_t)0x7000) /* OC4M[2:0] bits (Output Compare 4 Mode) */ -#define TIM_OC4M_0 ((uint16_t)0x1000) /* Bit 0 */ -#define TIM_OC4M_1 ((uint16_t)0x2000) /* Bit 1 */ -#define TIM_OC4M_2 ((uint16_t)0x4000) /* Bit 2 */ - -#define TIM_OC4CE ((uint16_t)0x8000) /* Output Compare 4 Clear Enable */ - -#define TIM_IC3PSC ((uint16_t)0x000C) /* IC3PSC[1:0] bits (Input Capture 3 Prescaler) */ -#define TIM_IC3PSC_0 ((uint16_t)0x0004) /* Bit 0 */ -#define TIM_IC3PSC_1 ((uint16_t)0x0008) /* Bit 1 */ - -#define TIM_IC3F ((uint16_t)0x00F0) /* IC3F[3:0] bits (Input Capture 3 Filter) */ -#define TIM_IC3F_0 ((uint16_t)0x0010) /* Bit 0 */ -#define TIM_IC3F_1 ((uint16_t)0x0020) /* Bit 1 */ -#define TIM_IC3F_2 ((uint16_t)0x0040) /* Bit 2 */ -#define TIM_IC3F_3 ((uint16_t)0x0080) /* Bit 3 */ - -#define TIM_IC4PSC ((uint16_t)0x0C00) /* IC4PSC[1:0] bits (Input Capture 4 Prescaler) */ -#define TIM_IC4PSC_0 ((uint16_t)0x0400) /* Bit 0 */ -#define TIM_IC4PSC_1 ((uint16_t)0x0800) /* Bit 1 */ - -#define TIM_IC4F ((uint16_t)0xF000) /* IC4F[3:0] bits (Input Capture 4 Filter) */ -#define TIM_IC4F_0 ((uint16_t)0x1000) /* Bit 0 */ -#define TIM_IC4F_1 ((uint16_t)0x2000) /* Bit 1 */ -#define TIM_IC4F_2 ((uint16_t)0x4000) /* Bit 2 */ -#define TIM_IC4F_3 ((uint16_t)0x8000) /* Bit 3 */ - -/******************* Bit definition for TIM_CCER register *******************/ -#define TIM_CC1E ((uint16_t)0x0001) /* Capture/Compare 1 output enable */ -#define TIM_CC1P ((uint16_t)0x0002) /* Capture/Compare 1 output Polarity */ -#define TIM_CC1NE ((uint16_t)0x0004) /* Capture/Compare 1 Complementary output enable */ -#define TIM_CC1NP ((uint16_t)0x0008) /* Capture/Compare 1 Complementary output Polarity */ -#define TIM_CC2E ((uint16_t)0x0010) /* Capture/Compare 2 output enable */ -#define TIM_CC2P ((uint16_t)0x0020) /* Capture/Compare 2 output Polarity */ -#define TIM_CC2NE ((uint16_t)0x0040) /* Capture/Compare 2 Complementary output enable */ -#define TIM_CC2NP ((uint16_t)0x0080) /* Capture/Compare 2 Complementary output Polarity */ -#define TIM_CC3E ((uint16_t)0x0100) /* Capture/Compare 3 output enable */ -#define TIM_CC3P ((uint16_t)0x0200) /* Capture/Compare 3 output Polarity */ -#define TIM_CC3NE ((uint16_t)0x0400) /* Capture/Compare 3 Complementary output enable */ -#define TIM_CC3NP ((uint16_t)0x0800) /* Capture/Compare 3 Complementary output Polarity */ -#define TIM_CC4E ((uint16_t)0x1000) /* Capture/Compare 4 output enable */ -#define TIM_CC4P ((uint16_t)0x2000) /* Capture/Compare 4 output Polarity */ -#define TIM_CC4NP ((uint16_t)0x8000) /* Capture/Compare 4 Complementary output Polarity */ - -/******************* Bit definition for TIM_CNT register ********************/ -#define TIM_CNT ((uint16_t)0xFFFF) /* Counter Value */ - -/******************* Bit definition for TIM_PSC register ********************/ -#define TIM_PSC ((uint16_t)0xFFFF) /* Prescaler Value */ - -/******************* Bit definition for TIM_ATRLR register ********************/ -#define TIM_ARR ((uint16_t)0xFFFF) /* actual auto-reload Value */ - -/******************* Bit definition for TIM_RPTCR register ********************/ -#define TIM_REP ((uint8_t)0xFF) /* Repetition Counter Value */ - -/******************* Bit definition for TIM_CH1CVR register *******************/ -#define TIM_CCR1 ((uint16_t)0xFFFF) /* Capture/Compare 1 Value */ - -/******************* Bit definition for TIM_CH2CVR register *******************/ -#define TIM_CCR2 ((uint16_t)0xFFFF) /* Capture/Compare 2 Value */ - -/******************* Bit definition for TIM_CH3CVR register *******************/ -#define TIM_CCR3 ((uint16_t)0xFFFF) /* Capture/Compare 3 Value */ - -/******************* Bit definition for TIM_CH4CVR register *******************/ -#define TIM_CCR4 ((uint16_t)0xFFFF) /* Capture/Compare 4 Value */ - -/******************* Bit definition for TIM_BDTR register *******************/ -#define TIM_DTG ((uint16_t)0x00FF) /* DTG[0:7] bits (Dead-Time Generator set-up) */ -#define TIM_DTG_0 ((uint16_t)0x0001) /* Bit 0 */ -#define TIM_DTG_1 ((uint16_t)0x0002) /* Bit 1 */ -#define TIM_DTG_2 ((uint16_t)0x0004) /* Bit 2 */ -#define TIM_DTG_3 ((uint16_t)0x0008) /* Bit 3 */ -#define TIM_DTG_4 ((uint16_t)0x0010) /* Bit 4 */ -#define TIM_DTG_5 ((uint16_t)0x0020) /* Bit 5 */ -#define TIM_DTG_6 ((uint16_t)0x0040) /* Bit 6 */ -#define TIM_DTG_7 ((uint16_t)0x0080) /* Bit 7 */ - -#define TIM_LOCK ((uint16_t)0x0300) /* LOCK[1:0] bits (Lock Configuration) */ -#define TIM_LOCK_0 ((uint16_t)0x0100) /* Bit 0 */ -#define TIM_LOCK_1 ((uint16_t)0x0200) /* Bit 1 */ - -#define TIM_OSSI ((uint16_t)0x0400) /* Off-State Selection for Idle mode */ -#define TIM_OSSR ((uint16_t)0x0800) /* Off-State Selection for Run mode */ -#define TIM_BKE ((uint16_t)0x1000) /* Break enable */ -#define TIM_BKP ((uint16_t)0x2000) /* Break Polarity */ -#define TIM_AOE ((uint16_t)0x4000) /* Automatic Output enable */ -#define TIM_MOE ((uint16_t)0x8000) /* Main Output enable */ - -/******************* Bit definition for TIM_DMACFGR register ********************/ -#define TIM_DBA ((uint16_t)0x001F) /* DBA[4:0] bits (DMA Base Address) */ -#define TIM_DBA_0 ((uint16_t)0x0001) /* Bit 0 */ -#define TIM_DBA_1 ((uint16_t)0x0002) /* Bit 1 */ -#define TIM_DBA_2 ((uint16_t)0x0004) /* Bit 2 */ -#define TIM_DBA_3 ((uint16_t)0x0008) /* Bit 3 */ -#define TIM_DBA_4 ((uint16_t)0x0010) /* Bit 4 */ - -#define TIM_DBL ((uint16_t)0x1F00) /* DBL[4:0] bits (DMA Burst Length) */ -#define TIM_DBL_0 ((uint16_t)0x0100) /* Bit 0 */ -#define TIM_DBL_1 ((uint16_t)0x0200) /* Bit 1 */ -#define TIM_DBL_2 ((uint16_t)0x0400) /* Bit 2 */ -#define TIM_DBL_3 ((uint16_t)0x0800) /* Bit 3 */ -#define TIM_DBL_4 ((uint16_t)0x1000) /* Bit 4 */ - -/******************* Bit definition for TIM_DMAADR register *******************/ -#define TIM_DMAR_DMAB ((uint16_t)0xFFFF) /* DMA register for burst accesses */ - -/******************************************************************************/ -/* Universal Synchronous Asynchronous Receiver Transmitter */ -/******************************************************************************/ - -/******************* Bit definition for USART_STATR register *******************/ -#define USART_STATR_PE ((uint16_t)0x0001) /* Parity Error */ -#define USART_STATR_FE ((uint16_t)0x0002) /* Framing Error */ -#define USART_STATR_NE ((uint16_t)0x0004) /* Noise Error Flag */ -#define USART_STATR_ORE ((uint16_t)0x0008) /* OverRun Error */ -#define USART_STATR_IDLE ((uint16_t)0x0010) /* IDLE line detected */ -#define USART_STATR_RXNE ((uint16_t)0x0020) /* Read Data Register Not Empty */ -#define USART_STATR_TC ((uint16_t)0x0040) /* Transmission Complete */ -#define USART_STATR_TXE ((uint16_t)0x0080) /* Transmit Data Register Empty */ -#define USART_STATR_LBD ((uint16_t)0x0100) /* LIN Break Detection Flag */ -#define USART_STATR_CTS ((uint16_t)0x0200) /* CTS Flag */ - -/******************* Bit definition for USART_DATAR register *******************/ -#define USART_DATAR_DR ((uint16_t)0x01FF) /* Data value */ - -/****************** Bit definition for USART_BRR register *******************/ -#define USART_BRR_DIV_Fraction ((uint16_t)0x000F) /* Fraction of USARTDIV */ -#define USART_BRR_DIV_Mantissa ((uint16_t)0xFFF0) /* Mantissa of USARTDIV */ - -/****************** Bit definition for USART_CTLR1 register *******************/ -#define USART_CTLR1_SBK ((uint16_t)0x0001) /* Send Break */ -#define USART_CTLR1_RWU ((uint16_t)0x0002) /* Receiver wakeup */ -#define USART_CTLR1_RE ((uint16_t)0x0004) /* Receiver Enable */ -#define USART_CTLR1_TE ((uint16_t)0x0008) /* Transmitter Enable */ -#define USART_CTLR1_IDLEIE ((uint16_t)0x0010) /* IDLE Interrupt Enable */ -#define USART_CTLR1_RXNEIE ((uint16_t)0x0020) /* RXNE Interrupt Enable */ -#define USART_CTLR1_TCIE ((uint16_t)0x0040) /* Transmission Complete Interrupt Enable */ -#define USART_CTLR1_TXEIE ((uint16_t)0x0080) /* PE Interrupt Enable */ -#define USART_CTLR1_PEIE ((uint16_t)0x0100) /* PE Interrupt Enable */ -#define USART_CTLR1_PS ((uint16_t)0x0200) /* Parity Selection */ -#define USART_CTLR1_PCE ((uint16_t)0x0400) /* Parity Control Enable */ -#define USART_CTLR1_WAKE ((uint16_t)0x0800) /* Wakeup method */ -#define USART_CTLR1_M ((uint16_t)0x1000) /* Word length */ -#define USART_CTLR1_UE ((uint16_t)0x2000) /* USART Enable */ -#define USART_CTLR1_OVER8 ((uint16_t)0x8000) /* USART Oversmapling 8-bits */ - -/****************** Bit definition for USART_CTLR2 register *******************/ -#define USART_CTLR2_ADD ((uint16_t)0x000F) /* Address of the USART node */ -#define USART_CTLR2_LBDL ((uint16_t)0x0020) /* LIN Break Detection Length */ -#define USART_CTLR2_LBDIE ((uint16_t)0x0040) /* LIN Break Detection Interrupt Enable */ -#define USART_CTLR2_LBCL ((uint16_t)0x0100) /* Last Bit Clock pulse */ -#define USART_CTLR2_CPHA ((uint16_t)0x0200) /* Clock Phase */ -#define USART_CTLR2_CPOL ((uint16_t)0x0400) /* Clock Polarity */ -#define USART_CTLR2_CLKEN ((uint16_t)0x0800) /* Clock Enable */ - -#define USART_CTLR2_STOP ((uint16_t)0x3000) /* STOP[1:0] bits (STOP bits) */ -#define USART_CTLR2_STOP_0 ((uint16_t)0x1000) /* Bit 0 */ -#define USART_CTLR2_STOP_1 ((uint16_t)0x2000) /* Bit 1 */ - -#define USART_CTLR2_LINEN ((uint16_t)0x4000) /* LIN mode enable */ - -/****************** Bit definition for USART_CTLR3 register *******************/ -#define USART_CTLR3_EIE ((uint16_t)0x0001) /* Error Interrupt Enable */ -#define USART_CTLR3_IREN ((uint16_t)0x0002) /* IrDA mode Enable */ -#define USART_CTLR3_IRLP ((uint16_t)0x0004) /* IrDA Low-Power */ -#define USART_CTLR3_HDSEL ((uint16_t)0x0008) /* Half-Duplex Selection */ -#define USART_CTLR3_NACK ((uint16_t)0x0010) /* Smartcard NACK enable */ -#define USART_CTLR3_SCEN ((uint16_t)0x0020) /* Smartcard mode enable */ -#define USART_CTLR3_DMAR ((uint16_t)0x0040) /* DMA Enable Receiver */ -#define USART_CTLR3_DMAT ((uint16_t)0x0080) /* DMA Enable Transmitter */ -#define USART_CTLR3_RTSE ((uint16_t)0x0100) /* RTS Enable */ -#define USART_CTLR3_CTSE ((uint16_t)0x0200) /* CTS Enable */ -#define USART_CTLR3_CTSIE ((uint16_t)0x0400) /* CTS Interrupt Enable */ -#define USART_CTLR3_ONEBIT ((uint16_t)0x0800) /* One Bit method */ - -/****************** Bit definition for USART_GPR register ******************/ -#define USART_GPR_PSC ((uint16_t)0x00FF) /* PSC[7:0] bits (Prescaler value) */ -#define USART_GPR_PSC_0 ((uint16_t)0x0001) /* Bit 0 */ -#define USART_GPR_PSC_1 ((uint16_t)0x0002) /* Bit 1 */ -#define USART_GPR_PSC_2 ((uint16_t)0x0004) /* Bit 2 */ -#define USART_GPR_PSC_3 ((uint16_t)0x0008) /* Bit 3 */ -#define USART_GPR_PSC_4 ((uint16_t)0x0010) /* Bit 4 */ -#define USART_GPR_PSC_5 ((uint16_t)0x0020) /* Bit 5 */ -#define USART_GPR_PSC_6 ((uint16_t)0x0040) /* Bit 6 */ -#define USART_GPR_PSC_7 ((uint16_t)0x0080) /* Bit 7 */ - -#define USART_GPR_GT ((uint16_t)0xFF00) /* Guard time value */ - -/******************************************************************************/ -/* Window WATCHDOG */ -/******************************************************************************/ - -/******************* Bit definition for WWDG_CTLR register ********************/ -#define WWDG_CTLR_T ((uint8_t)0x7F) /* T[6:0] bits (7-Bit counter (MSB to LSB)) */ -#define WWDG_CTLR_T0 ((uint8_t)0x01) /* Bit 0 */ -#define WWDG_CTLR_T1 ((uint8_t)0x02) /* Bit 1 */ -#define WWDG_CTLR_T2 ((uint8_t)0x04) /* Bit 2 */ -#define WWDG_CTLR_T3 ((uint8_t)0x08) /* Bit 3 */ -#define WWDG_CTLR_T4 ((uint8_t)0x10) /* Bit 4 */ -#define WWDG_CTLR_T5 ((uint8_t)0x20) /* Bit 5 */ -#define WWDG_CTLR_T6 ((uint8_t)0x40) /* Bit 6 */ - -#define WWDG_CTLR_WDGA ((uint8_t)0x80) /* Activation bit */ - -/******************* Bit definition for WWDG_CFGR register *******************/ -#define WWDG_CFGR_W ((uint16_t)0x007F) /* W[6:0] bits (7-bit window value) */ -#define WWDG_CFGR_W0 ((uint16_t)0x0001) /* Bit 0 */ -#define WWDG_CFGR_W1 ((uint16_t)0x0002) /* Bit 1 */ -#define WWDG_CFGR_W2 ((uint16_t)0x0004) /* Bit 2 */ -#define WWDG_CFGR_W3 ((uint16_t)0x0008) /* Bit 3 */ -#define WWDG_CFGR_W4 ((uint16_t)0x0010) /* Bit 4 */ -#define WWDG_CFGR_W5 ((uint16_t)0x0020) /* Bit 5 */ -#define WWDG_CFGR_W6 ((uint16_t)0x0040) /* Bit 6 */ - -#define WWDG_CFGR_WDGTB ((uint16_t)0x0180) /* WDGTB[1:0] bits (Timer Base) */ -#define WWDG_CFGR_WDGTB0 ((uint16_t)0x0080) /* Bit 0 */ -#define WWDG_CFGR_WDGTB1 ((uint16_t)0x0100) /* Bit 1 */ - -#define WWDG_CFGR_EWI ((uint16_t)0x0200) /* Early Wakeup Interrupt */ - -/******************* Bit definition for WWDG_STATR register ********************/ -#define WWDG_STATR_EWIF ((uint8_t)0x01) /* Early Wakeup Interrupt Flag */ - -/******************************************************************************/ -/* ENHANCED FUNNCTION */ -/******************************************************************************/ - -/**************************** Enhanced register *****************************/ -#define EXTEN_LOCKUP_EN ((uint32_t)0x00000040) /* Bit 6 */ -#define EXTEN_LOCKUP_RSTF ((uint32_t)0x00000080) /* Bit 7 */ - -#define EXTEN_LDO_TRIM ((uint32_t)0x00000400) /* Bit 10 */ - -#define EXTEN_OPA_EN ((uint32_t)0x00010000) -#define EXTEN_OPA_NSEL ((uint32_t)0x00020000) -#define EXTEN_OPA_PSEL ((uint32_t)0x00040000) - -#include <ch32v00x_conf.h> - -#ifdef __cplusplus -} -#endif - -#endif /* __CH32V00x_H */ diff --git a/attic/ch32v003evt/ch32v00x_conf.h b/attic/ch32v003evt/ch32v00x_conf.h deleted file mode 100644 index 217af40..0000000 --- a/attic/ch32v003evt/ch32v00x_conf.h +++ /dev/null @@ -1,1813 +0,0 @@ -/* - * This file contains the contents of various parts of the evt. - * - * The collection of this file was generated by cnlohr, 2023-02-18 - * - * Contents subject to below copyright where applicable by law. - * - * (IANAL, BUT Because it is an interface, it is unlikely protected by copyright) - * - *********************************** (C) COPYRIGHT ******************************* - * File Name : ------------------ - * Author : WCH - * Version : V1.0.0 - * Date : 2020/08/08 - * Description : Library configuration file. -********************************************************************************* -* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. -* Attention: This software (modified or not) and binary are used for -* microcontroller manufactured by Nanjing Qinheng Microelectronics. -*******************************************************************************/ -#ifndef __CH32V00x_CONF_H -#define __CH32V00x_CONF_H - - -#ifdef __cplusplus -extern "C" { -#endif - - -// Tricky: We need to make sure main and SystemInit() are preserved. -int main() __attribute__((used)); -void SystemInit(void) __attribute__((used)); - -// Useful functions -void SystemInit48HSI( void ); - -#define UART_BAUD_RATE 115200 -#define OVER8DIV 4 -#define INTEGER_DIVIDER (((25 * (APB_CLOCK)) / ((OVER8DIV) * (UART_BAUD_RATE)))) -#define FRACTIONAL_DIVIDER ((INTEGER_DIVIDER)%100) -#define UART_BRR ((((INTEGER_DIVIDER) / 100) << 4) | (((((FRACTIONAL_DIVIDER) * ((OVER8DIV)*2)) + 50)/100)&7)) -// Put an output debug UART on Pin D5. -// You can write to this with printf(...) or puts(...) -// Call with SetupUART( UART_BRR ) -void SetupUART( int uartBRR ); - - -/* ch32v00x_gpio.c -----------------------------------------------------------*/ -/* MASK */ -#define LSB_MASK ((uint16_t)0xFFFF) -#define DBGAFR_POSITION_MASK ((uint32_t)0x000F0000) -#define DBGAFR_SDI_MASK ((uint32_t)0xF8FFFFFF) -#define DBGAFR_LOCATION_MASK ((uint32_t)0x00200000) -#define DBGAFR_NUMBITS_MASK ((uint32_t)0x00100000) - - -/* ch32v00x_adc.c ------------------------------------------------------------*/ -/* -/* ADC DISCNUM mask */ -#define CTLR1_DISCNUM_Reset ((uint32_t)0xFFFF1FFF) - -/* ADC DISCEN mask */ -#define CTLR1_DISCEN_Set ((uint32_t)0x00000800) -#define CTLR1_DISCEN_Reset ((uint32_t)0xFFFFF7FF) - -/* ADC JAUTO mask */ -#define CTLR1_JAUTO_Set ((uint32_t)0x00000400) -#define CTLR1_JAUTO_Reset ((uint32_t)0xFFFFFBFF) - -/* ADC JDISCEN mask */ -#define CTLR1_JDISCEN_Set ((uint32_t)0x00001000) -#define CTLR1_JDISCEN_Reset ((uint32_t)0xFFFFEFFF) - -/* ADC AWDCH mask */ -#define CTLR1_AWDCH_Reset ((uint32_t)0xFFFFFFE0) - -/* ADC Analog watchdog enable mode mask */ -#define CTLR1_AWDMode_Reset ((uint32_t)0xFF3FFDFF) - -///* CTLR1 register Mask */ -//Editor's Note: Overloaded Definition -#define ADC_CTLR1_CLEAR_Mask ((uint32_t)0xFFF0FEFF) - -/* ADC ADON mask */ -#define CTLR2_ADON_Set ((uint32_t)0x00000001) -#define CTLR2_ADON_Reset ((uint32_t)0xFFFFFFFE) - -/* ADC DMA mask */ -#define CTLR2_DMA_Set ((uint32_t)0x00000100) -#define CTLR2_DMA_Reset ((uint32_t)0xFFFFFEFF) - -/* ADC RSTCAL mask */ -#define CTLR2_RSTCAL_Set ((uint32_t)0x00000008) - -/* ADC CAL mask */ -#define CTLR2_CAL_Set ((uint32_t)0x00000004) - -/* ADC SWSTART mask */ -#define CTLR2_SWSTART_Set ((uint32_t)0x00400000) - -/* ADC EXTTRIG mask */ -#define CTLR2_EXTTRIG_Set ((uint32_t)0x00100000) -#define CTLR2_EXTTRIG_Reset ((uint32_t)0xFFEFFFFF) - -/* ADC Software start mask */ -#define CTLR2_EXTTRIG_SWSTART_Set ((uint32_t)0x00500000) -#define CTLR2_EXTTRIG_SWSTART_Reset ((uint32_t)0xFFAFFFFF) - -/* ADC JEXTSEL mask */ -#define CTLR2_JEXTSEL_Reset ((uint32_t)0xFFFF8FFF) - -/* ADC JEXTTRIG mask */ -#define CTLR2_JEXTTRIG_Set ((uint32_t)0x00008000) -#define CTLR2_JEXTTRIG_Reset ((uint32_t)0xFFFF7FFF) - -/* ADC JSWSTART mask */ -#define CTLR2_JSWSTART_Set ((uint32_t)0x00200000) - -/* ADC injected software start mask */ -#define CTLR2_JEXTTRIG_JSWSTART_Set ((uint32_t)0x00208000) -#define CTLR2_JEXTTRIG_JSWSTART_Reset ((uint32_t)0xFFDF7FFF) - -/* ADC TSPD mask */ -#define CTLR2_TSVREFE_Set ((uint32_t)0x00800000) -#define CTLR2_TSVREFE_Reset ((uint32_t)0xFF7FFFFF) - -/* CTLR2 register Mask */ -#define CTLR2_CLEAR_Mask ((uint32_t)0xFFF1F7FD) - -/* ADC SQx mask */ -#define RSQR3_SQ_Set ((uint32_t)0x0000001F) -#define RSQR2_SQ_Set ((uint32_t)0x0000001F) -#define RSQR1_SQ_Set ((uint32_t)0x0000001F) - -/* RSQR1 register Mask */ -#define RSQR1_CLEAR_Mask ((uint32_t)0xFF0FFFFF) - -/* ADC JSQx mask */ -#define ISQR_JSQ_Set ((uint32_t)0x0000001F) - -/* ADC JL mask */ -#define ISQR_JL_Set ((uint32_t)0x00300000) -#define ISQR_JL_Reset ((uint32_t)0xFFCFFFFF) - -/* ADC SMPx mask */ -#define SAMPTR1_SMP_Set ((uint32_t)0x00000007) -#define SAMPTR2_SMP_Set ((uint32_t)0x00000007) - -/* ADC IDATARx registers offset */ -#define IDATAR_Offset ((uint8_t)0x28) - - -/* ch32v00x_dbgmcu.c ---------------------------------------------------------*/ -#define IDCODE_DEVID_MASK ((uint32_t)0x0000FFFF) - - -/* ch32v00x_dma.c ------------------------------------------------------------*/ - -/* DMA1 Channelx interrupt pending bit masks */ -#define DMA1_Channel1_IT_Mask ((uint32_t)(DMA_GIF1 | DMA_TCIF1 | DMA_HTIF1 | DMA_TEIF1)) -#define DMA1_Channel2_IT_Mask ((uint32_t)(DMA_GIF2 | DMA_TCIF2 | DMA_HTIF2 | DMA_TEIF2)) -#define DMA1_Channel3_IT_Mask ((uint32_t)(DMA_GIF3 | DMA_TCIF3 | DMA_HTIF3 | DMA_TEIF3)) -#define DMA1_Channel4_IT_Mask ((uint32_t)(DMA_GIF4 | DMA_TCIF4 | DMA_HTIF4 | DMA_TEIF4)) -#define DMA1_Channel5_IT_Mask ((uint32_t)(DMA_GIF5 | DMA_TCIF5 | DMA_HTIF5 | DMA_TEIF5)) -#define DMA1_Channel6_IT_Mask ((uint32_t)(DMA_GIF6 | DMA_TCIF6 | DMA_HTIF6 | DMA_TEIF6)) -#define DMA1_Channel7_IT_Mask ((uint32_t)(DMA_GIF7 | DMA_TCIF7 | DMA_HTIF7 | DMA_TEIF7)) - -/* DMA2 FLAG mask */ -// Editor's note: Overloaded Definition. -#define DMA2_FLAG_Mask ((uint32_t)0x10000000) - -/* DMA registers Masks */ -#define CFGR_CLEAR_Mask ((uint32_t)0xFFFF800F) - -/* ch32v00x_exti.c -----------------------------------------------------------*/ - - -/* No interrupt selected */ -#define EXTI_LINENONE ((uint32_t)0x00000) - -/* ch32v00x_flash.c ----------------------------------------------------------*/ - -/* Flash Access Control Register bits */ -#define ACR_LATENCY_Mask ((uint32_t)0x00000038) - -/* Flash Control Register bits */ -#define CR_PG_Set ((uint32_t)0x00000001) -#define CR_PG_Reset ((uint32_t)0xFFFFFFFE) -#define CR_PER_Set ((uint32_t)0x00000002) -#define CR_PER_Reset ((uint32_t)0xFFFFFFFD) -#define CR_MER_Set ((uint32_t)0x00000004) -#define CR_MER_Reset ((uint32_t)0xFFFFFFFB) -#define CR_OPTPG_Set ((uint32_t)0x00000010) -#define CR_OPTPG_Reset ((uint32_t)0xFFFFFFEF) -#define CR_OPTER_Set ((uint32_t)0x00000020) -#define CR_OPTER_Reset ((uint32_t)0xFFFFFFDF) -#define CR_STRT_Set ((uint32_t)0x00000040) -#define CR_LOCK_Set ((uint32_t)0x00000080) -#define CR_PAGE_PG ((uint32_t)0x00010000) -#define CR_PAGE_ER ((uint32_t)0x00020000) -#define CR_BUF_LOAD ((uint32_t)0x00040000) -#define CR_BUF_RST ((uint32_t)0x00080000) - -/* FLASH Status Register bits */ -#define SR_BSY ((uint32_t)0x00000001) -#define SR_WRPRTERR ((uint32_t)0x00000010) -#define SR_EOP ((uint32_t)0x00000020) - -/* FLASH Mask */ -#define RDPRT_Mask ((uint32_t)0x00000002) -#define WRP0_Mask ((uint32_t)0x000000FF) -#define WRP1_Mask ((uint32_t)0x0000FF00) -#define WRP2_Mask ((uint32_t)0x00FF0000) -#define WRP3_Mask ((uint32_t)0xFF000000) - -/* FLASH Keys */ -#define RDP_Key ((uint16_t)0x00A5) -#define FLASH_KEY1 ((uint32_t)0x45670123) -#define FLASH_KEY2 ((uint32_t)0xCDEF89AB) - -/* FLASH BANK address */ -#define FLASH_BANK1_END_ADDRESS ((uint32_t)0x807FFFF) - -/* Delay definition */ -#define EraseTimeout ((uint32_t)0x000B0000) -#define ProgramTimeout ((uint32_t)0x00002000) - -/* Flash Program Vaild Address */ -#define ValidAddrStart (FLASH_BASE) -#define ValidAddrEnd (FLASH_BASE + 0x4000) - -/* ch32v00x_i2c.c ------------------------------------------------------------*/ - - -/* I2C SPE mask */ -#define CTLR1_PE_Set ((uint16_t)0x0001) -#define CTLR1_PE_Reset ((uint16_t)0xFFFE) - -/* I2C START mask */ -#define CTLR1_START_Set ((uint16_t)0x0100) -#define CTLR1_START_Reset ((uint16_t)0xFEFF) - -/* I2C STOP mask */ -#define CTLR1_STOP_Set ((uint16_t)0x0200) -#define CTLR1_STOP_Reset ((uint16_t)0xFDFF) - -/* I2C ACK mask */ -#define CTLR1_ACK_Set ((uint16_t)0x0400) -#define CTLR1_ACK_Reset ((uint16_t)0xFBFF) - -/* I2C ENGC mask */ -#define CTLR1_ENGC_Set ((uint16_t)0x0040) -#define CTLR1_ENGC_Reset ((uint16_t)0xFFBF) - -/* I2C SWRST mask */ -#define CTLR1_SWRST_Set ((uint16_t)0x8000) -#define CTLR1_SWRST_Reset ((uint16_t)0x7FFF) - -/* I2C PEC mask */ -#define CTLR1_PEC_Set ((uint16_t)0x1000) -#define CTLR1_PEC_Reset ((uint16_t)0xEFFF) - -/* I2C ENPEC mask */ -#define CTLR1_ENPEC_Set ((uint16_t)0x0020) -#define CTLR1_ENPEC_Reset ((uint16_t)0xFFDF) - -/* I2C ENARP mask */ -#define CTLR1_ENARP_Set ((uint16_t)0x0010) -#define CTLR1_ENARP_Reset ((uint16_t)0xFFEF) - -/* I2C NOSTRETCH mask */ -#define CTLR1_NOSTRETCH_Set ((uint16_t)0x0080) -#define CTLR1_NOSTRETCH_Reset ((uint16_t)0xFF7F) - -////* I2C registers Masks */ -// Editor's note: Overloaded Definition. -#define I2C_CTLR1_CLEAR_Mask ((uint16_t)0xFBF5) - -/* I2C DMAEN mask */ -#define CTLR2_DMAEN_Set ((uint16_t)0x0800) -#define CTLR2_DMAEN_Reset ((uint16_t)0xF7FF) - -/* I2C LAST mask */ -#define CTLR2_LAST_Set ((uint16_t)0x1000) -#define CTLR2_LAST_Reset ((uint16_t)0xEFFF) - -/* I2C FREQ mask */ -#define CTLR2_FREQ_Reset ((uint16_t)0xFFC0) - -/* I2C ADD0 mask */ -#define OADDR1_ADD0_Set ((uint16_t)0x0001) -#define OADDR1_ADD0_Reset ((uint16_t)0xFFFE) - -/* I2C ENDUAL mask */ -#define OADDR2_ENDUAL_Set ((uint16_t)0x0001) -#define OADDR2_ENDUAL_Reset ((uint16_t)0xFFFE) - -/* I2C ADD2 mask */ -#define OADDR2_ADD2_Reset ((uint16_t)0xFF01) - -/* I2C F/S mask */ -#define CKCFGR_FS_Set ((uint16_t)0x8000) - -/* I2C CCR mask */ -#define CKCFGR_CCR_Set ((uint16_t)0x0FFF) - -/* I2C FLAG mask */ -//Editor's Note: Overloaded Definition -#define I2c_FLAG_Mask ((uint32_t)0x00FFFFFF) - -/* I2C Interrupt Enable mask */ -#define ITEN_Mask ((uint32_t)0x07000000) - -/* ch32v00x_iwdg.c -----------------------------------------------------------*/ - -/* CTLR register bit mask */ -#define CTLR_KEY_Reload ((uint16_t)0xAAAA) -#define CTLR_KEY_Enable ((uint16_t)0xCCCC) - -/* ch32v00x_pwr.c ------------------------------------------------------------*/ - - -/* PWR registers bit mask */ -/* CTLR register bit mask */ -#define CTLR_DS_MASK ((uint32_t)0xFFFFFFFD) -#define CTLR_PLS_MASK ((uint32_t)0xFFFFFF1F) -#define AWUPSC_MASK ((uint32_t)0xFFFFFFF0) -#define AWUWR_MASK ((uint32_t)0xFFFFFFC0) - -/* ch32v00x_rcc.c ------------------------------------------------------------*/ - -/* RCC registers bit address in the alias region */ -#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) - -/* BDCTLR Register */ -#define BDCTLR_OFFSET (RCC_OFFSET + 0x20) - -/* RCC registers bit mask */ - -/* CTLR register bit mask */ -#define CTLR_HSEBYP_Reset ((uint32_t)0xFFFBFFFF) -#define CTLR_HSEBYP_Set ((uint32_t)0x00040000) -#define CTLR_HSEON_Reset ((uint32_t)0xFFFEFFFF) -#define CTLR_HSEON_Set ((uint32_t)0x00010000) -#define CTLR_HSITRIM_Mask ((uint32_t)0xFFFFFF07) - -#define CFGR0_PLL_Mask ((uint32_t)0xFFC0FFFF) -#define CFGR0_PLLMull_Mask ((uint32_t)0x003C0000) -#define CFGR0_PLLSRC_Mask ((uint32_t)0x00010000) -#define CFGR0_PLLXTPRE_Mask ((uint32_t)0x00020000) -#define CFGR0_SWS_Mask ((uint32_t)0x0000000C) -#define CFGR0_SW_Mask ((uint32_t)0xFFFFFFFC) -#define CFGR0_HPRE_Reset_Mask ((uint32_t)0xFFFFFF0F) -#define CFGR0_HPRE_Set_Mask ((uint32_t)0x000000F0) -#define CFGR0_PPRE1_Reset_Mask ((uint32_t)0xFFFFF8FF) -#define CFGR0_PPRE1_Set_Mask ((uint32_t)0x00000700) -#define CFGR0_PPRE2_Reset_Mask ((uint32_t)0xFFFFC7FF) -#define CFGR0_PPRE2_Set_Mask ((uint32_t)0x00003800) -#define CFGR0_ADCPRE_Reset_Mask ((uint32_t)0xFFFF07FF) -#define CFGR0_ADCPRE_Set_Mask ((uint32_t)0x0000F800) - -/* RSTSCKR register bit mask */ -#define RSTSCKR_RMVF_Set ((uint32_t)0x01000000) - -/* RCC Flag Mask */ -//Editor's Note: Overloaded Definition -#define RCC_FLAG_Mask ((uint8_t)0x1F) - -/* INTR register byte 2 (Bits[15:8]) base address */ -#define INTR_BYTE2_ADDRESS ((uint32_t)0x40021009) - -/* INTR register byte 3 (Bits[23:16]) base address */ -#define INTR_BYTE3_ADDRESS ((uint32_t)0x4002100A) - -/* CFGR0 register byte 4 (Bits[31:24]) base address */ -#define CFGR0_BYTE4_ADDRESS ((uint32_t)0x40021007) - -/* BDCTLR register base address */ -#define BDCTLR_ADDRESS (PERIPH_BASE + BDCTLR_OFFSET) - -static __I uint8_t APBAHBPrescTable[16] = {1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}; -static __I uint8_t ADCPrescTable[20] = {2, 4, 6, 8, 4, 8, 12, 16, 8, 16, 24, 32, 16, 32, 48, 64, 32, 64, 96, 128}; - - -/* ch32v00x_spi.c ------------------------------------------------------------*/ - - -/* SPI SPE mask */ -#define CTLR1_SPE_Set ((uint16_t)0x0040) -#define CTLR1_SPE_Reset ((uint16_t)0xFFBF) - -/* SPI CRCNext mask */ -#define CTLR1_CRCNext_Set ((uint16_t)0x1000) - -/* SPI CRCEN mask */ -#define CTLR1_CRCEN_Set ((uint16_t)0x2000) -#define CTLR1_CRCEN_Reset ((uint16_t)0xDFFF) - -/* SPI SSOE mask */ -#define CTLR2_SSOE_Set ((uint16_t)0x0004) -#define CTLR2_SSOE_Reset ((uint16_t)0xFFFB) - -/* SPI registers Masks */ -//Editor's Note: Overloaded Definition -#define SPI_CTLR1_CLEAR_Mask ((uint16_t)0x3040) -#define I2SCFGR_CLEAR_Mask ((uint16_t)0xF040) - - -/* ch32v00x_tim.c ------------------------------------------------------------*/ - -/* TIM registers bit mask */ -#define SMCFGR_ETR_Mask ((uint16_t)0x00FF) -#define CHCTLR_Offset ((uint16_t)0x0018) -#define CCER_CCE_Set ((uint16_t)0x0001) -#define CCER_CCNE_Set ((uint16_t)0x0004) - -/* ch32v00x_usart.c ----------------------------------------------------------*/ - -/* USART_Private_Defines */ -#define CTLR1_UE_Set ((uint16_t)0x2000) /* USART Enable Mask */ -#define CTLR1_UE_Reset ((uint16_t)0xDFFF) /* USART Disable Mask */ - -#define CTLR1_WAKE_Mask ((uint16_t)0xF7FF) /* USART WakeUp Method Mask */ - -#define CTLR1_RWU_Set ((uint16_t)0x0002) /* USART mute mode Enable Mask */ -#define CTLR1_RWU_Reset ((uint16_t)0xFFFD) /* USART mute mode Enable Mask */ -#define CTLR1_SBK_Set ((uint16_t)0x0001) /* USART Break Character send Mask */ -//Editor's Note: Overloaded Definition -#define USART_CTLR1_CLEAR_Mask ((uint16_t)0xE9F3) /* USART CR1 Mask */ -#define CTLR2_Address_Mask ((uint16_t)0xFFF0) /* USART address Mask */ - -#define CTLR2_LINEN_Set ((uint16_t)0x4000) /* USART LIN Enable Mask */ -#define CTLR2_LINEN_Reset ((uint16_t)0xBFFF) /* USART LIN Disable Mask */ - -#define CTLR2_LBDL_Mask ((uint16_t)0xFFDF) /* USART LIN Break detection Mask */ -#define CTLR2_STOP_CLEAR_Mask ((uint16_t)0xCFFF) /* USART CR2 STOP Bits Mask */ -#define CTLR2_CLOCK_CLEAR_Mask ((uint16_t)0xF0FF) /* USART CR2 Clock Mask */ - -#define CTLR3_SCEN_Set ((uint16_t)0x0020) /* USART SC Enable Mask */ -#define CTLR3_SCEN_Reset ((uint16_t)0xFFDF) /* USART SC Disable Mask */ - -#define CTLR3_NACK_Set ((uint16_t)0x0010) /* USART SC NACK Enable Mask */ -#define CTLR3_NACK_Reset ((uint16_t)0xFFEF) /* USART SC NACK Disable Mask */ - -#define CTLR3_HDSEL_Set ((uint16_t)0x0008) /* USART Half-Duplex Enable Mask */ -#define CTLR3_HDSEL_Reset ((uint16_t)0xFFF7) /* USART Half-Duplex Disable Mask */ - -#define CTLR3_IRLP_Mask ((uint16_t)0xFFFB) /* USART IrDA LowPower mode Mask */ -#define CTLR3_CLEAR_Mask ((uint16_t)0xFCFF) /* USART CR3 Mask */ - -#define CTLR3_IREN_Set ((uint16_t)0x0002) /* USART IrDA Enable Mask */ -#define CTLR3_IREN_Reset ((uint16_t)0xFFFD) /* USART IrDA Disable Mask */ -#define GPR_LSB_Mask ((uint16_t)0x00FF) /* Guard Time Register LSB Mask */ -#define GPR_MSB_Mask ((uint16_t)0xFF00) /* Guard Time Register MSB Mask */ -#define IT_Mask ((uint16_t)0x001F) /* USART Interrupt Mask */ - -/* USART OverSampling-8 Mask */ -#define CTLR1_OVER8_Set ((uint16_t)0x8000) /* USART OVER8 mode Enable Mask */ -#define CTLR1_OVER8_Reset ((uint16_t)0x7FFF) /* USART OVER8 mode Disable Mask */ - -/* USART One Bit Sampling Mask */ -#define CTLR3_ONEBITE_Set ((uint16_t)0x0800) /* USART ONEBITE mode Enable Mask */ -#define CTLR3_ONEBITE_Reset ((uint16_t)0xF7FF) /* USART ONEBITE mode Disable Mask */ - -/* ch32v00x_wwdg.c ------------------------------------------------------------*/ - - -/* CTLR register bit mask */ -#define CTLR_WDGA_Set ((uint32_t)0x00000080) - -/* CFGR register bit mask */ -#define CFGR_WDGTB_Mask ((uint32_t)0xFFFFFE7F) -#define CFGR_W_Mask ((uint32_t)0xFFFFFF80) -#define BIT_Mask ((uint8_t)0x7F) - - -/* ch32v00x_adc.h ------------------------------------------------------------*/ - - - -/* ADC_mode */ -#define ADC_Mode_Independent ((uint32_t)0x00000000) - -/* ADC_external_trigger_sources_for_regular_channels_conversion */ -#define ADC_ExternalTrigConv_T1_TRGO ((uint32_t)0x00000000) -#define ADC_ExternalTrigConv_T1_CC1 ((uint32_t)0x00020000) -#define ADC_ExternalTrigConv_T1_CC2 ((uint32_t)0x00040000) -#define ADC_ExternalTrigConv_T2_TRGO ((uint32_t)0x00060000) -#define ADC_ExternalTrigConv_T2_CC1 ((uint32_t)0x00080000) -#define ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x000A0000) -#define ADC_ExternalTrigConv_Ext_PD3_PC2 ((uint32_t)0x000C0000) -#define ADC_ExternalTrigConv_None ((uint32_t)0x000E0000) - -/* ADC_data_align */ -#define ADC_DataAlign_Right ((uint32_t)0x00000000) -#define ADC_DataAlign_Left ((uint32_t)0x00000800) - -/* ADC_channels */ -#define ADC_Channel_0 ((uint8_t)0x00) -#define ADC_Channel_1 ((uint8_t)0x01) -#define ADC_Channel_2 ((uint8_t)0x02) -#define ADC_Channel_3 ((uint8_t)0x03) -#define ADC_Channel_4 ((uint8_t)0x04) -#define ADC_Channel_5 ((uint8_t)0x05) -#define ADC_Channel_6 ((uint8_t)0x06) -#define ADC_Channel_7 ((uint8_t)0x07) -#define ADC_Channel_8 ((uint8_t)0x08) -#define ADC_Channel_9 ((uint8_t)0x09) - -#define ADC_Channel_Vrefint ((uint8_t)ADC_Channel_8) -#define ADC_Channel_Vcalint ((uint8_t)ADC_Channel_9) - -/* ADC_sampling_time */ -#define ADC_SampleTime_3Cycles ((uint8_t)0x00) -#define ADC_SampleTime_9Cycles ((uint8_t)0x01) -#define ADC_SampleTime_15Cycles ((uint8_t)0x02) -#define ADC_SampleTime_30Cycles ((uint8_t)0x03) -#define ADC_SampleTime_43Cycles ((uint8_t)0x04) -#define ADC_SampleTime_57Cycles ((uint8_t)0x05) -#define ADC_SampleTime_73Cycles ((uint8_t)0x06) -#define ADC_SampleTime_241Cycles ((uint8_t)0x07) - -/* ADC_external_trigger_sources_for_injected_channels_conversion */ -#define ADC_ExternalTrigInjecConv_T1_CC3 ((uint32_t)0x00000000) -#define ADC_ExternalTrigInjecConv_T1_CC4 ((uint32_t)0x00001000) -#define ADC_ExternalTrigInjecConv_T2_CC3 ((uint32_t)0x00002000) -#define ADC_ExternalTrigInjecConv_T2_CC4 ((uint32_t)0x00003000) -#define ADC_ExternalTrigInjecConv_Ext_PD1_PA2 ((uint32_t)0x00006000) -#define ADC_ExternalTrigInjecConv_None ((uint32_t)0x00007000) - -/* ADC_injected_channel_selection */ -#define ADC_InjectedChannel_1 ((uint8_t)0x14) -#define ADC_InjectedChannel_2 ((uint8_t)0x18) -#define ADC_InjectedChannel_3 ((uint8_t)0x1C) -#define ADC_InjectedChannel_4 ((uint8_t)0x20) - -/* ADC_analog_watchdog_selection */ -#define ADC_AnalogWatchdog_SingleRegEnable ((uint32_t)0x00800200) -#define ADC_AnalogWatchdog_SingleInjecEnable ((uint32_t)0x00400200) -#define ADC_AnalogWatchdog_SingleRegOrInjecEnable ((uint32_t)0x00C00200) -#define ADC_AnalogWatchdog_AllRegEnable ((uint32_t)0x00800000) -#define ADC_AnalogWatchdog_AllInjecEnable ((uint32_t)0x00400000) -#define ADC_AnalogWatchdog_AllRegAllInjecEnable ((uint32_t)0x00C00000) -#define ADC_AnalogWatchdog_None ((uint32_t)0x00000000) - -/* ADC_interrupts_definition */ -#define ADC_IT_EOC ((uint16_t)0x0220) -#define ADC_IT_AWD ((uint16_t)0x0140) -#define ADC_IT_JEOC ((uint16_t)0x0480) - -/* ADC_flags_definition */ -#define ADC_FLAG_AWD ((uint8_t)0x01) -#define ADC_FLAG_EOC ((uint8_t)0x02) -#define ADC_FLAG_JEOC ((uint8_t)0x04) -#define ADC_FLAG_JSTRT ((uint8_t)0x08) -#define ADC_FLAG_STRT ((uint8_t)0x10) - -/* ADC_calibration_voltage_definition */ -#define ADC_CALVOL_50PERCENT ((uint32_t)0x02000000) -#define ADC_CALVOL_75PERCENT ((uint32_t)0x04000000) - -/* ADC_external_trigger_sources_delay_channels_definition */ -#define ADC_ExternalTrigRegul_DLY ((uint32_t)0x00000000) -#define ADC_ExternalTrigInjec_DLY ((uint32_t)0x00020000) - - - -/* ch32v00x_dbgmcu.h ---------------------------------------------------------*/ - -/* CFGR0 Register */ -#define DBGMCU_IWDG_STOP ((uint32_t)0x00000001) -#define DBGMCU_WWDG_STOP ((uint32_t)0x00000002) -#define DBGMCU_TIM1_STOP ((uint32_t)0x00000010) -#define DBGMCU_TIM2_STOP ((uint32_t)0x00000020) - -/* ch32v00x_dma.h ------------------------------------------------------------*/ - -/* DMA_data_transfer_direction */ -#define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) -#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000) - -/* DMA_peripheral_incremented_mode */ -#define DMA_PeripheralInc_Enable ((uint32_t)0x00000040) -#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000) - -/* DMA_memory_incremented_mode */ -#define DMA_MemoryInc_Enable ((uint32_t)0x00000080) -#define DMA_MemoryInc_Disable ((uint32_t)0x00000000) - -/* DMA_peripheral_data_size */ -#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) -#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100) -#define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200) - -/* DMA_memory_data_size */ -#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000) -#define DMA_MemoryDataSize_HalfWord ((uint32_t)0x00000400) -#define DMA_MemoryDataSize_Word ((uint32_t)0x00000800) - -/* DMA_circular_normal_mode */ -#define DMA_Mode_Circular ((uint32_t)0x00000020) -#define DMA_Mode_Normal ((uint32_t)0x00000000) - -/* DMA_priority_level */ -#define DMA_Priority_VeryHigh ((uint32_t)0x00003000) -#define DMA_Priority_High ((uint32_t)0x00002000) -#define DMA_Priority_Medium ((uint32_t)0x00001000) -#define DMA_Priority_Low ((uint32_t)0x00000000) - -/* DMA_memory_to_memory */ -#define DMA_M2M_Enable ((uint32_t)0x00004000) -#define DMA_M2M_Disable ((uint32_t)0x00000000) - -/* DMA_interrupts_definition */ -#define DMA_IT_TC ((uint32_t)0x00000002) -#define DMA_IT_HT ((uint32_t)0x00000004) -#define DMA_IT_TE ((uint32_t)0x00000008) - -#define DMA1_IT_GL1 ((uint32_t)0x00000001) -#define DMA1_IT_TC1 ((uint32_t)0x00000002) -#define DMA1_IT_HT1 ((uint32_t)0x00000004) -#define DMA1_IT_TE1 ((uint32_t)0x00000008) -#define DMA1_IT_GL2 ((uint32_t)0x00000010) -#define DMA1_IT_TC2 ((uint32_t)0x00000020) -#define DMA1_IT_HT2 ((uint32_t)0x00000040) -#define DMA1_IT_TE2 ((uint32_t)0x00000080) -#define DMA1_IT_GL3 ((uint32_t)0x00000100) -#define DMA1_IT_TC3 ((uint32_t)0x00000200) -#define DMA1_IT_HT3 ((uint32_t)0x00000400) -#define DMA1_IT_TE3 ((uint32_t)0x00000800) -#define DMA1_IT_GL4 ((uint32_t)0x00001000) -#define DMA1_IT_TC4 ((uint32_t)0x00002000) -#define DMA1_IT_HT4 ((uint32_t)0x00004000) -#define DMA1_IT_TE4 ((uint32_t)0x00008000) -#define DMA1_IT_GL5 ((uint32_t)0x00010000) -#define DMA1_IT_TC5 ((uint32_t)0x00020000) -#define DMA1_IT_HT5 ((uint32_t)0x00040000) -#define DMA1_IT_TE5 ((uint32_t)0x00080000) -#define DMA1_IT_GL6 ((uint32_t)0x00100000) -#define DMA1_IT_TC6 ((uint32_t)0x00200000) -#define DMA1_IT_HT6 ((uint32_t)0x00400000) -#define DMA1_IT_TE6 ((uint32_t)0x00800000) -#define DMA1_IT_GL7 ((uint32_t)0x01000000) -#define DMA1_IT_TC7 ((uint32_t)0x02000000) -#define DMA1_IT_HT7 ((uint32_t)0x04000000) -#define DMA1_IT_TE7 ((uint32_t)0x08000000) - -/* DMA_flags_definition */ -#define DMA1_FLAG_GL1 ((uint32_t)0x00000001) -#define DMA1_FLAG_TC1 ((uint32_t)0x00000002) -#define DMA1_FLAG_HT1 ((uint32_t)0x00000004) -#define DMA1_FLAG_TE1 ((uint32_t)0x00000008) -#define DMA1_FLAG_GL2 ((uint32_t)0x00000010) -#define DMA1_FLAG_TC2 ((uint32_t)0x00000020) -#define DMA1_FLAG_HT2 ((uint32_t)0x00000040) -#define DMA1_FLAG_TE2 ((uint32_t)0x00000080) -#define DMA1_FLAG_GL3 ((uint32_t)0x00000100) -#define DMA1_FLAG_TC3 ((uint32_t)0x00000200) -#define DMA1_FLAG_HT3 ((uint32_t)0x00000400) -#define DMA1_FLAG_TE3 ((uint32_t)0x00000800) -#define DMA1_FLAG_GL4 ((uint32_t)0x00001000) -#define DMA1_FLAG_TC4 ((uint32_t)0x00002000) -#define DMA1_FLAG_HT4 ((uint32_t)0x00004000) -#define DMA1_FLAG_TE4 ((uint32_t)0x00008000) -#define DMA1_FLAG_GL5 ((uint32_t)0x00010000) -#define DMA1_FLAG_TC5 ((uint32_t)0x00020000) -#define DMA1_FLAG_HT5 ((uint32_t)0x00040000) -#define DMA1_FLAG_TE5 ((uint32_t)0x00080000) -#define DMA1_FLAG_GL6 ((uint32_t)0x00100000) -#define DMA1_FLAG_TC6 ((uint32_t)0x00200000) -#define DMA1_FLAG_HT6 ((uint32_t)0x00400000) -#define DMA1_FLAG_TE6 ((uint32_t)0x00800000) -#define DMA1_FLAG_GL7 ((uint32_t)0x01000000) -#define DMA1_FLAG_TC7 ((uint32_t)0x02000000) -#define DMA1_FLAG_HT7 ((uint32_t)0x04000000) -#define DMA1_FLAG_TE7 ((uint32_t)0x08000000) - -/* ch32v00x_exti.h -----------------------------------------------------------*/ - -/* EXTI mode enumeration */ -typedef enum -{ - EXTI_Mode_Interrupt = 0x00, - EXTI_Mode_Event = 0x04 -} EXTIMode_TypeDef; - -/* EXTI Trigger enumeration */ -typedef enum -{ - EXTI_Trigger_Rising = 0x08, - EXTI_Trigger_Falling = 0x0C, - EXTI_Trigger_Rising_Falling = 0x10 -} EXTITrigger_TypeDef; - -/* EXTI_Lines */ -#define EXTI_Line0 ((uint32_t)0x00001) /* External interrupt line 0 */ -#define EXTI_Line1 ((uint32_t)0x00002) /* External interrupt line 1 */ -#define EXTI_Line2 ((uint32_t)0x00004) /* External interrupt line 2 */ -#define EXTI_Line3 ((uint32_t)0x00008) /* External interrupt line 3 */ -#define EXTI_Line4 ((uint32_t)0x00010) /* External interrupt line 4 */ -#define EXTI_Line5 ((uint32_t)0x00020) /* External interrupt line 5 */ -#define EXTI_Line6 ((uint32_t)0x00040) /* External interrupt line 6 */ -#define EXTI_Line7 ((uint32_t)0x00080) /* External interrupt line 7 */ -#define EXTI_Line8 ((uint32_t)0x00100) /* External interrupt line 8 Connected to the PVD Output */ -#define EXTI_Line9 ((uint32_t)0x00200) /* External interrupt line 9 Connected to the PWR Auto Wake-up event*/ - - -/* ch32v00x_flash.h ----------------------------------------------------------*/ - - -/* FLASH Status */ -typedef enum -{ - FLASH_BUSY = 1, - FLASH_ERROR_PG, - FLASH_ERROR_WRP, - FLASH_COMPLETE, - FLASH_TIMEOUT -} FLASH_Status; - - -/* Flash_Latency */ -#define FLASH_Latency_0 ((uint32_t)0x00000000) /* FLASH Zero Latency cycle */ -#define FLASH_Latency_1 ((uint32_t)0x00000001) /* FLASH One Latency cycle */ -#define FLASH_Latency_2 ((uint32_t)0x00000002) /* FLASH Two Latency cycles */ - -/* Values to be used with CH32V00x devices (1page = 64Byte) */ -#define FLASH_WRProt_Pages0to15 ((uint32_t)0x00000001) /* CH32 Low and Medium density devices: Write protection of page 0 to 15 */ -#define FLASH_WRProt_Pages16to31 ((uint32_t)0x00000002) /* CH32 Low and Medium density devices: Write protection of page 16 to 31 */ -#define FLASH_WRProt_Pages32to47 ((uint32_t)0x00000004) /* CH32 Low and Medium density devices: Write protection of page 32 to 47 */ -#define FLASH_WRProt_Pages48to63 ((uint32_t)0x00000008) /* CH32 Low and Medium density devices: Write protection of page 48 to 63 */ -#define FLASH_WRProt_Pages64to79 ((uint32_t)0x00000010) /* CH32 Low and Medium density devices: Write protection of page 64 to 79 */ -#define FLASH_WRProt_Pages80to95 ((uint32_t)0x00000020) /* CH32 Low and Medium density devices: Write protection of page 80 to 95 */ -#define FLASH_WRProt_Pages96to111 ((uint32_t)0x00000040) /* CH32 Low and Medium density devices: Write protection of page 96 to 111 */ -#define FLASH_WRProt_Pages112to127 ((uint32_t)0x00000080) /* CH32 Low and Medium density devices: Write protection of page 112 to 127 */ -#define FLASH_WRProt_Pages128to143 ((uint32_t)0x00000100) /* CH32 Medium-density devices: Write protection of page 128 to 143 */ -#define FLASH_WRProt_Pages144to159 ((uint32_t)0x00000200) /* CH32 Medium-density devices: Write protection of page 144 to 159 */ -#define FLASH_WRProt_Pages160to175 ((uint32_t)0x00000400) /* CH32 Medium-density devices: Write protection of page 160 to 175 */ -#define FLASH_WRProt_Pages176to191 ((uint32_t)0x00000800) /* CH32 Medium-density devices: Write protection of page 176 to 191 */ -#define FLASH_WRProt_Pages192to207 ((uint32_t)0x00001000) /* CH32 Medium-density devices: Write protection of page 192 to 207 */ -#define FLASH_WRProt_Pages208to223 ((uint32_t)0x00002000) /* CH32 Medium-density devices: Write protection of page 208 to 223 */ -#define FLASH_WRProt_Pages224to239 ((uint32_t)0x00004000) /* CH32 Medium-density devices: Write protection of page 224 to 239 */ -#define FLASH_WRProt_Pages240to255 ((uint32_t)0x00008000) /* CH32 Medium-density devices: Write protection of page 240 to 255 */ - -#define FLASH_WRProt_AllPages ((uint32_t)0x0000FFFF) /* Write protection of all Pages */ - -/* Option_Bytes_IWatchdog */ -#define OB_IWDG_SW ((uint16_t)0x0001) /* Software IWDG selected */ -#define OB_IWDG_HW ((uint16_t)0x0000) /* Hardware IWDG selected */ - -/* Option_Bytes_nRST_STOP */ -#define OB_STOP_NoRST ((uint16_t)0x0002) /* No reset generated when entering in STOP */ -#define OB_STOP_RST ((uint16_t)0x0000) /* Reset generated when entering in STOP */ - -/* Option_Bytes_nRST_STDBY */ -#define OB_STDBY_NoRST ((uint16_t)0x0004) /* No reset generated when entering in STANDBY */ -#define OB_STDBY_RST ((uint16_t)0x0000) /* Reset generated when entering in STANDBY */ - -/* Option_Bytes_RST_ENandDT */ -#define OB_RST_NoEN ((uint16_t)0x0018) /* Reset IO disable (PD7)*/ -#define OB_RST_EN_DT12ms ((uint16_t)0x0010) /* Reset IO enable (PD7) and Ignore delay time 12ms */ -#define OB_RST_EN_DT1ms ((uint16_t)0x0008) /* Reset IO enable (PD7) and Ignore delay time 1ms */ -#define OB_RST_EN_DT128ms ((uint16_t)0x0000) /* Reset IO enable (PD7) and Ignore delay time 128ms */ - -/* FLASH_Interrupts */ -#define FLASH_IT_ERROR ((uint32_t)0x00000400) /* FPEC error interrupt source */ -#define FLASH_IT_EOP ((uint32_t)0x00001000) /* End of FLASH Operation Interrupt source */ -#define FLASH_IT_BANK1_ERROR FLASH_IT_ERROR /* FPEC BANK1 error interrupt source */ -#define FLASH_IT_BANK1_EOP FLASH_IT_EOP /* End of FLASH BANK1 Operation Interrupt source */ - -/* FLASH_Flags */ -#define FLASH_FLAG_BSY ((uint32_t)0x00000001) /* FLASH Busy flag */ -#define FLASH_FLAG_EOP ((uint32_t)0x00000020) /* FLASH End of Operation flag */ -#define FLASH_FLAG_WRPRTERR ((uint32_t)0x00000010) /* FLASH Write protected error flag */ -#define FLASH_FLAG_OPTERR ((uint32_t)0x00000001) /* FLASH Option Byte error flag */ - -#define FLASH_FLAG_BANK1_BSY FLASH_FLAG_BSY /* FLASH BANK1 Busy flag*/ -#define FLASH_FLAG_BANK1_EOP FLASH_FLAG_EOP /* FLASH BANK1 End of Operation flag */ -#define FLASH_FLAG_BANK1_WRPRTERR FLASH_FLAG_WRPRTERR /* FLASH BANK1 Write protected error flag */ - -/* System_Reset_Start_Mode */ -#define Start_Mode_USER ((uint32_t)0x00000000) -#define Start_Mode_BOOT ((uint32_t)0x00004000) - - -/* ch32v00x_gpio.h ------------------------------------------------------------*/ - -/* Output Maximum frequency selection */ -typedef enum -{ - GPIO_Speed_10MHz = 1, - GPIO_Speed_2MHz, - GPIO_Speed_50MHz -} GPIOSpeed_TypeDef; - -#define GPIO_SPEED_IN 0 - -#define GPIO_CNF_IN_ANALOG 0 -#define GPIO_CNF_IN_FLOATING 4 -#define GPIO_CNF_IN_PUPD 8 -#define GPIO_CNF_OUT_PP 0 -#define GPIO_CNF_OUT_OD 4 -#define GPIO_CNF_OUT_PP_AF 8 -#define GPIO_CNF_OUT_OD_AF 12 - -/* Configuration Mode enumeration */ -/* -typedef enum -{ - GPIO_Mode_AIN = 0x0, - GPIO_Mode_IN_FLOATING = 0x04, - GPIO_Mode_IPD = 0x28, - GPIO_Mode_IPU = 0x48, - GPIO_Mode_Out_OD = 0x14, - GPIO_Mode_Out_PP = 0x10, - GPIO_Mode_AF_OD = 0x1C, - GPIO_Mode_AF_PP = 0x18 -} GPIOMode_TypeDef; -*/ - - -/* Bit_SET and Bit_RESET enumeration */ -typedef enum -{ - Bit_RESET = 0, - Bit_SET -} BitAction; - -/* GPIO_pins_define */ -#define GPIO_Pin_0 ((uint16_t)0x0001) /* Pin 0 selected */ -#define GPIO_Pin_1 ((uint16_t)0x0002) /* Pin 1 selected */ -#define GPIO_Pin_2 ((uint16_t)0x0004) /* Pin 2 selected */ -#define GPIO_Pin_3 ((uint16_t)0x0008) /* Pin 3 selected */ -#define GPIO_Pin_4 ((uint16_t)0x0010) /* Pin 4 selected */ -#define GPIO_Pin_5 ((uint16_t)0x0020) /* Pin 5 selected */ -#define GPIO_Pin_6 ((uint16_t)0x0040) /* Pin 6 selected */ -#define GPIO_Pin_7 ((uint16_t)0x0080) /* Pin 7 selected */ -#define GPIO_Pin_All ((uint16_t)0xFFFF) /* All pins selected */ - -/* GPIO_Remap_define */ -#define GPIO_Remap_SPI1 ((uint32_t)0x00000001) /* SPI1 Alternate Function mapping */ -#define GPIO_PartialRemap_I2C1 ((uint32_t)0x10000002) /* I2C1 Partial Alternate Function mapping */ -#define GPIO_FullRemap_I2C1 ((uint32_t)0x10400002) /* I2C1 Full Alternate Function mapping */ -#define GPIO_PartialRemap1_USART1 ((uint32_t)0x80000004) /* USART1 Partial1 Alternate Function mapping */ -#define GPIO_PartialRemap2_USART1 ((uint32_t)0x80200000) /* USART1 Partial2 Alternate Function mapping */ -#define GPIO_FullRemap_USART1 ((uint32_t)0x80200004) /* USART1 Full Alternate Function mapping */ -#define GPIO_PartialRemap1_TIM1 ((uint32_t)0x00160040) /* TIM1 Partial1 Alternate Function mapping */ -#define GPIO_PartialRemap2_TIM1 ((uint32_t)0x00160080) /* TIM1 Partial2 Alternate Function mapping */ -#define GPIO_FullRemap_TIM1 ((uint32_t)0x001600C0) /* TIM1 Full Alternate Function mapping */ -#define GPIO_PartialRemap1_TIM2 ((uint32_t)0x00180100) /* TIM2 Partial1 Alternate Function mapping */ -#define GPIO_PartialRemap2_TIM2 ((uint32_t)0x00180200) /* TIM2 Partial2 Alternate Function mapping */ -#define GPIO_FullRemap_TIM2 ((uint32_t)0x00180300) /* TIM2 Full Alternate Function mapping */ -#define GPIO_Remap_PA1_2 ((uint32_t)0x00008000) /* PA1 and PA2 Alternate Function mapping */ -#define GPIO_Remap_ADC1_ETRGINJ ((uint32_t)0x00200002) /* ADC1 External Trigger Injected Conversion remapping */ -#define GPIO_Remap_ADC1_ETRGREG ((uint32_t)0x00200004) /* ADC1 External Trigger Regular Conversion remapping */ -#define GPIO_Remap_LSI_CAL ((uint32_t)0x00200080) /* LSI calibration Alternate Function mapping */ -#define GPIO_Remap_SDI_Disable ((uint32_t)0x00300400) /* SDI Disabled */ - -/* GPIO_Port_Sources */ -#define GPIO_PortSourceGPIOA ((uint8_t)0x00) -#define GPIO_PortSourceGPIOC ((uint8_t)0x02) -#define GPIO_PortSourceGPIOD ((uint8_t)0x03) - -/* GPIO_Pin_sources */ -#define GPIO_PinSource0 ((uint8_t)0x00) -#define GPIO_PinSource1 ((uint8_t)0x01) -#define GPIO_PinSource2 ((uint8_t)0x02) -#define GPIO_PinSource3 ((uint8_t)0x03) -#define GPIO_PinSource4 ((uint8_t)0x04) -#define GPIO_PinSource5 ((uint8_t)0x05) -#define GPIO_PinSource6 ((uint8_t)0x06) -#define GPIO_PinSource7 ((uint8_t)0x07) - -/* ch32v00x_i2c.h ------------------------------------------------------------*/ - -/* I2C_mode */ -#define I2C_Mode_I2C ((uint16_t)0x0000) - -/* I2C_duty_cycle_in_fast_mode */ -#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /* I2C fast mode Tlow/Thigh = 16/9 */ -#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /* I2C fast mode Tlow/Thigh = 2 */ - -/* I2C_acknowledgement */ -#define I2C_Ack_Enable ((uint16_t)0x0400) -#define I2C_Ack_Disable ((uint16_t)0x0000) - -/* I2C_transfer_direction */ -#define I2C_Direction_Transmitter ((uint8_t)0x00) -#define I2C_Direction_Receiver ((uint8_t)0x01) - -/* I2C_acknowledged_address */ -#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000) -#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000) - -/* I2C_registers */ -#define I2C_Register_CTLR1 ((uint8_t)0x00) -#define I2C_Register_CTLR2 ((uint8_t)0x04) -#define I2C_Register_OADDR1 ((uint8_t)0x08) -#define I2C_Register_OADDR2 ((uint8_t)0x0C) -#define I2C_Register_DATAR ((uint8_t)0x10) -#define I2C_Register_STAR1 ((uint8_t)0x14) -#define I2C_Register_STAR2 ((uint8_t)0x18) -#define I2C_Register_CKCFGR ((uint8_t)0x1C) - -/* I2C_PEC_position */ -#define I2C_PECPosition_Next ((uint16_t)0x0800) -#define I2C_PECPosition_Current ((uint16_t)0xF7FF) - -/* I2C_NACK_position */ -#define I2C_NACKPosition_Next ((uint16_t)0x0800) -#define I2C_NACKPosition_Current ((uint16_t)0xF7FF) - -/* I2C_interrupts_definition */ -#define I2C_IT_BUF ((uint16_t)0x0400) -#define I2C_IT_EVT ((uint16_t)0x0200) -#define I2C_IT_ERR ((uint16_t)0x0100) - -/* I2C_interrupts_definition */ -#define I2C_IT_PECERR ((uint32_t)0x01001000) -#define I2C_IT_OVR ((uint32_t)0x01000800) -#define I2C_IT_AF ((uint32_t)0x01000400) -#define I2C_IT_ARLO ((uint32_t)0x01000200) -#define I2C_IT_BERR ((uint32_t)0x01000100) -#define I2C_IT_TXE ((uint32_t)0x06000080) -#define I2C_IT_RXNE ((uint32_t)0x06000040) -#define I2C_IT_STOPF ((uint32_t)0x02000010) -#define I2C_IT_ADD10 ((uint32_t)0x02000008) -#define I2C_IT_BTF ((uint32_t)0x02000004) -#define I2C_IT_ADDR ((uint32_t)0x02000002) -#define I2C_IT_SB ((uint32_t)0x02000001) - -/* SR2 register flags */ -#define I2C_FLAG_DUALF ((uint32_t)0x00800000) -#define I2C_FLAG_GENCALL ((uint32_t)0x00100000) -#define I2C_FLAG_TRA ((uint32_t)0x00040000) -#define I2C_FLAG_BUSY ((uint32_t)0x00020000) -#define I2C_FLAG_MSL ((uint32_t)0x00010000) - -/* SR1 register flags */ -#define I2C_FLAG_PECERR ((uint32_t)0x10001000) -#define I2C_FLAG_OVR ((uint32_t)0x10000800) -#define I2C_FLAG_AF ((uint32_t)0x10000400) -#define I2C_FLAG_ARLO ((uint32_t)0x10000200) -#define I2C_FLAG_BERR ((uint32_t)0x10000100) -#define I2C_FLAG_TXE ((uint32_t)0x10000080) -#define I2C_FLAG_RXNE ((uint32_t)0x10000040) -#define I2C_FLAG_STOPF ((uint32_t)0x10000010) -#define I2C_FLAG_ADD10 ((uint32_t)0x10000008) -#define I2C_FLAG_BTF ((uint32_t)0x10000004) -#define I2C_FLAG_ADDR ((uint32_t)0x10000002) -#define I2C_FLAG_SB ((uint32_t)0x10000001) - -/****************I2C Master Events (Events grouped in order of communication)********************/ - -/******************************************************************************************************************** - * @brief Start communicate - * - * After master use I2C_GenerateSTART() function sending the START condition,the master - * has to wait for event 5(the Start condition has been correctly - * released on the I2C bus ). - * - */ -/* EVT5 */ -#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */ - -/******************************************************************************************************************** - * @brief Address Acknowledge - * - * When start condition correctly released on the bus(check EVT5), the - * master use I2C_Send7bitAddress() function sends the address of the slave(s) with which it will communicate - * it also determines master as transmitter or Receiver. Then the master has to wait that a slave acknowledges - * his address. If an acknowledge is sent on the bus, one of the following events will be set: - * - * - * - * 1) In case of Master Receiver (7-bit addressing): the I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED - * event is set. - * - * 2) In case of Master Transmitter (7-bit addressing): the I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED - * is set - * - * 3) In case of 10-Bit addressing mode, the master (after generating the START - * and checking on EVT5) use I2C_SendData() function send the header of 10-bit addressing mode. - * Then master wait EVT9. EVT9 means that the 10-bit addressing header has been correctly sent - * on the bus. Then master should use the function I2C_Send7bitAddress() to send the second part - * of the 10-bit address (LSB) . Then master should wait for event 6. - * - * - */ - -/* EVT6 */ -#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */ -#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */ -/*EVT9 */ -#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */ - -/******************************************************************************************************************** - * @brief Communication events - * - * If START condition has generated and slave address - * been acknowledged. then the master has to check one of the following events for - * communication procedures: - * - * 1) Master Receiver mode: The master has to wait on the event EVT7 then use - * I2C_ReceiveData() function to read the data received from the slave . - * - * 2) Master Transmitter mode: The master use I2C_SendData() function to send data - * then to wait on event EVT8 or EVT8_2. - * These two events are similar: - * - EVT8 means that the data has been written in the data register and is - * being shifted out. - * - EVT8_2 means that the data has been physically shifted out and output - * on the bus. - * In most cases, using EVT8 is sufficient for the application. - * Using EVT8_2 will leads to a slower communication speed but will more reliable . - * EVT8_2 is also more suitable than EVT8 for testing on the last data transmission - * - * - * Note: - * In case the user software does not guarantee that this event EVT7 is managed before - * the current byte end of transfer, then user may check on I2C_EVENT_MASTER_BYTE_RECEIVED - * and I2C_FLAG_BTF flag at the same time .But in this case the communication may be slower. - * - * - */ - -/* Master Receive mode */ -/* EVT7 */ -#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */ - -/* Master Transmitter mode*/ -/* EVT8 */ -#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */ -/* EVT8_2 */ -#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */ - -/******************I2C Slave Events (Events grouped in order of communication)******************/ - -/******************************************************************************************************************** - * @brief Start Communicate events - * - * Wait on one of these events at the start of the communication. It means that - * the I2C peripheral detected a start condition of master device generate on the bus. - * If the acknowledge feature is enabled through function I2C_AcknowledgeConfig()),The peripheral generates an ACK condition on the bus. - * - * - * - * a) In normal case (only one address managed by the slave), when the address - * sent by the master matches the own address of the peripheral (configured by - * I2C_OwnAddress1 field) the I2C_EVENT_SLAVE_XXX_ADDRESS_MATCHED event is set - * (where XXX could be TRANSMITTER or RECEIVER). - * - * b) In case the address sent by the master matches the second address of the - * peripheral (configured by the function I2C_OwnAddress2Config() and enabled - * by the function I2C_DualAddressCmd()) the events I2C_EVENT_SLAVE_XXX_SECONDADDRESS_MATCHED - * (where XXX could be TRANSMITTER or RECEIVER) are set. - * - * c) In case the address sent by the master is General Call (address 0x00) and - * if the General Call is enabled for the peripheral (using function I2C_GeneralCallCmd()) - * the following event is set I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED. - * - */ - -/* EVT1 */ -/* a) Case of One Single Address managed by the slave */ -#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */ -#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */ - -/* b) Case of Dual address managed by the slave */ -#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */ -#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */ - -/* c) Case of General Call enabled for the slave */ -#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */ - -/******************************************************************************************************************** - * @brief Communication events - * - * Wait on one of these events when EVT1 has already been checked : - * - * - Slave Receiver mode: - * - EVT2--The device is expecting to receive a data byte . - * - EVT4--The device is expecting the end of the communication: master - * sends a stop condition and data transmission is stopped. - * - * - Slave Transmitter mode: - * - EVT3--When a byte has been transmitted by the slave and the Master is expecting - * the end of the byte transmission. The two events I2C_EVENT_SLAVE_BYTE_TRANSMITTED and - * I2C_EVENT_SLAVE_BYTE_TRANSMITTING are similar. If the user software doesn't guarantee - * the EVT3 is managed before the current byte end of transfer The second one can optionally - * be used. - * - EVT3_2--When the master sends a NACK to tell slave device that data transmission - * shall end . The slave device has to stop sending - * data bytes and wait a Stop condition from bus. - * - * Note: - * If the user software does not guarantee that the event 2 is - * managed before the current byte end of transfer, User may check on I2C_EVENT_SLAVE_BYTE_RECEIVED - * and I2C_FLAG_BTF flag at the same time . - * In this case the communication will be slower. - * - */ - -/* Slave Receiver mode*/ -/* EVT2 */ -#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */ -/* EVT4 */ -#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */ - -/* Slave Transmitter mode -----------------------*/ -/* EVT3 */ -#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */ -#define I2C_EVENT_SLAVE_BYTE_TRANSMITTING ((uint32_t)0x00060080) /* TRA, BUSY and TXE flags */ -/*EVT3_2 */ -#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */ - - -/* ch32v00x_iwdg.h -----------------------------------------------------------*/ - -/* IWDG_WriteAccess */ -#define IWDG_WriteAccess_Enable ((uint16_t)0x5555) -#define IWDG_WriteAccess_Disable ((uint16_t)0x0000) - -/* IWDG_prescaler */ -#define IWDG_Prescaler_4 ((uint8_t)0x00) -#define IWDG_Prescaler_8 ((uint8_t)0x01) -#define IWDG_Prescaler_16 ((uint8_t)0x02) -#define IWDG_Prescaler_32 ((uint8_t)0x03) -#define IWDG_Prescaler_64 ((uint8_t)0x04) -#define IWDG_Prescaler_128 ((uint8_t)0x05) -#define IWDG_Prescaler_256 ((uint8_t)0x06) - -/* IWDG_Flag */ -#define IWDG_FLAG_PVU ((uint16_t)0x0001) -#define IWDG_FLAG_RVU ((uint16_t)0x0002) - - -/* ch32v00x_misc.h -----------------------------------------------------------*/ - -/* Preemption_Priority_Group */ -#define NVIC_PriorityGroup_0 ((uint32_t)0x00) -#define NVIC_PriorityGroup_1 ((uint32_t)0x01) -#define NVIC_PriorityGroup_2 ((uint32_t)0x02) -#define NVIC_PriorityGroup_3 ((uint32_t)0x03) -#define NVIC_PriorityGroup_4 ((uint32_t)0x04) - - -/* ch32v00x_opa.h ------------------------------------------------------------*/ - -/* Editor's note: I don't know if this is actually useful */ - -/* OPA PSEL enumeration */ -typedef enum -{ - CHP0 = 0, - CHP1 -} OPA_PSEL_TypeDef; - -/* OPA NSEL enumeration */ -typedef enum -{ - CHN0 = 0, - CHN1 -} OPA_NSEL_TypeDef; - - -/* OPA Init Structure definition */ -typedef struct -{ - OPA_PSEL_TypeDef PSEL; /* Specifies the positive channel of OPA */ - OPA_NSEL_TypeDef NSEL; /* Specifies the negative channel of OPA */ -} OPA_InitTypeDef; - - -/* ch32v00x_pwr.h ------------------------------------------------------------*/ - - -/* PVD_detection_level */ -#define PWR_PVDLevel_2V9 ((uint32_t)0x00000000) -#define PWR_PVDLevel_3V1 ((uint32_t)0x00000020) -#define PWR_PVDLevel_3V3 ((uint32_t)0x00000040) -#define PWR_PVDLevel_3V5 ((uint32_t)0x00000060) -#define PWR_PVDLevel_3V7 ((uint32_t)0x00000080) -#define PWR_PVDLevel_3V9 ((uint32_t)0x000000A0) -#define PWR_PVDLevel_4V1 ((uint32_t)0x000000C0) -#define PWR_PVDLevel_4V4 ((uint32_t)0x000000E0) - -/* PWR_AWU_Prescaler */ -#define PWR_AWU_Prescaler_1 ((uint32_t)0x00000000) -#define PWR_AWU_Prescaler_2 ((uint32_t)0x00000002) -#define PWR_AWU_Prescaler_4 ((uint32_t)0x00000003) -#define PWR_AWU_Prescaler_8 ((uint32_t)0x00000004) -#define PWR_AWU_Prescaler_16 ((uint32_t)0x00000005) -#define PWR_AWU_Prescaler_32 ((uint32_t)0x00000006) -#define PWR_AWU_Prescaler_64 ((uint32_t)0x00000007) -#define PWR_AWU_Prescaler_128 ((uint32_t)0x00000008) -#define PWR_AWU_Prescaler_256 ((uint32_t)0x00000009) -#define PWR_AWU_Prescaler_512 ((uint32_t)0x0000000A) -#define PWR_AWU_Prescaler_1024 ((uint32_t)0x0000000B) -#define PWR_AWU_Prescaler_2048 ((uint32_t)0x0000000C) -#define PWR_AWU_Prescaler_4096 ((uint32_t)0x0000000D) -#define PWR_AWU_Prescaler_10240 ((uint32_t)0x0000000E) -#define PWR_AWU_Prescaler_61440 ((uint32_t)0x0000000F) - -/* STOP_mode_entry */ -#define PWR_STANDBYEntry_WFI ((uint8_t)0x01) -#define PWR_STANDBYEntry_WFE ((uint8_t)0x02) - -/* PWR_Flag */ -#define PWR_FLAG_PVDO ((uint32_t)0x00000004) - - -/* ch32v00x_rcc.h ------------------------------------------------------------*/ - - -/* HSE_configuration */ -#define RCC_HSE_OFF ((uint32_t)0x00000000) -#define RCC_HSE_ON ((uint32_t)0x00010000) -#define RCC_HSE_Bypass ((uint32_t)0x00040000) - -/* PLL_entry_clock_source */ -#define RCC_PLLSource_HSI_MUL2 ((uint32_t)0x00000000) -#define RCC_PLLSource_HSE_MUL2 ((uint32_t)0x00030000) - -/* System_clock_source */ -#define RCC_SYSCLKSource_HSI ((uint32_t)0x00000000) -#define RCC_SYSCLKSource_HSE ((uint32_t)0x00000001) -#define RCC_SYSCLKSource_PLLCLK ((uint32_t)0x00000002) - -/* AHB_clock_source */ -#define RCC_SYSCLK_Div1 ((uint32_t)0x00000000) -#define RCC_SYSCLK_Div2 ((uint32_t)0x00000010) -#define RCC_SYSCLK_Div3 ((uint32_t)0x00000020) -#define RCC_SYSCLK_Div4 ((uint32_t)0x00000030) -#define RCC_SYSCLK_Div5 ((uint32_t)0x00000040) -#define RCC_SYSCLK_Div6 ((uint32_t)0x00000050) -#define RCC_SYSCLK_Div7 ((uint32_t)0x00000060) -#define RCC_SYSCLK_Div8 ((uint32_t)0x00000070) -#define RCC_SYSCLK_Div16 ((uint32_t)0x000000B0) -#define RCC_SYSCLK_Div32 ((uint32_t)0x000000C0) -#define RCC_SYSCLK_Div64 ((uint32_t)0x000000D0) -#define RCC_SYSCLK_Div128 ((uint32_t)0x000000E0) -#define RCC_SYSCLK_Div256 ((uint32_t)0x000000F0) - -/* RCC_Interrupt_source */ -#define RCC_IT_LSIRDY ((uint8_t)0x01) -#define RCC_IT_HSIRDY ((uint8_t)0x04) -#define RCC_IT_HSERDY ((uint8_t)0x08) -#define RCC_IT_PLLRDY ((uint8_t)0x10) -#define RCC_IT_CSS ((uint8_t)0x80) - -/* ADC_clock_source */ -#define RCC_PCLK2_Div2 ((uint32_t)0x00000000) -#define RCC_PCLK2_Div4 ((uint32_t)0x00004000) -#define RCC_PCLK2_Div6 ((uint32_t)0x00008000) -#define RCC_PCLK2_Div8 ((uint32_t)0x0000C000) -#define RCC_PCLK2_Div12 ((uint32_t)0x0000A000) -#define RCC_PCLK2_Div16 ((uint32_t)0x0000E000) -#define RCC_PCLK2_Div24 ((uint32_t)0x0000A800) -#define RCC_PCLK2_Div32 ((uint32_t)0x0000E800) -#define RCC_PCLK2_Div48 ((uint32_t)0x0000B000) -#define RCC_PCLK2_Div64 ((uint32_t)0x0000F000) -#define RCC_PCLK2_Div96 ((uint32_t)0x0000B800) -#define RCC_PCLK2_Div128 ((uint32_t)0x0000F800) - -/* AHB_peripheral */ -#define RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) -#define RCC_AHBPeriph_SRAM ((uint32_t)0x00000004) - -/* APB2_peripheral */ -#define RCC_APB2Periph_AFIO ((uint32_t)0x00000001) -#define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004) -#define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010) -#define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020) -#define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200) -#define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800) -#define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000) -#define RCC_APB2Periph_USART1 ((uint32_t)0x00004000) - -/* APB1_peripheral */ -#define RCC_APB1Periph_TIM2 ((uint32_t)0x00000001) -#define RCC_APB1Periph_WWDG ((uint32_t)0x00000800) -#define RCC_APB1Periph_I2C1 ((uint32_t)0x00200000) -#define RCC_APB1Periph_PWR ((uint32_t)0x10000000) - -/* Clock_source_to_output_on_MCO_pin */ -#define RCC_MCO_NoClock ((uint8_t)0x00) -#define RCC_MCO_SYSCLK ((uint8_t)0x04) -#define RCC_MCO_HSI ((uint8_t)0x05) -#define RCC_MCO_HSE ((uint8_t)0x06) -#define RCC_MCO_PLLCLK ((uint8_t)0x07) - -/* RCC_Flag */ -#define RCC_FLAG_HSIRDY ((uint8_t)0x21) -#define RCC_FLAG_HSERDY ((uint8_t)0x31) -#define RCC_FLAG_PLLRDY ((uint8_t)0x39) -#define RCC_FLAG_LSIRDY ((uint8_t)0x61) -#define RCC_FLAG_PINRST ((uint8_t)0x7A) -#define RCC_FLAG_PORRST ((uint8_t)0x7B) -#define RCC_FLAG_SFTRST ((uint8_t)0x7C) -#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) -#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) -#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) - -/* SysTick_clock_source */ -#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB) -#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004) - - -/* ch32v00x_spi.h ------------------------------------------------------------*/ - - -/* SPI_data_direction */ -#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000) -#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400) -#define SPI_Direction_1Line_Rx ((uint16_t)0x8000) -#define SPI_Direction_1Line_Tx ((uint16_t)0xC000) - -/* SPI_mode */ -#define SPI_Mode_Master ((uint16_t)0x0104) -#define SPI_Mode_Slave ((uint16_t)0x0000) - -/* SPI_data_size */ -#define SPI_DataSize_16b ((uint16_t)0x0800) -#define SPI_DataSize_8b ((uint16_t)0x0000) - -/* SPI_Clock_Polarity */ -#define SPI_CPOL_Low ((uint16_t)0x0000) -#define SPI_CPOL_High ((uint16_t)0x0002) - -/* SPI_Clock_Phase */ -#define SPI_CPHA_1Edge ((uint16_t)0x0000) -#define SPI_CPHA_2Edge ((uint16_t)0x0001) - -/* SPI_Slave_Select_management */ -#define SPI_NSS_Soft ((uint16_t)0x0200) -#define SPI_NSS_Hard ((uint16_t)0x0000) - -/* SPI_BaudRate_Prescaler */ -#define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) -#define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) -#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) -#define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) -#define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) -#define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) -#define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) -#define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) - -/* SPI_MSB transmission */ -#define SPI_FirstBit_MSB ((uint16_t)0x0000) - -/* SPI_I2S_DMA_transfer_requests */ -#define SPI_I2S_DMAReq_Tx ((uint16_t)0x0002) -#define SPI_I2S_DMAReq_Rx ((uint16_t)0x0001) - -/* SPI_NSS_internal_software_management */ -#define SPI_NSSInternalSoft_Set ((uint16_t)0x0100) -#define SPI_NSSInternalSoft_Reset ((uint16_t)0xFEFF) - -/* SPI_CRC_Transmit_Receive */ -#define SPI_CRC_Tx ((uint8_t)0x00) -#define SPI_CRC_Rx ((uint8_t)0x01) - -/* SPI_direction_transmit_receive */ -#define SPI_Direction_Rx ((uint16_t)0xBFFF) -#define SPI_Direction_Tx ((uint16_t)0x4000) - -/* SPI_I2S_interrupts_definition */ -#define SPI_I2S_IT_TXE ((uint8_t)0x71) -#define SPI_I2S_IT_RXNE ((uint8_t)0x60) -#define SPI_I2S_IT_ERR ((uint8_t)0x50) -#define SPI_I2S_IT_OVR ((uint8_t)0x56) -#define SPI_IT_MODF ((uint8_t)0x55) -#define SPI_IT_CRCERR ((uint8_t)0x54) -#define I2S_IT_UDR ((uint8_t)0x53) - -/* SPI_I2S_flags_definition */ -#define SPI_I2S_FLAG_RXNE ((uint16_t)0x0001) -#define SPI_I2S_FLAG_TXE ((uint16_t)0x0002) -#define I2S_FLAG_CHSIDE ((uint16_t)0x0004) -#define I2S_FLAG_UDR ((uint16_t)0x0008) -#define SPI_FLAG_CRCERR ((uint16_t)0x0010) -#define SPI_FLAG_MODF ((uint16_t)0x0020) -#define SPI_I2S_FLAG_OVR ((uint16_t)0x0040) -#define SPI_I2S_FLAG_BSY ((uint16_t)0x0080) - - -/* ch32v00x_tim.h ------------------------------------------------------------*/ - -/* TIM_Output_Compare_and_PWM_modes */ -#define TIM_OCMode_Timing ((uint16_t)0x0000) -#define TIM_OCMode_Active ((uint16_t)0x0010) -#define TIM_OCMode_Inactive ((uint16_t)0x0020) -#define TIM_OCMode_Toggle ((uint16_t)0x0030) -#define TIM_OCMode_PWM1 ((uint16_t)0x0060) -#define TIM_OCMode_PWM2 ((uint16_t)0x0070) - -/* TIM_One_Pulse_Mode */ -#define TIM_OPMode_Single ((uint16_t)0x0008) -#define TIM_OPMode_Repetitive ((uint16_t)0x0000) - -/* TIM_Channel */ -#define TIM_Channel_1 ((uint16_t)0x0000) -#define TIM_Channel_2 ((uint16_t)0x0004) -#define TIM_Channel_3 ((uint16_t)0x0008) -#define TIM_Channel_4 ((uint16_t)0x000C) - -/* TIM_Clock_Division_CKD */ -#define TIM_CKD_DIV1 ((uint16_t)0x0000) -#define TIM_CKD_DIV2 ((uint16_t)0x0100) -#define TIM_CKD_DIV4 ((uint16_t)0x0200) - -/* TIM_Counter_Mode */ -#define TIM_CounterMode_Up ((uint16_t)0x0000) -#define TIM_CounterMode_Down ((uint16_t)0x0010) -#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) -#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) -#define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) - -/* TIM_Output_Compare_Polarity */ -#define TIM_OCPolarity_High ((uint16_t)0x0000) -#define TIM_OCPolarity_Low ((uint16_t)0x0002) - -/* TIM_Output_Compare_N_Polarity */ -#define TIM_OCNPolarity_High ((uint16_t)0x0000) -#define TIM_OCNPolarity_Low ((uint16_t)0x0008) - -/* TIM_Output_Compare_state */ -#define TIM_OutputState_Disable ((uint16_t)0x0000) -#define TIM_OutputState_Enable ((uint16_t)0x0001) - -/* TIM_Output_Compare_N_state */ -#define TIM_OutputNState_Disable ((uint16_t)0x0000) -#define TIM_OutputNState_Enable ((uint16_t)0x0004) - -/* TIM_Capture_Compare_state */ -#define TIM_CCx_Enable ((uint16_t)0x0001) -#define TIM_CCx_Disable ((uint16_t)0x0000) - -/* TIM_Capture_Compare_N_state */ -#define TIM_CCxN_Enable ((uint16_t)0x0004) -#define TIM_CCxN_Disable ((uint16_t)0x0000) - -/* Break_Input_enable_disable */ -#define TIM_Break_Enable ((uint16_t)0x1000) -#define TIM_Break_Disable ((uint16_t)0x0000) - -/* Break_Polarity */ -#define TIM_BreakPolarity_Low ((uint16_t)0x0000) -#define TIM_BreakPolarity_High ((uint16_t)0x2000) - -/* TIM_AOE_Bit_Set_Reset */ -#define TIM_AutomaticOutput_Enable ((uint16_t)0x4000) -#define TIM_AutomaticOutput_Disable ((uint16_t)0x0000) - -/* Lock_level */ -#define TIM_LOCKLevel_OFF ((uint16_t)0x0000) -#define TIM_LOCKLevel_1 ((uint16_t)0x0100) -#define TIM_LOCKLevel_2 ((uint16_t)0x0200) -#define TIM_LOCKLevel_3 ((uint16_t)0x0300) - -/* OSSI_Off_State_Selection_for_Idle_mode_state */ -#define TIM_OSSIState_Enable ((uint16_t)0x0400) -#define TIM_OSSIState_Disable ((uint16_t)0x0000) - -/* OSSR_Off_State_Selection_for_Run_mode_state */ -#define TIM_OSSRState_Enable ((uint16_t)0x0800) -#define TIM_OSSRState_Disable ((uint16_t)0x0000) - -/* TIM_Output_Compare_Idle_State */ -#define TIM_OCIdleState_Set ((uint16_t)0x0100) -#define TIM_OCIdleState_Reset ((uint16_t)0x0000) - -/* TIM_Output_Compare_N_Idle_State */ -#define TIM_OCNIdleState_Set ((uint16_t)0x0200) -#define TIM_OCNIdleState_Reset ((uint16_t)0x0000) - -/* TIM_Input_Capture_Polarity */ -#define TIM_ICPolarity_Rising ((uint16_t)0x0000) -#define TIM_ICPolarity_Falling ((uint16_t)0x0002) -#define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) - -/* TIM_Input_Capture_Selection */ -#define TIM_ICSelection_DirectTI ((uint16_t)0x0001) /* TIM Input 1, 2, 3 or 4 is selected to be \ - connected to IC1, IC2, IC3 or IC4, respectively */ -#define TIM_ICSelection_IndirectTI ((uint16_t)0x0002) /* TIM Input 1, 2, 3 or 4 is selected to be \ - connected to IC2, IC1, IC4 or IC3, respectively. */ -#define TIM_ICSelection_TRC ((uint16_t)0x0003) /* TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */ - -/* TIM_Input_Capture_Prescaler */ -#define TIM_ICPSC_DIV1 ((uint16_t)0x0000) /* Capture performed each time an edge is detected on the capture input. */ -#define TIM_ICPSC_DIV2 ((uint16_t)0x0004) /* Capture performed once every 2 events. */ -#define TIM_ICPSC_DIV4 ((uint16_t)0x0008) /* Capture performed once every 4 events. */ -#define TIM_ICPSC_DIV8 ((uint16_t)0x000C) /* Capture performed once every 8 events. */ - -/* TIM_interrupt_sources */ -#define TIM_IT_Update ((uint16_t)0x0001) -#define TIM_IT_CC1 ((uint16_t)0x0002) -#define TIM_IT_CC2 ((uint16_t)0x0004) -#define TIM_IT_CC3 ((uint16_t)0x0008) -#define TIM_IT_CC4 ((uint16_t)0x0010) -#define TIM_IT_COM ((uint16_t)0x0020) -#define TIM_IT_Trigger ((uint16_t)0x0040) -#define TIM_IT_Break ((uint16_t)0x0080) - -/* TIM_DMA_Base_address */ -#define TIM_DMABase_CR1 ((uint16_t)0x0000) -#define TIM_DMABase_CR2 ((uint16_t)0x0001) -#define TIM_DMABase_SMCR ((uint16_t)0x0002) -#define TIM_DMABase_DIER ((uint16_t)0x0003) -#define TIM_DMABase_SR ((uint16_t)0x0004) -#define TIM_DMABase_EGR ((uint16_t)0x0005) -#define TIM_DMABase_CCMR1 ((uint16_t)0x0006) -#define TIM_DMABase_CCMR2 ((uint16_t)0x0007) -#define TIM_DMABase_CCER ((uint16_t)0x0008) -#define TIM_DMABase_CNT ((uint16_t)0x0009) -#define TIM_DMABase_PSC ((uint16_t)0x000A) -#define TIM_DMABase_ARR ((uint16_t)0x000B) -#define TIM_DMABase_RCR ((uint16_t)0x000C) -#define TIM_DMABase_CCR1 ((uint16_t)0x000D) -#define TIM_DMABase_CCR2 ((uint16_t)0x000E) -#define TIM_DMABase_CCR3 ((uint16_t)0x000F) -#define TIM_DMABase_CCR4 ((uint16_t)0x0010) -#define TIM_DMABase_BDTR ((uint16_t)0x0011) -#define TIM_DMABase_DCR ((uint16_t)0x0012) - -/* TIM_DMA_Burst_Length */ -#define TIM_DMABurstLength_1Transfer ((uint16_t)0x0000) -#define TIM_DMABurstLength_2Transfers ((uint16_t)0x0100) -#define TIM_DMABurstLength_3Transfers ((uint16_t)0x0200) -#define TIM_DMABurstLength_4Transfers ((uint16_t)0x0300) -#define TIM_DMABurstLength_5Transfers ((uint16_t)0x0400) -#define TIM_DMABurstLength_6Transfers ((uint16_t)0x0500) -#define TIM_DMABurstLength_7Transfers ((uint16_t)0x0600) -#define TIM_DMABurstLength_8Transfers ((uint16_t)0x0700) -#define TIM_DMABurstLength_9Transfers ((uint16_t)0x0800) -#define TIM_DMABurstLength_10Transfers ((uint16_t)0x0900) -#define TIM_DMABurstLength_11Transfers ((uint16_t)0x0A00) -#define TIM_DMABurstLength_12Transfers ((uint16_t)0x0B00) -#define TIM_DMABurstLength_13Transfers ((uint16_t)0x0C00) -#define TIM_DMABurstLength_14Transfers ((uint16_t)0x0D00) -#define TIM_DMABurstLength_15Transfers ((uint16_t)0x0E00) -#define TIM_DMABurstLength_16Transfers ((uint16_t)0x0F00) -#define TIM_DMABurstLength_17Transfers ((uint16_t)0x1000) -#define TIM_DMABurstLength_18Transfers ((uint16_t)0x1100) - -/* TIM_DMA_sources */ -#define TIM_DMA_Update ((uint16_t)0x0100) -#define TIM_DMA_CC1 ((uint16_t)0x0200) -#define TIM_DMA_CC2 ((uint16_t)0x0400) -#define TIM_DMA_CC3 ((uint16_t)0x0800) -#define TIM_DMA_CC4 ((uint16_t)0x1000) -#define TIM_DMA_COM ((uint16_t)0x2000) -#define TIM_DMA_Trigger ((uint16_t)0x4000) - -/* TIM_External_Trigger_Prescaler */ -#define TIM_ExtTRGPSC_OFF ((uint16_t)0x0000) -#define TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000) -#define TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000) -#define TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000) - -/* TIM_Internal_Trigger_Selection */ -#define TIM_TS_ITR0 ((uint16_t)0x0000) -#define TIM_TS_ITR1 ((uint16_t)0x0010) -#define TIM_TS_ITR2 ((uint16_t)0x0020) -#define TIM_TS_ITR3 ((uint16_t)0x0030) -#define TIM_TS_TI1F_ED ((uint16_t)0x0040) -#define TIM_TS_TI1FP1 ((uint16_t)0x0050) -#define TIM_TS_TI2FP2 ((uint16_t)0x0060) -#define TIM_TS_ETRF ((uint16_t)0x0070) - -/* TIM_TIx_External_Clock_Source */ -#define TIM_TIxExternalCLK1Source_TI1 ((uint16_t)0x0050) -#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060) -#define TIM_TIxExternalCLK1Source_TI1ED ((uint16_t)0x0040) - -/* TIM_External_Trigger_Polarity */ -#define TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000) -#define TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000) - -/* TIM_Prescaler_Reload_Mode */ -#define TIM_PSCReloadMode_Update ((uint16_t)0x0000) -#define TIM_PSCReloadMode_Immediate ((uint16_t)0x0001) - -/* TIM_Forced_Action */ -#define TIM_ForcedAction_Active ((uint16_t)0x0050) -#define TIM_ForcedAction_InActive ((uint16_t)0x0040) - -/* TIM_Encoder_Mode */ -#define TIM_EncoderMode_TI1 ((uint16_t)0x0001) -#define TIM_EncoderMode_TI2 ((uint16_t)0x0002) -#define TIM_EncoderMode_TI12 ((uint16_t)0x0003) - -/* TIM_Event_Source */ -#define TIM_EventSource_Update ((uint16_t)0x0001) -#define TIM_EventSource_CC1 ((uint16_t)0x0002) -#define TIM_EventSource_CC2 ((uint16_t)0x0004) -#define TIM_EventSource_CC3 ((uint16_t)0x0008) -#define TIM_EventSource_CC4 ((uint16_t)0x0010) -#define TIM_EventSource_COM ((uint16_t)0x0020) -#define TIM_EventSource_Trigger ((uint16_t)0x0040) -#define TIM_EventSource_Break ((uint16_t)0x0080) - -/* TIM_Update_Source */ -#define TIM_UpdateSource_Global ((uint16_t)0x0000) /* Source of update is the counter overflow/underflow \ - or the setting of UG bit, or an update generation \ - through the slave mode controller. */ -#define TIM_UpdateSource_Regular ((uint16_t)0x0001) /* Source of update is counter overflow/underflow. */ - -/* TIM_Output_Compare_Preload_State */ -#define TIM_OCPreload_Enable ((uint16_t)0x0008) -#define TIM_OCPreload_Disable ((uint16_t)0x0000) - -/* TIM_Output_Compare_Fast_State */ -#define TIM_OCFast_Enable ((uint16_t)0x0004) -#define TIM_OCFast_Disable ((uint16_t)0x0000) - -/* TIM_Output_Compare_Clear_State */ -#define TIM_OCClear_Enable ((uint16_t)0x0080) -#define TIM_OCClear_Disable ((uint16_t)0x0000) - -/* TIM_Trigger_Output_Source */ -#define TIM_TRGOSource_Reset ((uint16_t)0x0000) -#define TIM_TRGOSource_Enable ((uint16_t)0x0010) -#define TIM_TRGOSource_Update ((uint16_t)0x0020) -#define TIM_TRGOSource_OC1 ((uint16_t)0x0030) -#define TIM_TRGOSource_OC1Ref ((uint16_t)0x0040) -#define TIM_TRGOSource_OC2Ref ((uint16_t)0x0050) -#define TIM_TRGOSource_OC3Ref ((uint16_t)0x0060) -#define TIM_TRGOSource_OC4Ref ((uint16_t)0x0070) - -/* TIM_Slave_Mode */ -#define TIM_SlaveMode_Reset ((uint16_t)0x0004) -#define TIM_SlaveMode_Gated ((uint16_t)0x0005) -#define TIM_SlaveMode_Trigger ((uint16_t)0x0006) -#define TIM_SlaveMode_External1 ((uint16_t)0x0007) - -/* TIM_Master_Slave_Mode */ -#define TIM_MasterSlaveMode_Enable ((uint16_t)0x0080) -#define TIM_MasterSlaveMode_Disable ((uint16_t)0x0000) - -/* TIM_Flags */ -#define TIM_FLAG_Update ((uint16_t)0x0001) -#define TIM_FLAG_CC1 ((uint16_t)0x0002) -#define TIM_FLAG_CC2 ((uint16_t)0x0004) -#define TIM_FLAG_CC3 ((uint16_t)0x0008) -#define TIM_FLAG_CC4 ((uint16_t)0x0010) -#define TIM_FLAG_COM ((uint16_t)0x0020) -#define TIM_FLAG_Trigger ((uint16_t)0x0040) -#define TIM_FLAG_Break ((uint16_t)0x0080) -#define TIM_FLAG_CC1OF ((uint16_t)0x0200) -#define TIM_FLAG_CC2OF ((uint16_t)0x0400) -#define TIM_FLAG_CC3OF ((uint16_t)0x0800) -#define TIM_FLAG_CC4OF ((uint16_t)0x1000) - -/* TIM_Legacy */ -#define TIM_DMABurstLength_1Byte TIM_DMABurstLength_1Transfer -#define TIM_DMABurstLength_2Bytes TIM_DMABurstLength_2Transfers -#define TIM_DMABurstLength_3Bytes TIM_DMABurstLength_3Transfers -#define TIM_DMABurstLength_4Bytes TIM_DMABurstLength_4Transfers -#define TIM_DMABurstLength_5Bytes TIM_DMABurstLength_5Transfers -#define TIM_DMABurstLength_6Bytes TIM_DMABurstLength_6Transfers -#define TIM_DMABurstLength_7Bytes TIM_DMABurstLength_7Transfers -#define TIM_DMABurstLength_8Bytes TIM_DMABurstLength_8Transfers -#define TIM_DMABurstLength_9Bytes TIM_DMABurstLength_9Transfers -#define TIM_DMABurstLength_10Bytes TIM_DMABurstLength_10Transfers -#define TIM_DMABurstLength_11Bytes TIM_DMABurstLength_11Transfers -#define TIM_DMABurstLength_12Bytes TIM_DMABurstLength_12Transfers -#define TIM_DMABurstLength_13Bytes TIM_DMABurstLength_13Transfers -#define TIM_DMABurstLength_14Bytes TIM_DMABurstLength_14Transfers -#define TIM_DMABurstLength_15Bytes TIM_DMABurstLength_15Transfers -#define TIM_DMABurstLength_16Bytes TIM_DMABurstLength_16Transfers -#define TIM_DMABurstLength_17Bytes TIM_DMABurstLength_17Transfers -#define TIM_DMABurstLength_18Bytes TIM_DMABurstLength_18Transfers - - -/* ch32v00x_usart.h ----------------------------------------------------------*/ - -/* USART_Word_Length */ -#define USART_WordLength_8b ((uint16_t)0x0000) -#define USART_WordLength_9b ((uint16_t)0x1000) - -/* USART_Stop_Bits */ -#define USART_StopBits_1 ((uint16_t)0x0000) -#define USART_StopBits_0_5 ((uint16_t)0x1000) -#define USART_StopBits_2 ((uint16_t)0x2000) -#define USART_StopBits_1_5 ((uint16_t)0x3000) - -/* USART_Parity */ -#define USART_Parity_No ((uint16_t)0x0000) -#define USART_Parity_Even ((uint16_t)0x0400) -#define USART_Parity_Odd ((uint16_t)0x0600) - -/* USART_Mode */ -#define USART_Mode_Rx ((uint16_t)0x0004) -#define USART_Mode_Tx ((uint16_t)0x0008) - -/* USART_Hardware_Flow_Control */ -#define USART_HardwareFlowControl_None ((uint16_t)0x0000) -#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) -#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) -#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) - -/* USART_Clock */ -#define USART_Clock_Disable ((uint16_t)0x0000) -#define USART_Clock_Enable ((uint16_t)0x0800) - -/* USART_Clock_Polarity */ -#define USART_CPOL_Low ((uint16_t)0x0000) -#define USART_CPOL_High ((uint16_t)0x0400) - -/* USART_Clock_Phase */ -#define USART_CPHA_1Edge ((uint16_t)0x0000) -#define USART_CPHA_2Edge ((uint16_t)0x0200) - -/* USART_Last_Bit */ -#define USART_LastBit_Disable ((uint16_t)0x0000) -#define USART_LastBit_Enable ((uint16_t)0x0100) - -/* USART_Interrupt_definition */ -#define USART_IT_PE ((uint16_t)0x0028) -#define USART_IT_TXE ((uint16_t)0x0727) -#define USART_IT_TC ((uint16_t)0x0626) -#define USART_IT_RXNE ((uint16_t)0x0525) -#define USART_IT_ORE_RX ((uint16_t)0x0325) -#define USART_IT_IDLE ((uint16_t)0x0424) -#define USART_IT_LBD ((uint16_t)0x0846) -#define USART_IT_CTS ((uint16_t)0x096A) -#define USART_IT_ERR ((uint16_t)0x0060) -#define USART_IT_ORE_ER ((uint16_t)0x0360) -#define USART_IT_NE ((uint16_t)0x0260) -#define USART_IT_FE ((uint16_t)0x0160) - -#define USART_IT_ORE USART_IT_ORE_ER - -/* USART_DMA_Requests */ -#define USART_DMAReq_Tx ((uint16_t)0x0080) -#define USART_DMAReq_Rx ((uint16_t)0x0040) - -/* USART_WakeUp_methods */ -#define USART_WakeUp_IdleLine ((uint16_t)0x0000) -#define USART_WakeUp_AddressMark ((uint16_t)0x0800) - -/* USART_LIN_Break_Detection_Length */ -#define USART_LINBreakDetectLength_10b ((uint16_t)0x0000) -#define USART_LINBreakDetectLength_11b ((uint16_t)0x0020) - -/* USART_IrDA_Low_Power */ -#define USART_IrDAMode_LowPower ((uint16_t)0x0004) -#define USART_IrDAMode_Normal ((uint16_t)0x0000) - -/* USART_Flags */ -#define USART_FLAG_CTS ((uint16_t)0x0200) -#define USART_FLAG_LBD ((uint16_t)0x0100) -#define USART_FLAG_TXE ((uint16_t)0x0080) -#define USART_FLAG_TC ((uint16_t)0x0040) -#define USART_FLAG_RXNE ((uint16_t)0x0020) -#define USART_FLAG_IDLE ((uint16_t)0x0010) -#define USART_FLAG_ORE ((uint16_t)0x0008) -#define USART_FLAG_NE ((uint16_t)0x0004) -#define USART_FLAG_FE ((uint16_t)0x0002) -#define USART_FLAG_PE ((uint16_t)0x0001) - -/* ch32v00x_wwdg.h -----------------------------------------------------------*/ - - -/* WWDG_Prescaler */ -#define WWDG_Prescaler_1 ((uint32_t)0x00000000) -#define WWDG_Prescaler_2 ((uint32_t)0x00000080) -#define WWDG_Prescaler_4 ((uint32_t)0x00000100) -#define WWDG_Prescaler_8 ((uint32_t)0x00000180) - - -/* from debug.h/.c ------------------------------------------------------*/ - -#ifndef __DEBUG_H -#define __DEBUG_H - -// Functions rewritten by cnlohr - -#define DELAY_US_TIME (SYSTEM_CORE_CLOCK / 8000000) -#define DELAY_MS_TIME (SYSTEM_CORE_CLOCK / 8000) - -static void DelaySysTick( uint32_t n ) -{ - SysTick->SR &= ~(1 << 0); - SysTick->CMP = n; - SysTick->CNT = 0; - SysTick->CTLR |=(1 << 0); - while(!(SysTick->SR & (1 << 0))); - SysTick->CTLR &= ~(1 << 0); -} - -#define Delay_Us(n) DelaySysTick( n * DELAY_US_TIME ) -#define Delay_Ms(n) DelaySysTick( n * DELAY_MS_TIME ) - -#endif - - -#ifdef __cplusplus -}; -#endif - - - - - -#endif /* __CH32V00x_CONF_H */ - - - - - diff --git a/attic/ch32v003evt/core_riscv.h b/attic/ch32v003evt/core_riscv.h deleted file mode 100644 index 2e4382d..0000000 --- a/attic/ch32v003evt/core_riscv.h +++ /dev/null @@ -1,632 +0,0 @@ -/********************************** (C) COPYRIGHT ******************************* - * File Name : core_riscv.h - * Author : WCH - * Version : V1.0.0 - * Date : 2022/08/08 - * Description : RISC-V Core Peripheral Access Layer Header File - ********************************************************************************* - * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. - * Attention: This software (modified or not) and binary are used for - * microcontroller manufactured by Nanjing Qinheng Microelectronics. - *******************************************************************************/ -/* - * NOTE: This file modified by CNLohr to be fully-header-only. - */ - - -#ifndef __CORE_RISCV_H__ -#define __CORE_RISCV_H__ - -#include <stdint.h> - -/* define compiler specific symbols */ -#if defined(__CC_ARM) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - -#elif defined(__ICCARM__) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ - -#elif defined(__GNUC__) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - -#elif defined(__TASKING__) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -/* IO definitions */ -#ifdef __cplusplus - #define __I volatile /*!< defines 'read only' permissions */ -#else - #define __I volatile const /*!< defines 'read only' permissions */ -#endif -#define __O volatile /*!< defines 'write only' permissions */ -#define __IO volatile /*!< defines 'read / write' permissions */ - -/* Standard Peripheral Library old types (maintained for legacy purpose) */ -typedef __I uint32_t vuc32; /* Read Only */ -typedef __I uint16_t vuc16; /* Read Only */ -typedef __I uint8_t vuc8; /* Read Only */ - -typedef const uint32_t uc32; /* Read Only */ -typedef const uint16_t uc16; /* Read Only */ -typedef const uint8_t uc8; /* Read Only */ - -typedef __I int32_t vsc32; /* Read Only */ -typedef __I int16_t vsc16; /* Read Only */ -typedef __I int8_t vsc8; /* Read Only */ - -typedef const int32_t sc32; /* Read Only */ -typedef const int16_t sc16; /* Read Only */ -typedef const int8_t sc8; /* Read Only */ - -typedef __IO uint32_t vu32; -typedef __IO uint16_t vu16; -typedef __IO uint8_t vu8; - -typedef uint32_t u32; -typedef uint16_t u16; -typedef uint8_t u8; - -typedef __IO int32_t vs32; -typedef __IO int16_t vs16; -typedef __IO int8_t vs8; - -typedef int32_t s32; -typedef int16_t s16; -typedef int8_t s8; - -typedef enum {NoREADY = 0, READY = !NoREADY} ErrorStatus; - -typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; - -typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; - -#define RV_STATIC_INLINE static inline - -/* memory mapped structure for Program Fast Interrupt Controller (PFIC) */ -typedef struct{ - __I uint32_t ISR[8]; - __I uint32_t IPR[8]; - __IO uint32_t ITHRESDR; - __IO uint32_t RESERVED; - __IO uint32_t CFGR; - __I uint32_t GISR; - __IO uint8_t VTFIDR[4]; - uint8_t RESERVED0[12]; - __IO uint32_t VTFADDR[4]; - uint8_t RESERVED1[0x90]; - __O uint32_t IENR[8]; - uint8_t RESERVED2[0x60]; - __O uint32_t IRER[8]; - uint8_t RESERVED3[0x60]; - __O uint32_t IPSR[8]; - uint8_t RESERVED4[0x60]; - __O uint32_t IPRR[8]; - uint8_t RESERVED5[0x60]; - __IO uint32_t IACTR[8]; - uint8_t RESERVED6[0xE0]; - __IO uint8_t IPRIOR[256]; - uint8_t RESERVED7[0x810]; - __IO uint32_t SCTLR; -}PFIC_Type; - -/* memory mapped structure for SysTick */ -typedef struct -{ - __IO uint32_t CTLR; - __IO uint32_t SR; - __IO uint32_t CNT; - uint32_t RESERVED0; - __IO uint32_t CMP; - uint32_t RESERVED1; -}SysTick_Type; - - -#define PFIC ((PFIC_Type *) 0xE000E000 ) -#define NVIC PFIC -#define NVIC_KEY1 ((uint32_t)0xFA050000) -#define NVIC_KEY2 ((uint32_t)0xBCAF0000) -#define NVIC_KEY3 ((uint32_t)0xBEEF0000) - -#define SysTick ((SysTick_Type *) 0xE000F000) - - -/********************************************************************* - * @fn __enable_irq - * - * @brief Enable Global Interrupt - * - * @return none - */ -RV_STATIC_INLINE void __enable_irq() -{ - uint32_t result; - - __asm volatile("csrr %0," "mstatus": "=r"(result)); - result |= 0x88; - __asm volatile ("csrw mstatus, %0" : : "r" (result) ); -} - -/********************************************************************* - * @fn __disable_irq - * - * @brief Disable Global Interrupt - * - * @return none - */ -RV_STATIC_INLINE void __disable_irq() -{ - uint32_t result; - - __asm volatile("csrr %0," "mstatus": "=r"(result)); - result &= ~0x88; - __asm volatile ("csrw mstatus, %0" : : "r" (result) ); -} - -/********************************************************************* - * @fn __NOP - * - * @brief nop - * - * @return none - */ -RV_STATIC_INLINE void __NOP() -{ - __asm volatile ("nop"); -} - -/********************************************************************* - * @fn NVIC_EnableIRQ - * - * @brief Disable Interrupt - * - * @param IRQn - Interrupt Numbers - * - * @return none - */ -RV_STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->IENR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - -/********************************************************************* - * @fn NVIC_DisableIRQ - * - * @brief Disable Interrupt - * - * @param IRQn - Interrupt Numbers - * - * @return none - */ -RV_STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->IRER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - -/********************************************************************* - * @fn NVIC_GetStatusIRQ - * - * @brief Get Interrupt Enable State - * - * @param IRQn - Interrupt Numbers - * - * @return 1 - 1: Interrupt Pending Enable - * 0 - Interrupt Pending Disable - */ -RV_STATIC_INLINE uint32_t NVIC_GetStatusIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); -} - -/********************************************************************* - * @fn NVIC_GetPendingIRQ - * - * @brief Get Interrupt Pending State - * - * @param IRQn - Interrupt Numbers - * - * @return 1 - 1: Interrupt Pending Enable - * 0 - Interrupt Pending Disable - */ -RV_STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->IPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); -} - -/********************************************************************* - * @fn NVIC_SetPendingIRQ - * - * @brief Set Interrupt Pending - * - * @param IRQn - Interrupt Numbers - * - * @return none - */ -RV_STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->IPSR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - -/********************************************************************* - * @fn NVIC_ClearPendingIRQ - * - * @brief Clear Interrupt Pending - * - * @param IRQn - Interrupt Numbers - * - * @return none - */ -RV_STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->IPRR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - -/********************************************************************* - * @fn NVIC_GetActive - * - * @brief Get Interrupt Active State - * - * @param IRQn - Interrupt Numbers - * - * @return 1 - Interrupt Active - * 0 - Interrupt No Active - */ -RV_STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)((NVIC->IACTR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); -} - -/********************************************************************* - * @fn NVIC_SetPriority - * - * @brief Set Interrupt Priority - * - * @param IRQn - Interrupt Numbers - * priority: bit7 - pre-emption priority - * bit6 - subpriority - * bit[5-0] - reserved - * - * @return none - */ -RV_STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint8_t priority) -{ - NVIC->IPRIOR[(uint32_t)(IRQn)] = priority; -} - -/********************************************************************* - * @fn __WFI - * - * @brief Wait for Interrupt - * - * @return none - */ -__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __WFI(void) -{ - NVIC->SCTLR &= ~(1<<3); // wfi - asm volatile ("wfi"); -} - -/********************************************************************* - * @fn __WFE - * - * @brief Wait for Events - * - * @return none - */ -__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __WFE(void) -{ - uint32_t t; - - t = NVIC->SCTLR; - NVIC->SCTLR |= (1<<3)|(1<<5); // (wfi->wfe)+(__sev) - NVIC->SCTLR = (NVIC->SCTLR & ~(1<<5)) | ( t & (1<<5)); - asm volatile ("wfi"); - asm volatile ("wfi"); -} - -/********************************************************************* - * @fn SetVTFIRQ - * - * @brief Set VTF Interrupt - * - * @param addr - VTF interrupt service function base address. - * IRQn - Interrupt Numbers - * num - VTF Interrupt Numbers - * NewState - DISABLE or ENABLE - * - * @return none - */ -RV_STATIC_INLINE void SetVTFIRQ(uint32_t addr, IRQn_Type IRQn, uint8_t num, FunctionalState NewState){ - if(num > 1) return ; - - if (NewState != DISABLE) - { - NVIC->VTFIDR[num] = IRQn; - NVIC->VTFADDR[num] = ((addr&0xFFFFFFFE)|0x1); - } - else{ - NVIC->VTFIDR[num] = IRQn; - NVIC->VTFADDR[num] = ((addr&0xFFFFFFFE)&(~0x1)); - } -} - -/********************************************************************* - * @fn NVIC_SystemReset - * - * @brief Initiate a system reset request - * - * @return none - */ -RV_STATIC_INLINE void NVIC_SystemReset(void) -{ - NVIC->CFGR = NVIC_KEY3|(1<<7); -} - - - -/********************************************************************* - * @fn __get_MSTATUS - * - * @brief Return the Machine Status Register - * - * @return mstatus value - */ -static inline uint32_t __get_MSTATUS(void) -{ - uint32_t result; - - __ASM volatile("csrr %0," "mstatus": "=r"(result)); - return (result); -} - -/********************************************************************* - * @fn __set_MSTATUS - * - * @brief Set the Machine Status Register - * - * @param value - set mstatus value - * - * @return none - */ -static inline void __set_MSTATUS(uint32_t value) -{ - __ASM volatile("csrw mstatus, %0" : : "r"(value)); -} - -/********************************************************************* - * @fn __get_MISA - * - * @brief Return the Machine ISA Register - * - * @return misa value - */ -static inline uint32_t __get_MISA(void) -{ - uint32_t result; - - __ASM volatile("csrr %0,""misa" : "=r"(result)); - return (result); -} - -/********************************************************************* - * @fn __set_MISA - * - * @brief Set the Machine ISA Register - * - * @param value - set misa value - * - * @return none - */ -static inline void __set_MISA(uint32_t value) -{ - __ASM volatile("csrw misa, %0" : : "r"(value)); -} - -/********************************************************************* - * @fn __get_MTVEC - * - * @brief Return the Machine Trap-Vector Base-Address Register - * - * @return mtvec value - */ -static inline uint32_t __get_MTVEC(void) -{ - uint32_t result; - - __ASM volatile("csrr %0," "mtvec": "=r"(result)); - return (result); -} - -/********************************************************************* - * @fn __set_MTVEC - * - * @brief Set the Machine Trap-Vector Base-Address Register - * - * @param value - set mtvec value - * - * @return none - */ -static inline void __set_MTVEC(uint32_t value) -{ - __ASM volatile("csrw mtvec, %0":: "r"(value)); -} - -/********************************************************************* - * @fn __get_MSCRATCH - * - * @brief Return the Machine Seratch Register - * - * @return mscratch value - */ -static inline uint32_t __get_MSCRATCH(void) -{ - uint32_t result; - - __ASM volatile("csrr %0," "mscratch" : "=r"(result)); - return (result); -} - -/********************************************************************* - * @fn __set_MSCRATCH - * - * @brief Set the Machine Seratch Register - * - * @param value - set mscratch value - * - * @return none - */ -static inline void __set_MSCRATCH(uint32_t value) -{ - __ASM volatile("csrw mscratch, %0" : : "r"(value)); -} - -/********************************************************************* - * @fn __get_MEPC - * - * @brief Return the Machine Exception Program Register - * - * @return mepc value - */ -static inline uint32_t __get_MEPC(void) -{ - uint32_t result; - - __ASM volatile("csrr %0," "mepc" : "=r"(result)); - return (result); -} - -/********************************************************************* - * @fn __set_MEPC - * - * @brief Set the Machine Exception Program Register - * - * @return mepc value - */ -static inline void __set_MEPC(uint32_t value) -{ - __ASM volatile("csrw mepc, %0" : : "r"(value)); -} - -/********************************************************************* - * @fn __get_MCAUSE - * - * @brief Return the Machine Cause Register - * - * @return mcause value - */ -static inline uint32_t __get_MCAUSE(void) -{ - uint32_t result; - - __ASM volatile("csrr %0," "mcause": "=r"(result)); - return (result); -} - -/********************************************************************* - * @fn __set_MCAUSE - * - * @brief Set the Machine Cause Register - * - * @return mcause value - */ -static inline void __set_MCAUSE(uint32_t value) -{ - __ASM volatile("csrw mcause, %0":: "r"(value)); -} - -/********************************************************************* - * @fn __get_MVENDORID - * - * @brief Return Vendor ID Register - * - * @return mvendorid value - */ -static inline uint32_t __get_MVENDORID(void) -{ - uint32_t result; - - __ASM volatile("csrr %0,""mvendorid": "=r"(result)); - return (result); -} - -/********************************************************************* - * @fn __get_MARCHID - * - * @brief Return Machine Architecture ID Register - * - * @return marchid value - */ -static inline uint32_t __get_MARCHID(void) -{ - uint32_t result; - - __ASM volatile("csrr %0,""marchid": "=r"(result)); - return (result); -} - -/********************************************************************* - * @fn __get_MIMPID - * - * @brief Return Machine Implementation ID Register - * - * @return mimpid value - */ -static inline uint32_t __get_MIMPID(void) -{ - uint32_t result; - - __ASM volatile("csrr %0,""mimpid": "=r"(result)); - return (result); -} - -/********************************************************************* - * @fn __get_MHARTID - * - * @brief Return Hart ID Register - * - * @return mhartid value - */ -static inline uint32_t __get_MHARTID(void) -{ - uint32_t result; - - __ASM volatile("csrr %0,""mhartid": "=r"(result)); - return (result); -} - -/********************************************************************* - * @fn __get_SP - * - * @brief Return SP Register - * - * @return SP value - */ -static inline uint32_t __get_SP(void) -{ - uint32_t result; - - __ASM volatile("mv %0,""sp": "=r"(result):); - return (result); -} - - - -#ifdef __cplusplus -} -#endif - -#endif/* __CORE_RISCV_H__ */ - - - - - diff --git a/attic/ch32v003evt/embedlibc.c b/attic/ch32v003evt/embedlibc.c deleted file mode 100644 index e40632b..0000000 --- a/attic/ch32v003evt/embedlibc.c +++ /dev/null @@ -1,649 +0,0 @@ -// Use with newlib headers. -// Mixture of weblibc, mini-printf and ??? - -#include <stdio.h> -#include <string.h> -#include <stdarg.h> -#include <limits.h> - -int errno; -int _write(int fd, const char *buf, int size); - -int mini_vsnprintf(char *buffer, unsigned int buffer_len, const char *fmt, va_list va); -int mini_vpprintf(int (*puts)(char* s, int len, void* buf), void* buf, const char *fmt, va_list va); - -static int __puts_uart(char *s, int len, void *buf) -{ - _write( 0, s, len ); - return len; -} - -int printf(const char* format, ...) -{ - va_list args; - va_start( args, format ); - int ret_status = mini_vpprintf(__puts_uart, 0, format, args); - va_end( args ); - return ret_status; -} - - -/* Some stuff from MUSL - - ----------------------------------------------------------------------- -Copyright © 2005-2020 Rich Felker, et al. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- - -*/ - -/* - * mbstate_t is an opaque object to keep conversion state, during multibyte - * stream conversions. The content must not be referenced by user programs. - */ - -#define CURRENT_UTF8 0 -#define IS_CODEUNIT(c) ((unsigned)(c)-0xdf80 < 0x80) -#define MB_CUR_MAX (CURRENT_UTF8 ? 4 : 1) - -typedef void * mbstate_t; - -size_t wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict st) -{ - if (!s) return 1; - if ((unsigned)wc < 0x80) { - *s = wc; - return 1; - } else if (MB_CUR_MAX == 1) { - if (!IS_CODEUNIT(wc)) { - errno = 0x02; // EILSEQ - return -1; - } - *s = wc; - return 1; - } else if ((unsigned)wc < 0x800) { - *s++ = 0xc0 | (wc>>6); - *s = 0x80 | (wc&0x3f); - return 2; - } else if ((unsigned)wc < 0xd800 || (unsigned)wc-0xe000 < 0x2000) { - *s++ = 0xe0 | (wc>>12); - *s++ = 0x80 | ((wc>>6)&0x3f); - *s = 0x80 | (wc&0x3f); - return 3; - } else if ((unsigned)wc-0x10000 < 0x100000) { - *s++ = 0xf0 | (wc>>18); - *s++ = 0x80 | ((wc>>12)&0x3f); - *s++ = 0x80 | ((wc>>6)&0x3f); - *s = 0x80 | (wc&0x3f); - return 4; - } - errno = 0x02;//EILSEQ; - return -1; -} -int wctomb(char *s, wchar_t wc) -{ - if (!s) return 0; - return wcrtomb(s, wc, 0); -} -size_t strlen(const char *s) { const char *a = s;for (; *s; s++);return s-a; } -size_t strnlen(const char *s, size_t n) { const char *p = memchr(s, 0, n); return p ? p-s : n;} -void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; for (; n; n--, s++) *s = c; return dest; } -char *strcpy(char *d, const char *s) { for (; (*d=*s); s++, d++); return d; } -char *strncpy(char *d, const char *s, size_t n) { for (; n && (*d=*s); n--, s++, d++); return d; } -int strcmp(const char *l, const char *r) -{ - for (; *l==*r && *l; l++, r++); - return *(unsigned char *)l - *(unsigned char *)r; -} -int strncmp(const char *_l, const char *_r, size_t n) -{ - const unsigned char *l=(void *)_l, *r=(void *)_r; - if (!n--) return 0; - for (; *l && *r && n && *l == *r ; l++, r++, n--); - return *l - *r; -} - -static char *twobyte_strstr(const unsigned char *h, const unsigned char *n) -{ - uint16_t nw = n[0]<<8 | n[1], hw = h[0]<<8 | h[1]; - for (h++; *h && hw != nw; hw = hw<<8 | *++h); - return *h ? (char *)h-1 : 0; -} - -static char *threebyte_strstr(const unsigned char *h, const unsigned char *n) -{ - uint32_t nw = (uint32_t)n[0]<<24 | n[1]<<16 | n[2]<<8; - uint32_t hw = (uint32_t)h[0]<<24 | h[1]<<16 | h[2]<<8; - for (h+=2; *h && hw != nw; hw = (hw|*++h)<<8); - return *h ? (char *)h-2 : 0; -} - -static char *fourbyte_strstr(const unsigned char *h, const unsigned char *n) -{ - uint32_t nw = (uint32_t)n[0]<<24 | n[1]<<16 | n[2]<<8 | n[3]; - uint32_t hw = (uint32_t)h[0]<<24 | h[1]<<16 | h[2]<<8 | h[3]; - for (h+=3; *h && hw != nw; hw = hw<<8 | *++h); - return *h ? (char *)h-3 : 0; -} - -#define MAX(a,b) ((a)>(b)?(a):(b)) -#define MIN(a,b) ((a)<(b)?(a):(b)) - -#define BITOP(a,b,op) \ - ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a)))) - -static char *twoway_strstr(const unsigned char *h, const unsigned char *n) -{ - const unsigned char *z; - size_t l, ip, jp, k, p, ms, p0, mem, mem0; - size_t byteset[32 / sizeof(size_t)] = { 0 }; - size_t shift[256]; - - /* Computing length of needle and fill shift table */ - for (l=0; n[l] && h[l]; l++) - BITOP(byteset, n[l], |=), shift[n[l]] = l+1; - if (n[l]) return 0; /* hit the end of h */ - - /* Compute maximal suffix */ - ip = -1; jp = 0; k = p = 1; - while (jp+k<l) { - if (n[ip+k] == n[jp+k]) { - if (k == p) { - jp += p; - k = 1; - } else k++; - } else if (n[ip+k] > n[jp+k]) { - jp += k; - k = 1; - p = jp - ip; - } else { - ip = jp++; - k = p = 1; - } - } - ms = ip; - p0 = p; - - /* And with the opposite comparison */ - ip = -1; jp = 0; k = p = 1; - while (jp+k<l) { - if (n[ip+k] == n[jp+k]) { - if (k == p) { - jp += p; - k = 1; - } else k++; - } else if (n[ip+k] < n[jp+k]) { - jp += k; - k = 1; - p = jp - ip; - } else { - ip = jp++; - k = p = 1; - } - } - if (ip+1 > ms+1) ms = ip; - else p = p0; - - /* Periodic needle? */ - if (memcmp(n, n+p, ms+1)) { - mem0 = 0; - p = MAX(ms, l-ms-1) + 1; - } else mem0 = l-p; - mem = 0; - - /* Initialize incremental end-of-haystack pointer */ - z = h; - - /* Search loop */ - for (;;) { - /* Update incremental end-of-haystack pointer */ - if (z-h < l) { - /* Fast estimate for MAX(l,63) */ - size_t grow = l | 63; - const unsigned char *z2 = memchr(z, 0, grow); - if (z2) { - z = z2; - if (z-h < l) return 0; - } else z += grow; - } - - /* Check last byte first; advance by shift on mismatch */ - if (BITOP(byteset, h[l-1], &)) { - k = l-shift[h[l-1]]; - if (k) { - if (k < mem) k = mem; - h += k; - mem = 0; - continue; - } - } else { - h += l; - mem = 0; - continue; - } - - /* Compare right half */ - for (k=MAX(ms+1,mem); n[k] && n[k] == h[k]; k++); - if (n[k]) { - h += k-ms; - mem = 0; - continue; - } - /* Compare left half */ - for (k=ms+1; k>mem && n[k-1] == h[k-1]; k--); - if (k <= mem) return (char *)h; - h += p; - mem = mem0; - } -} - -char *strstr(const char *h, const char *n) -{ - /* Return immediately on empty needle */ - if (!n[0]) return (char *)h; - - /* Use faster algorithms for short needles */ - h = strchr(h, *n); - if (!h || !n[1]) return (char *)h; - if (!h[1]) return 0; - if (!n[2]) return twobyte_strstr((void *)h, (void *)n); - if (!h[2]) return 0; - if (!n[3]) return threebyte_strstr((void *)h, (void *)n); - if (!h[3]) return 0; - if (!n[4]) return fourbyte_strstr((void *)h, (void *)n); - - return twoway_strstr((void *)h, (void *)n); -} - -char *strchr(const char *s, int c) -{ - c = (unsigned char)c; - if (!c) return (char *)s + strlen(s); - for (; *s && *(unsigned char *)s != c; s++); - return (char *)s; -} - - -void *__memrchr(const void *m, int c, size_t n) -{ - const unsigned char *s = m; - c = (unsigned char)c; - while (n--) if (s[n]==c) return (void *)(s+n); - return 0; -} - -char *strrchr(const char *s, int c) -{ - return __memrchr(s, c, strlen(s) + 1); -} - -void *memcpy(void *dest, const void *src, size_t n) -{ - unsigned char *d = dest; - const unsigned char *s = src; - for (; n; n--) *d++ = *s++; - return dest; -} - -int memcmp(const void *vl, const void *vr, size_t n) -{ - const unsigned char *l=vl, *r=vr; - for (; n && *l == *r; n--, l++, r++); - return n ? *l-*r : 0; -} - - -void *memmove(void *dest, const void *src, size_t n) -{ - char *d = dest; - const char *s = src; - - if (d==s) return d; - if ((uintptr_t)s-(uintptr_t)d-n <= -2*n) return memcpy(d, s, n); - - if (d<s) { - for (; n; n--) *d++ = *s++; - } else { - while (n) n--, d[n] = s[n]; - } - - return dest; -} -void *memchr(const void *src, int c, size_t n) -{ - const unsigned char *s = src; - c = (unsigned char)c; - for (; n && *s != c; s++, n--); - return n ? (void *)s : 0; -} - -int puts(const char *s) -{ - int sl = strlen( s ); - _write(0, s, sl ); - _write(0, "\n", 1 ); - return sl + 1; -} - -/* - * The Minimal snprintf() implementation - * - * Copyright (c) 2013,2014 Michal Ludvig <michal@logix.cz> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the auhor nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ---- - * - * This is a minimal snprintf() implementation optimised - * for embedded systems with a very limited program memory. - * mini_snprintf() doesn't support _all_ the formatting - * the glibc does but on the other hand is a lot smaller. - * Here are some numbers from my STM32 project (.bin file size): - * no snprintf(): 10768 bytes - * mini snprintf(): 11420 bytes (+ 652 bytes) - * glibc snprintf(): 34860 bytes (+24092 bytes) - * Wasting nearly 24kB of memory just for snprintf() on - * a chip with 32kB flash is crazy. Use mini_snprintf() instead. - * - */ - -#define mini_strlen strlen - -static int -mini_itoa(long value, unsigned int radix, int uppercase, int unsig, - char *buffer) -{ - char *pbuffer = buffer; - int negative = 0; - int i, len; - - /* No support for unusual radixes. */ - if (radix > 16) - return 0; - - if (value < 0 && !unsig) { - negative = 1; - value = -value; - } - - /* This builds the string back to front ... */ - do { - int digit = value % radix; - *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); - value /= radix; - } while (value > 0); - - if (negative) - *(pbuffer++) = '-'; - - *(pbuffer) = '\0'; - - /* ... now we reverse it (could do it recursively but will - * conserve the stack space) */ - len = (pbuffer - buffer); - for (i = 0; i < len / 2; i++) { - char j = buffer[i]; - buffer[i] = buffer[len-i-1]; - buffer[len-i-1] = j; - } - - return len; -} - -static int -mini_pad(char* ptr, int len, char pad_char, int pad_to, char *buffer) -{ - int i; - int overflow = 0; - char * pbuffer = buffer; - if(pad_to == 0) pad_to = len; - if(len > pad_to) { - len = pad_to; - overflow = 1; - } - for(i = pad_to - len; i > 0; i --) { - *(pbuffer++) = pad_char; - } - for(i = len; i > 0; i --) { - *(pbuffer++) = *(ptr++); - } - len = pbuffer - buffer; - if(overflow) { - for (i = 0; i < 3 && pbuffer > buffer; i ++) { - *(pbuffer-- - 1) = '*'; - } - } - return len; -} - -struct mini_buff { - char *buffer, *pbuffer; - unsigned int buffer_len; -}; - -static int -_puts(char *s, int len, void *buf) -{ - if(!buf) return len; - struct mini_buff *b = buf; - char * p0 = b->buffer; - int i; - /* Copy to buffer */ - for (i = 0; i < len; i++) { - if(b->pbuffer == b->buffer + b->buffer_len - 1) { - break; - } - *(b->pbuffer ++) = s[i]; - } - *(b->pbuffer) = 0; - return b->pbuffer - p0; -} - -#ifdef MINI_PRINTF_ENABLE_OBJECTS -static int (*mini_handler) (void* data, void* obj, int ch, int lhint, char** bf) = 0; -static void (*mini_handler_freeor)(void* data, void*) = 0; -static void * mini_handler_data = 0; - -void mini_printf_set_handler( - void* data, - int (*handler)(void* data, void* obj, int ch, int len_hint, char** buf), - void (*freeor)(void* data, void* buf)) -{ - mini_handler = handler; - mini_handler_freeor = freeor; - mini_handler_data = data; -} -#endif - -int -mini_vsnprintf(char *buffer, unsigned int buffer_len, const char *fmt, va_list va) -{ - struct mini_buff b; - b.buffer = buffer; - b.pbuffer = buffer; - b.buffer_len = buffer_len; - if(buffer_len == 0) buffer = (void*) 0; - int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va); - if(buffer == (void*) 0) { - return n; - } - return b.pbuffer - b.buffer; -} - -int -mini_vpprintf(int (*puts)(char* s, int len, void* buf), void* buf, const char *fmt, va_list va) -{ - char bf[24]; - char bf2[24]; - char ch; -#ifdef MINI_PRINTF_ENABLE_OBJECTS - void* obj; -#endif - if(puts == (void*)0) { - /* run puts in counting mode. */ - puts = _puts; buf = (void*)0; - } - int n = 0; - while ((ch=*(fmt++))) { - int len; - if (ch!='%') { - len = 1; - len = puts(&ch, len, buf); - } else { - char pad_char = ' '; - int pad_to = 0; - char l = 0; - char *ptr; - - ch=*(fmt++); - - /* Zero padding requested */ - if (ch == '0') pad_char = '0'; - while (ch >= '0' && ch <= '9') { - pad_to = pad_to * 10 + (ch - '0'); - ch=*(fmt++); - } - if(pad_to > (signed int) sizeof(bf)) { - pad_to = sizeof(bf); - } - if (ch == 'l') { - l = 1; - ch=*(fmt++); - } - - switch (ch) { - case 0: - goto end; - case 'u': - case 'd': - if(l) { - len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2); - } else { - if(ch == 'u') { - len = mini_itoa((unsigned long) va_arg(va, unsigned int), 10, 0, 1, bf2); - } else { - len = mini_itoa((long) va_arg(va, int), 10, 0, 0, bf2); - } - } - len = mini_pad(bf2, len, pad_char, pad_to, bf); - len = puts(bf, len, buf); - break; - - case 'x': - case 'X': - if(l) { - len = mini_itoa(va_arg(va, unsigned long), 16, (ch=='X'), 1, bf2); - } else { - len = mini_itoa((unsigned long) va_arg(va, unsigned int), 16, (ch=='X'), 1, bf2); - } - len = mini_pad(bf2, len, pad_char, pad_to, bf); - len = puts(bf, len, buf); - break; - - case 'c' : - ch = (char)(va_arg(va, int)); - len = mini_pad(&ch, 1, pad_char, pad_to, bf); - len = puts(bf, len, buf); - break; - - case 's' : - ptr = va_arg(va, char*); - len = mini_strlen(ptr); - if (pad_to > 0) { - len = mini_pad(ptr, len, pad_char, pad_to, bf); - len = puts(bf, len, buf); - } else { - len = puts(ptr, len, buf); - } - break; -#ifdef MINI_PRINTF_ENABLE_OBJECTS - case 'O' : /* Object by content (e.g. str) */ - case 'R' : /* Object by representation (e.g. repr)*/ - obj = va_arg(va, void*); - len = mini_handler(mini_handler_data, obj, ch, pad_to, &ptr); - if (pad_to > 0) { - len = mini_pad(ptr, len, pad_char, pad_to, bf); - len = puts(bf, len, buf); - } else { - len = puts(ptr, len, buf); - } - mini_handler_freeor(mini_handler_data, ptr); - break; -#endif - default: - len = 1; - len = puts(&ch, len, buf); - break; - } - } - n = n + len; - } -end: - return n; -} - - -int -mini_snprintf(char* buffer, unsigned int buffer_len, const char *fmt, ...) -{ - int ret; - va_list va; - va_start(va, fmt); - ret = mini_vsnprintf(buffer, buffer_len, fmt, va); - va_end(va); - - return ret; -} - -int -mini_pprintf(int (*puts)(char*s, int len, void* buf), void* buf, const char *fmt, ...) -{ - int ret; - va_list va; - va_start(va, fmt); - ret = mini_vpprintf(puts, buf, fmt, va); - va_end(va); - - return ret; -} - diff --git a/attic/ch32v003evt/startup_ch32v003.c b/attic/ch32v003evt/startup_ch32v003.c deleted file mode 100644 index c52564a..0000000 --- a/attic/ch32v003evt/startup_ch32v003.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - C version of CH32V003 Startup .s file from WCH - This file is public domain where possible or the following where not: - Copyright 2023 Charles Lohr, under the MIT-x11 or NewBSD licenses, you choose. -*/ - -#include <stdint.h> -#include <ch32v00x.h> - -int main() __attribute__((used)); -void SystemInit( void ) __attribute__((used)); - -void InterruptVector() __attribute__((naked)) __attribute((section(".init"))) __attribute__((used)); -void handle_reset() __attribute__((naked)) __attribute((section(".text.handle_reset"))) __attribute__((used)); -void DefaultIRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute__((naked)) __attribute__((used)); - -extern uint32_t * _sbss; -extern uint32_t * _ebss; -extern uint32_t * _data_lma; -extern uint32_t * _data_vma; -extern uint32_t * _edata; - - -// If you don't override a specific handler, it will just spin forever. -void DefaultIRQHandler( void ) -{ - // Infinite Loop - asm volatile( "1: j 1b" ); -} - -// This makes it so that all of the interrupt handlers just alias to -// DefaultIRQHandler unless they are individually overridden. -void NMI_Handler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void HardFault_Handler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void SysTick_Handler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void SW_Handler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void WWDG_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void PVD_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void FLASH_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void RCC_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void EXTI7_0_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void AWU_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void DMA1_Channel1_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void DMA1_Channel2_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void DMA1_Channel3_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void DMA1_Channel4_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void DMA1_Channel5_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void DMA1_Channel6_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void DMA1_Channel7_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void ADC1_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void I2C1_EV_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void I2C1_ER_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void USART1_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void SPI1_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void TIM1_BRK_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void TIM1_UP_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void TIM1_TRG_COM_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void TIM1_CC_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); -void TIM2_IRQHandler( void ) __attribute__((section(".text.vector_handler"))) __attribute((weak,alias("DefaultIRQHandler"))) __attribute__((used)); - -void InterruptVector() -{ - asm volatile( "\n\ - .align 2\n\ - .option norvc;\n\ - j handle_reset\n\ - .word 0\n\ - .word NMI_Handler /* NMI Handler */ \n\ - .word HardFault_Handler /* Hard Fault Handler */ \n\ - .word 0\n\ - .word 0\n\ - .word 0\n\ - .word 0\n\ - .word 0\n\ - .word 0\n\ - .word 0\n\ - .word 0\n\ - .word SysTick_Handler /* SysTick Handler */ \n\ - .word 0\n\ - .word SW_Handler /* SW Handler */ \n\ - .word 0\n\ - /* External Interrupts */ \n\ - .word WWDG_IRQHandler /* Window Watchdog */ \n\ - .word PVD_IRQHandler /* PVD through EXTI Line detect */ \n\ - .word FLASH_IRQHandler /* Flash */ \n\ - .word RCC_IRQHandler /* RCC */ \n\ - .word EXTI7_0_IRQHandler /* EXTI Line 7..0 */ \n\ - .word AWU_IRQHandler /* AWU */ \n\ - .word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ \n\ - .word DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */ \n\ - .word DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */ \n\ - .word DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */ \n\ - .word DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */ \n\ - .word DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */ \n\ - .word DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */ \n\ - .word ADC1_IRQHandler /* ADC1 */ \n\ - .word I2C1_EV_IRQHandler /* I2C1 Event */ \n\ - .word I2C1_ER_IRQHandler /* I2C1 Error */ \n\ - .word USART1_IRQHandler /* USART1 */ \n\ - .word SPI1_IRQHandler /* SPI1 */ \n\ - .word TIM1_BRK_IRQHandler /* TIM1 Break */ \n\ - .word TIM1_UP_IRQHandler /* TIM1 Update */ \n\ - .word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */ \n\ - .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ \n\ - .word TIM2_IRQHandler /* TIM2 */ \n"); -} - - - -void handle_reset() -{ - asm volatile( "\n\ -.option push\n\ -.option norelax\n\ - la gp, __global_pointer$\n\ -.option pop\n\ - la sp, _eusrstack\n" - // Setup the interrupt vector, processor status and INTSYSCR. -" li t0, 0x80\n\ - csrw mstatus, t0\n\ - li t0, 0x3\n\ - csrw 0x804, t0\n\ - la t0, InterruptVector\n\ - ori t0, t0, 3\n\ - csrw mtvec, t0\n" - ); - - // Careful: Use registers to prevent overwriting of self-data. - // This clears out BSS. - register uint32_t * tempout = _sbss; - register uint32_t * tempend = _ebss; - while( tempout < tempend ) - *(tempout++) = 0; - - // Once we get here, it should be safe to execute regular C code. - - // Load data section from flash to RAM - register uint32_t * tempin = _data_lma; - tempout = _data_vma; - tempend = _edata; - while( tempout != tempend ) - *(tempout++) = *(tempin++); - - __set_MEPC( (uint32_t)main ); - - // set mepc to be main as the root app. - asm volatile( "mret\n" ); -} - -void SystemInit48HSI( void ) -{ - // Values lifted from the EVT. There is little to no documentation on what this does. - RCC->CTLR = RCC_HSION | RCC_PLLON; // Use HSI, but enable PLL. - RCC->CFGR0 = RCC_HPRE_DIV1 | RCC_PLLSRC_HSI_Mul2; // PLLCLK = HSI * 2 = 48 MHz; HCLK = SYSCLK = APB1 - FLASH->ACTLR = FLASH_ACTLR_LATENCY_1; // 1 Cycle Latency - RCC->INTR = 0x009F0000; // Clear PLL, CSSC, HSE, HSI and LSI ready flags. - - // From SetSysClockTo_48MHZ_HSI - while((RCC->CTLR & RCC_PLLRDY) == 0); // Wait till PLL is ready - RCC->CFGR0 = ( RCC->CFGR0 & ((uint32_t)~(RCC_SW))) | (uint32_t)RCC_SW_PLL; // Select PLL as system clock source - while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source -} - -void SetupUART( int uartBRR ) -{ - // Enable GPIOD and UART. - RCC->APB2PCENR |= RCC_APB2Periph_GPIOD | RCC_APB2Periph_USART1; - - // Push-Pull, 10MHz Output, GPIO D5, with AutoFunction - GPIOD->CFGLR &= ~(0xf<<(4*5)); - GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<(4*5); - - // 115200, 8n1. Note if you don't specify a mode, UART remains off even when UE_Set. - USART1->CTLR1 = USART_WordLength_8b | USART_Parity_No | USART_Mode_Tx; - USART1->CTLR2 = USART_StopBits_1; - USART1->CTLR3 = USART_HardwareFlowControl_None; - - USART1->BRR = uartBRR; - USART1->CTLR1 |= CTLR1_UE_Set; -} - - -// For debug writing to the UART. -int _write(int fd, char *buf, int size) -{ - for(int i = 0; i < size; i++){ - while( !(USART1->STATR & USART_FLAG_TC)); - USART1->DATAR = *buf++; - } - return size; -} - - diff --git a/attic/ch32v003evt/system_ch32v00x.h b/attic/ch32v003evt/system_ch32v00x.h deleted file mode 100644 index 04d516e..0000000 --- a/attic/ch32v003evt/system_ch32v00x.h +++ /dev/null @@ -1,28 +0,0 @@ -/********************************** (C) COPYRIGHT ******************************* - * File Name : system_ch32v00x.h - * Author : WCH - * Version : V1.0.0 - * Date : 2022/08/08 - * Description : CH32V00x Device Peripheral Access Layer System Header File. -********************************************************************************* -* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. -* Attention: This software (modified or not) and binary are used for -* microcontroller manufactured by Nanjing Qinheng Microelectronics. -*******************************************************************************/ -#ifndef __SYSTEM_CH32V00x_H -#define __SYSTEM_CH32V00x_H - -#ifdef __cplusplus - extern "C" { -#endif - -// Stub - -#ifdef __cplusplus -} -#endif - -#endif /*__CH32V00x_SYSTEM_H */ - - - diff --git a/attic/cnlohr-notes.txt b/attic/cnlohr-notes.txt deleted file mode 100644 index 91e28ea..0000000 --- a/attic/cnlohr-notes.txt +++ /dev/null @@ -1,7 +0,0 @@ - -Overvolting notes: - * Tests done at 24MHz, no PLL. - * If running from flash, browns out at around 8V. - * If running from RAM, can go up to around 10V before it blows up. - * IN SPITE of PC5/PC6 being listed as FT inputs, Applying about >2.5V higher than VCC will blow up the chip. - * Trying to run off LDO - still blows up at 10.5V. diff --git a/attic/dont_use_wch_printf.c b/attic/dont_use_wch_printf.c deleted file mode 100644 index 8c53e6c..0000000 --- a/attic/dont_use_wch_printf.c +++ /dev/null @@ -1,84 +0,0 @@ -#include <stdio.h> -#include "wch_link_base.h" - -// TESTED - -int main() -{ - libusb_device_handle * devh = wch_link_base_setup(1); - - // Place part into reset. - wch_link_command( devh, "\x81\x0d\x01\x01", 4, 0, 0, 0 ); // Reply is: "\x82\x0d\x04\x02\x08\x02\x00" - // TODO: What in the world is this? It doesn't appear to be needed. - wch_link_command( devh, "\x81\x0c\x02\x09\x02", 5, 0, 0, 0 ); //Reply is: 820c0101 - -// // This puts the processor on hold to allow the debugger to run. -// wch_link_command( devh, "\x81\x0d\x01\x02", 4, 0, 0, 0 ); // Reply: Ignored, 820d050900300500 - - wch_link_command( devh, "\x81\x0d\x01\x02", 4, 0, 0, 0 ); - - // Issue reset -// wch_link_command( devh, "\x81\x0b\x01\x01", 4, 0, 0, 0 ); - // Why does db[1] = 6 appear to be some sort of query? - // Also 0x0b appears to be a query. But it wrecks up the chip. - // db[1] = 0xd DOES WRITE TO 0xe0000000. But is it predictable? - // db[1] = 8 => get some sort of status back. This is VERY INTERESTING - // db[11]=Get chip status. Only works in reboot mode. - // DO NOT 0x0f! - - // when in pause mode - // d 0 2 => Go into reset mode,and do more stuff. - // d 0 10 => Force chip into mode but no preamble. - // Found one: 0x0d 0x00 0x03 will write something into the data reg when in debug mode. - // Will write other data into the debug register. - - // 0x81, 0x00 = ??? No ops. - // 0x81, 0x01 = ??? No ops. - // 0x81, 0x01 = ??? No ops. - // 0x81, 0x02 = Lots of ops, if in debug mode, wacks chip. If regular, no bug. - // 0x81, 0x03 = ??? No ops. - // 0x81, 0x04 = ??? No ops. - // 0x81, 0x05 = ??? No ops. - // 0x81, 0x06 = Lots of ops ,no clarity. - // 0x81, 0x07 = ??? No ops. - // 0x81, 0x08 = Lots of ops. - // In debug mode: 82 08 06 00 00 00 00 00 00 - // In run mode: 82 08 06 7f ff ff ff ff 03 - // 0x81, 0x09 = ??? No ops. - // 0x81, 0x0a = ??? No ops - // 0x81, 0x0b = Lots of chatter but no go. - // 0x81, 0x0c = ??? No ops - // 0x81, 0x0d, 0x00, 0x01 --> Halts in such a way d,1,ff does't unhalt. - // 0x81, 0x0d, 0x01, 0x01 --> Halts in such a way d,1,ff does't unhalt. - // 0x81, 0x0d, 0x01, 0x02 --> Normal Halt. - // 0x81, 0x0d, 0x00, 0x03 --> If in debug mode, will write cdef89ab into f4 (data0) - // 0x81, 0x0e = ??? No ops - // 0x81, 0x10 = ??? No ops - // 0x81, 0x11, 0, 0: ==> 20: 82 0d 04 02 08 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - // or sometimes ==> 20: 82 0d 04 02 08 02 00 00 88 b3 bc 48 ff ff ff ff 00 30 05 00 - // Point is 0x11 actually comms with the device in non-reset mode. - // 0x81, 0x12 = ??? No ops - // 0x81, 0x13 = ??? No ops - // 0x81, 0x14 = ??? No ops - // 0x81, 0x15 = ??? No ops - - unsigned char databuff[11] = { 0x81, 0x08, 0x08, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - unsigned char rbuff[1024]; - int i, j; -// for( i = 0; i < 20; i++ ) -// for( j = 0; j < 20; j++ ) - { - databuff[2] = i; - databuff[3] = j; - int transferred; - wch_link_command( devh, databuff, 11, &transferred, rbuff, 1024 ); - int k; - printf( "%d, %d: %d: ", i, j, transferred ); - for( k = 0; k < transferred; k++ ) printf( "%02x ", rbuff[k] ); - printf( "\n" ); - usleep(10000); - } - - // Close out. - wch_link_command( devh, "\x81\x0d\x01\xff", 4, 0, 0, 0 ); -} diff --git a/attic/external_crystal_run_from_ram_turbo.c b/attic/external_crystal_run_from_ram_turbo.c deleted file mode 100644 index 8951252..0000000 --- a/attic/external_crystal_run_from_ram_turbo.c +++ /dev/null @@ -1,54 +0,0 @@ -// Could be defined here, or in the processor defines. -#define SYSTEM_CORE_CLOCK 24000000 - -#include "ch32v003fun.h" -#include <stdio.h> - -uint32_t count; - -void RamFunction() __attribute__((naked)); -void RamFunction() -{ - asm volatile("\n\ - li a0, 1 | (1<<4)\n\ - li a1, (1<<16) | (1<<(16+4))\n\ - la a2, 0x40011410\n\ -1:\n\ - c.sw a0, 0(a2)\n\ - c.sw a1, 0(a2)\n\ - c.sw a0, 0(a2)\n\ - c.sw a1, 0(a2)\n\ - c.sw a0, 0(a2)\n\ - c.sw a1, 0(a2)\n\ - c.sw a0, 0(a2)\n\ - c.sw a1, 0(a2)\n\ - j 1b" ); -} - -uint8_t rambuffer[128]; - -int main() -{ - EXTEN->EXTEN_CTR = EXTEN_LDO_TRIM; // Boost LDO. - SystemInitHSEPLL( RCC_HSEBYP ); - // When running from RAM appears to go up to about 96MHz. - - // Enable GPIOD. - RCC->APB2PCENR |= RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC; - - // GPIO D0 Push-Pull, 10MHz Output - GPIOD->CFGLR &= ~(0xf<<(4*0)); - GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*0); - - // GPIO D0 Push-Pull, 10MHz Output - GPIOD->CFGLR &= ~(0xf<<(4*4)); - GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*4); - - // GPIO D0 Push-Pull, 10MHz Output - GPIOC->CFGLR &= ~(0xf<<(4*4)); - GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*4); - -memcpy( rambuffer, RamFunction, 128 ); - void (*fn)() = (void*) rambuffer; - fn(); -} diff --git a/attic/flashtests/wch_erase.c b/attic/flashtests/wch_erase.c deleted file mode 100644 index 2772289..0000000 --- a/attic/flashtests/wch_erase.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include "wch_link_base.h" - -// UNTESTED - -int main() -{ - uint8_t rbuff[1024]; - libusb_device_handle * devh = wch_link_base_setup(0); - int transferred; - int status; - WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x02\x01\x01", 4, &transferred, WCHTIMEOUT) ); - WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. - WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x02", 4, &transferred, WCHTIMEOUT) ); - WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. - WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\xff", 4, &transferred, WCHTIMEOUT) ); - WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. -} diff --git a/attic/flashtests/wch_printf.c b/attic/flashtests/wch_printf.c deleted file mode 100644 index 1d78ee8..0000000 --- a/attic/flashtests/wch_printf.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <stdio.h> -#include "wch_link_base.h" - -// TESTED - -int main() -{ - libusb_device_handle * devh = wch_link_base_setup(); - - // Issue reset -// wch_link_command( devh, "\x81\x0b\x01\x01", 4, 0, 0, 0 ); - // Why does db[1] = 6 appear to be some sort of query? - // Also 0x0b appears to be a query. But it wrecks up the chip. - // db[1] = 0xd DOES WRITE TO 0xe0000000. But is it predictable? - // DO NOT 0x0f! - unsigned char databuff[11] = { 0x81, 0x0d, 0x08, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - unsigned char rbuff[1024]; - int i, j; - for( i = 1; i < 20; i++ ) - for( j = 1; j < 20; j++ ) - { - databuff[2] = i; - databuff[3] = j; - int transferred; - wch_link_command( devh, databuff, 11, &transferred, rbuff, 1024 ); - int k; - printf( "%d, %d: %d: ", i, j, transferred ); - for( k = 0; k < transferred; k++ ) printf( "%02x ", rbuff[k] ); - printf( "\n" ); - usleep(10000); - } - - // Close out. - wch_link_command( devh, "\x81\x0d\x01\xff", 4, 0, 0, 0 ); -} diff --git a/attic/flashtests/wch_query.c b/attic/flashtests/wch_query.c deleted file mode 100644 index 2bab1f7..0000000 --- a/attic/flashtests/wch_query.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> -#include "wch_link_base.h" - -// TODO Make me actually query data! - -int main() -{ - - libusb_device_handle * devh = wch_link_base_setup(0); - int transferred; - int status; - char rbuff[1024]; - - WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x06\x01\x01", 4, &transferred, WCHTIMEOUT) ); - WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. -//"\x82\x06\x01\x02" << back in - - WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x11\x01\x09", 4, &transferred, WCHTIMEOUT) ); // Checkme with BULK_IN - WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, WCHTIMEOUT) ); // Checkme with BULK_IN - printf( "Query data: %d\n", transferred ); - int i; - for( i = 0; i < transferred; i++ ) - { - printf( "%02x ", (unsigned char)rbuff[i] ); - } - printf( "\n" ); - -// Note this is for CH32V003, MCU UID 20-9e-ab-cd-88-b3-bc-84 -//Respone is: -//"\xff\xff\x00\x10\x20\x9e\xab\xcd\x88\xb3\xbc\x48\xff\xff\xff\xff" \ - -//"\x00\x30\x05\x00" << Back in. <<<< QUERY DATA. - WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x04", 4, &transferred, WCHTIMEOUT) ); // Odd that it did it twice - maybe something took too long on the proc. - WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. -//"\x82\x0d\x01\x03" <<< Streamed back in. - WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\xff", 4, &transferred, WCHTIMEOUT) ); // Odd that it did it twice - maybe something took too long on the proc. - WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. -//"\x82\x0d\x01\xff" <<< Streamed back in. -} diff --git a/attic/flashtests/wch_reset.c b/attic/flashtests/wch_reset.c deleted file mode 100644 index df8cadb..0000000 --- a/attic/flashtests/wch_reset.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include "wch_link_base.h" - -// TESTED - -int main() -{ - libusb_device_handle * devh = wch_link_base_setup(0); - - // Issue reset - wch_link_command( devh, "\x81\x0b\x01\x01", 4, 0, 0, 0 ); - - // Close out. - wch_link_command( devh, "\x81\x0d\x01\xff", 4, 0, 0, 0 ); -} diff --git a/attic/flashtests/wch_write_simple.c b/attic/flashtests/wch_write_simple.c deleted file mode 100644 index 838a881..0000000 --- a/attic/flashtests/wch_write_simple.c +++ /dev/null @@ -1,125 +0,0 @@ -#include <stdio.h> -#include "wch_link_base.h" - -// tested -// Having some difficulty with the base. - -const uint8_t * bootloader = (const uint8_t*) -"\x21\x11\x22\xca\x26\xc8\x93\x77\x15\x00\x99\xcf\xb7\x06\x67\x45" \ -"\xb7\x27\x02\x40\x93\x86\x36\x12\x37\x97\xef\xcd\xd4\xc3\x13\x07" \ -"\xb7\x9a\xd8\xc3\xd4\xd3\xd8\xd3\x93\x77\x25\x00\x9d\xc7\xb7\x27" \ -"\x02\x40\x98\x4b\xad\x66\x37\x33\x00\x40\x13\x67\x47\x00\x98\xcb" \ -"\x98\x4b\x93\x86\xa6\xaa\x13\x67\x07\x04\x98\xcb\xd8\x47\x05\x8b" \ -"\x63\x16\x07\x10\x98\x4b\x6d\x9b\x98\xcb\x93\x77\x45\x00\xa9\xcb" \ -"\x93\x07\xf6\x03\x99\x83\x2e\xc0\x2d\x63\x81\x76\x3e\xc4\xb7\x32" \ -"\x00\x40\xb7\x27\x02\x40\x13\x03\xa3\xaa\xfd\x16\x98\x4b\xb7\x03" \ -"\x02\x00\x33\x67\x77\x00\x98\xcb\x02\x47\xd8\xcb\x98\x4b\x13\x67" \ -"\x07\x04\x98\xcb\xd8\x47\x05\x8b\x69\xe7\x98\x4b\x75\x8f\x98\xcb" \ -"\x02\x47\x13\x07\x07\x04\x3a\xc0\x22\x47\x7d\x17\x3a\xc4\x79\xf7" \ -"\x93\x77\x85\x00\xf1\xcf\x93\x07\xf6\x03\x2e\xc0\x99\x83\x37\x27" \ -"\x02\x40\x3e\xc4\x1c\x4b\xc1\x66\x2d\x63\xd5\x8f\x1c\xcb\x37\x07" \ -"\x00\x20\x13\x07\x07\x20\xb7\x27\x02\x40\xb7\x03\x08\x00\xb7\x32" \ -"\x00\x40\x13\x03\xa3\xaa\x94\x4b\xb3\xe6\x76\x00\x94\xcb\xd4\x47" \ -"\x85\x8a\xf5\xfe\x82\x46\xba\x84\x37\x04\x04\x00\x36\xc2\xc1\x46" \ -"\x36\xc6\x92\x46\x84\x40\x11\x07\x84\xc2\x94\x4b\xc1\x8e\x94\xcb" \ -"\xd4\x47\x85\x8a\xb1\xea\x92\x46\xba\x84\x91\x06\x36\xc2\xb2\x46" \ -"\xfd\x16\x36\xc6\xf9\xfe\x82\x46\xd4\xcb\x94\x4b\x93\xe6\x06\x04" \ -"\x94\xcb\xd4\x47\x85\x8a\x85\xee\xd4\x47\xc1\x8a\x85\xce\xd8\x47" \ -"\xb7\x06\xf3\xff\xfd\x16\x13\x67\x07\x01\xd8\xc7\x98\x4b\x21\x45" \ -"\x75\x8f\x98\xcb\x52\x44\xc2\x44\x61\x01\x02\x90\x23\x20\xd3\x00" \ -"\xf5\xb5\x23\xa0\x62\x00\x3d\xb7\x23\xa0\x62\x00\x55\xb7\x23\xa0" \ -"\x62\x00\xc1\xb7\x82\x46\x93\x86\x06\x04\x36\xc0\xa2\x46\xfd\x16" \ -"\x36\xc4\xb5\xf2\x98\x4b\xb7\x06\xf3\xff\xfd\x16\x75\x8f\x98\xcb" \ -"\x41\x89\x05\xcd\x2e\xc0\x0d\x06\x02\xc4\x09\x82\xb7\x07\x00\x20" \ -"\x32\xc6\x93\x87\x07\x20\x98\x43\x13\x86\x47\x00\xa2\x47\x82\x46" \ -"\x8a\x07\xb6\x97\x9c\x43\x63\x1c\xf7\x00\xa2\x47\x85\x07\x3e\xc4" \ -"\xa2\x46\x32\x47\xb2\x87\xe3\xe0\xe6\xfe\x01\x45\x61\xb7\x41\x45" \ -"\x51\xb7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \ -"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \ -"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"; - -int bootloader_len = 512; - - -int main( int argc, char ** argv ) -{ - int i; - int status; - uint8_t rbuff[1024]; - - if( argc != 2 ) - { - fprintf( stderr, "Usage: wch_write_simple [binfile]\n" ); - } - - FILE * f = fopen( argv[1], "rb" ); - fseek( f, 0, SEEK_END ); - int len = ftell( f ); - fseek( f, 0, SEEK_SET ); - int padlen = ((len-1) & (~0x3f)) + 0x40; - char * image = malloc( padlen ); - memset( image, 0xff, padlen ); - status = fread( image, len, 1, f ); - fclose( f ); - - if( status != 1 ) - { - fprintf( stderr, "Error: File I/O Fault.\n" ); - return -10; - } - if( len > 16384 ) - { - fprintf( stderr, "Error: Image for CH32V003 too large\n" ); - return -9; - } - - libusb_device_handle * devh = wch_link_base_setup(0); - int transferred; - wch_link_command( devh, "\x81\x06\x01\x01", 4, 0, 0, 0 ); - wch_link_command( devh, "\x81\x06\x01\x01", 4, 0, 0, 0 ); // Not sure why but it seems to work better when we request twice. - - // This contains the write data quantity, in bytes. (The last 2 octets) - // Then it just rollllls on in. - char rksbuff[11] = { 0x81, 0x01, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - rksbuff[9] = len >> 8; - rksbuff[10] = len & 0xff; - wch_link_command( devh, rksbuff, 11, 0, 0, 0 ); - - wch_link_command( devh, "\x81\x02\x01\x05", 4, 0, 0, 0 ); - - int pplace = 0; - for( pplace = 0; pplace < bootloader_len; pplace += 64 ) - { - WCHCHECK( libusb_bulk_transfer( devh, 0x02, (uint8_t*)(bootloader+pplace), 64, &transferred, WCHTIMEOUT ) ); - } - - for( i = 0; i < 10; i++ ) - { - wch_link_command( devh, "\x81\x02\x01\x07", 4, &transferred, rbuff, 1024 ); - if( transferred == 4 && rbuff[0] == 0x82 && rbuff[1] == 0x02 && rbuff[2] == 0x01 && rbuff[3] == 0x07 ) - { - break; - } - } - if( i == 10 ) - { - fprintf( stderr, "Error, confusing respones to 02/01/07\n" ); - exit( -109 ); - } - - wch_link_command( devh, "\x81\x02\x01\x02", 4, 0, 0, 0 ); - - for( pplace = 0; pplace < padlen; pplace += 64 ) - { - WCHCHECK( libusb_bulk_transfer( devh, 0x02,image+pplace, 64, &transferred, WCHTIMEOUT ) ); - } - - // Waiting or something on 2.46.2??????? I don't know why the main system does this. -// WCHCHECK( libusb_bulk_transfer( devh, 0x82, rbuff, 1024, &transferred, 2000 ) ); // Ignore respone. - - // Issue reset (this is optional) - wch_link_command( devh, "\x81\x0b\x01\x01", 4, 0, 0, 0 ); - - // Closeout - wch_link_command( devh, "\x81\x0d\x01\xff", 4, 0, 0, 0); -} diff --git a/attic/on-wire-protocol-notes.txt b/attic/on-wire-protocol-notes.txt deleted file mode 100644 index 70580c5..0000000 --- a/attic/on-wire-protocol-notes.txt +++ /dev/null @@ -1,175 +0,0 @@ -Genearl Procedure: - -Watch the signal. - -> One wire - -> Measure timing - -> Count bulk numbers of bits? - -> Is it encoded funny - -> Same timing for several bits? - -> Same number of edges for bits? - -> Write out 1's and 0's - -> Find a "counting" thing to discover MSBit first. - -> Write it out in Notepad++ - -> Look for which bits change and which ones don't. - -> Seeing slight variations on timing to identify whether it's host or client talking. - This is with Part ID 20-9e-ab-cd-88-b3-bc-48 << - -> By knowing the part ID we can search for it in what we think are the replies from the chip. - -> Once found we can make more sense of the rest of the protocol. - -> Also, look at the USB protocol to the WCH-Link - -> Ok, that was worthless. - -> Try running the programmer without a processor connected. - -> wow! Turns out the processor doesn't "send data back" - -> Instead, the host drives a line low then goes high-z - -> Then the chip decides to "drive the line high" if it's a 1. - - -There is an initial training pattern. - -Start with line high. - -FIRST: - low for 8.2us - high for 3.1us - low for 9.2us - high for 3.1us - low for 102.3us - high for 95.3us - -Then repeat this, 199 times - low for 4.07s - high for 3.1us - low for 8.26us - high for 3.1us - low for 9.3us - high for 3.1us - low for 102.3us - high for 95.1us - -Then, repeat this 10x - low for 4.1us - high for 210us - low for 6.3us - high for 2us - low for 8.4us - high for 2us - low for 6.2us - high for 2.4us - low for 5.2us - high for 2.1us - low for 62.3us - high for 2.1us - low for 8.5us - high for 5.3us - low for 2us - high for 8.4us - low for 6.3us - high for 2.1us - low for 8.4us - high for 2.1us - low for 6.9us - high for 1.7us - low for 5.3us - high for 2.1us - low for 63.3us - high for 2.1us - low for 8.4us - high for 5.3us - low for 2us - high for 5.8us - low for 6.3us - high for 2.1us - low for 6.3us - high for 2.1us - low for 8us - high for 1.6us - low for 6.6us - high for 80us << Actually this goes "high-z" the last time. The target chip will drive it high if present until... <This doesn't seem to be crucial> - - -low for 2us -high for 5.3us - -then the break. - - -*** 2ms low break *** - - -line goes high for 620ns and BOOM we begin our session. - -Then, there is a one-wire like protocol for data comms. Thanks, Spirit. - -Sending data goes: - 0: on-for-250-ns off-for-1000-ns - 1: on-for-250-ns off-for-250-ns - -For replies from the processor: - The clocking is still controlled by the host. - The host drives the line low, goes high Z with pull-up. - The processor can drive the line low for this period to indicate a 0. - 0: on-for-320us off-for-790ns / Total: 1100ns - 1: on-for-320us off-for-420ns / Total: 740ns - - -"/" indicates flip to chip instead of programmer - -Then the data starts. - -"Issue Chip Reset": - -11 1111101 01011010 10100101 00000100 00000000 -11 1111011 01011010 10100101 00000100 00000000 -11 1111000/00000000 00000001 00000100 00000011 << I thought this was "turned around" but it seems the main uc controls the clocking and it's up to the uc to drive high. -1 0010001 0/00000000 01001111 00000011 10000010 -1 0010000 1 10000000 00000000 00000000 00000001 -1 0010000 1 10000000 00000000 00000000 00000001 -1 0010110 0/00001000 00000000 00000000 00000010 --- -10 0100010/00000000 01001111 00000011 10000010 -11 1111110/00000000 00110000 00000101 00000000 -10 0001011 00011111 11111111 11110111 11000100 -10 0101111 00000000 00000100 00000000 00000000 -10 0001000/00000000 00110000 00000101 00000000 -10 0001001 00000000 00000000 00000011 00000111 -10 0101111 00000000 00100011 00000111 11000000 --- -10 0001011 00011111 11111111 11110111 11100000 -10 0101111 00000000 00000100 00000000 00000000 -10 0001000/11111111 11111111 00000000 00010000 <<<< CAPACITY First 4 bytes of the response from "\x81\x11\x01\x09" -10 0001011 00011111 11111111 11110111 11101000 -10 0101111 00000000 00000100 00000000 00000000 -10 0001000/00100000 10011110 10101011 11001101 <<<< CHIP UID -10 0001011 00011111 11111111 11110111 11101100 -10 0101111 00000000 00000100 00000000 00000000 -10 0001000/10001000 10110011 10111100 01001000 <<<< CHIP UID -10 0001011 00011111 11111111 11110111 11110000 -10 0101111 00000000 00000100 00000000 00000000 -10 0001000/00000000 00000000 00000000 00000000 *** UNSURE ABOUT THIS LINE >> Actually probably all 1's *** -10 0001011 00011111 11111111 11110111 11000100 -10 0101111 00000000 00000100 00000000 00000000 -10 0001000/00000000 00110000 00000101 00000000 - -10 0100010 00000000 01001111 00000011 10000010 -10 0100011 00000000 00000000 00000000 00000001 -10 0100001 10000000 00000000 00000000 00000001 -10 0101100 00001000 00000000 00000000 00000010 - -10 0100010 00000000 01001111 00000011 10000010 -10 0001011 11100000 00000000 11100000 01001000 -10 0001001 10111110 11101111 00000000 10000000 -10 1000001 01111011 00100101 00010000 01110011 -10 1000011 01111011 00110101 10010000 01110011 -10 1000101 11100000 00000000 00000101 00110111 -10 1000111 00001111 10000101 00100101 10000011 -10 1001011 00100101 01110011 11000001 10001000 -10 1001101 00100101 11110011 01111011 00100000 -10 1001111 10010000 00000010 01111011 00110000 -10 0101111 00000000 00000100 00000000 00000000 - - -wch_link_command( devh, "\x81\x0d\x01\xff", 4, 0, 0, 0); -10 0100001 01000000 00000000 00000000 00000001 -10 0100001 01000000 00000000 00000000 00000000 -10 0100010 00000000 01001100 00001100 10000010 - - diff --git a/attic/wch_dump_flash.c b/attic/wch_dump_flash.c deleted file mode 100644 index 5105e09..0000000 --- a/attic/wch_dump_flash.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> -#include "wch_link_base.h" - -// TODO Make me actually query data! - -int main() -{ - int i; - int transferred; - int status; - char rbuff[1024]; - libusb_device_handle * devh = wch_link_base_setup(0); - - wch_link_command( devh, "\x81\x06\x01\x01", 4, 0, 0, 0 ); - - // Flush out any pending data. - libusb_bulk_transfer( devh, 0x82, rbuff, 1024, &transferred, 1 ); - - // 3/8 = Read Memory - // First 4 bytes are big-endian location. - // Next 4 bytes are big-endian amount. - uint8_t readop[11] = { 0x81, 0x03, 0x08, }; - uint32_t readptr = 0x08000000; - uint32_t amount = 16384; - - readop[3] = (readptr>>24)&0xff; - readop[4] = (readptr>>16)&0xff; - readop[5] = (readptr>>8)&0xff; - readop[6] = (readptr>>0)&0xff; - - readop[7] = (amount>>24)&0xff; - readop[8] = (amount>>16)&0xff; - readop[9] = (amount>>8)&0xff; - readop[10] = (amount>>0)&0xff; - - wch_link_command( devh, readop, 11, 0, 0, 0 ); - - // Perform operation - wch_link_command( devh, "\x81\x02\x01\x0c", 4, 0, 0, 0 ); - - printf( "WARNING ENDIAN WILL BE REVERSED\n" ); - - uint32_t remain = amount; - while( remain ) - { - WCHCHECK( libusb_bulk_transfer( devh, 0x82, rbuff, 1024, &transferred, WCHTIMEOUT ) ); - for( i = 0; i < transferred; i++ ) - printf( "%08x", (uint8_t)rbuff[i] ); - printf( "\n" ); - remain -= transferred; - } - - wch_link_command( devh, "\x81\x0d\x01\xff", 4, 0, 0, 0 ); -} diff --git a/attic/factory_bootloader.bin b/misc/factory_bootloader.bin similarity index 100% rename from attic/factory_bootloader.bin rename to misc/factory_bootloader.bin -- GitLab From bf7c4b38c72e6019af3197cf1ef96c87e655fbc5 Mon Sep 17 00:00:00 2001 From: cnlohr <lohr85@gmail.com> Date: Sat, 27 Apr 2024 14:02:07 -0700 Subject: [PATCH 2/3] Move some media --- examples/spi_max7219/README.md | 2 +- examples/spi_max7219/demo_pic.jpg | Bin 224985 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 examples/spi_max7219/demo_pic.jpg diff --git a/examples/spi_max7219/README.md b/examples/spi_max7219/README.md index 2605e21..399656b 100644 --- a/examples/spi_max7219/README.md +++ b/examples/spi_max7219/README.md @@ -16,4 +16,4 @@ The example expects you to connect a MAX7219 based 7 segment 8 character display You can choose which examples will be shown on the display by changing the `spi_max7219.c` file in the marked demo selection section. All examples are enabled by default. Once running, you'll see one of the many examples being displayed like so: - \ No newline at end of file + diff --git a/examples/spi_max7219/demo_pic.jpg b/examples/spi_max7219/demo_pic.jpg deleted file mode 100644 index 33b15eb2cab5b746ab7105910e78c82bf92cab2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224985 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�oHrzqnL5|7*msKZ&k3=ZKg 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	$NtUrb9Z)+!$OY6-F^nCazM4ePg=ml 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 -- GitLab From 1772b48e9c2be938f9df45a3f145327e86fdebd2 Mon Sep 17 00:00:00 2001 From: cnlohr <lohr85@gmail.com> Date: Sat, 27 Apr 2024 14:04:10 -0700 Subject: [PATCH 3/3] Move over breadboard --- examples/adc_dma_opamp/README.md | 2 +- examples/adc_dma_opamp/breadboard.png | Bin 440457 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 examples/adc_dma_opamp/breadboard.png diff --git a/examples/adc_dma_opamp/README.md b/examples/adc_dma_opamp/README.md index fe6c174..b501b0c 100644 --- a/examples/adc_dma_opamp/README.md +++ b/examples/adc_dma_opamp/README.md @@ -42,7 +42,7 @@ be done by accessing the user option byte in flash memory. For this case I went off of the WCH EVT board and lashed up a "raw" CH32V003 on a breadboard using the PA1 and PA2 pins. - +  ## Use diff --git a/examples/adc_dma_opamp/breadboard.png b/examples/adc_dma_opamp/breadboard.png deleted file mode 100644 index f772a36693823045977df2ab6135969fec12d730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 440457 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: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�<5SAu}sh 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�=@}3yA zK9dz<3FJiZ!BXK_AmoTBaICAL0HQI5$i_sBk3V|h$@6EJ1A=lDEfr>pf%<-FYJqD} z`uKY;Joe}XQzK##2r;CFh>VDsj2TR_?~>a#iOA{GyW2ZEgzTQq7}I1jMskK_nT*Gb z3TlB7ny5ku_|cDigej;Qg^*Iywvns{6;+E(6Uk7slvNBEL-Wvu3!nMSXNqZx(Jc`h z(<uiuD4>GKjHFpTd^&7QpMUPTCmw&i&;78=r0v<PX*g0r>qH76w6PVU1;cpMJpIhm zPd)V{qKayaF$6kw>U3%+3WlJ_z+fspm=M`yG<y2IPd@(W!v}{4{<+ybz1KF06A~%F z3ITHwgIV8orIZ-cV~;()vALCVRzSco+1iP*EmDGHRTNRT)3~-4DeaxT$T5P6ltM&` zEpbaBY0>(5F*ATt1PoKtF4KHfvZk1_auH^UA!s&r^qr5;4Pw(k+bp}ho;)LB2(j<G zb#+KgK0&R0-$|50?O0UBGh>EZmPeyDrgphpuKh^Eg*`M+2sLOz9b#yk8}0j_dGgYw zE32;CXlZjC6Lf}!z?Q4kcs#;-N7int6c4QAjoHS*;en}RZgsv`P9`HHeozaxTrOQd z-;Ub0ZI6$SOi7A%t5vsJjmE93V?7hki#a0N+}zljZ7i2_uPf*C#p3vQys<Hy+lq>% zlu`;4wQbtko~>4MBp{;Ya=9*923s@F=kvqEBLEnUN7Iez{=tEP0q}gj+URmh>A|T$ z*L92KQdFlKlkM%T8#iu<VBgEZ!BNwUyk-g^_+O=zW|pQK)9J=6#@o4cF^0u**|v$u z`3#7NzUP8mq==}<aG?(Bg$Jx=Kt!Ql3VziOMXsGBU162Mtgqh_nzM?k!dk~v?=}Fn zQgg2faQ!B!m%!Bo?CfNJbWBjI*`LwxQ}1X+C0mVxF(1>qagZsfI-m;!4yjuJ?phJa z^{&%OpZE42)i-ujMao0&qu<$8C|Kp)G&I)U_fVB@N4j+P_G+L*o;<F$epB6?s-8CO z=&w5EM|3OR(1F%?xk?#Ze=9mk`t(l_AR2@VI}eSNu;Mg*U;!#+&AS;Aq3T;f1Wb1C z{v88QM@H1}Ng|(Fn=&Avr9f{V9N}?yYbyWj|Nh-x@!GYQSF8K~_<#OiZ|)z2(djqe zc%^K|KmX=;<Ls=JZnf%u^Phk2_TgK`r`~$w_20bw?bH+<wNaKwNBgh6`r4Pj{8gdT zxnE|4fAhP4c(lxB>1*Hm%WJp3JI^IhS}a%l``3*Rj5k03`QHw@&^8~gRy8(*X~+vf zCZ42b@6_%aZ@m6{|MvH8-@W(gPyfuPKK<#<o$W7w`75e2n@x*~F*?Vtj`S;OWLT}& z*@_D-$+<g<ZuP6(Z7oj`y;L_JC)2P-uCK7m^pMGsZbrm9l!k6wcf1)f0f&$p(cH9w zgI1apiD$1OR%x-r!&Ec|3XC{xoy8D=6oAMGEd(|b5sWc57^Da>&o;)+l2QfshThCq zvTfU@m~!r!xrreK4jgkXW=4Ty^!O<<Btk-FBAQGmB4P?{6K5L}0N9vJ>D)Op>vKkD zaS#J~EHk&G5&6z3rZ#Pw%9-6$F~yY9a=BcsR!!3a!gw-eq~)q(4#YSfjYLb^kjkm2 z-}@93G))AA#bQxPY1*-<mSQ3nQz}x-Kr`)~+EJAY51$87k&;pp6*VhGizrY)Vz;&T zeNPN$&z?DZ_S{1kE*#AleJ-oMbXgZ&>BPirxmtkr4+wcsRVEv=i|={j{KFSboTTbj z6f9DZH2Az)#Z-tPA#QGNPR1>i%zX}v&h0KPj?IcpZ0Zyv)4s<T&8%q}kAEYt)eK{7 zO70Dfh{t2^8tp;il`97UjEM=2As7HLF^9ID08!U<>yv+tIr7s52?*GvI8Hb~dE&yk z_dUKFW%1UvYp1u<*;C_jy8&9v%BXFa0-BSVT}Z?^_W%(Q_jb42Ci(AWV9XX`GF5Y3 zWDS#$#bN<Kqb8j{f41wlyS`TuBH$1`NtUW3UqvwI3`R|pc1~?Amm{+xDjqxH3o{WR zs#Euz`w#+>?e1=efUDIq7gfg$TUE4qmVp@_9UUVwA<bs9&Fv+cBATeqkLS&)#wYC} z;-iSZ?}<33w7Ip__x)nA5VNl9S6x49+XofqrMNUy+qOA<X7}jm&`e9tITr+~ZFpcp z^zm#R>XsrkBItpoy=Ml4YBOqv+thuis;V^D$z0{Hri5&ck!RQZ)_^}V(NgNo?xh*C z)|-tKgFEWh)Djg@6_0(<6Hk)68WAvX3Mb@Jchi?bI2g1X90@2;YMID^c!-EFLxUo@ zl+GIxIAKCzjVT7?L5&H9B3UF$IpIHR?Go!rTDRy`q5w-P-@bEY1--v4HYi7j;>NGV zI-5rrP_Wh6GOXw8N5m@xr^I;ktM$4yL!-6w7L<_ElMg+@YUW1ndfPu>()Vrjx<Ez( z)K#~-zJEuDx5lc0k{ILrx6jX42bYcym`Hor;;j!n_ug`R{ncx?n%S9$&zza;?7jZl zcRG`uU`+@&?;R|9NQ*vggq_o;Zrr~;U+HW!gs|K@efIM8Hxk8edH=D;9{b$q|J^(r zh1@pjYhVA?&0AMPJ57jNr*>}MyQ3&wx4$!sr%vr$c;w-){q<|N?!9$-ck}we?Hl** zDl!5Ev!Y6jOsr_4a`o2RXSa5L<!}G$rAu%A>7V}TCx7abKmEy{e&*@-28OSH<Lf05 z1OhrqnH-)gU%%HE-vguT`*A|F!y2)m>VyZU2n?3rI`A7(AIK%Uo+k7_RyqNDZE7w@ z@VOyJHh|J~ragIxi_29IM9QdXo2Eg+)pF@l4n)tqECA%|XlMHpvV*?kn82*>`_*bS z95)7l3M_!W(LgEA86Z3!jmLyoO7RpHr$&KL-)ClzLLx!~H6prq?_La{X&NF}EEWUg z&R4_$2%e20Rm`Hxg)w7{0SR*MUCGc;<F;T&EQJtajJcGQLZ8cW)j7n#RNA&hgl@Gg zlF`>pRtS+}bbnmaHuHt#oXsSq5W=W!o8#l7Xfef9N^aU_)nz0qYB}p-wKByJwC^S7 zqN+udV{jm*0U!s^f)xy2z)004!9F1bL`I6LL=GITY_H%PJoUqmSfmJ`S0WM!m^2F! zBMJ|qXa^Pg!3sslV0U*{)Fg|Vh8Pjx`1ttv_?VcT7dsx0{hd0=fgP$z(?U$UJ9}H3 zGjEgvM}xTR`o7B<x-}Q7qCmg^ED-E&Z%mqyyRMD6v)R1x+!I@~G<n~}htE#NZJdnS z3TAX@pd(t5M6*wZbM8bkQJ8H`V+uJJtcO%>v<B>IZQpb55jiE^-kFMwy{2`wJR$-F zAJ;K+jIr-~07BsHo!O?;`6W4`%kNZ&JcCQwCHI+_H#SC-Nn1)4{X7^g;g=U8E*1+S z4k2!BZ*6YQO3ntJKo23XNc}Uri^Msah&0=nPR64O6C4J&zMdD6QVIaxxN*}Zd*>fI zr*c|Vx~^m97&)kF(<I`7H0HVp001jRJkku^GF?ZO$jp(+P8RgeE|DVYcZAP!)l89) z0ugiVPKJ~~FxBG83yz&Kp&^$b0AdKd_Wf4Yv=*_7jdd$-#Xvzd8w`(~51OH9=}I3t z;DA(CL@VHE9z^pI0U#k%0J_@%)G>r;h*2sej|Ct#t=oUsvT)S`rXE8vM0v2^zG~zK zMKLviqdb43JLsbnDXQW@avlckX2iN+2miwW5t|kpMoQ*wsMQ_tT0sklwK;Q-u-0x2 z>gy4xH0REoRgp^jHaKZ^>tCU!DUk&uga7~_07*naR1EKaAh>_9fBoRTMqER={cope z=O6xO|J7Gt{KH@W(jPFV(>D6GU;X>%V*2%e@;?F3KJ)3nbN=+^D=&Zb#jhP~ZJ+-; zfA{Y%ZocukfA#sIlTUp37q_;W+qW<M>wo?2GiNUR;%EPZGh6&yzx98u3O@PBbB{lC z@!<>S{?Y&PKTJ0F{`SxR-N(*v|BHX|fAlta^x+rY``8n^yIcR{fB#3L&8?sN)X(p2 zPF{Zb#fuN^y!P6Ki%-30Z*TLT{y+b;FdHEuJ+br9<4-*H$6xzOPXGX&mH+qme&=s| z@@JoT>dB{{eU_M}lSwW;GW@gO`pwUM;q%s_u`hp(hQO|xEj`pkNN8Y;RCn<;J<b7m zUS+Y*9hjn416%!AdvWEBDKj%Uy_JRvlEA02RNrz(y2yZa_DKhrD%ju%0w(I9YnsN) zX@7O5Z55&`!#Rq8WTa*mLgiiLuJgohzw=xrUbH@79=7Pa#zsUCODW6ca`;%)1|5+M zi6|j3)WU*kG8U0i>|p=Czg)w)?tt8t)|!C5=p2pOt<9OL9v&W+QV76f5dCGjdw1VC z?Wz_+C`D3=8&e5P_wL=5TteVdGFDFx`*O*zN>Njl5YlMWj>qHGVt)VLJx`JH!rITr zB5L5OEmX4*!p6pw+2@dlS&A9vB3UhqiMUYS$dTRPDN^ndt_J!+8Co3-V(Sf>Q+)`L z3^D)-^lr1!Krn83*@q&14@AVoTH_gv5HuGMLDfJpwvmWN;}Igon26x$=!l5M<MDJl z6;ZPz7!FqSN*cf{q)3|^lgT(TyM8N_LT1=DEj^H$K2)6mV6#d1(EA@hzq?_j4`eYS zk+q3t<Bf4NCkeX3)k=N(z-kkabI!R7OtZ~RKwK<4k>X@~MD|<W&o5KW^?tGt!fZBO zEEZj#>s+Z4KiHj~>!^vGGZBqiFF?B*A>@0Wy0{yzRWlU<QA8Mz#;aAYDgy;i5yPNL ztK5rWbg!Q0QdC0ZBF4-WEy?u2!m(<-B2!4Q>l6T)*O|#SRFmYpc0}-<_dq)i{vWGq zs6-MUgQ%yex++-A1ZzSc4ZQ&Z@@O>j13iNRC>VPAqmqfhgBoPGkcfd|s%<5%0|5cR za=!}B(-F^nFjEwBA`KB?tuK*?0g6g-Wus}uZ~6_~7=^}_RxU6e1j15!GQnX{>NhN6 zFf!yY$jGWET1^d#O7EPKiY@c`6eU9rfmKd)hD3yDQhG2oTnBmjL(PT_#fFd-!9Z>w z-QTAorfPL9WG9(1SizkBaUi$zDmo;_^Z}F-LX8X@B+M`@UjWg|05Ra<rvhvsp5EGa zI7b!d+S+gD*ZaV!A3}IkWWHQ1P1JY@F+f8gpbtLsf%lz%<hy-N5aTMI51aR|-Mn<| z+AH6`+)hW&z5n@caplDqU(C|H@PVJ$-8psb>g#X3d866b``MrU%xkZH`QQD)H@a1P z^2rZB|NKWnx%bldUd73Dd$#w9Pkj8(zVxLokAD2QPyF1^eOB}RSATF>+v($vKl|yQ z`x|#|yrtSc^Yll5{xiS0cV_h0|Lq?i9O|>reB@I<^Qn8cubuvr^ZWbvK#NKKPyWOI z==mofz5K@OFYVtlFe3iT?|=KvOK(1W?&8MA22&8zgQJ71H{V|7dAl(^l7)h<x#0jv zMw{3?dEt?1J2rqKS;$_!{^qUKkqrTH)!yi8IiJ!4B2z`O3`1pK%==sD5CbvsH(Kjn z83D1VIv#dV$#_>`F$Qpe`H&i2_s1SzgrHiWhEF@uW{qu!LF34ME-`|}XrdSi&|HsN z8JJW-dtm6jo<9i=S_&K_7ZU|sXDg5?C>Wv@?GYI@cpSackwnx3zJWaIk-Ro7CV&K3 zmr(AvHWg7(wcO{b8L3yjn!4bzrZxCaUb3eYW0(7`ud!xGXqLS=a2~7|uO3^az5^@* zs6)N#RVMlnQ~^bSh>K{~b#2=sV%O)c?+~e|6a`V#y2~O31mmj7aQl@=)ip|QCUsJR zh6G;z00Rny*dn5Tbk&5IL5d+*AR496mzZ-Arkv}`<Q-g5JzjJn@@PUKxK=bayfK|L zO*nPx6ab7y?PxS!ExX(}IK?Hab)?M5Z3<0fCJ6Nb*1+73nzn5{C(09g>wgb`q;14$ zYl$=QU?5g4MP}1!&iUXVm(n8u0zW9@swbGaqNjM*2&Phs7o+N&e>KOFN|EX|CNpCI zYuZ$b<i0ymrhxvC@}^F7OOsODHhtICeLPk;l8LP^R6sCMMc6sDv$uQdt!p=>FAgL! z&jE7zDlrbrU__ivr#m~__wL=F=M1jHcR&t3pa}Ncy_DI;#&kM8Iy~~5dte{qKzE@E zkS9{rwrK)~<#MTDBE<*0%rSt0yV{3w1g@_)0wFXcH7i2~N%B^D07Jr>b8TQu4&^OS z6(`kM%3;9HnA5Fw4dJ1Iz&vCSG8hF8>qx}^pRG5I)h$c!yPjdKJ-ovi?zv;#n!CDs zuzMzSS9?h8!~#VSH%%K0A&?M4NFebADH0z*2tk685Ry?OVkOWxkwc6KBsc=w>2|wg zV-a_|jk~+L=J{6L;oNiXIq$UhUh8=tK0IshbIL|4l~lLRz31Hb-S1k@@c;k*ektIj zpN4d?d<7yRmCTGWRs{~_Rj3&v#K550ZAs(p#)vo!HeVim7_{c7AXUw1>L^ml06>Ur zNbO?bjic{tz0?GgoCh!ot~T`bu90C>poW9@LmA|~v*XO5o(V_@iX~H7$F^$hTVNEe znW|r^<IM9?tBM!vVH_)nqD1p201b_h=t|t%pUt7yQW@(1Z)hm0X<1p50mAX|gX~xm z&&6_To#<1yo~X<oJbch{b0xLI!}b60H+}^zH|?He{cHcle|h%kIQ0Wy{X5_K-9Pxf z-`}pzLw&Sf55M$Z{q?ure$50z-2eXfU;OL8^k1Jpcz?hn?D-%6<8R)5=k5RZk6+AK zfB%O+`kTM<->;9~-Ri<R`t9HTo#&r@_V53XUsr2RPglSF&EL3oIQyeNdHt1l9?skM zzVyY<{OaHQTQcB!yR#}r!)I^YxYoo+C-;$nk(lWAV*g+Lm%j4Yt;g>@xc@uf{@owF z^_n#S%>L@X_a8jC|G|IvfBYI%!9%kEjgWur;P!v`@BaI<s!1vi=sww=ef@v=yT>1_ zGmf~o(H`JIduB$C-Ec$xhXm9f@B$u&SGF)_MKo7FG@dX-Wwt~FfNGLbR+F3s;X`j3 zhCmoqvYF*Pm_j5%rV_1V2FQixgcGvcg69DcsR|akLM9G4R&FW=#D-jCDWVPoGS!mv z=+`_4&n^T6qw)m$Od9}$>slqFj!keOd!h@}1(b-HSyZ!@&?KMIo4T0BW8-{KFA50A zF4<MEfD{5t7DC8A2a*wCY^2UJcZv*B&Ka8u2(qRUxKvIml#*eS#L$qDgPIOQYMR=E zzj98hW`F{a3-ORdQN#d(QQ*KH(qo{iIj7z<nW=b<ZQ$4}Q5B#N>!YjJR;zW&3aSd6 z)v^ei4km3CFfa$EL_|a)<n@6swo<lTXUvEV#h7ynkpb1&ScRjH2<Xal0Mo$HyILPP z20~_H1TYyB|BwuVD-sYvgaQK?k0HE~v<haL42py$I07%mwr#tvOKDJ1#*sRAfvMHv znIYKib_WLsR1mvPXfhyEQwA;}G*Hs)vh|>gMKkMngJX0Y+gfl#z7G-|*E(j9IW#c_ zk6s2;MACB9m)Uq00W(GdH6~sz7dhoI$6~a`IG0U}jR%2M#hqQN^%^f>wh2b0UFjl~ zN_k>c6}sIH!2mq<!7l>w6dMEt(?Co}O;d~H&8A00196~R82X;6TyP#^qT@r22*f5S ziHNC*3bEBq?QQGiCK^KmkO&AR>mZWBAZ0U{g{G;idQ36YqBb=Huqp;3QA+@-noG(L zhPG`-ZSEzVo*AJM2w=)-5ET;$+yYlsQv+VMPPx%TspLJFN*-^05&`B#j8!Q!P0K_` z0L`uWo@lHkij`_CfWmQ@JxaL2{HZlC0aZuHA}|tB;8<13NNli(Z}tx@xX}XvX_Qe- zLTdlSinr>%7cbFlVBqFy^$yz*5eTg~Sf`1j8?X?WOv~a}6`t6;vIrIQJxmc}e}<Cd z?Uj{B2LSEfgL}YS@-<5=iK*Dp;niW-ymx$G6|c{)+WKLR(S)22e0IJ8tLnP(MgMLv zj0+&E>+trw@0vy5Ha<K#d31V)093W!!+rM$?_#x&YIpBF_$S}^eFed|1e5y@&;Rqk z_TR=3uv)zG>YG1$@f8A~aCrCrcD?zN|KvaWPk;2<%Llh_R<Q=ndvUfozW>K>|8U)J zscpqzpPT>qKl-bz@c#Y#A9?P%Cmw(NyWjhxfAo#teD2Ao|H2o4;tziBcj_38so({T zOzhwK#eehZYq!4scYpOfb%=<89(AjiK6q#3V_mYwO$95_m_t(Dh|58)gfQ-IoaT)* zK@z|Wfhee%nvxMQ6$w3{s)%OL4CCxh)lV69?jW;AVyUQgeaA$BL#d|B6)T9u)40sn zQIZA9JeK?xcPW|Yy#Rm(a_ko~G83RVhiGg!6@h@*Pzfp{hD!?%AG8)(CKiLoXz_|J zE(a<=W9GmJF~;3?W9B8hD?A9%C&Q?KU|Kg94CEN2nPwMDmp%_i<}3m+I@NY0qD5u| zxKzj3D2gM1pg@Kwl8eTeu&QGStXpyJk2nI+Kmb($EEtigiN}a}!K@}JsrIVLTw02y zs1{YANW|x>wTKe4O5jjgzZMa*Y^K7<O^hj4DdvzxghU9bq?3ujkWex+AWBZXRy-<Z zG5}RoaOgq|LB+vjh5#{EW=3Ek_@;}d!d=0JG%#aRM-@>9)$C9P0*u6mix5DeAn?FB zZIUGogUdt$l9C~qX@-f=@5Ce#CMK{nq9tAWW1^;tKnOVbWkv-up&=1gbyZa{5M>AG zjw2bHVj+C66T)t{YuhG<u+>Zj5Tv8U9LmwCs-mId^YgR4y(J<z|G?Cc3AAWy4M2>_ z)4@0l!)CK_BAc73U`#q0mA52XW?H-5?%L6nD#p!fC89p!c6CmnK^1`z5@OB+Vq4X* z>)FTnfe1{4V=wg5nc<a$7e2)B)*J8UtS2YOqLNbeiBEp&=;*+s6l@F)HZ#*q41wYJ z_~FUPsfna4$X7n`W1r<QeP!}^`*pyCf$@B^S*=z%i<u(KW{c|J>a@?balq;!ZbG1G z*sabVou8ktSL@~SYTe#g9Nh4MJB~3=j!4d6F&Luu-6p5Z%w`~_v-!a^j{?IGqHnta zjMyVRdexkhI4`Z@8FQS5=Wbps(s4opGRWC-9=c&jOi|R1Zr-pF=eV={wron)dKu$; zmZ9g-xX#(nM7xN9ynNwbVxyxsHzfmOM5ovoFm<66G6MR<?T-Y6T(r7|fc9Y;`vntc z9Mc=fqxG300onKgFa!eQ!@Z-k^V7Fa?yAn2VmA!TtOy|l$pUET#77Q{q$)`>sJSB1 zG3$gxL<PC-+*CxJLJx^E83JQr<B$OkV2Er)5E;mlh#*(({O-w_QJ6K&@vZ|E#s0y& zuim=30L^I17JlZ1FF$?z_AmePFaP07KltJozVwqXeEFw-;wKLd4`2Mj4+4@7sl*Yw zA)Epk+`Msf^XUBU$^GxX{*ndq1WBlU+-Vaq&xc|c5i!0%B_O<zvz3RCkdTPcM&t{W za~X-yTNqI(04D@hH8xixBcO_4SxGnx#iN{b{G?JAr@@S&dt+5^?vFAcKN!TnI~v$9 zB<3QXnXn;>1Q_h{rxb}f78a?KZpl%T3Z_78NJJ5dDFou^fvGXZ%|;MPNMc!)0|BaG z1g=J%8k$0=0}*+eS+ScFiMaWc)liH%)FR?>Rx!riZlvjYN~|l-i%*bMA~B42u=w_l znTB4hBsJRzqd<k6Ehus@V8%q52xD{ru;etTSr!phA7QJJsu>d?F$EPxFe$S&(>#ox z2olL)s0s?ifdI)@X$3|~frtxyK($kA0%CB&5C<=SMtLTfN*-8p9(qOK7*paHYu`k8 zclPk%Ny@`?3IIZ&u}=UcCNnW300aTxFr=aDc0|yG01$|*j={tDG^HB#>OKWf%}G%K zFor-1X-Fb6YiH+=&dYk$C$41_pa5tB>}~<1z8_R|KAR8Su-WWH^m1mrqx{sQZ1K&u z+Z`eXW+($AokqTs#aT-|Cqp+3yS|RGZ5r48mF>Qb_~hc-002!%oH$)qRn9wqKM7nB z>7#+{0o5*>>WBXNwX0pXJUKZPNzp|HTBK2`V(R(C#7O67XKm9|Rkhh}d{#diRLUY+ z!I+|Zqhk#7S<~;joO&#)cL?)&J3+{BBGvfTmr(L>=l%CWh{wnG(~x#u{iQGev_DPi zm(X-6ATXoJ@cJt+^?k1*DeLVgukRo17uw$xur=N(%!HWUdgHbAW|wmUv(*Z}^pj5$ z)AU!sQ6TK2-(k1A`~KT+zw_QObi>et-dpYu&wl)~)3BffD!4_T5D?DKAHMbGTbs=$ zM3Q8yb^XOJ|J>5As8M=f;yB3h8TRtaFL(WLcJ|2BhE#q2&;8u~l`x6H#~;i27(fK8 z^VPk3ckjISen0fXkYl|1lRx{|yjmzBAZ~Mi-}=F_pUo3H+RPZy6Aq9|22oj+Pve%$ zLCe!T2Jq5FFfI`N&NTz)pcxW{>xWlWbksXfp$~tSKj)o<0+`zH_WSP%+GR7onK8vH z2m9ye_s&ueyo@oN^+O<Rnpw`Gq#=Y596}^*-E6m8KVI9W?)%<lffEA0sw!1YDWPA< zj`b-cTr@%sff3aMPgFg_%RKNT)*NWNJ6E$i@4pYrIuJF)*AHip-8d@XfSmXD57lhj zbs6m&-}$|_@4WL1f90#6`}C&|7kiOtx7makdypwO5WxQFx4!+gzx*$M?dQMtg*)$M zm4tG#JOB1~e(&A&adEf-cndp)E7*l*eX3)M(|1H%`Id@AbqbYJ)G_<kr(xhqX(vuc z4)b<yMmbwxGE@igPtJ`?@tmqATx58FQ%7j(=z#HgyNFj;Q=i;kBz~KFg^+-!^NWdr z0fGFcU`DV~Cc4T*)tn(Bg>2(CH4Gu<lyXWQYfeZ=CDxh>IE)Yok%%~i07xbdfYrji zDn70$49Ke;j4{-8O-QD`gv$Q1r_={#r053IQ927q#2BksZFOy+P|`m^MG#qmGAM`E zA;&`+Bqt`TV=xuaoRb@taxw)X!z!y0M2;kqR8=&)M_ELMVE|387$2zs1Qdv=SSI}! zU7y1hAv+m#Fl2(JirDqc%p52PB_u-yBc!a_Z8u<<Vq7$FWUnb2BH((pTCZ0rCA!EQ z1as|@CL&-aZ&l5u{$ShnF7-VTEf#YmTg;ls1YpC^4?B&TuO99*l|`l+x}i-35ZTO{ zrrvBQtC=OjF(|`S4Mh-{2nYaGt?RlfRw0D)NRC6$3pZrRf)RHE&*$@$QdQMC=Yk%( z6tC{Tor)|g=j^e7(_XgZ(0jXT<IOE%h_G3&4-T)?Rh9a*%h_CsV`h*LDT}IU7zHwt zrR#eS=g3);%M{0kP<6~VGZjhO?RL4CHBH@hyPUG()Uo>s?t22?Y{0JDEfz;y`b3XG zpfDRR;BjrG1cXR|DKOqUepJ_W*L6+PhB&+R_>)IRhyG1ud|7-^$;^nuX1mF$cfk{5 zb?@GTtP(Mlmk-HQU2R2y5c2B$Ohr=eKvfbV%&%NM@`tSaJ=9c19q*je8?V1o1=w!Z zW}->9yZ-jm*J2etzVFgi1H~Z>a{vAZB7NWQQi6V`3X2=J9xEa4b}8|==vQUvwhvG4 zr<8LVB-{B)s%Gwo23V1p5u*6LMSx^)yz$!ReDl`ZZ=0m9OG7^Y>7T2zil3&EZHt;! z%a9kn_E9P^7V2^LlZa+qFniFj7GyAvSiT7sH$`20zTI@BVxetlg2%31l_c<Ix?T?e zo)9xr=rSM-sek{`10*t)OBXy<*d8or5AWRHDO53_?=_ttuDzKca$VP(^&0eIR6Co` z>MD+seU}%-x~_*|@Pl%1Z*Q~N_;j)Fdq0?c)g)#dxSh?mn=LZ-DFvk2Y`NR66|%o~ zH?AJt-JAlU+V-g@Z>&={NLI~geE06%5ANUp`LF!^&F}y5|Mt!Q>qqzB{ncOpwO{<o z*FOJap9+Kz&mV~@xONo{Oqs&0nJwmv#eDwc?I)Bl2dz);N*0^o-2gID{YGA>T`rkM zj7r%Kn5x&3lS4^7W&=>w$P<K#3_wK)kwS1JoB)1s@6qn$_~>vSN$V=c$aX0sw!AfF zpeSJdw)Zzw)!eL7H_fO?ym;&Vk^}&6P`a**F#=+URbBHq9=^1jz%mbaYodYGbp-~d z7$PwT0}7#zT!jz`%<cZgmzl(?i@L6}2$EsJ1P~yqff_Oew_qUx69Kq!*%TqCL>FE} z@9LeHM1Uxwj6h&HD<cJF1uzhi90E;gee4JnQ!@$dd9JytD*zjk(|t8(aR@#F#=!Gg zOMsFkFe<PiFqi^#Lq_lb-(+q$^bmMAN&vVX&8HYDzEC5Vu$GM#xyXWnSUe$_8BGO1 z191o;um}ZVWfdr598lAoNn?z`rSz)89K7`3tk)(&<3!he{6Wdcm;;m4b?}rkVngJ9 z7<OGJB4*lk9W!n<$4F*ok^{lf-h4T$0g{KrAfT$KA~T<zo!3{dFmnhoVXx}@O(i1d z@u>+~5Jk7U=PY}Rdg!y~DCoFzb6|vvr)fm(ib&V(>bmZ`-VZewFnTXGF-9EUjLuk& zF70NK3>Tj=_wVEpI0QtzK3})(EHIl1XvRRMYFI{mrhv?*Afkx6Uax1frmE@?`kV(7 zQPU!=@$ON93gR1*pN(}j>a@inUm_x=h%^@98bVl|pUs-4swzSf5I-D3QD9AYNB~5r zVqgjgy4|H~S0B53_a5;aAU^ff6C4N;M2g(Hq+|fZPyy)Kd8gQNWEo)FrKg{Itg1pG z>*|zirv^kAkaW9Cp_!%Ab5&Zc^8S^>cHWkwO5|b(41mPz&F21tlP8~eOa*sc9(p`E zOFwbr`UM$kWI&hs8#5?wwu1<%z<RYieUv}<&piX9djl>wz~uX?K;hBxW`F<S&Ye3s z$!-G}7ggJo&hug(PJoCU7&C}S8pQJcawaJ=EA(?0r>bdNHTTcYHad(ooLsECrZ9!e zd7Wlva%rICgBzU^k?|tAbDZW=i99yA_(cP#pn3e-O}w<a#6O*jQYQ8zD%OzT{QT_R z?kw{-<sM<x`*AUE+P7Ax8M##?!_;?GT~}4;dk+T5IcHIg97ePY$5;(HT^@J0ZL`^I zMZ|9lFI1ViEa{0u4DL6m>)JoB?$|c4z5V_5YUT7$5dj0~SD*XXbHDr2OJ@1>!3S^L zc~6Ty48Q&V{L_H=@sB-!`rufzSOssK-~IZp|DEBhUprep`@Pp*N-pUwW^Jng{`nWa z^!A%?{L<g}Z_aX`MT9hyKGGe8Q93x0hDL-*3G)~izoz4=c>MorhBk7ZJ*Ue?#v1t? zUJG`MBN9^Nf#Cf|XFq)X-Td%TfICf%pZfI2IJ&#hcUy%?XNU^8T5Vr^@wJ>}yX|JP zmKZ+r+_R6}YGB%1`9oEnD%)+l?|kQvbJm=towYH9!z)*w|JX-~G>k?ag-Lz^X7r<% zU%&goz0Izl&zcbU>h<fN{_N+c4X~&XvNQjPSrp!U{jE3Od^csOYo5<$P1}C{3xDon zX@j0WffS<$^S*!Q{nuZAJxeCUS=&(HAN%niZ$dpXWu0wFF;-Pwciry({RgkU_8OWl z7c*wAs_NG5Tg$z}Y0fMn%tT<$;9IYUH{X0yO#@S1RYY`f<*-@oyLrZEs%hxkdgdd& zUAMb`{}_lAfSHj9V_h{%KrtJTxkPr9<X$j?)%twbZHbtW4Fr(d<rNVLWaHNqni_Hd z<n`v9ATdG$FvW@~geampD}oRjA*cxepcrMH)pc9decyAmoE`1~?kk&`enO~1L;&AM zHg)s~zn><|v|eq7K8cutraUxN)Bu4=OqXpP7}|L=s01_uAttz_0UY{a7&1|aq2B67 z6~P#ZQ_dc&>zF}6Q-eU%?S{Ni4o(NJ0LCAZa7d2YAO!&{C`~OoKZmWB36X)B<S`At zObt!7ANsxhy$XQ2CkjL!dE$jv9tD!Bnu$ozy1rk`7fnATRo6!|bIH|ElM$}sUh2N@ z>!wB`=4hUISo&!pM1=we^>g6l<TL~>AuEO)Ev1BnDCi_IG$3{%F!fzGpU*byRo|-` zGLA(r6?iBF4hDfnmf~kW{e_g|`Hyvm7(*N#I-_xl0hD5_iHV62n#1cK`TYJ9^Z8s9 z6mT|QWc5A#sHj3Dq7WicWx{(0x4Ala;;By=uv%E|A9!b=23qizhCqQLvh5w*c<%Yn zS1~;I@r4@I^<F(&Jo(g9BI@Q1fAyg_8Y==yBG;}xb8>n@;o#b>+08`Hef)VG^&6&| za~eaLBB%i3y2FE`+vh7t*={|4tC}6m7fZ0w0^%_Y>eW3HR(;pCi^I(>16IIwyIg+a zbD!EjIOs)*0V4jh_g_(F6mfrE5nGuH2QE%IcgK}XSsPP$t@upbgM^d%+(+|-s3T_+ z%i7leR5ZF4mj~?}2bciU<LG)?!<WjVcwCSGWV_v*<w2<6D#zIi9X88Z6CRzOaHwZo zYd_Rg6^MQK5kl}ta8=DHNZ7V*&Y78qp`UJFRn1wds>(S#L?VQ0yX`_i5i5I2gDf(e z&;4XMIXwll`MV4kDF6T<07*naRD9kxZE|NS8G>aMB7EVCpL_ZvPk-yhA5?WU+uK{N z4~tpLQZJj|`sQ!#*6YRo{^y_l#1GznrH^zso&C!H`giu5*$2B*&nCh$Fd!!0cHJVx z$8JA<_RbrImL(e@v!}(CB8HGWGzrHYiC!4uN6C1p&`3l8k(f9z0A!JI0YJqNJbJCC zs9+*8q@8L~%ZgRigh*ZA&lgQGSB$iELlY4(>vPT-x*pUh3r3=$?^TroYcZQmghDm2 zAty83Y&um9p+X8Ju)46}JR+He6e$2=%5r|TIeGYKNJ2n$({!Bx2FU^-CHT_}42c6E z6V>ZYIzL;TK6-R?^+?qWDQ79lUGlz!m_rDGLLj8gX8Y>PudcVNTQ_gEP1DSqVMwzD z7qm9IDov}ZiXk9i&id*ruhx-{u3RC)SjD5GE4nZP(K3KRFyzQh(;(6?q#yq9#k14X z>({R_Q`6R;`pjqBxv7e;30xr&V>O%25HTlx<(1ctA0F==>^E&2Lb!6{=F#;Q$@4q8 z$a~A)28KSr^wKM<^;y%@vvwXLA6~gK-zNhQQQ`t87z<%k!+ZDc54-cWi4})sY_5c+ z_IxNe1RG=*7P(=0$o*=w*=~oN=gVal4IJvG-P_xH`0!!Q*{fJ$2BO7sVJe%|>f~fc zFc83O*3K8Rrlt9O&QXsaJ`%|xaLSngDh^i;_P3kO`DT4``~gZgi}w6;PaW(ZG7%P! zIQU&p#39CQpI`dXD>)|usp{A?@%qghvw7<$w)<!sYO)F-g;>4y&fWLly8|W67>=%9 zIXu`mbSj^42#A=5LED;$cf0)7+jlm*p2!SxQ}gxfN6Y1Mbl(Diu|ZDBlaB7+dvxc6 z2O>j=5m62fmRGMHl3ohc6&;45kAoQwz1(^Ke%E)z>~PlGk3HtnHLq(!2>p=ei^Y64 z?{@wD2M^EA9>u^_6{@N_I=bSw--Pz;`##1++qB)TzkBa^x7~(F05+euhll%MsOCdu z6w`hfLI_RUZnoWf@7~Q>!bKm2aB&%5*eNi?FylpG+nPtl0=cvufRKR!Ao{s?c+|S0 zR@IOSKGMoM3<C!+!#b3rjH>1SeD8qF5C}u?(C_k`(ioz^%w~ufs%rMkbBAW|_%lAK z3sz$KtbkdFfP<M50fe9`AugVH`s(9P8G86;hzL~Ny%!>DB|?P2GzYM!pZSbvzV*as zm@5u7hk)cf*XauJplJ%B0gK#(=Rf(v<J%nq8HU)*>t;UW<i4Iw+P%Dcm{_uko3b4a zTV%B*i}r$USC)ZpAfNIuY*g5eDWP_0iE9PiVe?s=bME^d3<2Wfi)%BACW$^Y$8#dL zO*b)&YZG5t-ao!4L<&|Clg4G{LAxMJZ@hnpIMf<y=86bRa_XD9G1IDPa?WU0aX>)N z0&|Sn<=9ald&U_1J`wSDyA=`lqx)hQ08+}{QoCF>rPOyr(>7;kXGBC~2&^JN7$bMP zjoU4buI&G#-~26N0z*dHWB!GI<*$7D3ok&ZLG1@G{>k6^jlVxsbf&|q8<ff}$FbH3 z+UH@r+dlc^Gr#cFe{Hkdr8FeUcTPU|2mj<ZKG>d4CVwx1yiN2pJuDx^Q7}I4xyyAk z!g1Uzt2SXa%)JmU<8oMZQi*D+x*L+1CP}I^46^O|tG<^R*Uchsz(7E8>qkEfIpq*C z5^r}qyc8-|#!gmt8pIr85K$4yIbkX~?Md_K(;#mR5km~s;o+6z<3|`$s9MA@Buzse zqok+y-|5+;3UxCJvE~q~s%5TKaY%WAzU*c%PeKSWR!j_tv)R0z&yi`iShP(OLdYo- z5)nJ*Vp8QGA~7u%i>7V~#FYn#IP?RKyiX`korMtVx+bEwY4#5ecbjbpk(dy}&?glI zQ;t|bj8vkd+qU(8?=6=^lyd@vl(VQp9*B`NARz$~q9-&dVAC$P+l}K7v%q$@JJ5`# zs@VXMxqKQ-4IqSyH~_N%3@YctZWgLKRy2@nvDA!}l!{AJQ(m1u+M!a6Mku09)3&pj z$6!wMB>;#q%oht(U7xQC$)7am+;v^s%$AF}tU6!li7E_IQ+WK=%_|3cZ@%%y>G^pK zPzBDKyFLM07C|vj%@Pq&i;;+^Y1+1(Z?`Lekj=W3w!7_oG4nx%D#XbB&^tGSndY-O z$0(8*10wBqT{Ekix`y(cDG~KUzk~(H$T806`|I_+uIq^@FzmWvHY@oJNwg+bwcW1Y z+gl8S0CKm>fR=N|jJsVgVnn{OK@njNUDwU$a}I&18ai2>Z(O&uf3VnfeO=eyEeH~G z$SFCc3ygBo^?FALL^fY67R$X5LU8wlf=EW@<#MU2oAs{W_2=hjgcKqXaou=LfD>_g z+jVta`>10W<m~J$j9cT2NZBcrP|N7pq|ldOgneA<XfOP}P^SEavxJ~lR`LKjml3S5 zrTpj^c|5MF@DV&xiHG;eiD7Bp&`0_}HUb{e3zitdG)*lYFBhYV5(YqE4B{XAu{Rk( z9dJq9?gIn^0ICCNU4cV?oJ@%m;vD_9Geu$mH07$QkucUvGj!&yA(;UZs>x};zL&R3 zo}l8B;v$^CU?*Jcp{G#lF{%NlA#fQzjAe~;9!4~_su`?zo3?IUvV@3_FRnF2azV|) z%PVBF%YK=ONGHc9_syqhW&}*kB4VH)ed?nK^1<075WdpxL!S^(B*)Nhw;d8xvzZFb z+L_;-I8IExJlA5*Mja_`W<bO#B}ClqIwI`*e!4KG1%&_DS!8v-n%*>jLQHkD-M#U> z?;~*?nm6Bg<K;Kr%VG*bqJQCqFF$ep=zsouzh>3^7r*k=FMaL{|KK<O;rr4Fl?4<M zfv7nX!?dm1SKfT><lcRuGFr|k5ANPSTd#~1O3;Ik3r1P_<#g52B{)$vtRMo$ju*iM zP}T2U-#`)-RlH&`F=lt@Rru7?kJ;Y52^`pN+_(~|$Oz07Dt5gzGg%1CVL7*3x33>| zqM`;;#c=E9wGg7O6=R$>spTX^#G|WMLumU!Vx*>N7V`yDh%x%gln~9O*+d)|vAJ>c zMp7HHs%YCZRojMGF>{O|j9P946j6uyUAuODwcgD44w|}BwRX0sn^_1|Rab<BP~>&Y z9GGUa`TqX?b07Wa`T2QOg|=zfzcf}HE9MwNEa+{*7%QgGHqB$VZ=XE8pL0$rRaKQ# z2?>L%i8(O)r>bdMpR6=>)3mcJf~EkJQp!1TsK6`$2IkFXyO_`XNMR0(#q#*!X(Tit zBM?JTBQn3KryURxA#**SSM5UVVaiAx5Ud|$NSUh=ouw-NI}m`8DMYFO+dw40>a-&j ztOF79R&`N_ST~|3swpJ~R71BTn<y~{W&sefA>|k?XBmb*C7DjAl=3n}W(L5jsyFL1 zCL@DxNF0JFsA=E#WhO3wsDbf`+t(uDa$c|7$ZSkN!2O_-l{ie&6C&#R-n;bqY_`9@ zJYPRT!~moQUElY8&!OTn>oR8UyJ0qO5wV$7`v(W7rzeJH2>p=yKGk(iB`nGpEB^do z(^m7voE|V@06@u@hAg6EUQ^+@ifY@oDeHXETsc~tot+^PGxhzDQVL;QEFvLN&H{ij zhFRMj9UZP#XWq1>B%^tsLa5v{1ps}QVyxO(<JDM710Zd;yN3^t_xBHGv-y}e6%1gt zI&a%qtmEGP-gdiADQAV%W-F%i`FwA0k0`iM3`{n=En#Tpv%SOp)3ftn09kBEc^dZn z6^Ns$P(=U<z+!Y;9f(+$vKB5BOoWO{A`$dYdtd?t6_b>+<Y|IXe8#S#)UreYV~)Y8 zCL$t|t=#h?JxUeKoq|}%8b%=mUkau?XqGWgeS|w2j{JNCB2{GqqyST(udj_k#~u{N zyAQ{ugOy$!Ol^#2DzS2<c{BwBD%5BL17)rh6wuy1z1s!MIgfAiMP_4hBu(TEar%W< ztp=Bv8*Z;8Ld)`DX>_@dCVTR3w=EG8VjsQzQ~<MrwzknPR%l5Ge@bOt0_jfAPCSeq z4UkYY8zLCpJi4x$PB)vVp$)aJ)()UpZ`Ni;Kq(C=<*KR;wC{Tt^rn;?Fl6H{YLfDL z#n$(ok4USka%bQrcQO<>ksldqlkpkRvSdQ|!HX|u3I<Tc_`@H)`n}iQ%603aj%S~I z!ur*BUi@z6y}$TVKYQcq(@`NJjdCipi^2vJY?u45|N5`ZV|{e6uK*?{mJ%dizpEMJ zh3#t;8{1`BGU7!jCyuT#L(5s+wmV5sMun$o2~NaIC6|fj*<$(B^H0>>^#DeQs=|Z- zw!gnu2k!gcgI3zMBEWe&zjpoFC3H8qIE6SMLfbZO+>as5XDtHmEfzPf-AXx|q91C^ zL?QU^p3UZq`9dX2mc?SRzrUYSzH)T!`Hz3XRaaI(TI7_B5V&a?B#@M16^@RM_Ls|> zH*bFGQ$OxixEc^~RaLQWkwO-YAuJa&6)}<Ja=BbCu3fwO`7eAvr8H}slylS8W-uf} z2tb%qHd8=|Asikav`u~U=8b2bdBy{p0WGUEO%r3Sz$xjjPqU^`Eo|qj*KS<BdhPJ= zFoei~Ma22LfG8F`fd&9$i2lyD?d-`XpPDW9KmN(j3^{GPE~#==$Ep=8uj<HcCopB^ zs&1cs?qfG@-S%`(Ul}&dUf^g*mzo*?M2?}E&z^qn`L26Xa#9%}%RGdD47%ce@H$CF z7*O47g@^_R%Vo8<40W4DtEwTw)%qmm>>&hxYR%d?A`|1@{(jTMq2GaJBy8%6IH<ue zqziBrU}Qi`OnmF+m8Rwx!)~+6sf)3~P&q`nij|)cIc3iz4w3f{_m>BIA@FK-etLS$ zTset(Og4lp(x)7T9Aca=<~MF!uj;z*cEix8Jj7UsP!&HaGZGR~-wiRw5NWZfZrr@O zUT^wgV1n6f!5l8>2$6^-=k2aX#QlT)M`tTy?)#3=vZS1)u3IZ~io%3(l6kCR-NeJA z!>;Rc&ffdhO;c6TOmnunj)-)2cHXuvqRr;b-rjr|q8nuaxNYZd#P<tc)%uh}%z^33 zm4o$qwcG8oW);avX0utb>=P9u2yj(Z!;t3lcD87PjZ}flJ;#Mk$E7`Fgvf;BrrLGY zBH}_KpKbafTf&DYP5ijc9TS$!E{Tq@e3-qXHH?HrAY$V_JtGw5Iw4Khk~3JzxlK+< zcUg`MrG_YZKtNa+fuLU5`#+#yDwfiqs)ZqA)6xJ(sgoB8hK!@xSsZDANEaXt*U=yr zh!_we6QLR?+Pmiu)|T@0YEIu`47w<qtkFCL7YR8dJ#V@;Wu(JgKsCla?s%h?w%8Do z-99>kWFNB401%?;rKo^$Wa@)|k?w;BcY#0^08ump08$`~*REdOZr8`_?Xtdhv^+ey zbKgvv5Dl1E&HAoqrkn>Wm}|)y+|t^0ooBYVH_4SFF~*St4;*MVYq#62sy0nC41<rO ztE%$;CdPPncIMZc`vpX#&%>ub|K+#u+}DSX+Pb-O_jv8lYlWKYgM-6#{xDKBBchPS z&^TmEs1R7mO=w7fipCTogunddKmWp)zFg1REP|ke_U|0u`Jevb-|JNjO|kfuC!=|p zC5(Fbi!|(U<_rirVw?*+%M3l*2CzW5ocuFN(zB_kfMtRl*vQOG%ae}Kb-PRyW2{2R zIg8{GSBn!P)eMM`*|&F)`hk&}rXj3zQm3Gs5->yb?%#;X6R#05MwXmhAjQE^9?&!m zF`FTW7-E&Om>Gx2A^HwgvH?QV)FNUQ0taFO0OsghUt(sC<F|-~xLH-py*(yu+Xl?i zFc=soPk+N0jW~!X)R6<#bydZH2u)pQ$)Hx(l{ij>&{V6Ysj8;yhg~-`b)C`>V-Tt5 z^Le-1&F70M#;S_LFgWK`R1Fx30gHstXWiFt+z_#LzTc(1>-zP!?^4RDB9_ENQKwD5 znE^7zrlG2;+u6(%yiA9QiZrcyMuWHkhN_+sHSK(|J&<JT2kSF!w<Hup5D_vXHB^^k zDJkqNm(_gFfB`TKy?;A14F$|n++f7Km@jPBAOb=zzmAXvMGLY@%RCR3d$T&mrfCij z_ss<H2Af4DD+_p^Na?I?39RdS00=SMzI|&L2GM+QFu#5Kdg;N&LDy*Rqa@N)VYys{ z5Ejcer8Gv%8GwmM2*Hch7-M0T11$HNroEnX9@W9>Vquq?ae1Wh<m9BC%>eA?&1+s9 zxWXm|zN9Vn`v^9hO^lH+9$h_LEEgq%fq=NE=zZZe?HRY*Ei)e+9#mEESHQpmhY-SK z0rhryyWORfK(%d~XFu{x*Y{Z@4XLi{s)`dI9sxwuFMa^q+uQr-bI*n8`S2g;@&!y& zw2LaZ%4#hA3O}--UtIrLc;%o1r8+K`l5ZT%%rDfU7M&8z5dleos92|AoY;uSFtNo2 zGG17N-3Jvpme?i#EvgDGGsdzm6Htfp5rL{AMP~NMb}JItf`JB)X&Sw<Mdyq`$pVH8 z;-)$@;6kBXZV|_?7#RjCNyDH3?++_uM)MNhe29q?4`bxwkD#s(kqk?s1&&@9=TnwW z2d8Wd91ZxFhY)P>`r#Fy>R-wSE%CuN!q>{xt}eo%403;UB0d!u<yR_7#z%)&j_*Gd ziSrQhde?0?B`vQ&F4aHzC0@<Im-pk->}VTG!_d~vkcEkwrdhAo{)oAOcw!{gHToPo zrJ|rN3EraWG8+|Np>}=$^6PJb!K|&tK*~HHiNkJ4T@SzTm473)d$%8dV%MdA@n87) z-jW1+=fQiw`zL?sBA4;wiH|R@e)X$gd-IjoUU}^mQAGl!{Mx&(ZF5)Bk^mLQWvSXl zY6Cz~>AJtmtbBF~pV&8xY=vw-EgcBi8ynIB4!jVZlUnZkA!p}o(OAyroT?D3Scyo9 zH3ioev#*hzkS78;XGB7vJi4xTyRPeYh{&A03?Q%K!O-&tfDkd~+%)Zcu?QS?>&@xu zS#kex1%O1oAtNy&VOD@1i6Y0Qt?Rl@DXms3w=5UU2V^rqU(J-#gaDw5VSj%K1l!Fn zYhG`*h^Uf1`fxs*Be^&>4_RW2(4`?sTi5+Cbh|F4p=s*8?aj1l8W9<iWF3YCyT0%H zv|ewk7-Ose?Ck6`r)*|vNPQnDFqrnkAmTnkR5h>ps^yXiCHMCpJWOJJ&V5P>CJJh3 zqdgLVRE-%p1lJ~&c_ak|b-tyIW=IAUbpz`}mS6?v&16t1j&2ST1e-d}W|D<4UF7N@ ziYY0`woBVCG>cd_ISX+Ju_`)BbWmw14JZP$!vGA7z%n8tF&gBYN9eqnS{0~@6a)8t zhv<YDV5bxi`%`aY)SHMRNL5D;IP_v5<aQ7aV=^92+>FVkIv$cngdwnVnaZaC(R<M8 z<P(t?D>DrNXbkI{{y?`LfvC$SK(*_3h#Ud|u&PF?#%$wJ3^^$z%~DFtMu;(@Dm&83 zU*~`XMB_z?BYpt94N%n(VBBDq0U8%<2$;#x_f?FDNX&IzN7Y$dT5uhsQv5$l=m@$) zFNBMDOGLTsE^<%VcxqQ6j42bN1bR$rDI-%W7eGNS16GmBG};$vXka2LWl#%>h1w2? z49Kyryva5b@XlF8a&qa4r>6US77+~skVX#P=DK%Z$uwtEwK5l0R}nI^f@Z<Gu121e zW3oZBW=S^EwoMh#Ra&l}K_X@j<D|MApptWOgh64CiWwRh1Vy4?zTwtL?`_XGFvz4{ zb^rB9&77pkK6@T3l?hie?ia^oS#nvZj&hmlPA%ZhqGmU`68CQG9e8996);5k!)f}C zBTCe#7)-F*Z0?*toMMFwJDsSKc(8YH{OI@#&wTo=*Y3=gA$7ZeIx1Ah5$nY~)|++5 zK}fmgn47weRV<8-i%=;Ah{G_rG&-f^W>Ei{?RE<Q^ZC548!+8$RsbNPYRZ9Ldg<j& z-z$J=e(I^m+wi>vXa>amgI8a@eeH?I9($^47RSdA5%uY(o)flA!|CRch*~H=u}l9x z`pk0?=zHJ$qu=<>w=lSNK`f|M2xwHI3t&vgE`uIbEq%006#b(?6Zx+k%*>QQ{bC+# z1b_F~(3~L(W8!2}#TkbP<e;a~N>un5h+rVoFBT@7mQj*Q5n_0jdI%AKeCS$LalKxv zstCIy2vpsQX~m;kRJh{kR?|H6DGeg7c~nI9AYnr!4gdpsplZt^lG31JDJ2!jL-NAF z%!q;kA_oKm3Z_nc3}z5G^eL~_YlaIk1QBnyga5s}@C2Z$=Dp>TP`2Ct;qhtqxhoNR z@o1%(DsfauF@|>5#=2I?oAqwJ*%V*98V46|f~Y$Ne2Rq3LyT1w<B;?DdX*Ii)vVB` zBx2@^IU-l1FjEOpA2UZq4Sl3vzEQ~}5`#cwfUfH)O`d`pFp*&q@p+yr)e&RG9Ebx# zB4STgVgogkUEi-Z)p9S?t&csbx^nS~?>hbdD@HQ&zzFjK&Uff8Y&1kO@M&XJS67dY zHtVfq$tf{`AtED!<*YEaBqKHl=1tQyP0o3{-MLK1A9f##`YY@M0B`5&7;fIU@xk4D z!!UTcFP;d3s3Hi^_q}5+GJt>5Z{E83!TaxTx4j=5e#3YcJCyiCPmmBKx_Wq6*VTjL z6JLp5>S89GaUuDbX^i3U@Zjw1T>3l`-KPuHTrTRsSLRU41qz$Z*3<|im?3ECdkAIh z!~iT1#TY|~>-EaFZ#s^XY4ZP#$D<#Z%mhZ^0+3V~#~IP{2tcizlEfiI#>;~gkG(Zh z6HqC53Mg@79tzGbG%ay^TCNTm3N_p#GD@!*IC9fegkb2fArFZ(0PzDuRnbc3fdK<T ztQwp$YKn^r#AIy3w2(o~)Cho8Leq@N5#tz~2!~-Pq+LJMz%MKYWsae$stc{ul%ehr zIw%G|0I#D_&A5)t(f?Y#$*~Q6PE+LO#c1CQ&H1QqNQXZ~s2VrH1!-8UzJSHNI^u_| zAkxtA(x}Vu*~N{6*$mfGhTUctVYUc15?QBm)zhE)v=#K;m^`_e7!2Tv!=nM@@yDP3 zcmDN%`&+;H&AYF>70_WM;AWv1<HVVpf;7~uA_~m2w%zS^u8ryYE><yca1AaRc(*it zK8K+PsQjmzmYrtCggNP$^(SCfRn-eGeDUu8`R#2UZeG2*n9Z}77ew2k|HdEu-!{-< zdE@cNo~WuyRW`frdbjCpdz@Dg%67%qB5L;Ddv{Jx&wlEs|9sD|>vp08M*HB=-B%vo zDPWsv#X43;B4TI&goa`tN@GP2J{>D}PYNop_W1UJ6+pfpUn5+f7<t(=zD5}znNh-K zDk3STD!A`J2oQ}FjQy=D5!<Gy2wcKH(3nxwRI>-(d0e55`CW(%#)hH>jO_cIYE-*r z&4GhLLR9BU0*90aBtpd)E77dVi}`*U@}pBzzl&TbjHD`nY?6JS;}GVou<LtOQFjj( zXTc=b$AZ#D=SeYO?din|sDL>OfV$hWINS^k6p&oBPeeIcN?O+y5V~c>Uw=(W&7csc z9f}WRL?QH9#nO<(kcXiMqTCIpMqp(l>#r-Y8OFK>!VJKKCXhY3(6gSr+;uFs0iY6B zF~%y!z&xas%vd>Rfie(wxI17BS_Ncg;uu4bqUyL{Qtj89X1j^AIbt+`5F!#uGLwvB zyGj!S90*MbOWFsRg}||jwChTXBRR&nK3}PVN|}b4XK5B>kiduM=Q(FzaFi(bVhfsr z4ef#wGvYy9XbDA%FXUi!(+S!QSOmQO{O>j!8d<wIs&b&P5NIS>DwXy$1m?P`hJNrh zrS}>IU1wH8@W6<$X`1=G1+bKcVMs&-9*GM;Fs^yPm=I0D@XFyn6Ayi#a|X!XmDxD_ zoy0S)%{)9jG_&=3rT+4n;+S!2@S!Ae0JwJTnyNm0a2%!}u%f3zBNNX{fs#kg1RqXJ z8pXM4f|dytP{2%eKqP=*!u2dVsY%Qbj1d(Pprlp9s3Ao}u;2j<zBD4dpe7Om5s*)n zM~s=N0#*t*8;1hp;sMMrT^q=XH?i<mj1ADkqWu(8Uvd(Fc)O-pR6^5qmklceAfCd8 zOXCip0Ai-73MESi!7L>OYPm)ZK@bf<Q6Fk&(Q`5`!G$g%uZpMaL-9mY0f*yk>9T0q zrns&Pl-C5iD|a`3^7>OP29I?zaG!J;nU1lPG_ENNf`d^{PVTQXc|Hh^u>lD7&iMy_ z`+xu2A31vRQy=~0uImvLirQQ+2WFJ?B=2Jo-O}!3<V#K%3n8dT${9UnlW_VPe>#U@ z@T+~AKcAnUk0S^4=Z6^Ewj#pwZbP9mO|QTHMk?VT{)eQWdEqa8@h5)f@XFP`9{_B- z+dO)7_6Ps$_mAKCAxt~|LjR<<@7^)f$8J6L7k~CIfeN5z8vgKy-+lQT?}`hUOQo-7 z;I8~K%s{%BNWh3j!V<A(=F1WA{S<k4!`L>dDQY<!-P|;dvQ4r%CfXltM0KI>rC79b z*Me85Mua98zCtrGWg=on75JHDswPaNYM{lwSDbLJPbPK6R#jDP+io@+kLv^~({4lr zV?_dE#1LblUNDgc<bYk*lZ$GMOAC*L6oA+n(}=7^X<_bf0Tnk05Ta_q7#X4>fni(E z0HYQKCjvlLA&~OAP08v&s$@V_Ra0O<@|7NQ@X?=0Hc&!Rcm8?~qoQ+w(I5>&-L@4I zXMw)USs)9lIH>`F(F_F%1I4zYsEDB#R$)==I>-Y6aLIT?WX=YRD8PhN#aUrBkQxUW zQcgq8eW7lesfeK^vp^JLC6Y4<VxqC^6NR+db?4`CF%QiGkPZ(IyRO^dy6<=XT9_e) z2!^$9pZfp+AOJ~3K~!Waxi>`xV>KfLgb=uGnv;`9F4<2>-gx)nvmcx{fmCv2RfiB; zVgAslHy+OxN|Kqmsv<LMPHJP7sJUoTk<`Z4+bpGgdU{Goj5KEZndLOvUKL$bG{(90 z-EMC=cX7Rn7J<tJ|5yCd_n6qgyxnY$j*d))2~<T#E6rrAvqC0T2F`gvBG+3nm(Q}5 z@Mdom{j&_dHp(ecw5qCdN(KUmCVrjM$UiE+6$)V(h8P0}Qq5l0Bl)muiYSE1Uc23H zo3;vpLa8zthyV!~kO_yOPpOCU!!>~`F8fiiOF%@&T7o6h!PHb0iA8dZv2E%J^*DY# zAeiU>n&#qQ2d`P$zyZdF+1t^kY4Xq+5<wR25lr$x#9#yvpn&}e(f&Wi-t*bg>^kpT zYwf+?aL&28Z+B03Ps9u`0fR(j8O&gYNYfO{CRJcjX853zMOCTFk}Q?|FSyFCa+wq< ziY3Y=+a!yYNkIfbkOW8~3?=}RV^62)aKpJLykYOPmOrfho_iYL2hXRTJGXmIpL^cD zS9qS^GjITakTU*DBZ4wVGkOCR;Hav@kRgL>7oIvIU<OF0fB_H?L|>KVn2K^WLdYsr zLPAU`s0n~s5}7eb0F*=}gu*UE3Uq6B5KB)0Xz_LmWcbwKUd43}5S(rZbG;-h-l6&B zKt(c>a@8&mewbkste}AEF7BR}BuId$IXGB`KxcanOj4(UGyt+N9UR_@cBxR_Mq0@r zLI39Jb6<Yx*(aWV_8!@W<xC_g$V#`|bzM<}VJ|T_PerP_wv19+-ZV{9mSt|f9oa2w zZrQ}SSziHT?W)eP&<HBhcfG2Z1lkda@T;%Au7n^m9#;bBeX!AzCjHUx{eky=@PoH+ zUw`TwPt6yL@nrJg!w=tg{{x>nf2RM#_Ng1Mu7aV=Rq~1Ve`Ig(%<upH|9$1)rlL59 z>iG3{F7v7!(i~y5YShqtz?MatD}#YomnqRYkVkFPf~VaA+GA|8GPI~Dn^yNJEt<AS z$*JV319EhXcMg$?qVVWaN`2e0inHY;<k62qQX7HV!v)|8O~^(_pfT5sD65hX$twt; z%O5i^P=@mvd&i0lN`Q#Ogan!t5h<)x8zK@@Tlg@1PJ2`X+qfZ1I4K1{bipR2Xs!z9 zoFnS{WQ8%WurokPq!3);418gaj}O6lr^=DL6>!_c5}?H3ysMq}0Kl49*a=SR(Sd5; zwva^v*+L<<*#(aj(0k|-^)WPETrS*fj>kvXN5=w^fK`PBzyXnvqA%)Aw`^1qQxc9T z_0rBTwnpw^LRMj<%6mnZFib{gNl^tw$p&&t)N(>iCPZOjKyc3CsDh^V0KzfG-jP)m zs=$_O(w@x2=DZ^BL#+T+RZXW;7Ij3zDxyUwCChX;apyoqlQZcOYE>20cx=h2WjVpo z<kf2_E>E`Vc<;Ho4o;n(&Si4Swc5%v=iPvoWm(r%>O14D8pl4L6`BmbX_{Z#?~Eto zuIm<yxfzWVR5+)v+Mgh7Fg4frJ#(t6ax@w(7fViQwFu9eBg^{3oVT@Dw%glMmQ~;N zoLJZbOZ1c=o$c%-f?d}w<_qVjC_>-oq_2F2WvP?_)X6y#;bz&?yW2Tpcn#ib*e66{ zv4AG0s?+Iob8|AP>ysGGjAN@p8oY+q^bMmdwwE!OXhlt3=ABpRUw!ozLRv27P17bW zKK9X%;oUj1E4Gd!Qqe0nt}PZzR27gI{n>L5+;j2lszM*UN{R?RIDoX6xAXa8xtxm# zK;hih#`X?@2Y|$~x{0hNGGG1S!JW406a<0LZEWt|??YIvABa#g(GQ&?1>wGH=Ci~i z$_kF$_Gt6GWu|2wcxF*5fRIxVj%mqBOd4HP8-4OS^$rfft$A~2Qw~rhAz)5jA0wd? z(XOYW+VG)Z1th@Wo_*)d4m5Fs)i`mGL8=O_Oi#LIUIEN7XT)J!J8TozoWm<u1JWwJ zdX+RqsP5wKzRQq9SmlKo8AFEkDk84d`~*T64~}k2#-C_rO#_)3n=wJ<ZcY!k)Q`;g zB~etGrtP{egn&3H%VLnyD>FOiMs*!yv@C(5C`>n06ot*40iY~P(<xMl28Zio@4ZLB z#bP-ck3=NJ7(!^<rfXZPPEv{pFqw=_W(!4Bmbxkrj%EX06d!%yq4&S<eP8&K&wuUZ zm!K?(JTu~7ed&k3=ZAj!r+(tYAN<hQuf2?ZpnxGdp#5{_nniQx;NY28Uu3k%6P5zd zJ4D5`t2bLxbCoT_;Q*_5b>MXj)M%wF*TT$o8t|Y>NI+{zk*cUlNPUXLEGb#?sGYo~ z0rB2Da%EX|eP@4P5uueBJICWvUIg3h)cFwncs#yw<3`tMHY2RKSE>LOQ#cfx!{1c% z{5;|+N!EtT<P=Z^LQ&Z1Da^rpa!RNwNj2pz3YiE65iy8}FKg$#ImlJP5fw#|OD>JN z28ko*L>vQz$~XoI(3e&19TlN)1i~zm02l!|i$e*pAXiw!s-V&*P;$(!i#nT=L`_j8 zS=^u@F*srHH564Zf~D_ACB(Lz9fzYsZ5pTIL`-$hEP$knNS<aVhyj2kMpSjc&@V%3 z?IZ;v22@8v#7Kp&9VpdXK&23+7!g5Z@B0oRTJ20AqPV-am&O~5D0rA0Q4tEx_XFEP z07SXz;%r`w>O@2ky!U2QWs#J)>wDX1i}hYvY%jUV0~wF%?X9ijc|RU+A&@IV#QOT- zom<_ZhsmY$6R>*DMwURV8L@A?SRy)^&VqSNiI6d+H0XR!OJ`gD+3=iMjF;z}i?J7G zJVlb2*hdCNH~_$WJ_p;8p)n*9k>vwhH6SADoF9T=x$9czNK`~vL7CY|_mH0sP+PdD zBD&>rvA4H3+1R*q`;Orgawh@^hG0Y^nggnKZEMZLDdj@*=oAr{lL7(JYINtkFUxYV zSj4^`#_+ZSHR36dcZMkL`!1y_XNcmU5_5zOb-I|(XEPOzv1Nv?(Y@W>Rd5QdX?Gl1 z#(2DX<qf33+<{<BqsJcKwFjI<2N_#N)f<oP#*Hg&)89V01uQI~8r}2c2R}5p>xS7~ z9xSUPSk7jzy!^tl>4-FT@njLc=Lhat8N5yr&3ULr<lT#}ymsf#0ivzSU6kDm_dT9v z*Lh1}waKt2S9$yL8z(1=lzL8m;=)%Kf9S^^TJ4N6-;7{!&Yoy7pI^TG)|+o!2GFCU zBgCzbf9f;4=Px-zC5*stEN(|(RuN^pw(pt~=L!6JO4_;u7>97t(=qdE2QX-_^HpsD z)`&tPh*$`n+uo5VG>r2>l-ABvSmTNeGB0%~HxF)$Ls1!yVsm&?W;UsgDU3ti%}zK) z06sc8MxwGT?Z(~O-hSuCjddRyfQH~Ky2K1Hrg?6fR#olx1prA2h>ZUn``!jn<5Asp zoew^xSXISJmTzw)qLxM2+S-cgYVAECwq0+GGZon1-!F=A`_3&26dfl-AqNW2KL6a$ z{>)EtA8}>k8p_JcmoJC!t-k*Ue`x>y`<SB(uHof3-+b|v+i$BRYgR=J5w(KN*oR35 zjr`j7E9*OOm062<)&v<TYHgr9O*=3c4fY1@4~ap0Mi563f?rY0m^p8PV<JbQAj*+N zm=VeQke8Zhoqe8~I8Uo5SA>z=s+_iQv>7aIIiX-zh{nV#h>G_fz{bPqoZ4JhgoTq5 ziX;G`EK3s5eEJJVP(mbdXoK+l$yY$Yx++uO5y7wlV_{RVfv|{5IiC0o5+MKxj!4N_ z@(3rA9_{fGBex(x=zU7AbyPT#Mb}Xk+QkVU9LV8OYUe5}l57k|il|8HJO!Y_69}qK zYLWy8cgmBQ>ywI@KZHe6WEkRM6+AN_IcFLINu?&AOKmlXv=9oYIH#eYW`V_2T<wdh zL||0ZH16A!Iz?m$(P0F12&2u-ZgeasGw*$heQ+*0$B_w96$C_6>Sv2Es;h0MgyYG0 zvfPX*#lGV_eu6;`?UD{@w<-uk2vrrfc6VCri+U$@X?ij}JiLtBkBai@tyxvbxxI-4 z#UTUGG>^8+H~4Uj?0uL_CSB9DZ99ahW{n}{pn`l;n2*2j`?4&W#;K|(Bj~!_e^|HW zV{oxpj7Fmnyl~MbUafW3p0AwR<q%^`%jI%1*(l2r0GeeZk`M`oh_KboZo|vIY5T7C z&IRYW?=6Q502FQYn!^@UM2TXG%jL4JtJ%!;UB{9vg^+=>{>Gt-fOA$vc5Mq~X(<6I z_I7v<Dibi2oq33vd9hd&Md5L6s_cn~^zhDMRo2U9;amZL_gvU7$^up#iD8+CnTAY< z(-S}tjwxx1=zVea?0&9RWYA&fXf{CSQ1N6sMRdxd%v}$UKl!lpBttn5N(f5ikPwBO zr>0$oK-6j9wO!ja%etz^m{+7LAXh$8$&n_RO^^GoMFbU@FA{_;ABwePnA3~LjKRxh zHlLkzU6)eNF&!N@@BPq+708jbC22TVl~tT`MDgZ3*AEX5Vro<DQ|#{?+}hdQw-Q4@ zd*nBk2U3cq77iXHR23WwnL(Ikr{w8Gdf30xs_|V-s!>mgWkWEQ0ze6}A-v~9Au!SM zT(u#wQ$S|R6%pq=g13a|fj(^-2NX~QVea3)c_ZZkH4X0)dGdu1#J+^E9mZ8Cn-o>0 zkG&7REURpfcU0GPRaO>m<DEmq7-Lx$%<No1#Ig)UQ7o6sl#-nhd9vzV+qQil%d(Im zX~6PyM|C})&k=Dl8OOfmD1*2Yo33fQ(m6tfz1=;f3SWB5-r3`mljG^hqffp+zWmCq z=`<z<@>`>=pZbZ<w0-yd3onp&sFpM(s;C5ERKI=W8iT&)J&z`iq43l8__eFAb4o%P z|GHYHNTy`lHp7ge#`zkw2!uK7Wr!?P6?7i6{Atk3$?Cz<(_x2*2wuH**dCvFgtDZa z?a9v0Wbl}QNf~nHpo$V59-J(fecSZG`=a!tx;nGBLql(EAE)E#aVE+DHf?u2oiVE; z^1(arw|90zVX{OEyeUE`LMWUM<eZ4yx_zf-5f<-#QG~j#cXs!|rl;yelGr&7h^prK zpU>whCGP_O`Vhw3h0n}rM8YEY$#~p%P2oc%jI4`AW9N7o3Kl^Z#+y!Afd~*JB~Jjr zBvIOqr*rH(NGbJE@}gb63yKSdpy-q8NgcQhv7PCyTW&VPw&9clfEzq^sCf&fYEJ<y z?)biKQc92#arU(d3&)5G!m5ZOs)EcmlSEl5Axx4zh_Gz8<A{_9{7hVduEbDy=g6T$ zfYf)Kgir$oN9+o>Y&W*{j(u3D*gTRsdFMo&^}iqr%DilN*}%Al(v3H^E|sIUjR4>Q z05GPg0Mp~+<#Jv+u1g4xywB;&W$E@eCgc4bfX!RiZXZo&%qftdcZ*){9L{$)M^)uD z`!gAH>kJ}lV$j4AV=}0Yh>EIrluJ9c*kmi@EWuM_j3OL@55b`EI;dl9a;bxR23B|} z+n87)<PeyYBTHZnZELB|=4BeyHK=w?tK>9io15(oRkPP#0s0u*w)NhJ;M*20yNYZD zll3sb%tinthfUL18SR6YUQGF#y6C(SLq!yv=A*3Z`VfkuC}Q6uVv5mT-XOdcRL9H+ zXgQV6IiE+EgzCwWM^puO@#1~c=?S6pzBqUOo|XD%@Cl%bdgrZoTr5%u8!Ql00>lR% zdKY<TBLL2_E7MRZQ6QA#<HOC({gc_WZJDS<H#&FzoE^AP)aux5CjfFjki(|o#I9{p z)1<Zqbfe9!4f`3VBzlUZKt!h?UB_iLnJ?O|>)Vcxr|HQL-tWA#B`#$06|yLRBS#+n za?yrR&SuNyvOPRpOi$?h&z}dpt5CB|ff=HeCB=TZn3o|qgswmz)cG8dfuu)^=@GCf zs|dPWD9Au01CbThSz$#@L%3Uwg@dHeQho<kQl?1*0<Z+dO-&DwJhI`=QkqC8%gJbQ z*mSmlv_%(^FN%6x6k+8*9qKMqZa~v5u1^mb)=8BpqO7tF^&>l%-hI!*JLUFkUw?VI zScDL|zVY4<W@rF_`C^e$a^7bql<IQX^u1MrXsN)=wnQ|sw8R)g2!r?;jN?s&^Ti@~ zZ`6(=1m~#ldrlERJj%E(kB{fVX*`}7j;OB6*WY|T!|MrOzw*}E=g)lnQ{VUDzw`Zz zc^^|EPiObfS7q@Z|L_l<zWlP3V9W|taE^fG8!tTf+Doqn^pnY$0YuW#^6*xFtO0X6 zWM-q;JGVxv$<$;REE#T?D9Oq-XO=7wUWM}6<Drz}0&(c>0YF$gP4C<|p5H$3-USCC zgpJK{<!#L6#^Z77qjOHAQ_z!><;$<Ubu#T1i+*#Xs>-mlJK5gZLJ<#u0Da&0eP4uN zf^!A9a^=QbZ(Tb$oSr?qI~t9A5#IacMkp*))Xo7Ua-k>$lzccoJo?I4zj1VYOh`LB zJ7rlu@X&+1XU@r*B-A_do<i{U=DhUc%TGW3%yf3LzqeOaqn+K|kACt~WxWlm%8CfF z@0QCMr_P)`%h~KtKL7a}*RGdku{9ZQZEZdIz7K3|oYCZjF{+T$wuHW!^U)FCIf@4d zx368F-nvbyWl<7g5sKaIT_93$EQkoLqvSwS*Bwr|ZG@BY4P-!^>#&8)nnZw33>uW| z-c<lj5>sSRQDo5-c2`9e&_FBMLSez}2qFp5t#b4fEp!qU9gt&C44#}TR7fSMup{Su zbbi^U?V^UoJhe?pM8Tzq!J#r)P_r|MQ%Z~JG@?RPhH6|^TN_)u%pw{OkB+*o1HiuT zIrSU0-xzuCpsLE0I5<*(P}C1R_+T%a#|NFNXO_|dqO!{M+w)Q7CsjZI=I9+%qiSb+ za}_^;NHL}5vf0=eg`)DlynW|LQ$hrm<Q;|J>bfRE+dB@ej=6XX06ILJ^<58y!t9)G zZjP&}z~Mr*Q@t#!@pzOHFPmn1GPCq2a_AjS#$$s%t&ZkqxoqmXtcs@TnBnkfmYB;j zAgB*vJQ^V)i{!-&qNo_A-MMglvIJGY7-L@)VLTq&x=vK7C`=GK8jZ%Iaf&lgn$8y> z2|z;`3<0eG%*i<-a+X&SLV@VoHuf<&$^x_Tcr;LzfQ89X-}k-<-dS%-=v}@g9)Ijf zgUx#KfOm<7tfnS%-cinnSH5)VJr6wagygf#msMev;eb!iNEBBDf`BU3X#bH%?^!OF zkG&VYuY9QLQQaqVVe2Y~l8Dp?!oZTwUU+nK=l=P8MpTsb=47&6)fKafYD%0_2muM5 z^Cf}r<NVSCPmVSZin5N8d>Gwx@jio@pk_2SGYbQeCmNylRBVnn&m|aD6CUsSk6gI_ z{Dt!ay;00$mNOyA#(6v%?@uPnzK>0m?P~PkV;6V!ca3rcr0<*@Kvj|m&`L<dCRJEF z$+0ZUwpnDSujH0#4a%XQlJ{b^<+XZIkw8c2M}Yejo~YsRQFj4u?P42JB@mk{&&B9X zhSB$Z&*-bI%`=xKJ7>yzWGEt&3W<uTcA92+r(a;{Oq+|@LIG#o*1!0<UwildB|!iG z{N5iK@I+L-4=KgA>%xGBna}46*@nb}x!$rX+F_f5h^dRJ%HFkYi->*S@qmjuIXMxL zqoc!=Qb#%1HH2_@c$iWIWdPaV-{`N;6y*N<FQk+Ja9kC)Z`~9S%pzf3bj_E){#9}H zyB~eu#^xR=Y0_^!_v|yzJ^igKFUr`fCL}`962qepJp9sIZ_L~FgO5J;k&k|2G^)E4 zr_-Znp84AC%Tvs;fvcdSwFIQK{mnpN&7)~yS$WTN<sTGf5OTEYO7r60tSX>1Sky$I zC~6UK&V{0Ay9gPK4uqtV@u+47B_hO71dM@0sLG;pF0hCP8D#3>z1!N}x^?SL{tUYS z5Qsud(nV&4n8bOnfWitus+P**0G%;FeJE52d_Z)zhhb*tJ)t@x?=S>Mj(l)gSq>6{ ztIM(~>y6385iuuIVW-ri0!s<1A%qNq6)k}_UDzz@jbc=*i-*&=aS)k8QK4{$si!_5 z;K32!xQWLndh@70=?bFY?5ywNGE4ae=$?wOakwML4BN>neac{6VdE=UGbhHnW3hi_ z7B<M9XyU9rx3kWCJ1|((G5~yqO9dWCcEcC~00>19iL?V5V7yM16mmL9(|6wc*}RI4 zbB<Ih2f(NVi7mY}^MX>>rl~ldEElt_y^G_Gz1ggF&~l2$Co>iG<cM^(SfmaL4{cSX zln^k9>~C$?qk40E?#w;2TQ{$(ED&2y0M0EJ{QBFsJtR*W2&#h4p5NQs-C60+O`X@r zl#&v8a_->ZXnry^O|17w4!5^AcXqZ4XZIb5%5u4|y3M(8{rW-EEDX$8)vg{@6%uC8 zUVehQt}DyJIYM+dZ%t2*kH{e*)T8p=dqZ7UrX#ecAQ_j<c~Lz)p1<+NRqx3;BGPl` z_v@;1wt3Ctd0i})RaF&Lolch5uH8PFPJ?&k-FRGWZ^!YtuBsALm=luM#C_j;ADr{I zZe4%potvQuL{OF<5y#_+LH><)017E_S(eWE!=u^Fo3|XQ_f%BHg$oy|ss=n|^4rwi zuL*oJ7sz?zGJLx)hB8HI)oa>5kv6us?bgVfZ#oUQHPDFN*@PAhtQ+N6gzL$!#R!@l zH~WI}ZW0Lzgq$m^irU)U+*H^%eh_9fi>la%JoBpsC<Lbk0_>a_A>z3U52N!r;m??q z18zxF(P6+~2o&Y=+@<%Nzx1exkPAe?Lcc{sacEo3<mwzzjjHPEOAl?{`_KnsVnGT; zjpW%LN&@e~wfSLk6eF)(zuxSPAUS5y{y=7@IKWwTU||aBYU_?5iUJ-8M4SRBR!SQ} zmx|2?CfoNG)k9^w@7~^)WssR*-?ewzn=d9Vl4{c|+hucnd?HYtx$yYzeUI&2xOcp@ z9f|;%?SqKmP;cM99YbK{VbW?qG57BMM?Ut*`(AzV=|B7GH(q}J%Km6mRRlDYh31M< zO_0&Gts^vTA?MB@FF^B}Q-qmq2pMBkBWtS|VQv*!Xe%G)1c1!UDH-}yx$nBgy_Y6~ zLL?ne8vv-h56&%@4H(~y2o*NR<F=pw_P_g0gsLv;kA3VTJ7@Oa_3$It4zJzj6D6>; zi68y=4}Rc%PyWyU`~UKu`yTn(pZVFhE?<7(#plNxn~%KfUH9zozWwjte!Dy36-#E| zr>t!Y>?;oL&RRxtgL%R-i@;gvf-<ZL>+>jdMgK;0L}u_{?G!{c6{R;IzxNIZMTAo< z%QA!lpivd?$$98wn-X*Cx+rCYynsen-7%`l!dc8k)OJnR#=h@daH`IB^GU#Y@4XKp zIA2uNs3^*mqzF}6jTP=Nb7Xeny0#-A@4a(mHakv<z!LyD64l9M0sx%E=6>XyLvX+# zokhcXn0U~{?3iWQ(y}`j>QOPSuoy#8iYunec>RVdb&8<kln)nk$2z@nE8Vyi=ZmW0 ziUJOBS|sXE7JdkT8I;a;CGwENtfxA3q9H=ufQ~R+z?zt2N}y`lxr&eyb9S4dXtwPR zq7C9<KefWrk?{l97DuPb&zx>)I)Lngb4d$OY!-U!Mj3nQItv&qP=f>Ki4@xeKonJ2 z1sNqp6zSRq5V!XBXN%Z2hbc`75q)<50z=OnT!35yDk^jAn`W`IUvKViojH5{o&L_K zq~LlL=R*-CR&`xD2?XAOFeKKZ2r59%8&O0Qi5$5!+1%XT*`3W!lt2Kw$dwD#Xar^u z5Xs2`h}%1xM@Q3oRBvu=utZRG<VAQfUzTOC(6C|3tzFl4U7-r(eO-^{^AlBIfv!tk z*VlDr@1$nf2{ug=LgAd-+}_&S+3wl~i4dh}+9>SM>#*1&G<74FRk^V-+1lRj`_4|M zzUQ`ULgC0!Q55LRcSlt{3Pm`co@{JxPG={^ylmQT*|hb5dN#nBg7z_b@5%Wyd;7~p z)3%L*#+dBZ7gdkLloX)vqyJ9#>EHT~>Y537%|3JLPE|kxYntTLQ!`|Y4k^OJUdjQY zBe%wMJS8a(bcj=kIa#8EnRyT?Q<?`M3^|ij8PW-nJowej1WZj#r>}WnP&hCLrtzDB zz%0+?vRIt*?V+a!Eg`v8ds^7a#p(_-RvPeA1wFlZbiLIG3J#G}HWhcV3MAy9Y1%&a zoP@kn=1w4GL7*Tiu$G8UG@vWMmq?`#CAh#C+Zfv(6O7P5w7vK6*7>tly;tLgJ1hjs zo;CG-MC6A1W0t_o&@8ZP`Q)ABgOl0yE8YA=QlBo~x4FIRLU1(PwkVgcUyID-z?tP7 zt&+m+FfLKP{?r#g|J1k6(FO0Q>srdVN-zY6b6!Bz;H`#w$xNka;Zb&2^?eTmkL}bb zFaUZiR9Hmnx=ty^*aJX{F=uy+5bAPqa_>Fg^~%eat?G(V0Kut#;-eqFJ&#|x`E~m& zp555_$<O@6I|oOq;vN3VFaPp|`!3Dqi&0&lIlKLvfABjA02H`S58n6CJ=<q}qVM_c z?_JJLe*1TS>o7Kj3qSrnKl}sV_o?^X`{1?Lj@U+61Ry40K3%M4yI9tv!|BFi-C?%2 z-Y0Y`%^jS6v}hoSs)!OoRhRF7-=psFcZu|)IuOaIDx4!v6bip+mQ9;+j6_tF#bb}Z zD<vQbs2aR03fkM-1~pX&A;Q7I!E|~OV;oH;F{S(Ozc3k(n>Kmxs=D+coIkf;6y><6 zL#WHLY`absn6<9PRXHv~`O%Ml^s&dDh%uFAQI>vdb8|c%JLg;o&Jkv>HZ)BWoG&&v z<GHh+_~a)K505~#2w`JmGARSb2A~HZMmULWJP013xp7;LPw;rQN97VylvMx#AOJ~3 zK~$*P41m5<>Lc+y^%mNlxQ`gqYcIY5ed?M<Qu2;~B^y@FM#=)F1T)$yp{THNYE?uv zF=zEozBwt6&;b*(#SkfA5@8hu$~iFr))uoG1VB#_gSlhlq4&j8gTAU8e(ZS4u2)>8 zoGG}K=^I3|Rt=iz6c9_p3<!AyQbiC?=$x}?B-7WR5Xa6CayxtHWAfMD?i*bo`XW#+ z`ip>wNhPu*R__4FS*l=J6?<pTzFk+N$)wO(a2$$?yGD|F=Zg{@h$m>;u4#MceGy6v zw>C%yYwnpgwkG>$&mA7zG2?^x{>F`Wc6N7mceco2mV{mE7fowj^xpo?V!7!1Mj)Zc zvT4di*xKI6&jg`?0R&VDi%@v)jIwFz+D+SyQVOB8AGm@RMTpFi6FRD^YCIk{&7yFD zS=v5!U0>I=8&swCGf9cdvZ|_TYinbAeAKoLfX0~m*f(uk6oolQ1Oy!(A0O9s9YUB) z#zm<5?nHzwcB$`si`yb1`w((=e1xhhN297~7WT1d+a{$HiXz9Af+KL8#KZrOe{y?< zYlw(b<IFmp1J}QVm`|otwsA&c!U~qO!a}Wm+qw`K*OG%|C?s`NQx2N|8b}3fK^*JS z=;4XT%uHB2C9{kR%?o(fNb%bmn&CM@8W4iH3Abc*J+)5RuxZ-O--t8sa9e4I@&01_ z0)-uxLb-33w+?5E<+2RLxDKH#deEMr)1=ZC(h*0WprWb@TcO<W<O5Jp;#oXAIGWu` z*uu_M{qV-#rE+&Nu0s$9<amSBrvwrub<EtdaM!g6sd8ATazEF8dF9z<GdnuJ_(;6} z;mOWUQI_6$LW$hnI=Hh{6ka2MM@J%>6cgjc-Sf)J<K-Pdz3==P*LKHuZaT^eqLkQv ztg(*>$ihU#DLEI+Wp9gUGa)c@N+~!mDn5kR^?l#1nneUmDf!@;Q@dQKDms^9Bt)}7 zID(=qUwQ4?o!f_k(zboq_JBC9i><AV<LT4_T4SHS?^EAhyYPiS`%}g8Cx7%ak3Rb7 zZ~fM9T)uYW7e4#h$KL(uxsC0&76)c4npCw1np7KS_s`$Ce*JiPqGQ)`f8+YqQB?&s z)7WZGe45%Jddeyp@+WkKYt4%Yvna@rl(e?Z873;Y{z1=56LN+37w<dcrAw&~-VZi@ z3`CAdL<A%h!8SFcQN1ylIOl>dRu7Lu$_^!RL=<C+F^)zx014>!_SU6K_aJ&l-gGWL z6h2gd-ccDsWs^Ms9FHg7hpnycix=;8&Vg!G*F=<3pTUZf3<cyoqQb_;#@5!BFz@bc zKlYw?w@p*}FsiEK!=u<o<mgb4p_?z8m}XssB;L7V(L$5%9d9S7`b8tLV-}e%=Erlf z-iO8IHI4aDBpTEfF-d|!7n|q6nEfg&neSx35Rt@e*;bNiltz$81r!xQVpZde8}81O zR<_4uvt<vG-P}3rDZEb9LMD+=vKd^A@}0F_Hal5yw@H<B$eA|Is0f+_GGEPNpo$W} z19*hssBlHYu~kTkN2BrCi<hdp-rL*TnCu_kzTGZPqIBLB!C}`eiKr;5o$amtv-`p_ z9*w+r;sUBDh<9!@8dX(I-C|T$I~$u`bv8XL%i@VA-dz+PK>^ZaGAf6#GQ&oS@bSrs zu%wvw_VzY6H!fYe7-O$s2|8HUMNtHcK(^}n@bDnU6jQ&wJt@lvnN!<#ee6|}3*Lob z9e;L963rJ2X5j>9&z{-c+lhTYUo2I%EL{kdr6S^h-V}l5vK0aE-I=p{+q+xKWz#eZ z5wXtLeoVHqF+ECA6p`b2RFB3Jav>B202hVd-QBILaxG5?O)=^mJ5M`1TRwOZMiNW> z48h{<X;{%pjJ*nk;76m;Y`##DP`FT(R-FK$WF>(DfWPbNySo+EmE&|}mKiwIqU&ir z!`E@mDg&pR%prm8E{&094}E5_u4ibhE!d3#l>HF{eM#?PL)!Nd!l}JgSKMY*K^qX^ z-4%t(Fo=hh(C$>0n)~ln^>ONcw*NJ+1_CO2*NqOKP}RlF{@^&aJBkm5?e~`(X9c!Y zMwlqJ^LFvp&EsXW*xK6O31jb^I${NN!Ex_rOK9g_kplVcv3J|*LxH4`XU#Ib(YPDQ zK{!`UE^VIM-Pi`_x3>50xwwCPoe$r9u8XPdwQYMzZPJut@=m0WUEigc02Jemo3H$J zznpi=lkI!%o9v$PW$7IVEDmqncwfCslq#oX=^6BR-rnipTwV9e!|PYyo=|9xZ+`ht zJ|CAeu@$c>B01+olQEcx%zVO@<V=L1;(Vy<x@(&hd+T=*z<a-J7OJ3-a4<X|qB1m# zxowV7SeO-&Q`GFFm1mxLNx>oNefQpXd-}2}Oh)w^Z@zx*#tj7pg1RUldhmg_-+Zf2 zT2=Lb@!j9^>dP;D<=L+>`m0yo{?vDWvT$JlN=hQ^M1JJcKeD;GDY1L^0}s9O&gGqA z^5GAC*J3_<?b=&Wm~*h;3dsXVW(`&Vu$jH6MZ#q?2LQqv=5wWBIVHcY<znS*2L&5I zGbiRK5JR90@38O~u%mhSwe66c1Arn2$AOW7Q_7rU3y~d)Q8MJ2CvU&k@Kpw9@jf`` z1jxc(9C;Wh3U-Uzk!O#pZ5ixDb42E{b81d*iEYQ6ynr@s5z~e*tE7uXhh5(<yOe~R zUfM*0-SJ7`!?bBqALF8lO`F;tSd4&}3uc>Tt@sY6)ltn5rF<i+1$3y{gKa;HsGvzz z6cV!n38-DSb^){faYRW)0a*mlJpO<J7V4rzA|RmF6R+O(Rj@|BUQJRx%=!=<<kc4q zc7_27X6GI#snQ_A^M?Er&K#ALa%edrDi|l+A(n`aumA`k6=I7J6iRZ0INsRU+^ToB zx2H$fog!&>&)M@Sjt-9w2tY)uYBbr{uoi;BEf<Zbgy1(fH||`6!iUmpj5cS-wu__5 zc>m0<h^Qv-Y=tDsc05W-kwp-c996C?%P<*_5F}fHb1pjo<c|t~^nGszhq8pCs54x} zz9028mTf3UZCBzwO*U%ll+Ngm-FB2cfh#~hiAvi?Lg#|t+uJdfmU)-O=p<lF1T^d= ziyTj<063o1kH7cbwi<Ippt3?-oQ~)Kj*gE3C<K4;()qrRh~V5hQV<42u9$910fF?M z3+K+BJ>$F^#APJ9##aCk5ud&zn0+P9U4J|Beavf)Rm@F578I?<%Q<&FA1US%)4MNV z)pgyny>1nu^>o$KE@8myovv8c?&%Em%O~Jz&X9H07UMCTK5`luhxncJ$Gg8Gs;BMy z`s!$iQBYWKX7byH3NosT8#iulVR(1B{h@N}lH!)CmlpaZbE0m!n-;so+kr;PC`>>^ z<T!;k>FtBiw+s%pC(f5bLBW%PB<z<O-|5`KQRUB^Ilr@arYJnR(Zi2E>Afrux0<%; zn%K42Hoc@KN)fw8v`>A!b^CVT^#TIgmm=@H_SMDgX!ridCg(0rHn&3=n)Y}LXi{y} zuG^XT&B>Suk7g%t9W+~M@y@HSOm7_o9v$6o`}uKEgvbz?L6pc+8nbVn8B~%Z2j~SE z6O+U7c(ZGozVA^0=Rg?0B2o}cDmv}k6g%e&+W}~H@1Y9CltkD&7e#DF!5j&_F#!k# zL6M;C)18xJP#8}p&QU9xSQEmT$%ZS6$m+5D@gMw&&CSVQ{KXg5A%I@IbZOZ(w`WsC zQU&Mz%dfrM&zBopn+Jz?+P0~R3L<>^$9{PK!uc=$`4_LA+@`Qf#2C!%x(bdyEg1<> zl@(V#u4ee>=>RCBIc)!v0T}uCHr%riI8$tjGN6ve<JrlHu+U0o?Z`q(R!lcp;kRrY zGZ5=6=EVYS)`L-1n1(M7wnBpoFp@el^f(Tqb6TB8BK9Pr2qT~)>{25v4p3Dkr7lJ@ z{->_@2;9YPF-MjTklUVE<Ff0QU0k-@bkd}*jj=a1mZ*wmZC^gY&Cx1Dr!X7^7TIQU z8U}#GDyl5jp|WMDnJz&<1vH5$q9}+8g9?IOy#UBIxKQhWRSck?SF^wZK&XI9Ac~T0 zEiQu%0Mu}r*$-w%fDEUbIB<g!-ty8jg4=e;1eSLo1WKlPQy^7OWOGA8^aPkJX-0-< zA94yMfOnx+DUrI_(lsr%Z9AJ+8+9m(Nm&M8Jb3Sh^X}j<p+rPlE*8eUAasa?ii_Dv zvzR$QNr_X8(09>hCJLZ9o1L7@W@pdsBas6_R00qI?@3jd#d&WHKA@;D0wAi(=5ja0 zv8$!Xn?Tw^fna5x2T~R1or)9X!J#fg;*g;r5VD8}Ea+BGyR4iqB_c*e%=Hbe^un}C z*G1<b|2WKsYu`l1;x}1S@P@kqT7>};8MkW{rv!>gBm{qY%@|A3`Bi($BC3&`Ln1L7 zD;n-T^J@hS6PrQFzDv0u#=%p%$}e1D5iMsbb2Hb*Zl@`y1KA($x|B}kC94K^`2JO@ z%;}wN*Zc5a*Xxgg?{D5T$fE!C@Wdg<4Hb0#cV^WvD6r%tSHNNK19u1beEZ%19T&MZ z<fp27Kv2`W=9#!;)vkAUrbmxeyB{B)zYpC+Qb?Uc-!da}i0y@~a%X!y-Z-;daF^`7 zWG{W$wA{2F5`z=)pyXJU6DXu6&5!3Cm5@Sk!Fy)yx_*26j3*D$+`jSl$#e=GFBYj; zb|Oum`o3-Fi<4$PZ@W%7+4QVwTSw{W>I>7uo5k)u_0GAX9(DbKPa4pu*aHfN0+B*1 z#dO|Zf8(#;`erqY)X!!o{ii<pi4T0>gMahYzj^BGPpQH${n9Tv?|$cZ{>^;8oJ_Vq z`SI`C+b)0i|M&xR^)LRyFMi^~_x#nL|M7qL!*57}|N5tY`tSYJ5C4n*{-3>i^F&ZT z{oNma*Sqfhjo<t~Be;7nUijIc{>)$e<)1zE?5ioJkA2|Dpa1!v`yc<Oe|6F(LjAix z{OL;%T>SOl__xbm-}RnHw#VUxm!1{p-hSs+3k0B5SzNt!>-Af=wHPD7@nZh+E3a*A zZ2!0a;8&k`?+5<+D_{EB3s0+~zw^P5-T%;oU;fKKU8V>gkjR1i+?T#kGZnrVmo-Z| znol>&$(74jp8D!nFW<hLN@6hPv++EKFb~XfhxI!c*47gl!2zqNj_k+JpWY1M%9PR7 zrbJj%V$7#AEEY=(HYX$+h#5NMX66A=z6C%?Es;CRCIAUgMZx9M<n)D!5&=2~kk58c zWSl_&@Z`|4t;FmzsJRKYJ6Q9$R+UpPi8ZmaS#94#lGwJ=^$sv~Jx1=AjdoGm7?(|I z`@V^>>r|A`rIakL0SU!ac9KIyHPZ<VnrY_`h%l?NNMcq{n=k_+115t-fyf$JiB$w) zu>C<YOC*A1i#DR8T+uru=L+u?oe}{c1@F8=BDSFl5gR_*Mt|t+{E+M<XG^b96_#YG zLJ;LXsz_e!TU2UFNQxq)Hm%MiJOTg~hvXCy1VJ5uV=#ubfo;e+U{eyI2PAY}rHHI| z4#7|G%&givyH#&=Rrt_*A3AqteEI6F<2!v_`XnI2)8pf^s*BPa^l(&^b)ZhL@4D0{ zFFGpx&Q>64yCsSb$Hyma*9IR}Vo;;d<XCqD_F4uLsZAeNmD13kC=#h9mkoT`VPcxs zb)01NBp{$8QZQ^f2<!S5a+OSsr^(xyGofoTw{Oq0|64>&tIXC+ya$C0oEBXtG32(; zhFOYwy5L{o7ilg04NqrXXwkH+f-Vc2*!zI!z(QMwLap%L=ctNrCr#q|UuKon`fb1d zwww6duC9Fk45;Gu*FF5G;502F!*g+UVXp?^gTWn7$IdIXR_;pd5F#~9(CN!iL{hO- zj8i|=U9S@f)?VISlkM+li)DZ(tt@e(D;s`BkHi!aVR<tDz~tN`qcanZE;ZwgQNK8D z<{~jVkiDJF2Ol^;-Z*pf=KSjQgA^56mHV_@3MT?m?*N^Oras#9+jXgJ`(@iup90Bj zdc2%&Vb5*D`{(y((<@iselE5twY*qh)3m9dcahqzX%@@2X=5vPo`R}s1WbU5n<ytO z+&*??4ZsGs@)~DTH@dwf!sW6#IGVkE<tt6!$+98vh3bdi`^5eCU3%`D<=)wy4}S0? z|K-p8SI0*OU--g*e)X-(zxt2<@uLs!zy0R3to;7RKk{q;<k$AL)9cTFscpK?{=z@_ zC;#0)JhNBbd*8WNZ_a=DSAO;9e&+k%dh472+pqt-tuq(@hkyC6e(2Mmn4Mht+S9N6 z;17QKU;eXy`oKdMf9qfWug|`A^+$f}$N%|1|EC<Mzx{9i?P%}bfB297@jW}~bAR%= z|Lb#~o3?$Y00>o8y!7hj-US=4M3FE5)!%&Lqn{Y<$>+cDpZ@qyKL_Yy7x&Md|H7aB z>F@v1?=h(u5Ey+${`)@psV?<@{-rNHeChtr{P^FkH#e4x<=)oz!R$^WQxR4Iq?M)* z*Go5DKO+<eB^|1s#u2VQLsr<Yga(!_tF+pG*aga_|L8ekFW!+cBFxN|M^Jzw>a7(R zU}+Zf>d1krGc*qZ0wiW~#5t|i5WgbHoX3g?w%N^1gY6K+)}L0AlS7wcN(#UtDM4b5 zQCTELNJ;u6T~Cpvi_*t_(I87~J58LrUSdjp<UT6f05c!JtO-;ZSdoBHRFW`=#uO9h zNhXUXu|!4@RJ(myIEg6Q0NJEK%A$%WXmew$xe<sg&PB{}6nt5h=p7LHqHw_%p&;*^ zqoOK8C=HjS&LcSmaKRgVhZXuPfyN|i8A^r^78xKbIdg-Rlduc{en}HcjLb=yQ|e>a zX^NUyV`Q<683qxP=OzSHG3b{AaG=h9txBMdjo~sZ_z44$7l6atz8?3tuHj_2?Au2! zZR~AU+NViXmjUaljI1Z~`SJ1b?(UhQtdY?9pu&seJM~sMJ-WHQH7-<lw)EkLwr|wh zEKj;l7mGzo?7e4`*oYE2mIOoqB8d%j3MypaH8R_~3?o8hWn>F`T083RR{E?$kOqOy zX|fE!=|uY57L<2gIzVujHtE}LE?u7|uMJ!=@A3s~Gm}A1x_-Rlieaaa=NBs&-`c?3 zy6wDzw4_BAK>#ous3V7z#RfyZ=!#6`^>2&fS-(^D6xnwg_M*o88{nU7n5GQY8r}i~ ziwTp}su-1JnAxHNXFu%PAbizo!w~ejKL1@o88sJAG+c^ohOo7FTp%Z>>fJx2^{>e3 z+<lcNiFW}wR^>?UH>?;O^5(=oMuU+EK%1`J((uIY#dD+0jiB?xn;uh}ICg#NV%szU zk|M{{^?lQ}ZDeb1n$$KBqbM*#T6VBpvR4)0B#T))o6Y;KlVv1MZ@l@2+k>sMWAw|v z`ino|bTclFw9~Fh^EuDw^S-5?ecyL&)Ae2CBqB<~r%P3nN-x}D=b+!)*i?k$c4mgQ zTSuKcn%k<MlX8m9vg^8}$|~@Uul&u+FFb$wjaNtGYCNg0UB9|m%x>MjIocc*Re1Z_ zJFmWRlR~+>zx~uVo+;hzsTU5x;nvRH*T3=f&Q|%<i?34%4?g(F+c$21{h3#o=+VcY zXkz@<3(r0E%@>96(I?(_I9oI?y!86zEA?pf{tvuQz5CYF-&(Z&PyWoOo1W`Yb?y4q zM&j(?PE>UW=l0K@J-<y)y&|fB4ghZ4zIo-!m2bZK$}3l{k`E7@yYSv8-;bcrf9snO zg`6RMpzFI|{@K6(#Csn9&!79_i@W=u{p>HCoXl?AdS^1({P@Q{UXT3me&P2iAZHT0 zB7lHU-o9kij^6zN%fqm>kF<)eg30nwC_^HxjZ)L~=bXq4e&=P=vZ!|!m}vNyT$Oq> zuPwR($K@OmQcAoU1)at{8I&(~=Oz(GBFfpZNFfxW=%cj6grRd0gv7Fn89)S*Xi5;7 zL^USqqsD|uNVQ)!+9&RMUG~z))b**091|fbi%pDjoI4Lbc2!Z%z8$;IP*lw7lUO)1 zvoNzHqZX(r00Spg$oH<YG3fvVkwKXd$SEN@hk;!1p(v^FE)?E-Ulcz0qOM#B6g&kN ziUJKoZRjuWeej}y<Sh<dk;pp$OrnW}6-6N?7EvU}EJmBQK;~5iE+Wdx%qq-@nOT`7 zMd73=NsQ9>l45MT)OFl<sc*UOgcEZjgS`kN2mz7;0gwt>@{EE<aeyR3h(hY@X$El1 zR_@$fAT7gaQ)k=TLA%t%c3h3Bs%#U+*!6AOHH`?n!Tu}=?c$`3bY^!Pn|9N=`z{m@ zKCo9;#e6oqdFxKoEc>o2%MwpBPJxI-S%DPA+7a()AT%4}C>vFWw<q@}ry;AS<08~G z<IT!bAS!tGMLUF?5)NKo0GHh`10@S=>6wr4yTV;p&t?vz%o_yDZ#@MK4@bX+9%iK7 zX-W<tfqrM3s+P}oS`+BtO3Xf*LGGjjof-$3aGtAs^9X)hr@r13=ZW-b9;%V|^2GI2 z)FiSt4PM<|0}}~kIQv0y9l@KKOL_|VTxI;&b#cl=#&tSHE|gG}ohK2^Q=kELtOJmA z?RTs%Zgaz7e|58<!D-Ip8YFNy&W5M#bSu1epxCS|2Mpi2edod5b7$(!^JmYF0!(jT zU-rwB>2ce%%h~++aC$8B@u({5{@S&plao%sI|l*#&~&tntePC9vP<&?dtqi3nVq!D z<zm?`Q;*JdVc}1vC*=f`mgIr(BsS8YU^7p%87}5cj78u3uJ8L8W8@W$46_D-qJ-o( z?s??BPk!_x=kMKl?&WV>dFfjzD|v&0B5R@O#ee9%@4xceD_7pS(kxqveC^s*Glmh- z)i+=Jo!|U*K%7pGcFvu7?%A(xjmFQv@R|?w`s>gCzkl=}_jg85fAiIHRDJcSuQtuR z@8-9U=hbNY&;RlZ58i+8Gta(`F5J9%<LPIfdH#8M@wIE@>9sfB?7HRg;XB7oHwmNH z-+b#||Lfm+`kALB_}5>1xp4BzbBiy2`D;85(WXNH7cXA8dgBU<vCbWc{=}z$_^~IR z_`^T`PvGd|Pkiw2{Wm{nE$0W`|Nj5*d;k6$S6>1`Qrh3x{H_mv*BdXq^u;fK=~sU7 zm$t@}-~O%NeC@{D_w1ef?9c!G_q_W(lP^_`EG<teKR}`b%u@%n%^><4vO(5~&;vwG zvixSKW@QKf20&-1h@qbrmB`%1ND9Vo0%hX}I&?@XkSv!lLEe~QvJRW<LV>)dF=Jrn z;0~u%UVtGWkwYY;1n3+l0EbG1UKy;NgeVx9ST!b%$q7hIB+6|MeUd(LA2}vTNfU!A zuyS6ji46lx!(|~hA`I5E3fs;%iRI@=6wYJh;YMQ>7EQ_qo?%pzN*TXG3Bh@AjzaLk zmu2aS;ELeOB9x``E`$QTcSZ1J@GhWpt}F!9c~9QqASy#58^u#5VE=z~z1fpx*>&Ex z*4lfYbBCNNv*rOk0^LAk;E0I?NerYwQUWZ5Ws5fDDdceI%@5Y!;P8vXj}Avz4k##6 zA}JE0DA^<kK!6$qz;28Ub_3|SYp%?!9PYj6+_U#yYx!aAbMDQC-O+(ARCiTn-h0p9 zYxut3hhm>8>uCU-QU%Cj-(1O;6+nCD1ufKDj2PXw!pb&tW&srz&RrB{5aAee*GW#P zZ6&ANb*XKai-qQ>sY~5bB}>lcxO0eE5J8iw19Sjh)d6?{Vi8m$$^n3!&bpZPyXExU zhM#OM+w8}#>$;q>N?vvi0;uG6*=*|$Dj=yNT^t|y5qFD2%Ey-<xljiNrOTHuG;JrM z2Zs-vw%OX+(msybL>?k)DkRf?Fe@|L+e?H7IiPaBmw9s0@s;kqG)T;=c5r=8ROsq` zs6&sez_msZ`~KKkK`eFfnJx>4mUn$tTz07ls5VtDr+R_5OPOb_-(`b(vUdr}+j_aR z{E2cTtpD<172SU^Qf{;|R2Q!xpx7sWpB<`UN$%5r?z-v-SHa7DXjKUl90qkbn1fZ< z76T<Gn#y{|67h!Fn3a*Md>H#O*rE#uEV8b8aYC!LMb^gSJug`V`T#8$bkSw8jk0Ff z6zO}M65NEacHOGIMy1|?0YNxO$*~Vj2Y}$iqG>N~Y<tkIT~daJ`}@n;LAN;W+Gf!- zhsTT4{r!8lkE`*B{K)wVDL6+?yXti58llXYmW(s0PC2BQq9j<HcE_iuv%C;>&|zrn zhet=%rgK$Q*OhZs7pJp1#0AagI-m2hTcjMitg4zBIWra{moTHyNc_%?cmKl2e&aW< zKk>-+w!U!t2e+%dgp2@$BmfopO7K#+^1)Aj;{M5le0m(FV_bB8nPS@ti^jY-Jj(T= z<Gg!rn-ISH?Z3W!;nM!W-D>0om*4sBbC2A(a&&UEv9<mB8?STjm|GznPsV@q{Bx(X z!xvwA$p?RQeDw9N|HpGX8^@=oo0~h|eC}I!?p>K3?<)~H{Nk6s^sdJrec^?dko-@6 z^5X3HVC-eOIf)e|V97eE#*0OB``&#aCkmwS__ar$e$RWJf9|=LZ{M2w>F@l`?;amN z{L?@C!i~qC_}phd`-?yK^UuBcLnU;Co6`+)9uY3=p1*MEV(hv_+aT(LhX>v}P#d+a z+1ZEBPw71Sd9vA!%nY-xOIXuAl<-Hy@*fkbDl(uqlT~>{9g#AFS3u01ot8@9idR-4 zMWsHK1(eXN+)99gihxEn0buOy#R!gjk-3F1k;M>jUkfv55mJJzoPijK2{UNS=F~w} zUdEhRvvqY`D65u$$b~Iqch5>T1;zPe88xb!MWo!#nweRZK}FRvOB9h+${ma#3K>KZ zl@PrH3gXd^YG2o3G$QY-@yJ&p)HQ`rjYi-o)RhZ9R27n`R1ZD?03ZNKL_t&|V`CC2 zB6&|n4Rem1QJ73gMtyuF*&fUM?PBm75ddTX5mUwib79FAB^ZLqr+dg!p_uss;ZorY zpgNg|wFo)e-<on<E@QV0v8$I|Y8r0aDlKE%K#HktP?R|WL5V^K$f^m@sRjiP>b1Nu z44RvTOC3mpcB=C+)}CuzB+e<P7zto&a}ykarT!5Ms{>%o6^E-ACTY>AbX7ggtfO%_ zckWz0y3IKs>>q4xZH1CMBw`6yg{f+nuI6%Nv#OGSDwmjm)n!rU%vq(^!<GT++EkNQ zf$m7EmN0D(1>>2AsIZj!;?;Z@mM43ruUl_b`zN9wG7+jMEB9o5)UuvAbH!RxYF`JK z*>&v(gtxCLhq3GW7hu=_@OxSlzdls=!m(J?R_!IAt~HCj;aAVh+6G4k==vgBhlDp$ zRkAliN+i^f_EWfPfEM1xYnyXb0LDS(RIa^JHE3TD6jBqQ03kD%IY1%WC}EGhFVR=J zexnz>WN#Yio8DrhvUXgG-fE=)Uqzt9N}^qKVLjW@Ii~~@A97C3Z01<@o8#l72i%^f zcF`>ti)MLnvV5>Vubtc8g1XjFWkezeHHx2iG|x^oa>p_gca(h7#V857R%UIplo+!h zdzc+fPp9=!RgcFqMdxMNx|11obDYnmZF1W=2H&NejTf#6B8WihGCRP@#Ydk0;3t0L ziD#bK+L=~iaX3G^4eb(G5$se#iDMXj^xYr0{*LQS;MsQ2mZsy;9#%YSo0F5pV!>U` z0HeCv+uCxIYThn4rql6wwCI{HEr0F<zc@cRGI3wCXg9aE9v&|0(MSn4Hm9S}*o>Qi zy0JMSg7IiX-ZQ}N?%wU2ulcHSJ^&y(rv!uq2-E4bn;ky!*o`+24<0UN<{=(Wrdb>i zA$bsg{`}<&7cRf?=FQ60pZw^@E?+qRg+KYj7he6*?ZboL`a6GTYiq0AbD+n~=^M9i z?q0m|*}wZ)PO@=v`!m1&**o{|Ub%90_uTGZ{?(t)Iil~MH(MIvknxD?9)Ui{57!4s zLlr!vNyFg#?H^)7>;p+HL5xS<qv?HF0FhMC6{~Sk+ZR2d?SPcX);wjM)^Dl^K!q$; zU02W?0kYauL0O0ag|y4Wgbc_^2}uaELKYOrT@q$VoO7}mg|h4G>(wHg>P1r~(kZ#E zc5Dk90mC%OfWRWzei=d*W>iJAo7lQrv6yZj(7RAq)wp(5RgFg&ydT%Tu6$jGdIW@_ zu6zg-f^*(3SMME>NAI0;NMs?qMD}AO95Oz^P&1;I24M0s+bG$S0)QlI+b`{V9Vy!= z?Abd7j<%-z?1kvgSu2Q2i0Fd1T7;PcPpXt-x8xkTi)qp5veVdgi+OIEv{-Q0YEB}# zFGx^q<gVh>64BKmI#5NDlyyE&-LhL$VO(cNok#IbQuc^~Ae_6lL9pxrMG+Lq%cJ)_ zbxqT`Teog5+IV!L=WsF})!W<KM7J07MU0VZbT<115MisbEJ@ScVqDO9%4!^5EqU0* zzaWT1JfIn5WC&a-gTxgF9S7yR-I}Ywnzc1BtQh^}eL1@%mLARhwsCQ<5mN*pQE)wh zkcJMs#Hi>hk+UB%0}P>OWzaEnw`ZXdMJ6^}w07lN@y;?73gtWU1|jOzB2W<HgR#k8 zQ5|X!vQcKSybYl){WQ)_67xtH4)tt-P^O^3Ya(hmW9TtI#V}a!XUTwX+vJu|uzpW4 zw8nNPuDwZvLQYmo{$AKz{zU38*<ra`sQ$8=9?;N#%j#@V6#-@y$tgPL$I}gD1xXT@ zCr8H*?{jR9+r=!k^R#T1&Ej;{o;LZo&0e#>axxMhA|fG3g$m6Q7afXZB~J60AFv-O zQ0%zt<Yc~V(sG$HQQ(C<JUm8^n>(9bOrtTJKAfE{pqqtdqcLKP8bLafL6`{xfB-#u z@|)xHkNm=~e)3)KeP;XIP92={iwCC<Ta?tRf)o@SW`@Ted)K56v$(kHQW%G)9((^* zgriqq+da3tfA3B^Z#ZSa^vJbqO^&1S#*IgB?C<Xf@0_EiS%~npYuB#5<B^Yk<k!FZ zoo|gsbsYkyeChmU5x#Nb+Uu{qF{&q{(Rgd49*@TiaOvV@7TMX^o-IyOmfhVQ@9^=* zA9>}qo8(59FJF`G3PQsn+<a~3yuY};clpYVdh)U$f^#bLOTYB-Cmw%#d+Xdh;io?N zsrz^DeEY@kaRBG3s;k9(280ZX2oKuhKmM~n`tZ+u=-TD0&b!n3?8^0PyO%C>vHRjz zzWC+mpG8jyJm9$p9{7;Hr9Bs^Cq?5Ki6X2bxJ%WKs}rXr$%`uRAor*NwyLU95{rDY zgFabg#K5e<RUA`q)FW646??H0qNp283KqJmikTe~Mnxefgv=EqB(V!vGiXknOChhU z7Wk@+tc-}I>n+ewX3m^*&RGgoR8&oHqO6*8E*W{CqMB7$O?sqi5o31alBy#NK8!}* zyJ|f0RprMcsw!VsVQsuj!MhO9c?)s!1^es0-MENg1APlM#J9yn;@VbfW!#5idFp$B z;xNTwBUR8?{UK9SIih`%d-)BE*m-UKxu(#Pz5xRua)@g4^E#+X?7A=+Yf7?=)p9#8 z8eT5q?4+HY=C(y1I3f%P0>q%%gj%XzKtPCv87Xs&sahuTUIIzL;0T;gIcF7>%$%G< zG<BD7Zo89*hewA8_wVgHkJqnVa?WpUPWE>9c6WE@&74z$5CowJnOSgXVun&g?LxH? zE)1!%*vA0%uZi7Fg%~9w*neVwT6nasWL7;Rp8aV)^4fSAsQ7Ccah;lsKh>wQkt2$g zVBObhZ@CU$<TL(U#GZJFH~@6d>Zr)BUTb`ZJGd}RigrqRlRNm7I(wjp2EKHd<s~fa zQx&iwK9&bu`$XHqS6jP_A#)$yx{A%~&z?d;$MqTgYL8uTTexBr^onf+;BpfWGStDc zZ3CYnbo%WI?XyFPA*8;Xo`g=zo?OZ~R#s)0SWMUwLV$kWE(L6-mRT0NrNks6<H=-W zJkBX*Ny}xMb4<&&Tg>OPMOw~dyXcnfyy@C5w#(!YsadiDb)YH)Kq3^AETUJ4NV!{b zT13}oAyCR$PnWUD%WNO!q$j7R6mZct8(R~^E-jB!Ln*n$VVN|EL}dXlV3c`4z^nv* z;_7qn{qQfp`vV`?+1c^lIii%>n@9Vl6e@vo<v_o@dp_mvR&#Vp0x|AA@;JZ#;Qb%? zP<whzUQZ5BPLEGWxtljkc>Vfy1Ui3y_jG=|ckxEo<&Dwk!rt!ry-Oed$j83-oo@i* zXjDD*?hjtOdVO|s7Xiq*|MGYL+wXt(8=KSM9gfG_|H<e6)91hO<?Gk3+`9e72Y%)w zPe1*h&FbXa-=2}f&;9*>cyf5xS8Yaq`R-lsYxM5?-o@R$D={jPLvrZ-V$o!VzxUaH zFxi;y?4JAmKlr_e+=fv77ys~gRPyuR{u@D6Q6WT6-@o<JoBKC+s?Dv94F}{y=(^>i zo$nv*=b%i5aRs1AsA%ip)gW5dP2famu}Oqy0-o0wR19FdFjmv(nik27x(IOn-0sEA zt^DxFi4wB{I1|6HlvFrl91ef=t{b<CiXb#<zk-=fQNRfjBV~2Mn7}0^B@#pd5+Xs( zni)WlIS;6EgBaL?hS?ff?(1x2;Vdkfb52E^44TER3-bjPLn!xGvVgK(g3bvc1y5BV z?<SM6ud6VsLtVKL{HO}!5jYn{qfk{u<SOr+4^==S3rTd25D6U(<vs!;p#ZMNcSAhU zppsm*P-U20F3$2}vSn1U5sMZK7Z->M7nnKN#Jt?QyuR<(!M}`(!_rMv%ksVN=>`NP zD2_%W4qiCRggK@>9Z5S8Pay27in2J-Za!CvDr{$MnS=vm1+VG}y(l4*3XAyQAvy9C zJcSWPhax<m9dqia4uq;A!QuYF@i)Km%@6`Ajz^;yF($co$%il=k2a2ukK3jhkLsZs z>BALt*wBgau*F-Me1u_zDH@batIHTH=%u_c<>+4j!O*rcb5EEW@=n$#Pd2|8ph<%V zVQ5TgkSM+F3Lhv>!|vAdw%111YcRW28O<U#RR%=(|MJVMZ+v@mFLOzB>9?2tvRQqO zoqbYzIk@&B<dqo8j&B|+A5$ia4hVuZS5NtoBWHt}GI_?Hsx`=s3$AsI7PPv>hwD>B zl?GuQ*z^E<1-15eNK@p=8Jm`<+MJ~LCT;DnL$KsJ2(uWA!P0UI^1xh1%<P;mqPRkr z6H_pEO%vO;ozG+JGV|8vriw6Ua;PGlbL_gNZQ8DD=Zmylv`ssoFS{ixxR|AljFfON zsH6mmB@zf{$(exTT&h~hsiG)m5O642MA<Q(&Q8c_9qYy7w5k-e!%V_1i9vrHk|*@` zDxfN&BdDO>dE#e&;paZ|p-Y!9SD|u9h&pdh4^s!O1dJ5jJv#6F`3t*;CwK1Vj=|MF zy!oRy|EJIX&X@lD&yJ5CQ0=$RU3~J%r~dZ4-)?5jl}8`Ztg-2u#cWhp<MGa~{mQ4l z`|Ov_Z`7~8^5&bbz4mLr@@rrC!atvmeb?%zKK{wS`oI6Q!aN<<Z{55VLVf@4?Z@A7 zJ<-OSZ{3_uHsWk?{nGi1m#&E5>#yH#=f~rEOz2KePqle?^Zv^x=*E-DlJk>KKD~G0 za>_YWwGsjNuYT<-m(QQy+1<^;fB3Ke@UNbKRuLb6<gqZR{^Z~O@pG@g1Y<Oo5fDJY zV_wXbt+e+EP+0;}rSK~s{Lrhn-gx=owvl{s;8hJGkX{41*7ZuCkAv%TXdTcE#fA$4 zLWC$_*$iN_N(59GhcK-}7o(;GDF>6TAQONaPJtedVG1njp<IYaNQUrsO27&tkioHc znLHy2dhjGfj39_g2na$$N(eKHp!GU-0cXyfvWOU_n>lCBENsfx#LOZoCjl1F$ZWT) zfQkU4Dk`fgp?W~)sPY(`HL~?&Ou@V0eO*_hD%6#)D<JZ9<w77|Qi+{&<h=9Fdyhy) z5i$LgsX~Og%r*_WgCso^)GpJ02tk8pWd+*n$9K#&F8~!}F|{)kTqP?@kFM0hQL>vx z)G9C&=Shh(r!tnv_P$H6c4sjhlKm?cK`Li`nYj@<?~%w?E{_6@LcO!4IR|jGOh<3s zlsHRWn{$@TW~`Kc`Dfd7mz4;Oz3xPjsnQTCa3HKIT?fLP5;zl|qI0l09kp$fn5P?c zm(tw_^Xc^bh(_Dnmu}s;dvbcZv$I_&n|AmC8Un?LFsj3pleL7!vnN6-OI}?U=azGM z)h|-N+p$`Q$n_qf5_?g;O&O-U#)MhFr}1o)io7-xE}p@@6D#J!VdH4zepMC0QUS0h z5=#jxE8%R{?a<T_kqE1zFk5iZ`qwk`#4O^7EQQx{W7nA(RxGN3k7?O2E&9}D#C7b{ zN-bsbZtTa%vKq~=PuT4z^O}>mA1s?Ii|l;raX`ap$hIoxo-!mHDiq!~^;x|Ajv4#f z%C_`FL%R}%_1I_WRb?bSoMo*$83N;Mu1Nh@+krZwKosh#K7amvRo6|koXuy;`C{2N z?PAe1i)KEXot!M@^R{i6^Tx*J;o<&tW4bZjs4B0_-E!G9i}`HP%ofXL5xZ`-Xj5iD zrvS?&NLsQjMI<X`l?a-Y5tsyk(f1#EARuz1puAMj1l%#VDQO2mF)=$74}|K;BdHPq zD<K7Ris&i|L^XzutM7XEFMa$IHy(XtG^(BD;*ri4r!6x(SF%x!AgQwD#yjV>-g@Z= zr@|1zIN^W&>A(An?|*9l<?BcD^yP2;@MFL7nQMDH_uqQ;;nC5(x9<J+=RWt+k6yTX ze(T`i!6!cP+mlh)o5*i`>LZ{3vzI^fncw{LKl#J!dm~EjQ@{4{-~9Do`_dQw;KLty z$G`vT!87lD-`@7dH^2BtER$!y_wp}&^naA*<o1hyb$KhM(c~ZhcmMd`{p<hh%4T|S z_&p^0-GB7o{P92gpU-XXTzT@zSMT3FY33KNUEA2$ymaXT-M(WVzhD07FD>S$zyF87 zKTpg3<*5Wf#M=*UfBs*7{?>!rT2sNP6vzvJ0)qfTR-uZzE`9nVpZu*)ed^h7{Kwb7 zdWTopN4=z9iY*vdQp1%|*f!{bXD4YT(YX}G)N3(}IgEWy3p#2zHzH_Ty_f~Tld~B~ z?pe`{R<K(tNfA1G+cz>JIL|~0f;cDMY4GexoCoKzLIo2(8DPggSW+_e%;=kKOPO*+ z&=_ONnKNf*7S7B9A|OfFP#B2~9VrZAPFz+o;-xwS??PQ;aOm7<I`LJY;CvN|Xu0yf z3eJ09`QR%G-g!^XIp>`>e7Ie=&R$YLEqWhEnzZk4*o1KX#191DKE3S8551qY$Cb#i zb5j)oV^P{qaI{v|B9c&8Sv9i&SixiKOB*|bX?Se%2^li;up=n$3Q+|iB4!mMKdBN? zPVD;6k`${Jf+~6MrxUCzP~F+u_8D^*$8pjuW+x}J)J2<$mlhpC6a>&AH~~>+5n}ei z`vg2!=csb(H=UQ1Q!5$>&^g@Nn!Nx0Pv;y}HH11bBo0fcb7X<Ksy3Ewx9pl?5&@-h z{`L)(l@Y7GN9i?_D&{jYNF0XNXsTNs=0RtS1Gv)qmK&E~g?1~x-oj^wpO#{%BGPI* zvzA0Kd?f>HYmJDErWUe7DW+s`tiujCrL1a5FC3_F7LV4a&zODxtbtfjg%JUS5mxu3 zwS`0ktjgkJZ2Mnen<LD&peaNw)RnH<y2)~Ip`LLo_44btGdk9Hy~E0Ct$ANzKg-Ls z8fEBUW*AiJMZjzl5*?-hWe_OLt8D}IpL^}4RW^}88Qxy%{YB<rCUlCZKn?>^y|p!c z?9oTJw>OQ{b92!yPEYsmKUkceo*W+^9UaVO$IRKvA9C)rnfYlg9CBPtBw&&lyTyEQ ze0(~e%{axbZJVa;VpgCmnGl+kEMQSpQA&hp7L(R12?H|+R4WvnM*>6-A`Fl`G?0}j z0XhOtKC`bKd5;3Q@<dW)4HT*Xeq;OG`ODWXz2otx-}nCOk3O=wJ#~)E38R=E96ZQH zRagSyO+-GOjNY2x{qhf<UjhVy5#p8IbH4Jw^|{~tlRx@jMfj<w-}~s5?dre!`=9?m zf4^Ds%~yW(&g<K4k~<IXpFe;8`LBQVV;_9imFwfDo_hMh{=?^={px@Jk3RFy{`v1+ zzPk7QAN(LU`yc&{4?O?E>yJP2<bU{!FZ^ep{m5T`>)F@tUw!wx-}C4H;(z}q|KxZ6 z^k4mcxAD%?*~#@?{lH^SfBicz{Jqco*4;OL@=yQi|M1nX{N<ni&5!oBc1ELmy0Pi% z@$tNk!s`6kS0DS>uiSg<^;-w`q$YJ}!{$Y7XZv#@73I<~4o*buYh(lgMu$hs*^95e z{FB#S$whM2>j9y}-j(%-F?7t1i6q6}3;ntm*CGc2&hqQ1?2;9XSJhL~+bqZPZc`Bq z&w|RCOQu#ySpX$(l0hoALi7p*>KUDQ&*a&At-J=0<3P2i+L1>f1XNZa$&!TGo}4V) zOQ$%+m{Q`LGIPo?rN}m8R$-B>oLK}UTTU*3pc>y%(a^?-A%G`WEI^eDKGc<~eW)t* zh|bmH5qWan`O1@X<jMB9-Ua78y298m`VY+@z?@6N+V>^IG#uAv+%jNwX_&P450)Sz z8L&Qx$TFZU3kXcKk6BP;1qI7sP*pS@NC^N|Eu#V=R<-c*LD4xRhug$XKnc;TR=xYu zr0>N5+K(q8aY>Wy0mn+FwCZW1P*)eOU#mh02XA@FfBS<UEnuE<=A3PkZUe=v!luju z^tOsj$-aB%-3Wcn$g??ZOfx6voH7#j#hfFN1c1ys?~>R0q!FaBSe!JA&IbbsN)K%B z!N5fyr2V}hLz~+(m2~|i@3~2!nh^%};;^W+^61RI7Pwyk6(l+gNe0-LT*G`=RtU${ zV>hURZKGh}Y=~qob=T{hopS=hCHMV|q*+y*b2;aJR$8v%yw*D!_6tiZuS9O`>ww;X zG_>YCjLiIs&{6L8eoJ9aWdT)9Ih9~37~&Ah3VrxZZBw+OlMjlql7_2qn?js%cj?Nc zi$w}ypcx+Wi&(@q$HD>%77k|1CUPiZpJ_$~W+4YsN|I97V{vEepwzY^!$##6;A+f3 zBu`NJYV*qF8|QYm%E_4c@czA5UV3T&?!D8K<Cr=m34x~5QB_y<XzZMax{8~VS9Ljc zd>O_Qk*;lL^Vy<l=8HDRE_Ge(5+VVifC&qU2<=6-ucGJTpmQ!0V(r?>qSGsIJ|VPA z1ahjXq0+iaRS2Fuh)*0+*xTI0WpZ6)AcU$KZ|z>Za_++Ai&w6mJAY|=@BGfW?aj?C zPhs$6A<CV*_ryjhILM6v5$`V#|Ci7IZ!f<269^&atm;!60YzoLF~%xPx3{L(AHDMM zV0&+OM~_bL-+JwlYwuykx*lzAPR{S`?45&dapJ?~Yp=ga(p|rFZtP(;Kl$c2|N8vi z=)%tU(%#O=(f;ZFtxJ24J8o`VfAmK`e(CuB>tpI3+<JZV$j^Q6xo5A2_WZf(+}8Nk zo3CtQ`_A`%<ZFNVZ^nr4{`sH%(pSHFYyaLK{QH0Rm6!fDd5=UJ)pToftKHiE&p-3I z43csdkk~DOFmY<7`_@a}J5CJ|@)}yM49d)fLi+3vpZo61FLbdJT)7I$E~Cdl_SM_! z!BG{PBtxIT*{hZDZ9pHu()A9qKoLO}R6Ur@&WCzKiIYf|$Q-)}g5V62s|skEZzKRG z8U$-`l{nAjVH9vw(Zsv4gFqPSFz&-Rm9qe{Kvsps8I)6sIVBZIF`7EJiyaH6oKjA# z!ps>Y3Mb)QcDkkUQ7p<Sazvi0Q7s5zT&t&QRHJvkHV%d-Pvp>tfR3Ce=e_ri9Fa3v zwH1FNkb#ML*gDZ#P-z*lOJUH01ud@C@rr;fQUECiHZIgH0Z;*P&Vib1NQR726|fXS zyB7;1x>ziFq6DC=;El|+nxfiNkKFnt-H)BcN-Hfw0qMtz2rK#Cuy8BjB<Md{B4Q43 zVno&5OBXL*zS_Pq8MUW(Zr+zH)ODH2B($o^lI<hM{ce~*11mrd3ZmjrvF+q|t|Bn0 z*`ZmXaa9PKOf|5^?d^-Fhf}3W8J1mJsV}4}RAn(Vrh!siAINC$BCmCOy}xs<)e-B9 zAjU3)qV=>@DE7ie=7E;D3S2J5ZW+EJA_@!j<~`^K_`P<ToTHTp7eKUM00E$B5y3F0 zkW?L!Dx{PQS!4D3kg#XJFmY#Dc%X!U#qp1Yi*DcCAkS8{-d_8zbFc^TP?sZ;iU5#b zmu{}EXdI%e)q+}kPqghF%4mAX6_+9R`mEx~jL)kr{9sqMPiL{`Tlh&o&>oyiDk&u` zA+zeeQx#5GEe$(oKvgz-o{C6LnFxz{1Bz3E*<_h&b*yu)x6ZE$1O>23my)>;9Qo<F zy?T3livUnSm|yz-_rLz-FCQHo<kSH{UHR$G=4ev+%1_2)B!|vrU+3M)4-fB;U41I~ z3Qz@^L7Qc}?4l&2QG10XN(z`#@}3-!MP(}jcw`J(d-RxshpkE88l_2K?`T}Zs9s23 z!iK%p9?69;s%m0!EFsE9tUvtee*h;9r<7uzPPV5TJ6k)uel(g+r&T?kOgHS%!_{O) z0Mg&S{_+xpOENMI71Sa%FWh}CdjRGU`VsjUvr3fqVE^FZx$TROKYjy&IdvB<?jiZ( zqk~s|@|OC%wYgi5$47?;+dqH(-r*Z<O9<)W-bTH#lbI25GO9oPp<kSCjybibNB6Wj z4Ry_FiQ3)0_2%ir{o}i@cX4_B{LbEVjK>)zjB09*_ix;|;HsT#H=cZV6JCDfwYzEl z$6x)66q}_-Ms$D|cK0?nHuS>9kAC>W+-o(NS&10)oBKDv^YROrp-)XHkITk*ym#Tk zy$AQZt^<Iqe7bDNy`3mqPIl3ihQLmEAan$!s5(Qlvrg<RSj}o&8V3Gij4fpcu1l$l ziO|Qal9dpgJ;106>W~6C5^zE__(~{<57~{d_E=Rks{O|1#x7w{L5@u1f)C8uv|1_> zV`5HS+s4%9xQsChXBJ7Eg*oS(m19m>a%5)ZERsPPMF}&g5&$9j%6Uh%cfq+TxZqsn z$&;_V5>aq2IC9SU5P~O9MC83AU)ozhAR;7G70#f*gex@m830k=Lr4$Ju~*pofx*F9 zyeO-hegN_ep)a5SoHL88t$|4go^V<2vZao)uz5iWOGH5wa%M9(_Au-|bfBDlC|ZUY zMe+kQs7wT;e6{`9v-d;yM4?_H3xHW=fF3E~a=9Fhs?D8?Z@uzrXy@YUsu~q*C!itz z5p5$YV62kTYKV#gWG4s+dER#Zlyagxg-I<zq@;Hg5sadua~spq`+nwqHA$S`3SNT` zDQ4BA<z@mRSd|~Egs(yUWd2gt6}A;jw#ud1Lr0jCT7}bBB8uz!=`yP*yY?Z>QzV(t zK}8|u-oVmF<(5e`XJ+hIKRuuU*3*{Es$+9?27!{0i`=sp`@ID8VLyO~l8n0M09e=J zda!@S3D*K}VU=82^zgRtDwg7G54|69%KE?}EXqMVGh08q^j@bqBCN;*v^K+EEyxFV zw2h8!dx2O~hN_w+i2-!PjQebdrYRK6<Y0Gfk-o9y6pKa4<RM%_s#8v7J0is%pE84* zbKHoJvc4Tsu?!g~BNFGx)mUxr?cMNHb;~qAKKa4(-+Atv&mNyVh_UnDhjCqx>#8F2 z5jgM2IVJDCUlQN(F-q6CeCor65xbGPfp)I|03ZNKL_t)C%3F#Y2%!NGKx0lZbCg(( zP>GZP9O1Z1HStE^NtMPvPpfX^V(n5OCK5tHFDvFLdh*k%j$H?ttLz=_oSfg9ZfsD7 z5s<HHH=4kBqZ*CD2X<~D9S9H?Eg2#b=HvOT=Wo59z~lndi^EHNrnyK^(E(n&{*K-A z+d0Q}Is4(?{&@Gwr$?g-Tz7PMqz*T>wwTjwwr~}m+q=p+S5C*3d;Qg0SFikxQ~uRY zei}x*p`Kp3e5E;f@YMUC>YBH<xA(Ruqi3Fa*QLjwNohd{7q@rz_jc>?cs_4Q<<6V0 z{p>T3FXO%4b9=FwgKPu3i&wA8t8d-QOT4hNcyQDuK~DgfMYeag$>9%P_}*VU`&A$y zN94T)^JSEKM-PsgnUJpHIC`t@(Zh#b*Y!vlP_&r!UjMw7=cTG-*Ki+<g+^yaOMR8~ z)L#Td8RU<peICv(6IK|PhP1TXk#lAgR%DY669NQ61gM-3>}sZpT_wK8QGhzoxDJ!b zRo;y@rrVAxP+(wmIp-{BtivQCvFn!0Mb2^AE@E7&<gV+oa88kh6Xy()jZ3AHK?GGD zs6!<J@2Dd5&UxqSK%RW<(Sff5kow@sJ96c3UwJd;A{Fc<kd-brivr<1%;9u(SQTy& zp_B52S~q7f0L?7UdqRpi4g2^1zigNlIH}h&7g~OQ&i5*iLehX0&>vV72xXv*7@j}| z93B-NXlZ%D8W4e%BHonJu%4u|LLKPpJj8MkuC9k7N-9oSW^9)WP}$ku*}MAa-Nn44 z;C%4DQdR(yz?7(@a(MO@P$L){X-QL7ZL{zs=So00!??oWhm8mblk<MWj`aFFuFv-O zZ@)6}$N(v)WScrAV#zqLlSND|vNlyLy5hnvBq&xdoA>vM<;+8DLt#g&sFBHG2nQ1# zjJ8FSq5`Upl%YgSsU%~X4;u#a?yZ>5L}wt!BEt;X>@9sfkC=30koRiIO<C=34Ge-v zsu>4G`|#zhi$ug$(c0G#rNI;7q0VG3Ux`N~vLdEu&GrU!8vYb1rP&I!ZLgh8ii`mX zNKi)Ef`CIfc~A2!uEFw$7l|e3oE>4W@L&REL$T!~%$&2ZfNF|Sa%Rp3`pGE?Gp8() znMIj78>iheRai1h`Ts?MUQhvv3meEB&#M}tJbOeATnM9`?a76|`P#Gh?%q4RcXxJl zZ`q#2)FL8{#|}MkmzG8lNjWV;J#v1O6^~k7bTN8)iMxk5x-s&5TTah!GDle~F_D1e z?6MD;Ttrq94nQNX8zVS3jT=?o9<?>b5v7`<!{~vL%+V-@RZuXk2$jM-WhX3xUKjb` z^MCUN*Jh^(S;k?sQB6lwP5j8TF~K<^*DX7nqQqqzydKZ*{<u3y9su1Cer4AUAu1~Y zO-5sAqAcR&tCt-4;~CEyzEo9qLhe5}5W>mMo@9y3r7}8on7j7j15b~?b#wo{k8htm zJp6@U{b1~F*W=xHKK{gPI(_u%_rLi3gU6qE&*sMV6Tk9ts?Uwbqem`2vb`~R-v^$- z=^kOVwXt!0^Nq)!`Sg!}@RxO{s}TGsfI_qAmXoT<3bhBaXOPswPJ=r*J^aDTFMjLh zi%i-lfQllp2svOhhE#732Lgc8X3_I**1!vE!{?$yJS%Z1wNRO$>Yz?OlU2Dc`m=_G zir1k0*FBz9MF9kj!pH&u3<9DKF`%o&Rq7@=jKxj3^6JO+=D6M(k9O*6YDop&2k+`$ zU8N!%yKdPuBDssp*mWs(DaWpBIi+RSh~&&EE3;}8PLi2a5ST<9iX#dh2q-uT&Q$?D zhAMyq^5o45R5>bluCs`^f}3^@`}`#_D+Hsk5+R`CSq<7c;?@2Y7ax!HQljRRX9hr{ zM6Ve)&)7il?fynsn>P1r+FmU;3_xs1X0mEKZgZA3d~TuUWhtv=yU>l<BxOxl{E=Mr zDY#-9$q=Vzw=(}Ux}kU1ltpN1`dLK;$;H?m9PD4Y{$$%MPUmwsp6X)eVg&EFL_?C< zdYIKDJIZ2>t?lpxlsF4OmR1p1n9_vKZE%&*k<q<;a3qkSJ3M%JaB$Ex?RYvJdp|$f z2i1C1A0M9rfDd7iNfA-btSUr(Hv=G&a6lX8G7MNHft1>!?2&~T5XiQ<gBG{9il&rs z6?$8m?3@MEu&<_DvPb|$D~5>7mu!z3aPBoz!;361;HX5Mqkcw0ed*Q%BW+FtD{iw5 z8wSrY7RWl8_r0%~5CEK8edE;QCA82>vEVd7MAdsg77=HThGO|u0S5Cl+U2j1awg{n zc31BhHg1Tst2#?oPy%NvPbkd)V!{_uixD&7l5*yp6*T3XQew_ICoP#>Npe=^oU*W_ z6eVZLIp@qdr<8>`rI=#|fUa9gW(45=ufl~BRRrmO2GMZvD=(TAQL9FOg%5P(4iE3$ z`xX$QLBg_uV2LQjHpT^cAL=^PRXrJpx^|;cMh9D44`Qx!j+r|L_ndUTKHTK(OJj0d z;k1UfOP!AkjEzK>qlO%aw>SOnM%o#tbK~XIw;no=$(6hfuo?KE<|i*XBPbwb77#5M z6;K6PpuTi+%L;YL?39p|V|Gd)>MQ^bh%<Xd6h(&jzw61{$9IxLWf5dF2$3q0hu-d) zV+x}wlDoKdL0Hk_@!@Re{Ppo<iVjuc?BHe;fBovCTjS|+F`J*xD}aZ0-kgTCd2TCq z5UTp}rHiA<bpOts$>hTI>sR&Cc^5|W)6=@ze)QU--bc=qv$l(+ESK;9xnBiWjmEoM z)6HM_;D>fDyd#7y79LN=qe;!N{n1N5K8nrB;c@C>?xJ%}ashF_d2s7r{M$eJ^7p@y zop~i0EzZ==eH0wfXluYYT#u6O2bY6D9tOF-o^d_cXiED*m0hA%i_(B{?G5o|klcfE zTq(X$;A~Krs?BNv9iexsV+gglTEj%^TEc`zm8-|~bUN7?PtH}<2$YyJrvw5yXDmT) zc{ZCh^SKBwyC&xtW4G*<!bwyzr<7xs#GpwfYF0<$1Okae(<f7KK;SEno_z4=$$3Yf zd~oQ{q{<;UA_7`HL@EeK&O04Qa{%kvGBEfRaaEnrnS7hx64__im$s<1R@!?=2JD!* zGht0TvJ$oYbktkV{wcrN>MhlEuy?QVM6w%}i-SW4g6&|KvG1oRI7zSl>PL|SX<q@X zZhm_iw~{GYK<z*Uwl6>Dyl9&Fe3nuI)s5|~ylnDvDamYA(z`|p(W6k}tOGjODt1MW z0K%jQ%MJi*1aa6^?#{!**?fNW+STptE$_vnYn$d9fBmgApEWUaj3Rjb$`u7YJUp@? zd|y!7L>&Q$S^H^@ShipBZL0Z|RMwzW+VlURk6-5AiHkjLy>JzW#7`u(a1Rsx^mWz{ z1KO+cO41JuQ@kEab9VYr`e(ErN{fMf(4v<D&6l!3`eVRAq^8@l>qRZQqYT4nATE}B zdQkrf+p@`~EW&KDE~@HB<4qNNn{1sRy#d$Y+hsamTg0Xb$sCy!*}gsqsFKC}vc}I; zAQV+bKv5R95KobuMJ1;wIje9^F{Nk&<eWOmImQlEbL?`?ImH|kh{UcF=Gb-R`i+U1 zyBGlwM03j0|7D7`p-3qcfL?)Cgbrs@gx9C*{RG}-@<+}&?RN}FYSzQk(_?bZIp>4- z-q+(vJsyuXH<R~OiZg09eAJra$VsiIz+H_;J2<W;8@n|&9jDy1br&}jH02lrb<+yB zC-Vxrk&}RYh5=fJXC}fO-nrfjpdxG)J1JOHTOSZ%xcDS0=#U|UC`(3CR#gYA=nyXM z>^%PNckZ9==k`Q;h(Ny@6&2vjo@irhi;z6hmEFr5lM!IPd-Kf<)niWp$3Qs0JOKzI z%VzPgUG81G@x&{qC)171+3~5*A}5E>y!)|wdxN3g+q<x{bFP|9n3q*Ot*hWCW5DMA z-B;fA)W@$sa=q(jImIsNjYpn%`l<I^d*n(pd)b9aRaH;C>ro&$I=I(#SwxTTzHxA_ ze(m0^Tg~G1;2^S!u%jY<Vv#o<+<x=Rch#1r2z~mqvCL$BtYm_CJ)1)^a8CRAox+-r zaNRN?>ukJX9aIPymT(4yRD~+0RDL;?WByF#*Xs<y`bLGZVhyxRTC<-hjya69s${g` zH!C-;{g_-;hmohLcXjXS0~P4nHpV4$mYf&!d0e)clW2}{nR801>vGKIGFMiF1ev|6 zBlX_Zo(L!q)y`Gkd2+##cUYuSE>yt<2VfcFWfxc&dxJegtsV2j#GQsqvOHPkHL^^Y zfpRdEK1Eq#Kd%GcVa2sy10$@^L5BO(9#ChiE1Maf&6qL#q)Gu4V{cR(9F^3oy)2y3 zB-6d<ci8I5nkJy%h+=Uftr%GLyY=6Azw|<I#aW|k8F|AiKs{2|c)B)whr@$|J9q9h zi-q@Yyt&!TPux*p>^xE)l2%ax&^w2S5mK*z5GngUPy|nanU`&=gx=9y(#gZ)MNGGK z|H1yz_SR(Y;zjn&{{DSlE+0NPs5QB?khrKT+}YYZIytpj_dsw41aJB*6(p2iiZmq7 zBO!t#z?^em5cNSjh=^{eMzF_2V?PKXGII(IObihqUz+V6Zb`<RB1bEFzpO?cy{y1q zWFE2^w2aOXu}nCK$VPt#bTUzSACG5>W3;rvLLarcw5;2XaXmuN3Ncn8Bzw{NinII= z5&6BH^Fu%0v#1K3R)({sukj6KxiVA%iU{XqZKj$%K}3X$Jj&(7ohYk<E#PBJlCnrn zDK48vI5FqcHYqN-0Lmlhm}1N^=A2U3bzKLdDw0da7psb7LBzyaWhh1aYj_|+Lje;N znY@&g!@<fuK)2T)>_O?>B_tx7Dj=a~GN!K?9*oc8!)aYr=)-7ZGqeklb~2?ft<t1w zrqw*aJh%lxwdsy00NZuWPQ;5yVos=$G!j5?>ZnwVDh4VmB7W&(H&s-?G`Pyed|=IP zAw;mHrkZI{Er}BazzVuP^{v3+00CgZ%ddU?Yxj>2xk&g*Dm4J215a)oYVSQ{jZHg( zu(!Qi2e){5@4G+vUWUoexjj-nJvljD0J%}ywog3y*!<wmcr<QKPww4%?WuQN=-MW8 z0KjIkFtl&GjLdTX=4;oUI5%%jKKRTtqCDN)jLZAJn!e|~?|br@r-9OgTl)<4)vMP; z7-V_#jTg6fE=@MZ8(SM&dsi26xqoz=VvNbud}X>=-1KXTQyG^1s+LXASHLKJO!Tm+ zD_8ZZdFi=@s$$S)U4hhB1H|=-qPgdbrW&eH)peaxDl9tt^QF&0Qs_ZHB%lNs7<QE| zb#AiAlU!Ai$LuCF9y^;hZ-ROvhYE;6R3!^}%qhjLTP~XU>@=q?cFPpol%tBo)QRMn zW9HQ5lu<G=I}id21R+pGSUK`U0i7qRg7<`u0HLZYUj^p~`s_lZVcNV;go&I*5D%{t z5<-a?wj~L!Jyu0~r2}ft@J6dta{y3BZjfyDPyn#KUfGm^<;@MX%fQ)JM5l&W0?0WR zGUclM9e7DfNI*rBGGuA2>*f#uf%>>e`==`ta$SowUGsqh_L-}F{?rg3EyyeNj12@? zEDiF^$)ljIFq=qGSfkBgx$BnQ(Zh%H(^)fbs!^?>u0|v7md-iPlv#wctu&nFJ7Mu6 zORo>IIETVELeypFRe@mQs_5YG;gKkup45W=V!eBEa<V*~&5q|4<d7G@@#@8$I*h#Y z#UVx|M+Xp*2nbD3<-Io*wpvn7--HqsVA-0?NQ=_AM1%GLcx#Sc`#=p!NdV)qTAmLO z`ZYL)8|K@HsDr`Kj%*#s>o~MqcCZUrewPKQnHoa|uW-2#`%nNP)FDo{6p{T1=S&>a z%G^jWSfpfKvyA<l?x)kqdL_9Q$~#2<*~ptjdUbvYqb^P%_7<VVoDw55XNJTAHWy-+ zoU@IQbBsB~Zn?}QqO$3lCdD>(ZQCq3X3lxJY;%gnv&$)pMT1)67eLNAn^3(#NOiqN zmL9_)g`hGB;rc3jZN0~Z?T18Ua~?#3Vl^)!0~V!WibgOf{fL-|a@H=!rfGce&0-FR z_r<%(*vaM?wkFkv^BZ+D3CodRRK$VUtJY*11J)9mzOtegAD6E7?z)ndizo?dW-s6b znc1#kQ<&JhCCmh%tSA5~171P7q+)=Gnae;F6i;WfQ&lVvj}8Y0AvthkA0#Ff&0Uh1 zmFVcSdGW=U|DS*Lf4uVWWV*9=;oMF$n}6dgUtMY#PtSew*FW)%ul-e%VpWf3C&vf( z(>rcVU;XhLEr;2B26F+8x8JxGIlc1w&GzWctB*~Nj!(1j-CMUGd)FiL)8l!QufOBQ z@!`SNuAjF@n_CyIUb}kdtsmt*ym$Ye(v5rf?*8&eK80Z%9X7;Ng&--jXaO52nuWS3 zCkypLEcT=X6AYdUg_0|{Mot5uUNSSd((QvoXj-aX>ThRIZ#Npq&wXrJ`Te_YnNl3W zSPHd(5TS<<+8@eX0gV~YVRcc$xs*0qp@pk8jBz}|jo_wr*zhzi2NQy@WL}!ep<6DS z#eCV!Ii;>^GRK^|l%fb{PFW>tVwCI^0zz<9xlntmoOq?$qoYs-=O6@!p2(piN8TY7 zvKEo!5^P@7%4gyi5eZ$ng2+bk1c<%}m0dCZ1NNL(1wf;QU|&2D5g2}`44+q`8US!b z9b7Q+s$iA}KqaJsLO-mQz4t?4&M>Z6%_z!D0|*@#Q8UVFZ-=1h5Cwn`SOw4#l>L4m zc?3hlFRFIW7;T+;>^>A*s+P8CO+~M3Zr9%4sm7|*{&g0?lau2+ckZ&};M~Uc?&X|g z%1zUHVM1h4N6tA%&Z+sdLD4zeN_yv!h?yBoBV7)Ztm*&~ivlZVB^m=o@+nkpO3N<A z%sHjDX=bz2*=$xJPh@%H>h5GZ$>O|s(ua$fcG|Z1wtNNK;}RgyP;==jxklGT$W(M2 z#5u>f3?Zx!Q_j#FaRo^<V$B+Dn^w*OIFpjJQsk|TSe&DhtB59XS5a-+rV150%gF{R zrD2(qWB=BdBCnTP*?&`tHHDuZW?*^BOJEO?z3-%|jvNuOimLiRbY=v1_Qz7NlTM(> zHf@!gk{O4T$l2A!l9Di|lv2#r!lo|8$SHNpCZ}b$Smd~j%Vpava@V!Zylv*WTgGLZ zQcNl36hR>-Lj*|9$u3=HPGyLPEV&=aLZ63#XIxJGbVGZ3x(-gel1BrjJcq*B>H`b` zl#4w@%X@=JX3bYn<RRsv__7D2J`3lV$U9K2TAxoFIGSy4jl(pIw(53!+-y|yu}if} zp6nc9g<g0)>^*w8nDjpYRS_(ADnfQY8!kO{<;o9!{9??+B1Fi{DQ8zQyt1k=(_>rb zFKusr?~RwEFe+IE_4tL$CyUwPVy+?yL{$i#l8HVFlzhOql1czZ1&AH7pd#k{?q}Zl zdw={d|N2{B+qrh>y_<WFKJkvPed&u|e(u>*g!f#3glhlo7rvhevGR&~dU||taQND- z*Wze8+TQ%uUw+|<$Nhi!$`|K!>6M#5spFm7uP=Z2lUFZ(@44Cj-QDxQ{N3libg*b& z_|Z%EUwi$xKl9$VUjNbk<HK)%=lO{{s_KVt+&&&(z46-XuOfajb+Z|FQc(a0iGf); zVW}6h<;*FVC%iA#4M5W;TAHP2XnlG>or!+HIM@n9o7*pghoo<7lB7J}YknE?fXWa` zZK8yNC@-H>Bn4N{{1_BG!<M=o_1lSdHEe;~$=x(kl}CYU@1`Ed4r)YaUx)D`yRI`7 zLyR3u?Aj)#4wPeD<{VRwq9Q0v!ZnE}szOyeKk^ueDo24_9bDysFjSRuWLGUZECwM_ zA}?jSORn!BaQM(8q9Z95PFMO3M}<p6-a8LSh$I3&gb+eZJS3~**^pOZQ7_JUM3agS zP^2N1Y;Z6tGZVT}3V>1{cxrKE0~&CMa7V<HbC24E5JLZ9M`Ytb+guX_(BL<{4gdv& z99gX{qR!cLQV}UL7b=u<%#5=7{3rqvVP7s3bFvX<L7l_Q$^4gu<h>Uuwx;3^R{}-O zPSv+fn|(q>&RIA$ZKJVsu?1n$A=jB$Kv_VPRecEN5=TV`qCmpg0${Bmx4a+C;yjJW zvBRXoA`H^D%eHMvW--PtcA!!@4#7L;=8IM`Q`LuF0NSf!?<q^R%F>ZX0ujzRdvbjT zY$EM}Yk`C)s!k#17-I&2kwK@|#<{)NNT6thOSI5>(8b%<{PuAgwh!2kV)Tr%QrAqV zno|aaP<ikC8q&)a7TQM+!_cYsqtkx50NBU;*d|_yO8S$5NxXBa44~-j$SHtp1VsW5 zXO#)~_8uA#KoH21eF2;+%nj#U&dIFnF{RkW7`vQe+ccWfVln3wmy1R2x^6LR=cnCr z-nFxC*~V_UY}yz*&XH3x#%#7g6;u6i=A4b|W<NPdV=Qq+SLQo6sN?K2T*%#hwy0^! zsYvD&kyv4%TNhWKkkRX~k18vHD8*h~phXI*xv=h-GY*;oKy=8+#90x`DbU8Sh%j=a zt$KXgZk(HpcgFMSXg1QWat!JbiF}R`y*CJhs*;jPGB^tn3imDj|I5~!1zUDpXL@U` z%-qA7?pSl7P(WcK27(|#QX)l>76&n8sVTWbQd=!|IBdxeb~qe<upjLR``u6WgCjbm zXmwa-bh{;rmMBV1QX(OcpooFQSeR?RHQeEhd&tbSmLGEOQ$^eLLIhZt?!9O4%(edi z`&db!T-rbQC%-#xX8SK)Tv^vDqY{e=(Ku@fM9D>FV>kcn-~3MxuD`o?^?Eeu$U@Zf zC(i%+7r*e_4}b8ptM9iGgDN1N*g3X;xZjVwv~Pf5XBQXAvdmf2HXc-s!cSg(?uV~@ zuW>M)9mRJq{@}G&|NMo&T~T=J>eWm0=ZfQ#cW!?;R-0L4vP>HP!PUL%tLdG%@&2tV zuits|fBav5ayVZ_6Z2P|H|?eG{$Tp<tj3@GU0WS4n>T;_;}=(){qJA@R~OFh4!(cs zTi^cfZ9n*5|Mma&sfV|76R#|5bL)CNt6q5F`{mHxm>*h&36bPB8U$IR@YhT89!Arb zQr7c7)_YRWz4}Y~XJ7Z(==V{|f^?U09#o^j4wlm;KQ!UWyDgEdDOdeoxOXO`ITa;f zfJlyJAT(C95zSVhjX;xV25JhSB7hS#P@v{24vdM+7-I+#0KIQRXhVoGcGRlYS0T2- z(T9dXB1Et#R<l8t6&VdP%B?9(F(|CF#*s^YA!o^2>#S;e=_a-ZA`lsi>Cd1+H0k=8 zwqw?s^+yQ}t=(k+s31h9fA)3cgr44<o?qSYZCxXUe!2j?iH?wv5+OkE0V#C$Sws+y z9gU}xx26P-#t_q4r)vu{r}9|(O+Lf~kVZ6XL<1+Jbtgva?&5umhgby^7%&7$M`97} z{E(mu;6p?-fEXf+h_iY3Xi^k_D4Gn!Dk3cDOVMi_yZ5bgF1110rp3-Cq$=QSd2~1f zu*O(bWahRF-uuvc-?XBFq0Thss7d~0kQlo7q(l}Zupr$+*iaN^5{_L+MEg&RFbWY; zi4?#Fj7w%8cs8Ab3&bRm1q7^!$f~ZGMM0c1Wm$9u#ctA`URpT;8lqkZE&WjKF1i^J zV@$lQm_mqkU9-f&pe%A{Es7+QUXoizOWiV*Om`^krc-Fzw$1Z=eHu(*+x}?PJq!{S zBE2c7Lp`dsE*<$0$pS=-&bcgenYGT@^p8&c@AbsE(}}LFVuWce%^U&Iph+(iWloI@ z>KW}xf62@WMuegJKS|XBKnQ?{mVW+?yG|{xgWI4Wtej9&psn}mXTp-1PLCvN2tEei z)K&0pQ&+yOLQ_}EMO&{{vsqiM*jG(8Z++#P%C~_zMh+aAV_NBQqHU~W%(@m8>H6i` z|A}<L=qgVLD(lyv0!TL%0z&HcI9(At9YBp}mzqn@lQbjZ&gqmOr6>vnq`fvyL>bm5 z6YO;+3C7zgVu3ZS@c>v5ohTZDy3GPv&v_j~kix^pRyH|vavH<a4?X(Q<%<OQXFl@S zkKcK9bF?)a4&S+Y<&pc({qXJAo;m(tG06V@omW3~?!wKZJ8#bK2&irJDR<_v&C}B> z^Iv`Dm#;7Gyzu5vuPpWr<h$AUqYpniEb?1-ZoKxvTjzE!eB{0h-@o|s;jL*w<x`J6 zKFWqqKJvsP+oyio$k}Xi@!AIsKxXn2r^nO7%foVH2uI~mP;c(vu0o4o3gfmnHi+S9 zdKA6ST~_((Ti^N1w(^b$IK009#vlLrpERpmhqw3kj*fPYWrxjtsg;#7%Q9DFzNR~e z%Uf*~2D>%1p`fGvc<rDXZESCyIr-BUe=@zfe{J6Ihi@O-9ldgS{??6yp!vr?@lhD% zKfL(*Yd81zV|EOpUb}O0bMpRd8mpiT|MMUJ(bn#yRx?6GXTW99Pr5oBs|faM1pu(d zifW8835B$8HT3KSS?_=&Gj-LwH76|{-IRq5fwQJ*{lTiP6ap!ztW}!bX#3u240KtW zl!5HWw_sFq#(|nmb-R#FTHF#lh&YHejAR)NcZeyp8IlFSnBoqhW@aDS7`^um3&-f0 zIm9*uuNor6h!JyZN}G>zH*nc7H@TxS%gfwl&SkbJa$~J^&RT<H6wnx}2#5yAT5^KM znhep9vBo%StN;R%F(&O{lW98*S=SFHLZiL)jP5r3a82(KNUAtkQ<12PEOpaBy+;Pa z5(!Cr^DrQ)GTuFQcPPTtD@0IcMnYjujoQc&y0K5k-~m7)+XbZiKva5=Ck24$T1MMN zURlz-EtRoV1sPNoL*!&e^Eh;o001BWNkl<ZVO3G(nEnGO;h?(-cKW^(b`Sqf#i8qS zN!oLD*)Ns5!@J%#Jew{S%atOU6lW7yE*8t#ECgTIRZf7hwW#RGsAUdBgm71WC&C~Y z5o}&q>$LUYV<)=>NYLA)l#P)sfH8JRHo7bVG^=Jbj?O6pE3=>wVmT<C)fmI(=A;~y zgW=d1leTv$-j&W4=@`n)>E40>F-A}nVPj0X)}$Hg-2k%+;;9}XqJ6vuL4^=R(`h&< zD@@YX5s?7I$Yj<ubamDx%12t9ut?JItWR+3i<u-^7IfNRB4k!$j0j_2#7%|W^oOWm zhyW>lij6UHj~1HNI}VZbzNfx@N5-r(bbu+wMd|x)(Tb$<E?9y8pI@TD9UoCzA6eD6 zK|qDY`_Q&+3?a0>t*hXDXj=}!w@tNN)XQnTocVfHEoN=AYU`@4EAMLr4KcKBbI(p! z(~x;x97;18_&Hrk7jaDS$o?Zp>Dh=tz4;9k)^AAdXk*=so(NN?+jJaL>V*v^naMR# zTO}3#5vWgV5p{n>KY`RPg9GaWGo%<=7gfW~nG+ydFsXTuA(o99P21?{#IXk_gOkoq zzWB&5J}w&{d+L`qjNiT;KmWO}JooDJANk1RpE`GDcs>5%um1DHJJ)xo*>8OIm;cqb z|IK^NUWxV;jvuhQV^`!SPi>yK?`h!+XV3lVUw$L#_`ms2{<BltI~rmeX5ab2w^!}S z0UBQ|N*?@IzxM|h?mMkwcE=l|tbO8v$3A!F^w<CFU;o3!i=Y3+FMjQpzx+cpdFEpu zM}Q*F>b80N-8cXA8-Mon<IjHeOJ5vMM$xw)TzdDFmw)={U;4~neDfQZ7B|mtpZ?mf z|A!afcxybEoH=`HWBl;Z(VgdBc;WoH^NabB&GhJCIU4V{ELX+W%f@JHc=F8Y-Q7pd zKD7Jf@etj7Srrm@COh{Zd-Tabr|&yGo!xN|n<F@J=D`b(JbCNJ#d17a1zv^LuI77{ z9<-H?ht<l9!uv;UQ7y6CpdcswZA$2f0)in@Wg?TlYX(VE<TdRZ3?<5DClev)HD}#4 zZ>?2GHJKF3KovCTMsBiMIMUm*dL_Vsf?Z<1gHlq@Nr!ZTlVqgrlz0q|V9dA+Zddc; znoT^7A`Zn`hAg5H5&>0GMIgfrtO5`s*Qyvfh8ToHWS?Hc!jUBkFjG{gRG4xya)T@% zXZbM8hj}q5!BCcGd7fo?o@H5<XU5pxy9WwjodX~N1T=XzAd?|jBnya{EApa91A{Ef zMYQ$a7)zb&hD5|UM~2dqC4G<qpvW>6#e0@<M3`k+UDq+jJkN|VE;ES8A+ksc?sg$c zl|0X5<Pf7VrmkxM$ecw&6$VLggJ_6i49QgEj7fi?H70~m*R^lka!_QMOCgc8DNk4P zrfH0GMNxoa(}t>U0Tb9cz3a)434y!#1OSj}eDqOR!TZRfAxdOr!N`)PlA=Hsg;@;( zkw_QbCX*hqur4z6K_N}3!*%*PMZVL6%!l^kTW=p79u9}YEX&i8#kXx;tyYVp=o=&@ z@r<aJ3}csTLo{j1oB$NU(NI<v<Z>h{QuQ-@k<JSQAOHqH#FA!YM&MfFMGP@Um#$pt zhzWRfI3<kE<vxTMd|4KQacPY0p>J#RZubOc4t<xxs0d=hjgs^$!*vw7U!QjQ*>s2{ zBvDSploXp4Kvl5DB~6cjcI?75-$v7Ik<vh=pN-rj6TGWsP7`D8I;ou*Mc1ChyIMc( z*GBi$4(}@MalMhb_b*HrHX^+1JHWdq%X_Gi<S?BG)#^Q^$h7!~kwatvNFJ0BIdVs7 z4<UH(o2r)JeO0$j?c1taE$ZdGUe2rK+&8OcwTPh!O%vFM)~D8QT2&_Ch6*rCNQFh= zG?7TDeeMS|-6996>u~j{-tK&~{-O}}wY$XUOd-fM;egUt$vL9}N^3^8rt@0*lo<uY z<a(3t1SgslG#0VXVW!nZ;-p9?I_s#ueWf_%?<k2=SO^VKjFO3B9S72G&g;c%@1A++ z89R&5oOtYfxm{J$kDhsa+u)DieC6YhfAwUs^R=fwcP8H=Gynb1eI-=053XK5V+Lol zaX74ZPESC?8y8=H_0sK6KJm$C9(?ll)7LLN_DheQI&*O6)_AaWY_s^%r+?w)*H@*1 z)uR5r-}s#ePMmo0AAbyX@bn{(o!zyy*MTd3`>S7BF5_1}|0}#&O@=$CkDa=H{nC3^ z_s*O+_3RT*eE9YUzxtJ5-x%fBu3a6Dh7X)LO;6~Vjop9ph5z6${`zlz>(_qc_|}%* z|KQH{&e74nmEmI-9$}FWZcQ&;KB}vFHuYyWPZgyaYe#PQv5$Y0N2doSd-kc1Su+sM zH#SG_efa9`_|)(J?jKyf{QmyYL56VQ?8#?8`iVu0){Q4-wXB+|X_fNXbS~mIHipGu zST`ZH8`}^7s6PyWXj~5!(`cwiW^|5?{=B3J*hBUqL0`LyT0)wD8lrUCTQ7m6pVwKG zoj5%0?4&fx4i;@C5($#G3~-InPO&Ubi7ZmI=>isYEOZjHW18)1zRhk^Z4pf#zzQaP zA@{}Dz>E?ZfW@;&((8uMig1YD`$m)_2PILfroeohQEmnsWi~2IL4!$|<t{G@=UkR$ zWGopnNnURZ8catG5l}=!q=<wT$y(=#9H9lWh~P4-U8*H<!ogabWf=gFF#;-rWRNIb zgy=4}$l5N+qGHITQwR|iMb2#VJkPQWQ3*-2gfGB6&-zC&4u`|G^>y2(L=pj(Wnl;q z)ug;6M-CAQVhqMm=Iq*t+B8jFxaD$HmgQ(vW|k7+2UN*WmgURU(ilTzV_;UT8xKe# zxLVbKm={H!=S}0AHmItx86YgHrtz_EnIMG7h@5b|F-=c8Mld3+TTf_ApPu=7UtCI& z5Uri-KNsy$6&AjA>(<`Qn+P}=Td=Ok3S;HivEzv7eJ#RK*=i7HfeeN&)n^PbcPON^ zr6xoV3Ix^|V=XFV8H5m2lMA7L>nI{dBA1hy*eob>h|#y)`gFJPG49>GGak4+_ds}b zG((~j$B&UQXed3*yU2Iv2uNG|L=lkgDBO7(Op3m$fU#y>yAVO`i%aPZO^Hbe#KJ^| zSp~ovi)hnCdfmfctBoX`Ui%mt$GDzAC@3MYBw(i)1wf}=mhG-O^yl7@r~pd3o;)ku z4V0xLf4b>PTH&W(L}bhwxzqLHQgvzVL0ZRA(*4lJ*nM$Q#mE?1EUOTLZ+&u;wXNq6 zIY!?$%jJ?ISIfEhrd=&pi)mHOs@1%y7QU{7Z`rpY_~3ot7~*wjx5tI_2OjOFNZL<z z)4+k(ClDn8lOj<7*!f_zTihn{PUk43K00Cy5s`Ii{tf_^OsYy-GSHvIy3Aw;pj1!| zF)~L{MMBpZ5_*M2kF-qx*36u)!UC)+DZSM3PSd=iQ-mrBv>K^!Auu69<mu(h#pd?> z@&~ui-j@%@m-y0fR9-l9--{PteBsu67w%sY+DGoY|Hiewjmd^{{+r+Zu2pj?7+5a$ zZr%BnXO08<`SkX;e)11bJp8fkjm^`$=bnD#BlZ3b1XYyz(fsiC!MPLXmdjZk+%G-- zu{U3O{@;G%-%d8pKKta;m#$s@?mztSBTqbW{_KOl{p(*VNdD+gzy1rK{pzY({N-PN z^WAHQ|M@@r=O>Tt`np+6X9K%Y7De!WHog7wOD{is;li){(&s?TV-Gy=&2Rq2?y(b( zJ^WB+X+E9pOSt_0rGvU&hG{dO7qq*3{3P$+wAT6PL(`ZcY!1t7w-(>{#=kpu;`~4R zo&V^*Gp7+pTU*DT|A+5<uy><btv>zK6U)WyUw-{hKlk}x`^foYvueR2%u!Ge_G<|` z7?<1ITP$lmCP`W{b%~4wJW@ku-JVRq$P_e9)wLv(PGWiPJu0nlS5>6~h$fLz`^REe zWJ-VkmSO*JsgZZL1{+0&qWi11V(`e4au=W-*D1jTK@c%BHWSPRPSD^a7AGa&W;+o# zj8v*2H7XioWKG8NR2_j3L*U3NEE<_vA}cfdz@9m>G8lwX+|Xqsmkq5O*<zGug>z+I zl)1}XSq_Y~M5LhB8bo6di7>^A)^rhA$J0>PbmcT??ryqi7v96sQp8CWB6lH006{Rl z&GRm8QPS|q*!1>KhTT-PG{#s%-nY2^H$y~KW6+WTz!-dtK_W}<R}c|vh!BNinp9*( zmKTm=h#X>!&?VHA2#ldDb1C!=0M3$-qUvxs0L0KH_EsPR1Z0Me8Cj@pTL9|DC#ZzU zt06IpGbWILMj|9*sFR_~dXasPF`%1->HkNB*AwyYBEePf-XpYg2SMBVYuB#{%WyC# z%Cf20WzJdv0z(*MWQjz=%9!@_hV<w2-f5FY1`U$13ZVxj1TsX>>kG8|-$aT)Q6q{5 z3$i7vZyF-hD8j5LtGeCV7$H&HdNM{>s#UEj92JE6qD_}_rH+b?T{Qzb)ov1B0sv_2 zZi*ZdzZLo$m#*Q7y%#ps&C*m9dx}MG0yXy@l#Q{7Y2|=Du%d&Fry;4TCL(I@4eClz z^mDFaT^GZ;p{geN1l{ZF>)%;-JB<G?6L7Z+;B~fleKn`9<k?*nP*v=5Rrg3{i6ORa z)3i+pA+$cm*wi%#AAK8|I(lENR!v<st9iAY`lf2@W!qFuQ%j7#ZAGMQ8|j{Jk~X`N zbV~wq_f59G<3jJ2q`n&0C1L>5-Ir1?5K}WTou&IVoplb8jI~4wIqOW8Tj$EbAT7F* zBBQTPfaxs+NR($;2qD#1*tg5&qOO||0w5Zf4M!vB!cZXw&oQbh$Eczq2IeTt!cios zN`kS8FafHhRv9HfHM4-GxFZu596dBkTHL<z{+m1ZJ@Dq+?|$hkUz%07|MunYuL^tR z=GDpgOM6$|edXe{uYLIomoNYHr8i#L(fsL$A6wPa*FL<ou{kDS1^vupPd@dLhp%71 z_TKf|kI!e#YW~9)UMR}J!w;T0n$I45V0$*(ubL35dS`p<#O|?AKKt48=g)rk-~agi zYu9ev+K0{j%(0ypUi`_+Z(aPgul<WWr)$@*+}dwXojQxuw!RJAesJm1crre7`oy51 z+5D)g8d3Vxv!A$h`SNo=dj7MY{rv6QcgWDO6UWDsvUuyY`qrK?eB<iPPk!|AVl-MD zQaKzf_NO1d{qFrAJ7ZBL#J4WKc6)zW6u&!LcxwwEs@d$|$FIEb=(!6IK6w85=YH^$ zS6+PViDw_bu=)N6*NbwvSk-|e0v;Sr+u(6sL`gZFUi+Ll&(wz`4W;BQBc!avJ(L60 z<gf+R5Q35xWmy(EA}p6x6c$_yyt}J&2NDuRpr~*-Z<OW4?#9lfEV69xXfcZ%Ek)_@ zuf4%j2_RG060;523C&M)xl8#LmLs8@$#BB+gO37WSU7M9EP-Pb2@-vbftghzN6{GB zs|H445;t^iXp3={k6b>qwlJ>9@-olzEZtC@bJp2Z(j`cdej#htNFGo$#wrMa=^_z| z9EFg<Dv@>w4Io4`&Pt#ENXH-1<d#qUbA#9&W$p>uL=nmJoKuI$fbbfCkRnkbWffzh zI3+5FKn%hhL^MPW98-*3S(>I5wnU)J3Sx~BOCrh~TAx~8>n69fZK&(kT3jMnYXDR@ zCV>TuB<E8~uQzQ-9Z^wgTQ3S}?k%c;SwkeUszAo3qlmC-6omAc?&NfM5C5{e*lOA( z!#dHq#%8VMwcQf*p5SgOug~Xm@8f7Z-k3~`q1Lwm=$z#cm#an7R3fYhQDnB9m&38? zZ(?0VyDy`Ih!t%@@NLU68sP#{Ku#1a2T+JTC>vNLia28&nGxa&F?jEr76F7~hF)}J ztz!<S&z!k=^HyC|w{PFs+1Vx_?cs~ik+3^KVH(_Y-syxc02O6K5Eew!v99ipeRWOt zR+V)5?)rP(PtM)+T!J>H!*cqsSi?m7zf&44uhZz=a2R{!B=+9t^=vv#a=Ok^YNj!- zy@YFW;yt%yO-^p@7*=-+SL<v9tlQ1WU@e+J=qaR<X3=)BSOUOsI7Be3)pT}r6nqmx z+qQLE*X(_}T*S8ab-h^3yl<Oo>6<DBU#%7~1ZMHRO%bZ3Okj@8v0J|MliKt`?ow=t z`l)H|hXf?u=su;r4RxblB;$<Bx}G&5AZ9MJ)}&^HbB4$igMqOY$=IwIj>g8gt?jMB zXlQIY)dHl`A7V-j65;w_FB(-e`1a=B&BMb3@7pM_wY|HuyPIWMy8edH#uU|#9NNIl zb+z(sQ>_*;_@-Xj7&&;6RJzlYH0%(dDj`CQ-usXwyR0e*2Up)-EcdT3{k6RdAMC&P z{O$MEWvgcT-qH0RzVh7BGCNuwz4)`2rmGc0_Q=DJzVr5LQFwoP?cK|M^Vq2`pMT=U zt@r=t@4o%&wVUTIoWFmv@$jP$jYp+`zrJ_t!3*sNS1!H$%1e(w`t<#0kN@89{>P_J zox6PX{hz(@#{O*Y2S51ES3m!Yt7i3g&wrl{oj7%DRqgFhr<)r)S?&%FZa(zzW1Ab3 zw{Kj(b9--RYqF}U#y8jZ_RgL<He1Y}`{DB&yIW6v^ohl4xxats@y8y`i%nJe$Rm$_ z<dKK|<lz6<zq3DE%z&sI4u;Eew0mrKcXKv97)>T$`r=paKmTZ8|LW^+Jb2;hs+r%s zb+f8hgHit8hwpv;&;DEyj;436-Prj4kA6CuOd28|d;$-xsj$$s(KzKT(@%LyMx+mI z+H<HR;!rQ*)y}tW(O5zvs$(lEzVVZd(XcEH;bKww{sS#{Sx4)uuqvPzn66r9SEqL; z+v6NW<Y+#REJTW`D5(i+5hq}GH9N)SNy(2vzT-wCC`xge0;qTn0-8QFp1F<D#}Gt< zi09}zcDyR#s6l`g*%Y8T730zkZ85O<&}5~xnJLTCSes=IiI5;l1R)LypPZKC>6o7~ zBP88LHbLSP0Lf;8s>lj#Bp93I5k^?a7*=6Uq(@|C=qPwy?Vb`lEy*MZMO0W~^oZ29 zEfI1wNI(e2Sc4cN$JqJoR6=^9w!X23(&&_o;n*#AqV|r{$SFUU4pU9rq&5(ObZe~` zRn-_GgH7#2R6weIl%@q0A`+G9Yz3lZP!(DqBB#uU0YoGdSreQyne3RASyUqu8pCaq z0_QPC(FA@<@x9&|+k0<%mqRy%z1IMrmfY*zCrbZfPKE$PWZ}_hbm78<>({O|b=5RY z+cqpQMmRj&FY>~-b>N^PZM$+1j*m-n&R8;RRXb<h8pI2crEMFPBx{+ttW1t7RW%4g z>rxQ(9BHyp5D8#tL)$b7!5Ou!s(O2z?`-b~Gjph_>fLwWF9&&9mLw)YUe`^LuE+?T zH?k9EchEUWHR0qzLR1i-PC4Ik)%)?xJ;+xC6`<~f0g1JieuM3^b?Z0f-4tbKccQ+# zuVidDoF`t3ipli%=?*PL+F3c2(4-Xu-u3O?yG>ZTK<?5-@E$rxKVrJ;%@m}bFwuR2 zh|tca)8S|oybnIyxqWLfJ!<L&aJyQ}e7$N{D_>Q<X_{u$HjOYZmkSjMzD?bs)_aaI zgwX5%SS3d8vQ*s<S<kS%Cqhhp!4f28w@o7LSVbh`5S`0QV>6Rw);R^ui%eApgEG%D zB6OK62SYL@FAL|KwOLUPZB}GizPY`%v9(oI%hop`cxQ~L80x?YrXSY;q=yMMtBNv5 z&Ms#2Ro!kMJ9h4Y2eK?9>Xy@?e*vd~Vf3+Dt*UCdS}dy7Y;ky4RWo0=sm%=7DO7qg zIuK9@x>^Mv<|+CeBHP15KPdnHhkx_t^qLpe7~Z&j@n3%X|9s>1mmb)@@Nd3Vzw**^ zR~83N&~N<hUw?S%J<QzmKl}d0w~BI5sxg;uTzzZrvSRjEKlt`9Jo5N3bBp&6-+bo{ zA0pd-|LQ9*Ub(aP*MI-*Pe1!iZt1-b-#<9K{iB!v@z^Ba+01U<y84~xp1XMcL#5%% zum1SXm5Xjz96z!1(^r4;=1*Tdm@ZdUg(78HeD{0b`|#3xP1Ckb)wa!dzx%z{-@b^( zy!YOFr%s&Q-QAte=dZo-+K*oN$KUwPf9l)dYkzcf?edlF`!+X_93o8*k4~xo@lRfO z;?WDA`Rp$MW^cXy<}0uLjL}(YUwr8mDiDaD`{9q?c;_8OI6AuZ+FSm^t9x!^I4JT# zS)>tvr^<n3A%(lZbm-=#N!ISHRh8*%HlMGgi<_i9MJGLpnACb+Ko!*2?Sf@<W4JlY z$C=qXn76zxj>BDMZ1VmRf<misI9(z0vCZMY(TT|*9xYm>peleyWde2wvQsoXql1%F zZlE1eF_5gFoRma4Fbivt5QSUs8;)%VO$;r^sM5wL8l#BU$e?1`6qF4zQ;;1wTaYWT z7}~)gGu9xbv6lD{))ayeA|M)LdomIMKv@*TLPU|1ucl3$Kma7;0i7|qv0yEb5o4^U zXsmUaBQ_zV=&vMnj3Jx8;N4LkV?(AlmZG%;iZMp-1!*mt1M6(652YEm=|CJ{h(y^E zifRneSkpx@Q?W2<0To>G$*2%vGG`J9k?}r6jvdU%P)dfYit&{A@YWhc6pk?j6?T?F z;K0f(M7A5@qCrF-xkpNxBngIemlJ7OgMts5k|<Gnzt3IYJFNLiED05sw!G4XK09XJ zx`&$P(dj8<6p=ZqYF-puTU*n^!})A#4HbDlpC1*uX_{uam{*IL#1>RSTbIO&!4=Mg zoMXBxc2LHI3NZjSa_!s7w+TLAhz8C&Lx>s~HH0(|1VRPiv^FthIci&rZyCTja?XYj z27^*n=kr-n6vo);bbfR+Es8w$2797(K<4z^@90~q5+y=v1Zffmt0;A^H6lQUzR98> z{Z3HfUJwT<P>j)#1xnj)R@LpDoe((1^t!w9I&IaR2#ESvxFsW+ezKGkEV1j3cfboo zOhoJT_fepiO$w}?4BafcvtvnW9PwR5kFMPh_ZW^P#&klXB-An1fdC5=5`Oo)&u?yR zt4dQ>cWzy;W(T2JwyW7{IrViF+P10d5TkEe?_2M^$X!kEy1biS#{Czfn+f#J`A!?6 zu#O?5FO5O6tZJ+SBI_&}Yn-*#Wv+B?ke3^S@pw2HCu=tu9hAAXX>){`bE;aD1Lrd5 zoUzVjxy{PacrqG~%i$n~uw2c(Z`0R~RJ%H2hx)urm-TIX<NEczy}kY0cc!!X?unC6 zfBc!rWSk0!om)d8a^#r4Y0|dddmp3Bj`pXAHxKUYUB7mvt!fStA}cF%U}lN2r+}o1 zC}f2hj*8*1D2GEGl=UDx7{DGyDRQmZ20XK|m3gUWi-Xz0JT_irI4E6ijuta=8L9x8 z5E)d!7!|-)O0~Jb*2cscI-E{tNAt*D0f|hRWh|`9+%``>{P5$CJiJ*9e)j6?Kl|YA zMmR*;+T1y|JwjuT4rYtPSsLPo)(<k5XIazK!=m`om%sGsPk!p%i*NtYpZswx5y%=e z+Z&tC*ru(Qt3~bGo!w)ZF*k1C9t<|0eCW|9&fRaDcK_Pdqh|Sq-}$HC`rH3|b2M(f zOlR{4AAaES^$(}h`N$1kee0(e9((A)2Tomm@5Vdte#l5Cc8+lj2lFFHAma41q-)X; zq&grXAQ=?}Oyvhd2+I7(h4V@>Up0qE^XY80_Q!QD*@Rh1lk0@~1+gFli)YX55J~O% z#;jg3`L65IuYnW!DphU(Eouf*W_aS*W;t+++8@m7rDvmNo3e9ud<KWdpxnWH0{Or= ztHuJRpa010gRh&$$KYdVA~&&ZI0WHVViSA-78F&DM$Ev{5Z%za!e*tjIl0{A1#NFl zilX2ctE%c##vL=2Oqy?*^irW@y*Fkw9BoV{%rc$NyB}kq^qvN?NEu=V=&a4MyfDUC zn~%oh?VW8Rx_x`Us_Q;<xVG<5+TRipp-m^DJkK{bC(fG1VmX^l*JDQRh}A%tB9A?o z5YSrMm<)EdCUxEH-MkZG=nMTl^DEspI><$bm)_YN9pBju-e0-8SNoPFh^R2jnkCoO zNhHC7K%va-`TI^~&Rn~G`}Y1mbHc%OO2K~1Xi}}1uzN8dKfa?P`-js--3CSxh%Bt2 zK&-&3tSZ`jBb3NE5e*@9Lrc_q4XvVzWYX&;eGR!oQm4iaKzbZqyLNML4^@`)>1=wC zWt8V8_)ssG2y9TrSHny{_Q(ULH#Szc>e=Bc296wk+w{yLHP%FHuZMc>Jt5@AZH-2| zgP}tb-+J%UqL8JNF&iQxa?Ua6w5<-SWfSGXBj;jUBd?x%^no%@z!q9o)!xnh`_G?x z;DNKontMV_i~!D%Aqvq;-|kA0o!(EN_pDtz5aDn*tm|61d)?ieD^A;qWGc4CArcy! z=Xtv1OQ&{Uw{`nDaEite0iq$}oK=7rf`kAmX(U0VyLhLEOy96URVeaORb%uVSvX*q zYvZ&NfrRSqy2hxAMUks$2wpfz)z^xVo^IRCu@L~B%d#vJk>Fd7(asJJIK;NC=d*+9 zoxNDkn&rG&&4O>)`?hTph$`IznK^yu*3gVpDbjn`kX<kVO;6DRM3Y2uJvGyG(F<cT zYqLDdi_AEe7lm<lG#(AgiLs-+nCzZ7J{S!F5kSbWO0Wi<wbpd!`aI78C~bV5D{NK{ zN8|Bif`lOiXH8@uf(H?6sqbiZS?F{Q2Y?W~0xqkns;Xt(G;L$Z42B~^n3jg?Fm3EI zeCT}?0b}!>`jq$g|Km%~Yna=5097N)1{+U|mL(7+Za}vsLTy_Kan<-RXxXl6yFEF# zdFqK%bp4G(001BWNkl<ZCr;mY|HgO{8ZSXoJaJjCR;y*TS_}%aS{(+B%cymTs%Wf5 z#N1|%@{RH4z?B#{ZOH1X@*x<2EJF@$(^T{MJj9?P=g-|&xctW6HK6#>#~x!<MSJ}C z$>FeUYd_tb$^Gn*ntByluPT|%MD(dApS*D4p(`JJ@Ux%&^vNflq%32Rx^0Ur=NN%7 zMxWMfpuDwFT9a)|N*`kSSdNCH>7ARyqPTYb`r*->tQ~C+^E|5;i&=HBJ=q+)oU7VW zd*8_|7Uft2z|MFan9(GSmtl@g(;9(PC^D2D#LOWWLuu#4A|Ue6XHLHJ{`(ow$?Y8n z=I~$^Rg(Y@)^-_Gg9Hdh1Vl}Y&s@0h>=WnDo_#O?e*Ig2art01Z6$CQsDYmJpU`=^ zp$s+p-~;aK(Ww(#yIHX@$&PL>w`q6+2B&be1I0F#Lz88aRL^MzBOwGIL+gFrHf`{& z#3qJTV#~p6Y$UeGYydN|xpg_X0htn9X<R{BZe3=rHP)apCUY*XM`5b0tO$gZ79hr` zU}s-hH&f9VR1i+D2Lu!#qZ)zK7z9Eh6fq%q5vORav*Ym?5f2WIg7>`uP8A{$8nUQ{ z$f#O|K*kc<v^jRp=DABOq;$rWzKKC8GlVISWl~k4EC(AK8%P8oA^P4Zg9-_XfeE#5 z$O51W6H%7u<H;zr-df@+MD}`joO_S+22Fa&5mJ_A8=D(t;TEfU@7C?eo%N=}H<J-& z)`(~TlHmYdW{SLU&IFd(@@5Dk0x`Yhwd1j9QhX>Pn$Cf>hAB!^Ozz{j2I5i&neBd< zp{s9nLH!tFy{eXrB`O#~?<<73TvXLE*%+0SiEwjcByDAk$xB;1#V#F|3O}jx3nGHd z1>lrfLA^p1+FFY&%N%tB@Dx#mzJr@)493vFIiF=&7IrsW)9U=tGh?3TX&x{b44lml z_7BgTK3-s^UF{iD{b_q+M^$+lSwbK7h8X+Dph)ZrxZO**$n&DenYn2ii7LvyX-|o; z-|f<xs$wk`MWL$8WySrg2YUcOnn#N$8k^oV)@4OeAkk{MP?i`Xba$$5M3H7PiSwwe z&J{&5GKN;GrEn!3*jAy(39QptECPZqb7U-8jKT!KF}Xm1@aMEwy`2FSF<~WCjVRmO zH?HoR8@_F(N4ML>A-7fVbqFno7<?NehmdZ)F};cV_imzSB-bV01xI&ui?kCWL@S77 zoV6vIoLp{<aam@pB?6Z@<8ZPuF_wnoQCSw&xw0I%taRDNV7z_m%;_w5BGR@s5+ewz zDD$Am)7{!xhlpg1v6-<snPO{eYd9)>U~8?jCdAgajS3sO2e02r)Dg)7g0;@t{Q8X> zE-wIaKA$&D<D7FuNL_QhTlFVD2DvC|OkuNPxtcaywimN_YD?<IEJ`XXyJ&6TwyvN> zaMlMe+-bqnrl+cWj658TXx6wbPm9_`&aJ(E>uLzmTBiar#$y{>C(BZ1cLt;K)_i`s zX#x?01r}pW>9SEVJag;>DYaFdPI04hD9pn=J9m6*@9Kx+;fWi!_pjZ)T?aosJP3i? z&~9vOfFW!1EH6jHNjV(59ed)~3Ewo@R2#*~YIcxYqe!bjxwCg}-Dc)r{LC+!EVFqw zoz0fZrE{)BbBDmuBZomov%`H77*CEh6&S?4%%g9X)9JI%e8O16B0ex0Xxr)&kAIZV za%_ED8EJMb>G75kS9M@hRxSG&6HUXp%=^|kHyjKlN|$;Qh1gCkPaMyVZhi98pMLT6 zE1YkP?eK{UkC)>ygDzI9wr-o&x87HE)r1&AAW)-1(P!KkXaH>+VUp>Cr%wF#zxYEi z+BVZ4y!_^k{kf1KB=0?|fB+)oD5r*Yx6s{5_UMyOef^uyRgmZ29M1=nGMDjW*k)U1 zFrj?I6uDC8y%6@^i)e_^$H*L;;G57k(KixX2^EJ{V?Yg78V8a=xl!1h&;&a$SwVU3 ztTWcyRDqKYs0u_TQHK(CCuLUqV6FCY+m2wx+&hLPh7gP~T^R{GHAMp0M@=y+av3p; z_dXRam^sBdJB$e=Z5JD30RYf;GBgz;beYY9OH;8vijrP6$jpdj$Regzy)_0!fkmvf z$;OtlHC@)ULwb;kvL>F1Au=j}Wb(2s24y@vjFGh?j|mGy4_fK=)Cy#Y1==<uA)-M{ zYPnu2mL@EU3Zz|u2nlV70RYOf$g4^@Dyt7MDyyO<2q}^P0h+EiE(Fw>l#+3s*{gO4 zDnKBz61flg3Zexi>TDLQqN`Q)-aGHstEDp(qDP2?g32+9Xe0#?9&HUy>}=lJTZu3d zjW@@usaIxWj5S8Yss`wT>7}9E0HE33*=pN%6`E05X2wZ~+7Dq>QAE;3od}IF1DA!^ zoZK02Pm0K+#ZkRnHltxyWOg_#+8{-qx1m<x$RWLvI0ellGDmBzA&R{u@?P$lN+Ogc z+$RD++xYRAiY)hS>m_u-X~4eeiRq`;fa&sG+C$}#BF7$@#%rXoA)C&2ENUzPP-HEv zvo?<*ssMA0?5W>tVJF@t07Eu2Hjj+PX4VveqKH?Cs6t(_3IKpiV!5NSj*I~$G}bxw z+OUKq15IQ3b+bT`020*Is3IDNMo`q=xcaWDRLePs%GVWvwr!K%vc7494=G-xsv(5* z2b~20fYaVO*;Z3-oH|A)5-K8DTe{M^VKLlx<<J#{%WRg}!LTHQd2Y$*aFCZ}Sq=sX z6=02Z`H<Xrym{>S$>W)It#7?=Kp8Zu1mR#1tV!H5i-=&*kTa$*t{hK>NX9{TS{LOk z%a{Xdf=w!lXi{=^mIW$@L+ky<#^(P1K~WUb+5Fb+TW8PRM|tKjh2y#s5+?8mVwUCO z@s=o}5mH?YXbw4+RFt{R+=T~^SJ!XexpC7F`4}@*F(!nNV4f<dqHQap6#^YzyLmXD z*+KEM*I#?_)mKyHAFYdZ^FRH!|J~6C?``DvnJ0F>{(rrCW52!;d<EdW2=lNkPwbw2 z`_iSGd$*4ckF2o<DFmNe_uu~)|K-MLFtu>*)W#3~{(Cp4i|a@8RT~t*T1$pDwl)=T zzNn(t%w<`ThZrs6Bd3l(`{hsVRePU)_NkX%ee3Ou@9#~6*wVQ?%kyGbZftGMmW!i< z!w@2oafV_D8hL9_e(kGYeErt7le=52epbb7I0Q1G@$=a%8fan&fdv3btwjxL&;s*f zcJzf$KQ-~Qle-(M82;vaKVC_`^l7Q0MNzseD~e(~D2Kx$fpGwkeaNEy%`ZH*UDTnT zKJdsx^Vw{fopI%eY^DlzQ|DthIG&TCHu&juzNl6{v=HME;={*BVZQgZ-}>^^Yj^(5 zU%e1T-v97QQ_ZcjgKYTV{r5faps_ZOK|+YFZ++7e$WT{*`1`*$(xal#!N!T|U^#0C z1U9S1u7Zh-OU=a=WQ_m_M3(iMCQXn6#~`7OZ7b0WH{x66nqo`h9k#h?bD%OCY?aoD z1I;pHGn0@y{iuzMp%`O`k;tTSfwcr6DukdwYn!YPQWP<UtcCPCG-L=ZbIr`wT2w)6 z5kMqj+O-mTR)<bRW0b0@thI?b;Jr^$&W?^Cq)4DnM3B_E93YkTm57q8vu<it?%f0( zAgfOTgNo*v1E5t^w|<C-##&)k)XrM3UBHD5DcE%J$c#$}XCgz87)E{5LOJbX?{Nha zfD$<Xictb{3C=pF-Q!)lW@I;DOmEY488Vci0yRyOWrh$l=N7AZ3RosOuBs{;1wwM7 zsNh`Y`WtYH7NIaJ1d&ceq!<7UqCp~MGR9zsb3!6gfx51vkA=&8GhZzaGApKV?1_UX z6>G4tbaH#(z~|PY$<Cg?f3|mccysQX2&$>%#T?VR*&t*96K6J#Z5=;xd^xXXi>d`4 zmAPYPj%uwYOA>U^Uj{X*#=y?z_}GcfBC|FdXT@Mu#TdEVm^AImX8C9|FfFS@Wla4Z z5m8|TZJK&A8g+sUj_V7cbew%i>3Z#<k6wM-G(=`i|4zC6eq`0<AejX?lC>(*wryDq zvMlr73rnJQ#B{bZMkErbsDN=uMifO5jCHPT>bBd2c5krGje%qk4OwRZAwk~0?Euk< zSYwL3G~NfICUQ^~#e};8MBo?*9T<mbK`nwK%&ajH1;A^{e0Lt=K2eq`u;>shq60)U z0xb5<^$&zum{mCVHgb%yOCEXep|f&!znB?`(utK*Arq|tAtaZRNj4cnWGq>iIh$Em zj<@gIJ$*JC4DvEFM1!($8IjQ}GenX*Hy#bFO}uW%vjR+M@~xfYCq|=@LCUhM^$s)w zFo#AZS^^@7DQrSyj8QOTGBCzilky1NDTzorrIjRcxRQd3(XRhSXpMC)%eJ<*Ha0ev zi^ZM&{rBE^_xuA7oH}(v1UisDh^W-{Dj$p#s4Q}q6+VW%C=OPKH(Z#FY_PGgbR0Gx zdh+oPLpy6KTGd)rNXWtWtS><z5KKk7)v5-f4B`D(UcWh?VjDGxDnxF@^Yss|yz|nl z_a7TScy_#Z<u*hb7lYAgxF4pUc=nT+nRnlN|I(Ffhey*+Ku$o$6zEp<>Xnz?8RYWT zo9|t}x~DEDjwIrvoWJkB>2f+>tqzW+bsL2N0P`$U1&Z>;XP+U_t<6d1aPP`{XLnrP zHm`qhdEw)I7artl3b*$T_YaSbrjpEYq6Pp0fB7@NJQ+?-9@`xc+^w5S@2PPv##mLW zgG-m{%kuiW?<x|Yo;`P8ncHh0Ua1#NVT;dx@>4t8yG48a;R|P9e(h~!*t@<rT{Vi9 zP+XozqGC`y`pEso!2aaLSL>>=<c#8OiN}BIQ#t#}$K~wk-M8L(<M46-6IBI-MO<!9 zpW4kb6Jxx2{bomjkN&fdpZ|?t`S_hH7axE6!PRVW_417+*mvK%aWwxQ&YnK;{L3%H zWH{N~D)Zvzja$BrA+ktxkw5+L@kgG#5RWdmH}~e(Zr^(Q3ebs-Y%-KA4=#_Hp^n?C zsxhWqqvyyWcppQEAqdy(>)1xa5tW^YBPO##sB>s@Y#rJHb~cNFBl0WIRKrMVkQ5@d z%;;lq(E@N+J<zlS*3?}jV>==ndj(^GFlZsb3AZonIy+eFAhH^TL?%fZk`6;lAxexw zM)N#FMCM>R@(lI}RumO9fNH65Kvo1oj4^P}te4KZewSm=8wyYi6^e!deH&AS#9E60 z(Fdfixzdp=B^hT;mX!cj6=O`#A9l_Wne;nTm$BQ-NebvWAWJ3#ax98yi73mm+?Ca; z>6X7;)<!uh1Bn_$Ypi8a72l@sn+hVt&`K|??W4~OXjnnP8cT?jIDN*L9``2zqQcVm zxVj(#Swu&a8!`X{il9bS+NRC3Ec#Vl%`@WC*@)^bsR2~T4L@-9*!la8p+rK6EUUT+ zDmHh<w8Cmg8POmybw4$Qfm0j9(`UCfwny_(4mXKei@^ZNDho7C0%!{-o>iw*CZsaY z9XW|m#Rd>OgDQsL3BiyUD<eDT5U>(c|HT?I0KRQvnWu-YFyD<0LzlQ_?kqB$vsokr zUzP*ZM6cw&Tz!|}-y8XiMWo2y`@vw8MkcLq5jE8gq0fK=I3;7LU<E?ULd;-XVYAZv zCf%6()>wyA$xCPLz}gbJhOq$zV{$`Tkh&X`B(DZ40HGyI8Db7-0W4x>T;>>>rfuq_ zHA;rkZ|>vSh}Mc4OF1hVvc?e$*lKndBS&Fj4l$;@HFrLuj(eWMQ(Zlm6@U~B8BB{3 z0z*W`8e<$8G6qG(Ip?f%d07s3&OQ3%eHR`;V~Qd-2#Vq?5CIu5z=OhO4i69R)NKoh zZPqBXo5wacH#gIq(?nw(i3H&g4N7RNQG#S5jxp_IAV*8PCpXuV_jMXBp^*^95+Z5S z)G05fN`PQ9=WI@hn_F9xjmdmInoK6s>2&Y<_1&$lY~+X_U0{-pM3@`jlq0KYX{K<n zIJy?+bEB1uInV>clf#Yi%84HrE^{O2{IaTn01Zd4A$0jV0cJ`6$pQ*>n~UUa6wf{g zA!(5B{?&JmZrq%o-o1V8GPiVYdw6AkdFt$ir_Wya*vCKl+>id@`uiU&TNa@1QAK1a z%YiPv|G`gx@cm&)nSsXha&|~$#^^@>4^wXzqf2t-_nmVhBG+%J`s&tl_qEx#SF$-I zn;b5)XckDCu?)$!UJSu73_r-Q1p|f+8v^{|7aO(#8H4e|7_w&oFOX!91`;$J4LMW~ zmm%5Qn%(SXuXnFo_tyHYnHdr196v->HT$t~yDM*2W=6z0=l}byRsY_v|MEA#_1f3o z{IC&X>5mDKB`32rUOzrQ`q7V%O6(ro+kN=(@bCX;|NdL=?k?v)7@xm#<+&SQ`_?y~ z9vm#@O;XV%^&cVCWnCBL2Or#dcyCW7E*FgDW>K>C{Cho_&YBQYfcN-hisQkjU-_js zfB0r*svFNd_u%2-y*EF2^!VuQ_wKZvI<%$DP~yMycYf#I?xWX!`1aA!$-%*pIc#m7 z+nk*H{&!zrt49~MF8<*AA2vt3?fj^m9DeZ8;a&?Z*shl=DiIvaj?Ya-H?Ce94eQ0x zY<7I|?3Ig~;}I&%7tKdMeEYR;ynb@Hnkq5q*T4Op-~G)mf9l2O{^+Y;9c^x`k7{oH zAS)l;xd$O$-`XZ058wW9_x+!L_|tdWrqrj-NQ;@Xj&gD)Y7%gIAA}`D?|tyTW9BaU zE{2XnC$W(bNj<k;{@pKr@vnXHufG4ouYK?Pt9G@>sC5`KvN=j&ttE&b9~wVK?Dhx+ zVC|y}X&NKTGF65oE>m`nv=4z8RaC(EF$C~*4LIALD=4Z+!dVCqh)Q4)NdiVZBju?u zQ13qKPqNCrJqA#f(o9oKR9<7?^cRsRuBjPKiS3N3WRp%F>64deks!i!>Ond6Jd%h4 z84+LsB-eDYZM!@();eo#+olTz1VvzBJuCegn<F|vCmI*ab~q?9=ZrnQHc&-nWd%r6 z6rc%JD9lX8oPra2(=CGZl42D?6a|qefQbc^4(&;3k&@9W8lz7!9|96MReTGQbwHHT zm<fM!|Neu6C;K40T%P1PR<<y}Mr4%Jq#BeNl_p*}Kipo=Lom#12giQdhQ(?jC@Dvx zJ&eh!1`z}UnZ=z8>suQ&=8$LgauuH*&XCYrvevM*sT-=2T;b__n36rjq9ht5s6xxy zc$pA7W68k!S|uu)!m%O}qpAp4MCdvX3eFj8uvNj{uzM<{gyeqhpO947@jjF#<hk=c zi1@QnWKl6_e!)dZXC_%;vDV~y5n>FX>w{s4X<}C-x;!V7iVa4UM6{~QRkH%Ls+iOW ziJh0I;e>{aB{B>K2_s9M7g7$Q@49xu+=2?C(Niyr^ka;cC|4lSG>W8|t2y%k9+6K6 zuhQfo8Dq(0nCR<dEV&rPF6Il7zS+a4T+Uz6H)`)K6_TD2MoDa9tOYWF#$}GIEsDG- z@;u9Y=+ez~)@5bw>a9z+Ze6-|DOEYFL1W2~Fb6_)1~Mx#F6WC`2$4C0s*lyht1s1c zuKIC9O9TQiMkFF<0f47Z_wPS=Fq_T*khy&E<uC4Bw9N1eT$)~~s3L~IIehr=-gG)k zv)llt^Z6%V`GTR0CFVsnS)Uvn?60ql4)&jZ`2PFXu3Q=p&IR8--hD8iFA#~y`tY<G zU)tQxvdo0WE9$$CKI}+W92k_zoIkfc9OlP1g!RGYa&7U^1B|MG-cuyRQ{T>MVh}p- zc`j8|Wrng&n}rwOC)*y~-E~9{A02=%Uwr=BfASCh?f>o{{@%&%)8gE@y*J;Q-MQnZ zt4JmS86;y}Vd~An#^+vm(RVywG_j+>AScM%#T1DQ*gP+P^NX)ObFui#*Z=309f0)u zRZI4zo40p{Luou0g_vSKU0uEY%;x6ioj-Z);&^i7%I3h);obW!A_yQLFd|{$?AYa7 zqqSk4fAH={M+Yaf=}DH=lM53THO5#n;@jDDZje|}8D__e?X``oS8l9MV(w}~`Hz0| z&i<Xp@4vs>gfN{gOP6I}|JrYT<-hrF|LZ^flYjD;KX?lj=O;_<{I7rcE1$S^YyaNv zWNq!rg$qA^^U-{F&wx_>G|!4J+`9Vy{U>*ir(#eLSa7lOh_lVL`R$uGkE<tJ&p*Gp zHdq`VeD&);IoW^w#?SUXy!-UU8<*;};dg)Z&SW(F5C7iZzV~?lAOFd}I^3TE$KU+S zFI^hfZyC6>bK!;C&n%9P|M2(!`TW800LO#e?d0bjxYFcK38PAs$Q+`Nk-hiccab@8 z=)4cg4TqI@58{nRBdz*ZzVfNtfAg0&U%YasIePc4Hy0MXMK)R(1VTe*(RxGaRYhxT zpKGL3cwFzb0RWPOun+-ILS~ktRAVfXML{wss?6GS-Vg~OCrz>_a|A$TBx^Woo*PI6 zc>o27EFnY$2qE?`EQz3CNRUiYGYTk?T0<g<%3(rO;WM~`atzX&GQ?U(L@bQtY*C~( zYWgzA7|EfthNwTusPbtZR3)i`Q<h%<lti)ZnEEkVLrB7bIj}_SN$%;+DJTJ$BvkFX zC_-p#V)$_INT<>sNfXp5uVF=n6k?R7X>fg*Os<9~#0Y>KnaFUAtP0ktvUApDnTR<> zO!m!7Q56<vKtOy5L|`nbNK)#=7>RO11i%>MYPmv$<!T;$>k2d$bJCo$%F6n<tTP#v zt}fib5mtj$yL#|={^0)Zdga#FN7&%ZFA{S3jINbbh!lf^Kx9H}Kz#^)HlIz(qN-|+ zk=cY0&eE%_0wEB&;5|`|1YPUNn(0Y1YvOrR%$CQ9Vq9X~5TM2oQ=M3am54d|;Ik|< z&LRN|bL3PN5K&{`4AZ2l)><MHLX0sQlk88Ynm;5^B%&BOEd(Ml#h8PSBI2BN&Jq$w z>DpE#8e{T2C$wh@Qf4s*jG@S~TD1y<#wi#P0*r}H1&YpEW`-CQg!+`cimI`hwS{v< z*Dez9G}U#83?M0@C<+ph1u|r;v5;kDuuazmmI$iG5+GVjDXOJN3TVhAkQrHLz4tLj z1xV#c?GbY+kDOF6fM69eB!_5?bA7bIxh&7KJS*$MSX)&2a8OlMF`J&OR;#o^+k9jP z8=tuSY+0AqkP1^z4`JaT5^|@`$<h9?Xhc*Z?OHD~m~5;k<8h3qTun}k1u6g;@?E=s z@MQPV1L4?qUU;o22dOJ|>J#i43Mphp1_5|?_rY@6HcbP{-lNUV=fzMI0m-?t9uC*m z)=rKNhlA?z?(W|1qwUR6+s%&-_NUW%h=Ez2?zgXg=_*;*1yMjC-kt7u!YRG20k3Ud z7?yIN&DPe98yn|;cK4BWS>7Kc(o@%+mKh>w8XDmk0*ax?akXk&L9)(fXdNPgkyVtn z^$ig9tEpec$A?Fk*Ro%J_R^2ve7AE}h!hQo*&bc}hyUO|fAJI7|KRukk<F_hVcten zqO7op&1}`omI~Q(pZxUB$ehg63rd9M)6c$eb$v3*Y*gvQ&t?l|ogU5q;D7rU@4fR> zv3&0O)_gG=YrEnM(57y<LmKDh^OrBLk0uu{U-{;@z8S^3dSbII9Y&B00fl7)ffI)W zfnpa|vv6{>`uyjAJ$jwZkM2Eu0#bm45G7(R-lOV^w{NayCvW`drwT?es>1Yesov&V zUfH}b7!GZ<wzs;!V$7}4m4D@zUV85Kt*y5{G;e<J!SOWoTV-7?y2lR>K6m?*E8ZXG zC5q|1dGoy|xwEJdZ27yt_VRPL&RyRrS}niv+V}449Y-j{!^!@_w#}7m+b{oHzkxu6 zWqZ&aJ&=*^49&2Hsxa1o0Tz%X)eJuLyz~$Qi?qRa9D+!rv6aw543@kFHtG@o^e<n# z^~*1ex7KgnzO{Pijin(WK!dE}eV8@j;e!K^l!Eg++Z*faBUR-Dc!}z%?*S*<>ufqZ zK3R00Q`5v+v%bEzwY6QAPPL!Z4UxelPAam9hVJNSxoTSl%=2uyXojQpoeP(pP2N3K zz}7PW`5>wUfRW?T@yYaLs(@u#%x1H!sBS*<f^o{CMpZ;3YmB`I7XgK3@5%1L!PBk@ z))_KbWW|*mH;4Iv`m+{BX7Aac=>_kqv+414cAV~MIzDXeTo|txXi*SEMb*xi4KsC} zH^w5;bUHgZITYa-Ldryq*Ve}yWq;`iXw0(l2S+Euo>_>f>-@>dA(>v=EGk7&)}slY z%B53lGxY3ICPQHrpB@~{7mL)KR)oB+&uw2Ut5Wo15tOQ=5H<pG<kfsG5>n}(2+7%E zu!gp<mJ+iG5UsW6&YinIn>MSNa9A$cq8p6LvQ}v|H?me|8|!suNkzJ*SuW<@`=$-& z&kdxPY(i>+5*dJSs^0`3{b(>~ML<Gb<v_?N^{Da~eVcn9thFHoqV#N}Y>$S(!N*Po zZC2Lx;XEune)RAdVv8CL0f0xuJh!<ur`=mhda<r;^DHxD5KOaLt(v6>c<+fQb8a}S zQ@H5VZP05xvMkH84ADG2I8HZ8MVzyPL2aE)w^oFStctX4n`I*aA~f^a>ha@8sxiy# zWHK3#hk21RE1(*4_9Ijz5LuU(-74QdoPjooXbg@=YtChfD<CS+PlKxuj0)s()#Az1 zSqzIjb48Jl*T#94X`-1M3uz(`kOjy(AU9ofk9YS7JsBB|27_U3(IKIz8Uz5cHZ#T` zL0**BcV0mS`q{oT+XX<<XCM*D0c6HjV2Y|9ly#jKdFoi_MQJiS9MxrA7CDYawKX6Q zAgd}>@XWJDU-`r*E?vF|2nNynHm!%kQ6z#yW22=2U~-o?vF+NhSi}f%Z8AQqJi)mO z$^ZZ$07*naRKOW=HBCAas><}_1X!$r&a(snbc5me3`WDJIGEJoK|(?Zp*=c0h*4q; zq3f0_bNi)>F3XY$&1P9O7*=If6vd#fr$@){z5DK^OIsn#d}u_1N^Be7G+{KJAR(); z@_aS>aQajrO=dtTZhJIp+B-9ZPpx11?XP_K$6x((KuW={vuY2=giSCpgp>?#TVGZM zim(q|69jBkWdkzSl46)O{@;B2Cl4RqclkOl+nud*<0{|YUK<%R2V_O7ZfMtj=Zk;+ zx4-gb?z&aO5$tq!97C58mbqgeTvlGcdDHu_UJWj9Z+^H~Mg|1?xfeh4%Ja{}$B$n9 z%;%r~?C1XQ5C8Y?y#CV=T4WU;Z4`^mxBu$LRUZC}|MWllFaL)>h?x-uRQqdR{MD>m zJb(Slg=^1Wy?N`;zVWT)sw=WQ3gn#7Hi$^Mu{#^*4tE~~1ywCfMpWc>b8G8H(=1oZ z<-B7F3IZH;*#!;W8Tx~N{QvyPpML$P@4V{;P{}DtKwdU)z5e=mIK24GOP~JS7v8!1 z_~HFskl-ZVQhNO8(bWs<=P!KmAN`+y98IQ#3K~7X^1`Qc$kyxiu2owM^7Z`Tokzx? zLA9an+6Bb?Z~Vq9-~RFLfB$=bxTFm7QiL`5?ZM!s+s_^!9PB=7EEdNP<Cr$akgsJ` zX`Mz9P8=rgx-P`%y^j)O3~dOWV=Hkb!K(z+j(COKkpzR_Bp;Oj`rF@m?rSf+`kBu> zc(S+RsMaYcuo4>Q90E?KUFbSOKoo1|gF%({=@yMh0-*N8KpZ);o}4txRp`2q7n!vb z#gz5fWkumq(=;Kd^i(DWKJsk7I6OLOyBGpnvg5U|zOilcWb;uZ5>X#n!EicFsm`X; zJNNFbmP-|JSvFqZxNzxaQG*I-QooCKK7xdFI8ea0Y43b==kV~@S+ll29t=jCI~VGa zpzV*iD%y5|Ahk(}Sx%-WZ~WvZ&2m`}2F}?m%c^=X7;p9{Y87D)K6*rEN#XvsZQp$J zt;Kvc7}SZ!c~Nw2^SmK4L}XHm3Xu#7<#}eU712izA2&&>VT_7yZ*OPCAS(+1RY;3; z*R);R`Q)%`n&$oY-`_tt7_Y54>lA5YduzPmo3;T^qS6@X)0e8C;%v5zyubgHgBRtr z@Rx&fBP;S^pvo!?<kE>SgwQmr5Ii9Yz{#R1^K4KKEs*dm2CuPTG9mc+d^H{pi=taK zU0zlua|aJ*3BPzs22E_%RE>wxs2m!-y0P`+w|A?9X70oOY-u`8=uJLlE`ofFn}`t? zi%_jsfEKN~EPJ$f{Ae#45Yp&?hqVQXo0~&3tgJP{DiED9hD`7whF}dL!EClVIa#!w z7h!9tuFJBlocl$TEXEi^h(%E-Xw&lUqob~Etwn3dI=Fc0{3sjr#sw7xu*Sp~MKsUz zB{iLot7S_B-iNk(EGp;DowHU6&={A}zzLd)h(s<%oXtYBoDy-C5dyiqa7LLU8clyl z6htJ?vlv1Un$N|zUUX5F85%d46d;;e3#TAXJ*6X)&Bzszv2D66$H=qR`>pM*%mSe~ zg~Rsu**R-Z<8Y*^iljiI29%I28jHpn%BymWw#bKTgSGKwbJIF&oXzsAs!QW+Sr#rc zd2U9-(h%5kq$+LekB;UOQ@r}>tAk->l0?j4f^|dyV@Mf|wWx+{HCo>mJlT7?m@o0S z|HiN8nf*nQ>Zz@Z5XhJeF?!FfkE*8gI-ACeS2ycHop_s|ea$NsmRM3aKu)H!w(S7% z$&>x%qMOa#Z~o48>nLUL5h%}!_4P@f=XG5<=kDIQ^Zt7~o125K^#BB5XS4aLGv%Nz z3bSfiL5}7pC(<bj#|U7zsM;C~?!C9KP`r5M8OyR<EUc~a%sS^p1bSgRDYU7uMoJ1A zn5pxLZNMQg0%Bszv8ejscMrnR(eVq<TtAr3G+TV*FJFJ@Q&*y>fRJ^iD=uza{_H1T zafYVLHqVDU=dV3^y5F^-L+0QJpw5fq<CAZG<6D3CKlq)kbKCm<`yj@E{p-K=J7%%_ z$zS^Imp}jO9l3eqk55*L${|=JCuk&m_xo@C_HTUNS!*bT;&5E8|I(*kUEKfqcx~tN zU;6Fu{on_fRkJ5gnk+c$igJW#6i|eJ>#zT{dwY9tKYEA?2F-Xh84fo8#^3xqv+2C+ z!m^DKOcxlGV~DM1OU@bd<aoBfm@ipGX)+w$x_<ro*7nt%;b>4SeDyc~?%z9}EiYfW z_U0QuQ4t^G8*jdM<I3hMFFt#IV|`MX)~hIFWG?TV|J+M2t)4s@7Dc4NfBg6VtDnF3 z&R759FJov3*$MxD|MGhWk1t=kcKO}+?{rFRoJNld&+c4&`S$JAw0Zs8Z;waMtyM+d zm<#2kB9{RvM`7;TF3l=N=EyOGzSrwfTaB%9>nK>)ieCl4LTNRz`D8E{59{@R{;$4< z)}AygFh&%VB`NL)b)Bu41sBWKIa3w6vsoIFAs|(aA|&d4C#Oz;yeyFnGe-dojAU1h z_aPvXhyo^ie3!QN*z3fF1-zH(bTyl=#%pWE001ojCH!?t(kGovIunaXJ*ZK2He19P zHzpfx(<Rquue=3_F?w$?*%{HK5^?g{g%G<oSlf18IMeZ>rdl_*5R=9=Nz3PpMYC8M zV}+fF%;)nh4v-uwX!&%DaH`n>=bRzab)JyYwJsL(<zkUd#z+Ry0<a;2fX0}rtcXZe z7R%NB`*%m9VO|u@nWk-HjCpTc5Fw3`my6{Ya5CX4VvODgM6wor+bkDzvI8`j=b5VM z=Uxd_01;VXwQLR!cJs2xU2Y92>A-ij^mZ3DJ(H4ST+HVptPllQRUbV)4w2XE%tef9 zvcj&f4>mWiot(^Pt#DSo`|j@U{xYmW(|I%ol_4=wkmR(Y3Fsypn^Zb)3b2KbI&a#e z{o_(`vl<!&gOr3NDF>XSVMeU)q&sS6>{n4wW-I2X%nF(rtQ>CSg%7-#Evhm<Z9n%O z8t=WRI_Hcrsx+OhMA>FegEnoqYTKF$N>No+Q8mUiU0aj|A{BX=<;8rlL^J>@%Cp&g zeSHm)B1``;ilj_|A*YCCS&^~K5mXd)zE})Lqg3`w&$%-u(aI7?Co3xJ>JUy80t?LM zO;I%!IqUT7aZ1c40JJtM%E}h?@$n&|hOi=gj6~zLiLej~7)nOev}_w|%ev01!D2Dz zHU<VHyIOgd4;2$mfO=90AOPAVuu?z;i(mi@nF4KQY@U~;p=>ysWJQ(LqiStD+1lLL z+#J+3gBUVJk&VV9Yl#S*C2LKdWtXo$*Q2~ds;aK*L6##SP_%{&voJ?Ps44(CAqdCy zb2rz|-C*Whw;Kg><?5Ambv*^X-zy=KwYET1mM~hodObUL_4=ot9!wF7^A|4LEY+V; zR5+duxgnt=v<fatb>;et08rHzy3Pm|=eEwBnQufD(F}&;^XD(D=Ch4+8~5(see12C zz3{?qh2qkc>kl681(4xd>GBLH8Mb-aEV|@GLLk)}!*eCX-J_$6lgkCr&wl!o)vC!d zB2yBOwVAjcQAQkveVR~6upCap8A^J}USA6Ru)bQGsVU$2@M*KsYtO8!6mR_O!&a1x zMKZAqYt{NEU-|?B3<mZ23pYJW^ZoDpmXSlWGOEigFQ)U=x4!+uwe|W3Km90ykczw< zR`oEOJooY|#bEOGPv3s|mCt|s+u!SagF+I#5Y>ZPV)x<QyB|J!h|Z;e{OxCMwafX= z_SUW2FMoJv_piS9#>GolAKZUn)rP2|cq%`q!~Ns8e)cW`Apt5~x^(&3n=f6waN+Z> zPX73h|8-dntgBjFM(#va6m6E}MYd|V9@Ixo7eUZaGoOFv*T4M2t*v_x9$mZm*`4zj z-+cSEwedM;a|8my)hZn9Pw(CNXk)QvkpVFS+8hji^Ot{lyS7iMqq=(G)!*8=bmeF7 zepC-OX49vj9jH7#j(_!oM=!N_`O>92`>0h>z&z?pH?D6~`A2WRN9|yJYeGw3x0<0d z0vvt9j<#)^O3tj}qi<r@aSW&}$IgK6Y{Fo;wX=Qy{=K97A9(~OAXMat4tF-TA3fUJ zeR6a(U-}SOjT(al%p84~&sOurN)$rijyly*|B@=CjCf|9wa)vHGKGb6#*z;WM~NXK zLS9$}^pSzsAUd+Dr~<+usgzB&s)oic11}V*X+zTmAEc1pP@k*`Rw#r-pdmz478QVD zR$;ST2B6RdmNd=ObMPU7(EDgC5~69Eb~amzaOWd4bgfSw$A0F7A;gd-hXD!6WLY5$ zk-6)-vu}DDrzPrz+(n+(Ri@0d%pgFPWpzDh+xyA52Y{>Ps$Dg-nRIYxI0$jpIhPTc zs;sK2vSdSGq8KAD77h0jy(F^Z#34@ux7J$cthF{oUM^QD@Y^<>Z#o&oWQsa--}Ll( z0Bf9cc??V@sDL#TL7AC_&FO(Neen&UNbHB(Qr7_JV7gi~Z5CIB8%3b2*RBkzBFpo# zl@^BYe6auRAN?GBJeO75#n2c~24jpdq<tIF938Iy;xFHRJX-`?JUW<87i||qk~y!b zI_wJsN;XPNf^#6lEX(C8v@{ET;bRa65kyLJ?M0D+uy14MQup^`c2)oA#Mr4CGI^eN zUSjk%inRt%R?DWyGjx>1_Xwn*A%v7#vAG!zM+XOofupEFjNXT?3wfRifH_q!5m5+C znYGr`!<rSm57rr@<bCwsmw?8Ygl+3jSOCTt$g->`vb<<ICPJ3z+Ay6ji+W_Nfzw$& zJVnhLYpbf7OePN>K0pO)V7clRi)OS=##u^z6C^|w0U<Hg)PsS|^1y0<#LJXhH1ldO zF;=WYB2)opB~lTwtd5XaAw6JZ3!B$jUE8v9c|ICVs(M`3!{Pc`F{n4Tx7OF!owbQg zljm8U7kQpJOKC{q^cf{20wiP57^IX<GHEy=DYOmr<Bmp*xU5d=&E#AU)=OLxIpwse zB(Eg)laVGbhh;rNRouEj3DVn>Kvd4S)4iJ0Au2GycyeVhx&VN;pSP?82!@O>0xE(E z3ji6HtxwLaO(rL^Sv{;DJ>0!`@y2IA_vP`qt#cQj|K#V0th3IpRxuf#j+XNdL`6`P z1TU{`sx<FCeRBEcmsYD|SWXqRZ5vk3tTRM_Kt$F$$$Ekqt0ZG(jHf$RNKT$!X`NW) zswN0cmrd^MjT_fj%cFO{dtZ$MP>vzTY%r*XYjw(ycn^zJ+*rS`*LV>L5t`NuP(COh zAD#S9zyC+~j~li*0SwAIhKPXm`WB!;TTV8wZe6(c<ncYQrc+kt$;O1+l`E?E@7?br z1DP_<NV>Zp{QT0VUS2NRj~>0dKG_5qWHv{Q!a|fvDaZof{mzd*Jlani9U@$<Rw7c@ zCeQ7BzE~|<M|oWhm?gBJ-djV1(WtD8;jnnHzb}BTZx{3VxpNzJRf5v(7heh?jE6&E z1SLSr+IE3Yrt@NW?X$1G@=yQl+vw3Kym<ZEwVkz0=YQ*O{o0*-CpTXCl&bFS9oE%& zc6@+f2qUZQxb)ua)K#7tXr#9GnXSpSjg3h;IKp8)8808~cTZ0WFA|~;-iN>(+qUHx z1INz$PP~`6k{E%-h!n<Mx%TSc{&xpk7w>)W(VfGirLn7ar4aL+@*G0&1gb2@v+2Rn zNf)9TO5j`|oy`|!vDlal3DG(N;k?KY2^5S;FFd9t!FwNLmjD-oy4pFPAyEu$of!`6 zx~k3+AfNz5#@Y}fqCrwJP!wfd59)y*jMqcpyr{GXOp=^UVJ2pMIt{oI$&A*v)*4_2 z78y-;5M7Tu0#QxgBLjW96#>y@c~K6x&*#?Krs;}u2xI}3KnVeq0f{3+?oz=}0i4UW zcg{~w3IKG@8AHzHB5Dm1L=^?X)pC*9DtERl@?*jx&v$lq9`8Nry4F}%kH*gBMd307 zgfYQDI5H6phXWRI&KhItvd)W|H3FbDj#;#~dMG3^G4`r<GK7f6xWRB#)pZC_6jd-r z5JroJ06-ap`BdPMa6d%WWu<dfyILA2d7hihAX)^gfT}FQ#ux;R9FkZ!HIkDxCIs%f zj)Zl0c6hRU=gz`+9*t?E%$D-t$#LXBkxO!{N<D+YoN1Q;OuLjfetLI5gcVZ6-sEEp z1%)<-Dog9N5fYTMfLY3wn^Xu%hv_6+FoYI@_$XN}2wf+u<tiJG5J{B{k%|gY+qHR7 zAYxu*U5IV7$}&?`WsJQA$dHr7u3|wjgt%O+vMkSY=bTBz)*{cXh52HcmPG7v86YB} z5JR-qx-2WovM8z$ymgtiCeJGcO79Ey8emF#Oi(q(WG<@)14-k&d9IiNIb$rQ?hk%! zwq|A|G|mi%gT!0R9TZhDT02L^As`wwhE5B$%&f+cwQg-~?eL%mjn<hwccan7+9EYW z6eO}bw5*^i7ENJ{Gsd_)cQ(tbx)_Ww&#KY5tcQboG#IW8$7^L(*K6bP+S+(DV&*h* zR+SYI8iT#-8v#JmY7G6r7$k5YKw{u=|5$uX$n2%fsc1t))?$px49R%W7n6IeDE5?1 zKqA|Z{GEEx63<0XrzfDF@J*B3n&fmyF8v#4%xS4jkf5i}0y<X=hHD#}JG0q*Hk~dP zs|OGEZaur2oUdwU(U^1z-UlG{7#|+&DIqfupaj_&t#y8N=Wzc?d~-Cugb(k{XA4ox zx@<5Q<XMJ5ih@Yix?n<NPA5f?B(qc&B||Cy6+)Nd5`czTLKLz_5x)P!pY9*-9d~iX z%nE2oNgqCW{Pn+h{VQMj%nx6GbLaA{r_*UwkF%_7eV0TyU5w<ih_H9E>d<hC)`32G z^7QJht+4VgM?ie@t@noG?Zy0LP@3cYC+d9+VYOTwFY<d&4!l|xo{Yy`w=g(4f8px( zrCTq5Zs-5~7k{?*cuwTTqhZgb17#5;6QUxSQxF?A?ef8+yFYp3owweySy3-mZB>ug z#!f>vJ37D^5FmPARr%3$)(Hz4RXn%7wQ8E3XI}AY@*>Z&?31s&{O4bPZE|ks=-_b- z(L-1PJbUY!A#8oLR7&V>T;4c%_}*t;{I!cOJ?F!_qtQSCin3@!@PQpEi-M{e7)^@B zavs`HLiWu1<`-_<9C^2V*zr@EKRME6a4Z~R2wl@QF^ySq=t2k~w&Ir(I^_UdZ&WXS z`o{XDa}VO^^6lpy?Hxbb-Rn4-EaOJI7)2m=jyW`~M=+|uB4_#0w2(1}^-(o>?z%H3 zEgXh0b4Wy>VgSpcG{&Gp?(&{ADdy7U3ka5sRRA)^Ip>^9bDO5$H(CUA&M~u72Y?Dx z57(~W0_O@OgT_|%z`25KL5LxEXAJ;lnPtw2&>#@uXFj{ef@u)cSd*6}8Jh-_MI(xd zF$w{I8e_|<zI^4{)vMRj5}rg6d0rG%on@s6^o)My7y@(5GPkj@u{l}0dGn^TMpaKv zPC^KS(Ws~f*5s-^w%7YM24{0y7TMZ(G+7&7IDh`jU;3hg+9We3%8DGx0@~H83qBI{ z%tcTgkH<xxPbQPkf8o`(>yXeIyXsm1ur610s!3PH{qzPX061%J-n_ZBeZK8{@G;8^ z<MOH=5E&F@?*nqGbn59qtIM*T3zrAOwHRAKbS}&CqN)dmoC*t=5JCtYGuMN9dwYBT zX$;*m5zd)oqKx<upN6=9B0qn)kiM7-n)C;t0MdytL9Uc`@o0=jP*e~AO7wpb?a!Ra z%;Y(wnm>S8qHqS$g!Ca26eWXz(3^@B0Hk#K!ZR1fl|zxt89*+p3W*@~G5fJs>;h*6 z8f)q*fByE>rVV*vGi#Y+QMfG25y{$qsY~&*)F98Y?A+$~S-okDv6c*h%WRexfJCJI zaUH1_{{Yy`l~wh^OD{C5l?XfMiXwBlb1p|B5k|tufy5vQ_bx)%IlnVr`?4WX4Mb#} zG1d@S5kZm|0}%pH+jY)bKpIche)U(sj3@w1gqd?dph;GpxMPT_YKV$Fx7KWJZmz8j z5ye@<F{U$U%EYFGn@UUwQtQe!lQ~xuWmVO6otITnSJh}(4~ErXSX6_u9#w;3T@MGt z(PT2Q*0yb<%0y%>ndC7dJd+Ha(Xmsy-x(Bv5Hy4+zu@rt1*4NnJatDHVx}xJDb^K2 z4BqQmKs*)Tdi@h=KXi}`*=n-hTN7hsjw(I+BAp+B=yW@efFLReNfZT=9EuXs__xdQ z$;P?q$<b_nax$Aee)9OvhaYX7zc|{M5F~VWVr)sv-QDTaPEvPFt=Myea^4(FV>dt8 zeP@5}_Kv&A9C_I^EV90~X2_gI#nBjx7!v9>DcC{`vHzcG*Djo6&8$UA$t5B}1VR1q z!2=I6SN4das=`4-1pj~hU;p<{e)`V6`wyRc;bmj;)hbw<DFPaFWhRJ=RXbfSPGXFP zL=}mqi}`eMvg{^z-oJPAmCeDRzJBwTaRzv4p|uiY*DdF>tSEM$9<RVD0V2(p3kc!G z+b>NnUb}MZMij{MeB<2a<lNTw#!!@jfH|rHi%Rm!^_DLVzH7Sa*T3<#@o4)CU;LHx zckkCl9#>CRM~g*_84&^=?eEX4@^CeeM4)JG)-?XkM<0p*^muL9EEnZy`{?LoFc@9C zeyeF_2AUl0+Q1w>-Mjzbej7<ZfpEE;4F<*2$4|6rtW#%sKAnH?;rq;-Wu=A2#Aqe% z><n+*IRE-jJ}lX8m!s$E&F4lJ^rU_7J9pzONXHVHBYWS4=)Lbk@R6CBSD|YqtR${D zcncoF+WO=ZpMCZ-zxjo?KREc{(cPzeOJ~h^JZ_uGVs#uih(?iERmE!6bRiO%q#>3w zs~Lc@xZLFyGHVe4)Fu^js-n51g;Et3L#A-Kh>9U=QyAZ+<CC=+oPHFXb<SFsu#t(s zk*x7#vfKa?ktO4RoUysFS!#b7`dC?uNLf~-(%)cMCgN;DbQx>mw49vYj~Ii3h_E3; zlxJCyS&N7qV_9L^BG`1D@Ub^0a1@S|#NL!4fHmZtbuJUpqO6RuqAI7<Vw?17L`6}o zt&L;w)+AAMsuQTNR&`C*_z+_V*5)oXcto7F8<WX$wW?!4#27hvPtJuHnzj>B1!B<{ zImRBrZ-}a@0z%_5mz5zhD}dT$l#(cdK{NsxGzJv=Lxn0Co0oM~6seJnr#)JZfFw~n z)h?|IbyZ!zal<*<+kFsxBa(nhDl7sTdOt<42GR5-O#1@DhCL$?Su%nu$VA49L`@FI zWHm_2pmZ=-RhEP~OHY;~qs)SshUAHC5?d#EprRs3ZsTu!>6PtCtrD#<r_Y8^kD!uN z<uZnhvBDs%*3z|W=S4I|K9%71+O9K)v@wK8s@ilNAPh%ERi95$ku=cL!^Mb@EFz^u zu>$xI03v`6hIL)nXMP=pe%LV4xkWgYhXaIEm8t70&mBtu2}GxzgM>Lu>UV<xBuFBx z!c|o|N2sE}r+wnSi7P$nyyuN18Ag_8Xh0<*0$Bu5GHK*YL^MV1lsSsn(bi5@7RK3n zP}g-eUSBWEvKkEP!N_IVU^LG1vMh%#&(|lDx*iBeRhLe-gkX|mDB+#bmmy_ri9`e~ zao^4D|Iv@VgnH(6A|>rNSYj+?&URiC{VpNM(*X1@%w%a|nI&a7O79y_%fI*C$3I0_ zn287yf~wc5fHEqo%d*om2TP1;)`SoT^<c8Gad5D|xw#p<y#K*F+vhLbD)OqX!CGsL zg2WI`R>zN<DWifYvkuj**V)1DQ^9iNCePpc#5dpkXFwDs%ohvmT<v{c<f#LP2xP1= z7Qn}lWXT$%gct#llvz4v%M6Gn3X6(!#uyt#JnBlMRo0Y>6h#Y9j~*eKH-7fRs>)w` z?O(QwRg6uDt#M>BQleGY`snwUGfweR00dYxv-duFe_YV+-c&cXZ`{24`WtU^>{iXH zb~2yOWAsFTd4B)l6A#JAE7QfSG5OucdwVByxW6|ZPY(7E7mKNLZdlbOH>-Bl6J68q zDXqQ;QKacwfUsO1MK9m_=GV(CTVJaoU)w$2<u0h_H2ZM0S}Y|pAb=h(7jNIaZ@c#8 zPh7cr?MjrxR;xe%H{W4`y{CIbFsSR&@@U}pj#oc=`-8a}K@p{Q?mm$V+ue76@X8C< zw>CHT?)>Pr*Pq_KbAK=xtPjd|dC(l~z5MLuUwZNK{G|Edrw^VRU)(I$FVM)$SXU5Y zr!3L?w(}fgh#`b7#t>rcqHm&aL00Npkd>7sipPMf<J-UT`RvNh3*+^}*FJjVU~f7- zVGg1~#u`F{FkT-Fhoilx2VNjDr{4vfk&B6}bqJ^;zUxx`$RzkPCb0xqA~DJ=iOmi` za#~p87>%_Ez#$rAp!c`*N#Z_N6Jk%{(9|DAK$b{Aq`=ryWi^F!tTi#j7-PCZMoj&q zq|!q&9Ah8E07~%Z)1Rx6qlzMdaAH;?0BB$U^cbyk=`~I3rLnmxB;KtdFof2at_w+) z-gTacBTL|vxX~gr&JbZ11Gi1*L+6~c)*?bu61Clm(Pmk`YPz<Kky({lLY6s1^dYWR zZP#_FP#0oImO&Ba$SfR16E8wUOtMHL##3dXF@%bNRg>d3xe|~-5rhzvYdrP7`ciOe z?DknoQ6-^Mg)Xo%03sAcv2*?+0zBS*&^3z`jA7xvQ4C6$5{=qpHj`^a5u8zLgp=ap z%(&W%&r#6=pqy645mD7SSCj>*0cJ~vfvKNrlU^pFNCXz3G@z&k!gIGTom(%M1E?q= z$7oGLl&Abs|2IW6A+SiBEL~`jB@&^k7$SwUt!57fOZni)5&*mv82|tv07*naRK;6o z4H;GC$fu9YnbLqjQ-#~0Ay(neCr-K{=TAKaJqEn@pY=oOY1}??Fl3E2%1mTL7|5hg zRKIwEq?@Lvn-o^CWO`>afJ!{=Z|bStMG_Q;5Tl5yI%~;TBT2?4DNmcyO$yLMyATq$ z&Te13R#mlirmm~Open1PEX%U2vaBeIBCqPasGQ5Qq8yC|Wobh|G-)Q10fbP_n(qLF zU<8GL6fK;2?*;l;Py&#$^gFoz0WlG{N0<Wv2p|}PF`jWj1bT=goQ*~&ArvMyEs;T+ zGOZy51V}F%2#BQhTh5fpL;$3S1Zq+fLP142#Hhlc!W<D{G#*bTlMsUU^5FjCH-7Sy z!P?s8>(>ntU^+(Yba6D3jzO6j6)songR=b5lf4TUZ+&v-l~Lw>2&psXy<e<W<IyOG zqL-;8&kGR}0U-xTSwt291SM1z=EzKFdW{_*2mmX4jUE^bF({@zo`KdcpC0al#9#m9 zul?~q`=_z%5TbRc;7mqQrD-}L4Jv8~5$m#EELTAEo!9?rdVF}}@~uyN{!4mq_q*Tw z?g#I`6Pm@Wo1ZLBs<P~SH$6F6f$-_uAPOCax8MEwpZ@t*U%35A5q$G!Z-j0|z(*%X zZD^~i992b9oN7`PVfw1;Y%zbl_c(Jyf}<x-A7`1{o(!Ow?;Y&V+Xe{?*$$<NK0UAs z>LnaC@#lNypa1#yzVz8<srP^I&K?$Phet<8M+c@K&dZ{q@Bi%H+Yb)|8c;9<@7#Sj zpD!;BitqpE&ENX1UwL%@ov;1t?<`_Io6axnoD-iv_wqBp`nen2v_Jj+J6o`|v#~RA zgMrO;-Wi4%rES_6f)8F*eCR^(p1BFFm$=f{AU7Zjk{QN^w9&Yn&7M4YI@%dS=n7gL zKE1!Yw?Chs93CFV7?5OrGPrnQXVv<H*|I8YV;vD1Yhv#&B}B-q5$5PU5eg)oUra(6 zP*6fDOKTIpATTGwm{kN}0mR6W&;pRPNg76|!cK`y=CT+##<t(T6B9W=K{iA{#)w8$ zPu7t_`fyl7AlSsfF`3)@RsxbmW=!5gBgs3Ch)uK7JhMd1vGXAbSFvv_0ucd{Dv&X) z_k>1M!y?(8MOq)arcJ;pI+Y70*krQ)rBxpQyh~{!TDI-M@o^gBwbu0YC7=+ZwaauS z4!!w^iD2^_0OIsyc659kqX483twLW>)W|*2lBM^*mZfEpw)4JAH7ZTukyEj6nm%FZ zKMj(w`;y|8a_XX2=}Gy(Nu&vy4iEr<HrWZ0i=y1v+yao@2Y1`H>s`717EK|EK~xDo z1`8OXYB*F&BFXMU#u#Rsc)==Q3^_nTL1X(h*xI_T3>oSdh-l6hJ3UL*h;#Pxc*Ew# zW#BAdytvV}t#Wk6a7<vKzWT~B#W^8H4gmqtD(0Cp2HUQS%!$%!OrHiy7)v#zknsGh z2xXBwo5jc+LyU4Zd_ZJX6(}Mn5jBZ25|AP5G63wnXO3wxr2cLR5<$}0p&`Q5)h065 z*e<f1IZ97eT?k2Ubvk{c3V_Z!>um78AIby8^q=$|Eg{4x3a7_GGKP#1K0}Y{sf7=r z$9<;J^t5jSd-dkcJkN?EGse_ak!P+biY&{lbvDZqY9q_?s;<k@SPLwaIVTvI`vnzL z5Rd?sK>^8F7SIIZAOeBDCawJ%EF4eytEpFOHO<b0Wz@`M>CZDO5<&!yQ6;8Ia&ii? zBm;~gV^X#@r!<Flil~O3j;8$*n+{{BNGeFi0@~EKNZns%PWP8%0ALj{#_a6usA}7G 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 LNkvXXu0mjf5z!Jg -- GitLab