From f3645d16acbb9b253ba1bc77a599f9d0fb2a10e4 Mon Sep 17 00:00:00 2001 From: Frank Voorburg Date: Fri, 29 Apr 2016 11:22:48 +0000 Subject: [PATCH] - Added support for the STM32 Cortex M0 family of microcontrollers. - Added demo for the STM32F0-Discovery board (STM32F051R8) that builds with GCC for ARM. git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@135 5dc33758-31d5-4daf-9ae8-b24bf3d40d73 --- Host/openblt_uart.ini | 2 +- .../Boot/bin/openblt_stm32f051.elf | Bin 0 -> 472672 bytes .../Boot/bin/openblt_stm32f051.map | 4441 +++++++++++ .../Boot/bin/openblt_stm32f051.srec | 381 + .../Boot/blt_conf.h | 153 + .../Boot/boot.dox | 7 + .../Boot/hooks.c | 299 + .../Boot/ide/stm32f0.depend | 717 ++ .../Boot/ide/stm32f0.ebp | 381 + .../Boot/ide/stm32f0.elay | 124 + .../Boot/led.c | 105 + .../Boot/led.h | 45 + .../Boot/lib/SPL/inc/stm32f0xx_adc.h | 450 ++ .../Boot/lib/SPL/inc/stm32f0xx_can.h | 643 ++ .../Boot/lib/SPL/inc/stm32f0xx_cec.h | 300 + .../Boot/lib/SPL/inc/stm32f0xx_comp.h | 245 + .../Boot/lib/SPL/inc/stm32f0xx_crc.h | 122 + .../Boot/lib/SPL/inc/stm32f0xx_crs.h | 183 + .../Boot/lib/SPL/inc/stm32f0xx_dac.h | 312 + .../Boot/lib/SPL/inc/stm32f0xx_dbgmcu.h | 107 + .../Boot/lib/SPL/inc/stm32f0xx_dma.h | 377 + .../Boot/lib/SPL/inc/stm32f0xx_exti.h | 216 + .../Boot/lib/SPL/inc/stm32f0xx_flash.h | 430 + .../Boot/lib/SPL/inc/stm32f0xx_gpio.h | 358 + .../Boot/lib/SPL/inc/stm32f0xx_i2c.h | 478 ++ .../Boot/lib/SPL/inc/stm32f0xx_iwdg.h | 140 + .../Boot/lib/SPL/inc/stm32f0xx_misc.h | 143 + .../Boot/lib/SPL/inc/stm32f0xx_pwr.h | 197 + .../Boot/lib/SPL/inc/stm32f0xx_rcc.h | 608 ++ .../Boot/lib/SPL/inc/stm32f0xx_rtc.h | 807 ++ .../Boot/lib/SPL/inc/stm32f0xx_spi.h | 588 ++ .../Boot/lib/SPL/inc/stm32f0xx_syscfg.h | 262 + .../Boot/lib/SPL/inc/stm32f0xx_tim.h | 1186 +++ .../Boot/lib/SPL/inc/stm32f0xx_usart.h | 599 ++ .../Boot/lib/SPL/inc/stm32f0xx_wwdg.h | 109 + .../Boot/lib/SPL/src/stm32f0xx_adc.c | 1240 +++ .../Boot/lib/SPL/src/stm32f0xx_can.c | 1631 ++++ .../Boot/lib/SPL/src/stm32f0xx_cec.c | 607 ++ .../Boot/lib/SPL/src/stm32f0xx_comp.c | 408 + .../Boot/lib/SPL/src/stm32f0xx_crc.c | 361 + .../Boot/lib/SPL/src/stm32f0xx_crs.c | 466 ++ .../Boot/lib/SPL/src/stm32f0xx_dac.c | 692 ++ .../Boot/lib/SPL/src/stm32f0xx_dbgmcu.c | 218 + .../Boot/lib/SPL/src/stm32f0xx_dma.c | 705 ++ .../Boot/lib/SPL/src/stm32f0xx_exti.c | 314 + .../Boot/lib/SPL/src/stm32f0xx_flash.c | 1256 +++ .../Boot/lib/SPL/src/stm32f0xx_gpio.c | 540 ++ .../Boot/lib/SPL/src/stm32f0xx_i2c.c | 1585 ++++ .../Boot/lib/SPL/src/stm32f0xx_iwdg.c | 293 + .../Boot/lib/SPL/src/stm32f0xx_misc.c | 167 + .../Boot/lib/SPL/src/stm32f0xx_pwr.c | 566 ++ .../Boot/lib/SPL/src/stm32f0xx_rcc.c | 1741 ++++ .../Boot/lib/SPL/src/stm32f0xx_rtc.c | 2518 ++++++ .../Boot/lib/SPL/src/stm32f0xx_spi.c | 1334 ++++ .../Boot/lib/SPL/src/stm32f0xx_syscfg.c | 320 + .../Boot/lib/SPL/src/stm32f0xx_tim.c | 3349 ++++++++ .../Boot/lib/SPL/src/stm32f0xx_usart.c | 2096 +++++ .../Boot/lib/SPL/src/stm32f0xx_wwdg.c | 303 + .../Boot/lib/cmsis/arm_common_tables.h | 35 + .../Boot/lib/cmsis/arm_math.h | 7051 +++++++++++++++++ .../Boot/lib/cmsis/core_cm0.h | 665 ++ .../Boot/lib/cmsis/core_cmFunc.h | 609 ++ .../Boot/lib/cmsis/core_cmInstr.h | 585 ++ .../Boot/lib/stm32f0xx.h | 5111 ++++++++++++ .../Boot/lib/stm32f0xx_conf.h | 83 + .../Boot/lib/system_stm32f0xx.c | 383 + .../Boot/lib/system_stm32f0xx.h | 104 + .../Boot/main.c | 117 + .../Prog/bin/demoprog_stm32f051.elf | Bin 0 -> 383423 bytes .../Prog/bin/demoprog_stm32f051.map | 3680 +++++++++ .../Prog/bin/demoprog_stm32f051.srec | 264 + .../Prog/boot.c | 208 + .../Prog/boot.h | 45 + .../Prog/header.h | 47 + .../Prog/ide/stm32f0.depend | 942 +++ .../Prog/ide/stm32f0.ebp | 305 + .../Prog/ide/stm32f0.elay | 79 + .../Prog/led.c | 108 + .../Prog/led.h | 44 + .../Prog/lib/SPL/inc/stm32f0xx_adc.h | 450 ++ .../Prog/lib/SPL/inc/stm32f0xx_can.h | 643 ++ .../Prog/lib/SPL/inc/stm32f0xx_cec.h | 300 + .../Prog/lib/SPL/inc/stm32f0xx_comp.h | 245 + .../Prog/lib/SPL/inc/stm32f0xx_crc.h | 122 + .../Prog/lib/SPL/inc/stm32f0xx_crs.h | 183 + .../Prog/lib/SPL/inc/stm32f0xx_dac.h | 312 + .../Prog/lib/SPL/inc/stm32f0xx_dbgmcu.h | 107 + .../Prog/lib/SPL/inc/stm32f0xx_dma.h | 377 + .../Prog/lib/SPL/inc/stm32f0xx_exti.h | 216 + .../Prog/lib/SPL/inc/stm32f0xx_flash.h | 430 + .../Prog/lib/SPL/inc/stm32f0xx_gpio.h | 358 + .../Prog/lib/SPL/inc/stm32f0xx_i2c.h | 478 ++ .../Prog/lib/SPL/inc/stm32f0xx_iwdg.h | 140 + .../Prog/lib/SPL/inc/stm32f0xx_misc.h | 143 + .../Prog/lib/SPL/inc/stm32f0xx_pwr.h | 197 + .../Prog/lib/SPL/inc/stm32f0xx_rcc.h | 608 ++ .../Prog/lib/SPL/inc/stm32f0xx_rtc.h | 807 ++ .../Prog/lib/SPL/inc/stm32f0xx_spi.h | 588 ++ .../Prog/lib/SPL/inc/stm32f0xx_syscfg.h | 262 + .../Prog/lib/SPL/inc/stm32f0xx_tim.h | 1186 +++ .../Prog/lib/SPL/inc/stm32f0xx_usart.h | 599 ++ .../Prog/lib/SPL/inc/stm32f0xx_wwdg.h | 109 + .../Prog/lib/SPL/src/stm32f0xx_adc.c | 1240 +++ .../Prog/lib/SPL/src/stm32f0xx_can.c | 1631 ++++ .../Prog/lib/SPL/src/stm32f0xx_cec.c | 607 ++ .../Prog/lib/SPL/src/stm32f0xx_comp.c | 408 + .../Prog/lib/SPL/src/stm32f0xx_crc.c | 361 + .../Prog/lib/SPL/src/stm32f0xx_crs.c | 466 ++ .../Prog/lib/SPL/src/stm32f0xx_dac.c | 692 ++ .../Prog/lib/SPL/src/stm32f0xx_dbgmcu.c | 218 + .../Prog/lib/SPL/src/stm32f0xx_dma.c | 705 ++ .../Prog/lib/SPL/src/stm32f0xx_exti.c | 314 + .../Prog/lib/SPL/src/stm32f0xx_flash.c | 1256 +++ .../Prog/lib/SPL/src/stm32f0xx_gpio.c | 540 ++ .../Prog/lib/SPL/src/stm32f0xx_i2c.c | 1585 ++++ .../Prog/lib/SPL/src/stm32f0xx_iwdg.c | 293 + .../Prog/lib/SPL/src/stm32f0xx_misc.c | 167 + .../Prog/lib/SPL/src/stm32f0xx_pwr.c | 566 ++ .../Prog/lib/SPL/src/stm32f0xx_rcc.c | 1741 ++++ .../Prog/lib/SPL/src/stm32f0xx_rtc.c | 2518 ++++++ .../Prog/lib/SPL/src/stm32f0xx_spi.c | 1334 ++++ .../Prog/lib/SPL/src/stm32f0xx_syscfg.c | 320 + .../Prog/lib/SPL/src/stm32f0xx_tim.c | 3349 ++++++++ .../Prog/lib/SPL/src/stm32f0xx_usart.c | 2096 +++++ .../Prog/lib/SPL/src/stm32f0xx_wwdg.c | 303 + .../Prog/lib/cmsis/arm_common_tables.h | 35 + .../Prog/lib/cmsis/arm_math.h | 7051 +++++++++++++++++ .../Prog/lib/cmsis/core_cm0.h | 665 ++ .../Prog/lib/cmsis/core_cmFunc.h | 609 ++ .../Prog/lib/cmsis/core_cmInstr.h | 585 ++ .../Prog/lib/stm32f0xx.h | 5111 ++++++++++++ .../Prog/lib/stm32f0xx_conf.h | 83 + .../Prog/lib/system_stm32f0xx.c | 383 + .../Prog/lib/system_stm32f0xx.h | 104 + .../Prog/main.c | 86 + .../Prog/prog.dox | 7 + .../Prog/startup_stm32f0xx.S | 250 + .../Prog/stm32f051r8_flash.ld | 186 + .../Prog/timer.c | 111 + .../Prog/timer.h | 45 + .../demo.dox | 8 + Target/Source/ARMCM0_STM32/GCC/cstart.S | 252 + Target/Source/ARMCM0_STM32/GCC/memory.x | 155 + Target/Source/ARMCM0_STM32/cpu.c | 165 + Target/Source/ARMCM0_STM32/flash.c | 757 ++ Target/Source/ARMCM0_STM32/flash.h | 49 + Target/Source/ARMCM0_STM32/nvm.c | 229 + Target/Source/ARMCM0_STM32/target.dox | 8 + Target/Source/ARMCM0_STM32/timer.c | 115 + Target/Source/ARMCM0_STM32/types.h | 63 + Target/Source/ARMCM0_STM32/uart.c | 264 + 151 files changed, 107635 insertions(+), 1 deletion(-) create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/bin/openblt_stm32f051.elf create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/bin/openblt_stm32f051.map create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/bin/openblt_stm32f051.srec create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/blt_conf.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/boot.dox create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/hooks.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.depend create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.ebp create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.elay create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/led.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/led.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_adc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_can.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_cec.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_comp.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_crc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_crs.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dac.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dbgmcu.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dma.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_exti.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_flash.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_gpio.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_i2c.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_iwdg.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_misc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_pwr.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_rcc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_rtc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_spi.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_syscfg.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_tim.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_usart.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_wwdg.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_adc.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_can.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_cec.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_comp.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_crc.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_crs.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dac.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dbgmcu.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dma.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_exti.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_flash.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_gpio.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_i2c.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_iwdg.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_misc.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_pwr.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_rcc.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_rtc.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_spi.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_syscfg.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_tim.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_usart.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_wwdg.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/arm_common_tables.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/arm_math.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cm0.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cmFunc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cmInstr.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/stm32f0xx.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/stm32f0xx_conf.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/system_stm32f0xx.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/system_stm32f0xx.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/main.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/bin/demoprog_stm32f051.elf create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/bin/demoprog_stm32f051.map create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/bin/demoprog_stm32f051.srec create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/boot.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/boot.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/header.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.depend create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.ebp create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.elay create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/led.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/led.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_adc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_can.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_cec.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_comp.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_crc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_crs.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dac.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dbgmcu.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dma.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_exti.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_flash.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_gpio.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_i2c.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_iwdg.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_misc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_pwr.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_rcc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_rtc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_spi.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_syscfg.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_tim.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_usart.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_wwdg.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_adc.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_can.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_cec.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_comp.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_crc.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_crs.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dac.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dbgmcu.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dma.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_exti.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_flash.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_gpio.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_i2c.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_iwdg.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_misc.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_pwr.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_rcc.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_rtc.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_spi.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_syscfg.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_tim.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_usart.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_wwdg.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/arm_common_tables.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/arm_math.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cm0.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cmFunc.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cmInstr.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/stm32f0xx.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/stm32f0xx_conf.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/system_stm32f0xx.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/system_stm32f0xx.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/main.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/prog.dox create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/startup_stm32f0xx.S create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/stm32f051r8_flash.ld create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/timer.c create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/timer.h create mode 100644 Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/demo.dox create mode 100644 Target/Source/ARMCM0_STM32/GCC/cstart.S create mode 100644 Target/Source/ARMCM0_STM32/GCC/memory.x create mode 100644 Target/Source/ARMCM0_STM32/cpu.c create mode 100644 Target/Source/ARMCM0_STM32/flash.c create mode 100644 Target/Source/ARMCM0_STM32/flash.h create mode 100644 Target/Source/ARMCM0_STM32/nvm.c create mode 100644 Target/Source/ARMCM0_STM32/target.dox create mode 100644 Target/Source/ARMCM0_STM32/timer.c create mode 100644 Target/Source/ARMCM0_STM32/types.h create mode 100644 Target/Source/ARMCM0_STM32/uart.c diff --git a/Host/openblt_uart.ini b/Host/openblt_uart.ini index ac250b34..34d42005 100644 --- a/Host/openblt_uart.ini +++ b/Host/openblt_uart.ini @@ -1,5 +1,5 @@ [sci] -port=4 +port=2 baudrate=8 [xcp] seedkey=FeaserKey.dll diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/bin/openblt_stm32f051.elf b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/bin/openblt_stm32f051.elf new file mode 100644 index 0000000000000000000000000000000000000000..566938648e0ac2a293e031bcfd5a687509db7253 GIT binary patch literal 472672 zcmeEv33yaRx^~s+bGkc8C+X~+qzRn`2oR7ZKvdL_Kv)6-0hCP*n+6350Tp*ZTyPr^ z7lbIdjte@9;*Jv?H(bWVZ2(8jxZ${>js^kg|9$H$=^%K$&)j?e`~S~rsB`LDtLm$- z)>G%?!eOJUq?E$`X`)zIkiQhjMxRe;nlMU5M0h|;7b&FIr{5?YJ;| z3$E4H=3HAP@~@~$u1Xt`J}Naw?%MlvvZW!(x+BeeT_lRc5u#XY4w(7b_3Y0P(OrmL z$M2Q9?);f)!PKxl)8vooP4u?I{>@_7@ZHx$nhcpQcJ=#NmR07h8Pc?g`Sfp|9TB^{ zyUn=RpLMJ(N9af3P~YZcRn*TglbAu#dk*76htu>H{N|=8r@^l7IHK ziUL0{ehcIOS?ns$tF(#Nt8?e(c=dO*YR{;t zwG8#cMMNtvl&1{4Z{@eIYt`9vmlniV=FBkhvU(dhP=4_EtKX}WksZE-x4npIksV&| z+aAR9NT|HBV)77AA5$i{Sr13sK99=cxE4_o*Bov8C@KfbVhzyl7TGFFM2is#ZmHjF zgddCuPqgi`s9qdw@sBQ?t99*PSvX_PjDor4g=vVH^mn6$a~}p&zlHhev-zS2jc_0= z3gv2({vzZfEh)&mRC&LBQ_rO)h0nY6neKCyaQ zU7#SXT<;lZ*0zbBMssnizh``Npl77Huyt~^r&dG?T8~rryw(ZTC)7=?yI<>-tPN-? zoTlYeXf5ML)K&UhM_0dhYI1&dx$Ij#LhNda)>TGoy{)5^oYq=ZT?jpu)l=(Iy{XB= z#@sV~>!z-C{lc%5r-WzLPOYmkYLf4r{^q8Z^7!zrwYjHlH?+5ps{Xjv-#QTao1$xP zPw;)@l*IWJZ479h?a*#u#x^Sjw zjm)g4e+9L2k$R30aYqR;@9$cZ5Rs+p-w~-xg%I8KX1#jq++gM88J<=RvE`Lh*%m3I zXlp@RqiAbETib!Q1GH_5wga>s77hMg=Yg*WD??^m783qFylUwqmp`b76T_Z5S+Kg& zQ(IBjy*jOYWnDsLWvy1%tvaXt%euLMy3b9hOapy+T_NbF&P}Vls8-$`ZF_Hjq`DF1 z^sP5q^Hj{gUbK4F7uIF#fp;zxk5?U5S6+2^SnPUazc*~ge%K%1+N188sq# zF1vCWEE4@T8f}`}-j=#nXTu^XmD#nE>xxFo@+q~UxZceE;K5>d}{5Kx(x-_dg3dm)@Ii&EvV7a z&(>y#mlj;BC)A}?>}&R;rLd;Rsi7wWUpP=uU6)qw@42@{^~3Okz~j-~(dbY6qtU%E zLQ`}jV(hb`7dA!BdR_kDQuM1bKic-U{Y#7P&>~^Rzus@&U*Es9%X}fOmt9Y-%3LUl zu3PBocKpJ(7iLwjsS1VXRz=&E{!(7m9ewz_znof?4vM(pnl4`(#fsMOOL17smj%(b zt%!M4?D<~;g<|z-RVOXf3Qw&{TX@~VcNd!6(|!@VTK0-v@9o{UljBeQ=Hv1n-6VR% zH(#AC2L{5!atfF9oFsM??vtgDRP1hH``~zZ;T}<(i;-i(K2e<2EOvbi9XIZg5tifJ z{bJXmJuKR`&yw_uM36F(OYF{U_fHYmo3pq{g&Ao!oS<<_kCee7j64{)DsqwXwSaL z$;^GFNad`3NPnL!_OwLX=I#@bqSnEkmKClO?`7Xqr58@CcrSNNRb^FP_K|fzg}T&< zU61YU6Q(8a+@}|NTl&}CS7Eg1rK5*^)#7OtMH+%=l||9E%6*Zr*{|>3QilFHF&wO3 zQ{ih)uD+=v9;rVZ6~(e8r8O}6OG89N&*T=->Kk2HcXLHtb0i#T>P{~b(YCQsjIR;& zG~u!>wVVrJHZa>GBJJf0gfqf<;p+Hl+D%nxBmKQC)m8qckyWPrVbLS&s)rfPW#N(V zgD0cDyiUzW)_syQI9o4GfqyJTS#KIDc2(~^veU;omBYN-P0l;P8Q-jT>baz_UY5!M z@@UcfOO`Q$G9o`RVwVo>R|+9vD{WL-Ed%|Ud1QV$HYJ8LVX-{R_SwyKc_KU7mKlu} zr#8=wuhHVF*H(C2;zs0$`-OXgb5+#W>UE&YqnIzEHaU(9KXt~IUk@iiV%L5nERXI3 ztzYiPT&36IX4G;?L-U;#_1iqXPTw9ZnYRt~yO%Y7!QN=w^1Wt_*Y6dPlUn;8>mT?~ z)u6EGDt5iJ=g1}ZAvcS}T6k5@>XyluRe4+C*@F^$f7`-RuBjSZCAx@Ro4|QHYX3Ab z6`YakzfCq;v3~AOsQ85kd&m z>)%WX*L2MJ88<4fdR>n3 zz9{lf369rG8!Ps_=N++hxOapYj`0HX`7qWRO~PD1%<&0-zC`*Xvqxdp*P2kP_gz)7 z_bu4;m;F2cEC02xAN-r6ZD;TIZ{dBJb-%~DPl%fM>#cit_5rBbMS!t-D#)odMoy_+ zTWjQJ*J6xU?I_qPS}%M`h&uKX1yW&&!#t#JhsW~{=K``{J1_Z|_P0^2A?o~F2y^}( zkCj8TZSg)0{h#QO(9HG~ZJWAJ9~}vkatiw8pPMCS@n~lle<|Y~5dmeYl94_177aBt zY+t0FTqe&Y5B>u)FR_|4cWt$2wXr%-sIT@xCr6#ld#QV*jJEYgZ^)iLbD#G?Q+7A{ z^TfRJUY_m25i795TClqq`MDQs3{P{yh|7REdAH~lY(`Cw6}$HB?sG!4ZJnZ)g;#-k z{BBu#`=`@Oj-r=DxK)fMS2#o@q6**DsD z**;N#IbnUEHQF{h>PH>S?k|egROs790cxTit+9wbbyL-Yu=_lOM-U!D@Nf1Ybx(D6 zt=M(_?tMES2kvQw7rQRrEsKNAaY#${44_?ij{2ba$Ntg&(EOGt(4aZmHhmx0n@x~; zUdhPMHl58J(eGghszywO{(>F#p@mxh(1M$4>WBNiBBI(% z{o2`;`BNtj&7WGcwti~8$`5E7(zVx8qEOM4Qer*|Q|tGrQ%E(V}oxz3kGZ zK3ecmeXyWl;jD$xw%el{aNQVf#r2-3h>tYPX}Gh&Uof=rqnfOL+&C(AiR>Yoi~ljG z|Bg)qdWh}u|5z=q9rf1a^;N@`MB7$GW!c3Qp7#qd-rN?Awq7x&xYNuf_sl~(+Z!$X zvVIog(?a*no(Vr2TKGlHH?5SK8zXgT^pn;Zb?1+{XEr5a3rp_adFx{2-fUf59fe(n z)-}$S$}(G9>lJ3*yz)9x>~C%giGu7UHK8{*$^I8r{ES(KC^)5BM0Q}F7;c!}keal% zK^EjJoV;+&Lch{*ck4+?L+z-wv(YCloVsxBLSO#&g(5$@VM@bI4JOz1tr%h3N~5b< zCn|1oPFXSqygL@=GI-d& z(NkN?M@I`kuD=r;AMKY%6^Ay=mdfTQC<|@duQ_)8Y5#=Q0V-`%^Nb~;yAQ3W2KuU$ zzEAg8w3bw_nRgpf8RVq0WB;JmZq+lF+%&Hyw03si)*_Xn=+b539Mtt6_itGE>B26k zZJ$avzcmaEGwLw@IvSqXpV^ujlX7xvwC$=rsWBLDE6a1|eyufv`>p#c3*$${G z1OeZ)e`uk1RLj%^jQPIzgJD@vS@_&UPoI@&JyZ6VZK1ywqfZkU%S89mW?3i-f{$EQ zQSz27D)QZ0p})DTLVGh#=E~hWKM^)OQcM%OcV1Q@-zv|^sT}R!P@%mga;N(XDzCKS zjflTy#s7{t?B1LkC!6EqKHeD&2cO1Bi}6TAnks#dXd|>+%R|~V9`ps-7+OX5UCkb} z$tR*oPghi~%n700tF~0lk%BvaA|Jl>X9J_oMW>p3dJ(J$`|rkhf?oh-so$JborF33 z*E#nG^THb|^yb^e50lpnm!-RRid~W2{_40xQ0uppN)fR`8RDMs^3duEtvS11_TRI! ze)#^KLhRn$RJHqQ|I@c1XR&e4AMj7;%t)~rHyH0@#=VS}nQ|hvoe(t!PUtm8 zcmuvMaWYj;ml-n46OuV{cxB}gk>cUUPKr!iuwdSz$jJ*DBKSjNkzw;^&Y3-X&g{sz zh6S_cELyanVNv%;Y45V$rICJp`j++?)NeqfxM9w`IWrc`=`OC(tiPfrbh&)HCghC2 zXyTIRJ-;%iw)ABwXu|jl;$B|9K=Az)7b%R#ar2iLbG1L=Pm#rq zK@pA9w0D3MaVx(8Fi#`59{0`bV4km$-5ZxPAHeB~%^&xN4bZ(n0fG3DLu-UluVjL8 zyD76!$)v`QC8a@8(&Mzhg0e_aGUHBu0tyx@1);b_62KV>2*(epg3OsJYmxYh8USZ0 z1;ugy)SzIAQqV&fJCLh{E74Yrv$by#4@lpI@1Q)1ht;4a6T73JQY4+e3MHP{9rQK$ zYq>eN%f=+olWzey0g>R{h)hK!MUIz!Q{*^L#i$}7Qd6yEOX-_6#9Z;ZSjs55}iP#0QNWa>yk zWF7sCCcND!lQE9yw6%Zq2ye0Y8!)=40E^|5&;R66J{chweu?;7f7@aZ97iPJ zI3i^nN2HA7h@?1fFr(vo9&37ARb_C%0Vx~3;0(P zW#cwzNPHXymV;Qka-0aTer4s`V418~PDDi~y-Sv1^i{(%6@LdZ=^i4g<|@Q=Ad+`L zU_Dradl0!7k%0(sTu;1^a9tySfn$US1~lP+36zNkqb3JIr4kXKd&-$5fYVhjt_C(0 zU5FC?m0FSXcjl)z%V2mWBR^@c1L5t?45sfv)Hhx}3l$maLhHc4??K_Sd~G1s$QXhs z!(W%w1sjv)+CzUfUAvre_~pb4@yZ6cw%MI}*iUNVBSF#3URSfaQ+lY@bs`C7KdYIY zr-z-VRyLmmvuD=KK2$UNP`d**{oTVJ)zhO7xIJ`a&%lw4vPbn)%rteV9`!E7y;7eq z-$KOKpPh|=!mx>O=eTT-Em&@R ztP%Q1)vt-bG2|Gf06j36K(zw=2@}9ITEznilo+Gp!Gs}*AFJZ&f#)bNRso@eu@#_< zQ$RRy0P22;hMw3WBKB!OD_A(zeL&phys)~z19W_l;fEE~x-0Ra7pa&`l zoS*=2U?kO^r~rT9SOO<0AU-gGK&=7-fyo4BC?H7~>rni-0;-v*twhR+(iqqucJ#f0 zY)RjpxN5!)$biS^A(w9+u7>b@1C%is-Yt?cp-^55J;HR|1|X9k0bO3o3gR!AN^m8? ze8Ne4phd1{G=d--uZK*^gH*JhHHCJWI+GcAm^I5^5J5JgHH+Z;)U}y}YEsg^rmoM+ z(N-b=WnG8mM^P4%80yP%9j7L+VZgHSHn3$sK?TPt zwKo8pqik`Uu8c8WWL`xr4F~9dpMq&r*PsNOA(*ACvsiI{2UvtWWVl+dhdIp5YDhar ziCwM4VC>9mnEcH;YyLbi7DG@r_5x$p2#T*)lpeHB=4oVoP9g4aSkD1#b~#y}Q#wb2 zHERsv=N0EEfO9v3or&i@Zbd}qi!7I4GTqmJEK}*eM`a^S3hk`MWu+`$akfHPcpKQ6 z!L10LFjc5Jrby)NwvaYLWWK`O_EKWdBuZ5RB^avB+#RMU@kpL^A*e71L|Z=3M%oCG z`6``jtP;~bf-?_T>RHHSPsXYQ6y}&Sl>6Q$t{38FP>j7WR2uNtgV_C z4nZ5!UmKHtxSxgmQw%b1goSL+)YmNKWe1e9pV!XRWhztOJDIvnvf1a+J(XE6SCYp7 zcB~MAu&w_fRv1x*;VPi9-uPRJAR8ZoOx6d?N|MF|<~j)k73WI8xxkBx*px1hNy$lm zeGKv-$=~-^G|ll&@*AL2Hm<@SRnFc?qmS3_0_GVee*@tODmzEQxLKFdCr$WO!j~|+ zCVU!foYlRZKY_(j_L-zoS`FCAU^x=A?c*RP9SnKu!H^fmAP-W$bLjl*RH`V5SggwD z!@M?oDf7QhW2ck_9cKP+R-9#kovgIRB;X)_j6ohG)o3@E@k1xoaVpiznCf%1(uXS5 z`OuNQmsT?2s|jD#4*vM({CrRifYb1Ab|kpXW30Ag(iB>N#K0Nxi2<>J-?m6 ztt`Q<2P80`3G^~4OrR@tm?pYiaSjLU)WI|`|AvY3n9nzz1j?aKHvW|f%wg@ksZ6xc zN#Je8d2MV0Pyc2Dk@HSP-}JMSz+jbt**pL2VaM<^l$pKr&nmIcoy7JksW|9&O4A*a z<3pE5bb>eP;xcq4*4%l@K5OpG!4khCQiS;W4$hR-R>c3VxihWtI)d*ZT(FLjm=J%A zXq=iU$C)$bcx$FiMm1kdDADI?9Fzmxuh36ZGg%SfeuX|yZ2;&2?pNsZRln;EaKA!7 zU9tHC+^^6VC?Jr?{R&J?xM>g!aKA!dsAN(TxnH3-C`x*O`xW{kMac|szd~QE6odlY zuh7p>Ksb^675bSfYmr3mSLkOc1;qjGSLjQW0xT1`Dv0NPg?_g7FT|6iam;5ZPu#cg zO%a#37k(IbF0NW!KB^P{Uck*5`T}^sJI;$?FYYqXMcjPy3eRBNj0v1jf_@T~aUyQ( zW6&J;`8gP=;yxM=9^pBbT(eR@1=j*DSK>Z_Vi8wMEpb00jwQ~+VKDvEF_H zb&&ErO?poqrfld0VAAs;oTW^94^1k^WtAun;^p|zHK-YRA8WFOU1I%$MHaXVV8};S zMJ0$NSoDbosAgb-xoT}(o0ZB<&wiIjn4;bKA*DV9&jqH^)0l?%F%{E^c(IX*{C zP20?w>3JfTn`W}BWX~Va?PWwSOqaq+MOR53Iy*|GrK_4=%JF$>EmExHx_~Nj^qNzRx|8O_4rv~zsuY;nyvtFr)mG4(iEMS! zj3c;DMv%=SRWi0(Q_%@S^PVh6~kC^U0Wy>5?K%P$eezll5l5h^;sDfv* zf+9CVz&l*azY9SA$G8YF9geDtlaNDefLsBPd-@;17)756Y7Y2n0G4cuE1mKn9gQt$_5vbR?v2Q9vkA#J#a+6c7$v zLzzD-Ad*nYjjbjH6a_wHqR%RzI8aY*&nciJa3+DjD4-AW*-z-tE1*=w{e=m=pdE%1 zBo-O{7Qkhb!eBQ_=@TNU4dyZiFs>(^&iFva{YjaSGX^mpNXmzY7-ftHlS+|S<8a2) zlX_9l5sZhDx{?1##=}XM5* z?}-uv$-a%dPOZ=@4M-zF#q%k6(!MaUWLgGCPgmPnKIQng(eYD%K^9~;B^FU)933;% zCQdg=m!R&cFtr>Kqk9OL(q@}j>VD19U8!_`t#m)nT-V0vKH1S->*$_9rZZxgu5g&n zaF}K?m)FNIZDIzFWZ|w?31%g-Fgs`wK98~olm}yVUq@j-Xe27dr zF-#XaOgRoy37PsRCbL2xWd`nMf_>CB!8#;pR%ky3Kdmw_fnwD$y16N3W}w>9y@Xm$ zRZOfY*@&G{k?{;gPgRR$=JH{h30p<@nHd-arnIkVV_hvrK65hQRj@A!teLZ^J729& zC~7)vYAKZsj8V3N%9`my1C?-J2%DuTQ*aHHrAEoXS(aU+Pf_es6HBX~=ZGDz#BNq% zZ!iywl~^g5WaCE^JC9zpSh2mS*wFrkyedX}oEL20lkFZvT^Q;MyRO7s-68R!RqCEEb7WvLm;76l)t#HKP6AI50EnqsG!Sc*MFw$O0q zDqSCnfv}No)R=*RFzsd*G+k%>O-FmC+R2;;%cqwxbrb$O;rD1c6Aod0mp+VzFyWDe zd$SBCd@W-xL}zQZHeC zjyLu>LO)UHZ&Y=>5}M%%9q$M|!R)LsLS8$ip4fv(t7J+ml+ZdyXoVxh>4UsomBGwj zErnF}ZdXF@I6}8OLi?%n`52+=DWtOZyb?;r%ET%zEMIW9ieX= zAum%ZfLmeEQPzu6Xg|$U;JpTziyWZ>uQK^~k&{Z-8R>nCQuvweXexFb(x%XYBbDG5 z2%0Wk?PWE5066_MI?ZSW&qL3Vu4dC?l%{6(B)RXB;bTrG`0Ixt8=r&b@T<(|r{?s1 zaVNEf`5D>vLaft`Ec#C7CxV5G+J$2|HbJnn94Ci}2uOk`6BPMrRCm5AH`B$k@CK&5 z%FAbG{F&Hf%=AoatWt$K2I|dBuU4G3TqmWTL&tbnDKq=bQix?JBR;Ie&}SCVm_vat zdF2jU2A^%I1H}Nim1K-1x698ANY^wmj``f zITI=TC!biFk13Bg1=V9pmPS3MOtdjHQwk6SCVp(b~w2F32M@|La~KJfY~5Ek@I^@lBg+e5*D-i#TqB4Ny`wI z(-9Lz2(mG`jlSDZiZ*Q4@E;%%>_x5yDqD#PP1#6rF~NITzsW(uYZ0^B$g`ALO+{jP8bMO$JPiJwxU1VJ|P(R;9*YCgRf zh!KzoE_A@T0MpcXv6K2P2Pl%yrixz>vqsiwR56<}zmVy1GNs>6rhs~g+|GFeI5VnD z3R$;{L6GrkO|M3cl;MqKY$x5au@U$1&rYM=N2@^?~swl;Q7fG3>C_O~nZOqSfPbzZC zbo8UV!#U0;A&ppWk*?F%GdiFxA5ZPm~;OpE@C>hl)&sD0-X+Sf^6h! z$Sj*zGi_;R43H&q8%2s^L}oc6#T`TdSt2`GmeESYG{;?z$Y@I>=UAF!v|9T<d&RX|p%idWsV_^$gOrp zKVe31RT=$~t`yqOtUVqhbfzQpxGmJnI?e$blEJ&tG50cb}_H2&5DPVkk0D-FsATHnC6&5A6i0Y z;Q?8N|Avz&75YwT&(5=SUSw`yi2EtaCz(?2Mo zI3j9dgzk5QYHXornNp1sO3#J%PzKFBM+rp$%f?nmXpSXhmI#nlqSI;Q^-9F_v@|SO zOe3uCAOgq|d7I_=PKlVt9^r_5XJ>7e$wQAGptANb%VVI&K{i#^&UJ(gBep96WTkTk zTSey>kp~=+&K*PmSt6}8Kv|5)$BsyuC6aTk$-}H2r?S?ACa6|IW_dz*u3(y=+7|jd zOiXpI6|Flp^MnXbW%clmC%zE8l!~F>|O5&jj@Gl*;dCW zp)j^FOs55vB}8}MM)HCf6|Xod7T7BOVe;IC0v*SlkWc~Z{YND<5U^|mi)AzE!w9dZYwcG2YXFN-1Fcbl zp4pzlThZ z@M|pm**@;5OokxL1p@@Je3!>RFApS=-NuEd^k(tcHmodfMT%KWb?!F7Oh`%&_B1wTz# znb(AUodK)rFyVoORc`;PQaTT?2z|!-Nav6v&=DZFoQ|8hO~*kJV8)q=ru%8`byT7f z%~bHygjJ#@`~j7A;%1&PLgQ39k5YN88PSQ`b;d}I^VV4Oa3o_4)+P|m3nrIpqGGkW=1R~C{^FIRe+Rq%7(#Nc9 zSkD~EuKTQKjs*OE>zN~gfZuxNNFeC9o;eao_gl{#355LCGe-hpzxB+KK*VP~b0kpY zx1Ko?DE3>=90`>8t!It|`XHbE_{@<&$7hc5Pq9}BN}2EyBR9@QgM1oXvXS%V03Qq9 z4b()UHjBiM$n+in!O=%H;;@cLQd>pu6Y&dtGFk2YD{y)QpxXLZ;Ozv}&c6cR1}K7W zQscQ4Hq=xms@ zE}GHFSgzg2a_wD~Yfn2&h^3FwwblD@xbb~Bdk@okAI^F?!+dK4G`?lzF<*ky&6hj6 zBNMv$I>#_Xt@k)|^F5A1#B_Xt!+d392BpkbHs&#E?uA~U6qql;-H*7Jm$wmokKqE&apGHJIBt*<{UdC;2b-njC1UaGS0Cx zQk-LFq&UaUsK7aPM!-3C#;iHV&ZxjSc18s_cJ@4O_OY|Qi1XOl*AP17u`}H~cE+_R zkDVoI;Eg?YrklskxT(WqXFNB1kYi`MdF(6%DvzB_A=j^uo$2PWv!g-fv9fz`w~m#u zw(MhN%&vW`jLF%@%9u6#SQ!)W3EezahLb}gWhO&Ifs%wge*epqvN_&#ps6JHw%@uw-uUAae#} zt_I}{$ULVgHQJdfv3^uZ@*0c$Q7l&$>nh-qee3K zCd+L~A&(Ck$4jQ(jt<{QT3!Jv!8bZ@3~yt^CTP*cRLnrE{;3{#^*BaNnuQo&Dn#8A zs6xIb={d-&yV@;Dy6_Ab1KrkJyqX|pAOt(S(CaB%NKA(pdezI5o+Ict2fRGVZcSJ3 z_M)S6Ug*`!R64(Yq1WiK20GMRyhg>nraJX7M|u}XHg2yvBI`Ae$ohCh7KBz1{GF3^ zp_NKcTnQrbk|xwv0r0YMG3*?F1MDF$sQ@CFk3MZt!z>HzOK{$t(*d3gY7M}^c__HN zjB@7#OkBLcg6;;Cv;&IA!Q3KQpGbATka_eczzzi{8+(8j_=d?H+Y`~JAd`Y)up$zN z*Ko+OBoLnZA;WHBPCUa<4sz<)wCjqNNAPYL^qqm^#Jqv|ncq<342$Zvg@?OfuUn65IzH zpXAC|jZ*oGGne7!>%mbeQ@uw#n9+>)Ascsj#+$gs_sHUd>V%;hwTJ!+a)|XLGLHk* z*RulAY(CHm?4n}DATm-|MU~=stmSp_3Z{^j*Zu>03iR4?%WIb&4zGR6^4f#FaIU;o z`<2&fzw%n`P+qGY#A{<+)pIacHQzE{kFwcsndAMv?*Mw$`+HvX{+?I8zvor&?|IGl z_cZhUy;s2L3&=`7sPbP!TMVO}gntF&RTm^U%yNS&vh4In?=ul-Cpmfv{o=u$t zmE;A4Co|1KD$Sb-pGJC_Mgu$uICvxJhbuU_9!WJIqsiwXg61YtmLu{NA~hPC1A2LX zsYt#AIJ6;=d^I9yDk36>oeuSnBrxAZfZjdhX*G+*ac z$O<_|0QUF-h*5gVnu@KGUM(EPwg+BsU zm+#7BAd|)McMgbIcO!B&B3R+$?KI>$Ro37QXARFWtZXmFm=MA{C4SbO^{hn%USM{< zQW-CUq&d6haARiYE0xj5pxCVKuT*w=6#-Tb^tB{!1K@1cBYrJe6ORE-n$Mc}R`I_B zIA`{v#X{~<{3Trgs}A)$1&;!p%i>K$7TBf8Ju(k^Rq^UTRK+_NkFUnzO*4 zQV;60&{GD0CAUbZu**TAFNW4yEFH+GMpi`lDO%%|m%$QJ_0s8K7UJ)$)>a@VD0mMznR%ccCzq9Nw0L)Xi`8!SX9l(gH$q&ffsVj2%6;#nLx2asJGx;g|EZlb{ z&bL^cAqx72MM`D@1`kv<-*!xu6I5k#ro#L$X2}gttrQUvDzX?4!8F?gCXs$vDhgDu z+LPo9j2T;5kb2eNGH@oqjt4cy8#In^!ES7%i_G}Dj4xIVFgTVxXQ;SHFC(y30qT@b zM!JchVS}n`cvYn$($lHpBa@RydrZ!c6xHPX#N_NWlPdPn{CM@-4rW%-nGbo2h;W9)DuEM1OP%f=_HPrQ>x~sL9y;vUK2VB05EO-pim0(T27Hq0R zG^HK~hztq&2W(#;ZAv`>zI>aYBwwTC)9sQxLG=N^0#g!C1w__6z!}AmvjK64 z6`_TX7lM5$L4dD>eM12Ljd`X=cs%q;>CXf91z|A z$ugXYWdODgW@o@Pc+#zV7s_tpaAB(JzKreQITOJ)+>=u%Z*d9VlQ$O1UVI_kxLUGS zdOr@$;xNAbZTvxU-cZ7q=Zyy0hwnKXXDA%|eZ^_A_vO6S*PT_@n@z>MoJ>vq_&&F> zNJ*K@;x?c)aW8iNb(vj`!k~Q32)%nxcm7XUa7M$dIn(i>pvp0QPMR=rO#gn<@gBlc0|5XoL(_{;`E6#8cvzBc>2&e^A~gw zKWXUPMY9&1Ij7-lQ(aY`0ew$`%IOsg7A&4VclI2?Zxjug5b4*uU#XBwD>Y77o>93} zUmO|&t8xOk0S?dK)^fatyXD`U03Kwmq8-8RrQ=$~IE7Vu46TGZf+uXm)%z~M9jImD zTR`$8c3;~Z79K3|tI=Z;>m&eboEkkQp{;k32w~V=ZiCT687sOpQ(l*}x0D0Kk z>rKLnp1g@1d_CQgIOKYYDZ+duSKyw^>?YG7B8fwSr#s2aL_1jo*%x?vk`iPy_4J}> zkUfn@tw)0F0X!v2b3JtF;xQceu+|YPAwf6VX1UQc2q!;-Ed1`>Igj}{pc9d(wNdAM zEJZD2)u&ZFWxw8%Q{PL`D;Al8YVCSE;@&H9@db^m_rF25Yt=F>AmSe)v|8Q`nFOxAq2TY$ib{QlGKZ1H z@YES1B6w~>7jL9HHXoN}?Km)1{8kMYqV3NIYr5KSuxh1MV6wg&W-a5`;m2-19BdhP z9(jJf`Jf$fy(#?bFE=TPn9T=InM$YQ=7ag=Cf0}b39-$lI#q$&5%)@CzVyNtzdlI{ z!Y-3zfh;D+uReHVERghfgUjRi5@VDn4c@L!+Zm%hUjk{Kwll^kz&ved9IF8Hw4E{5 zqn2;#w4E`|Lq+CkJ7c_}n5XTG8bvWr+Zhv-0`s(;F;TIZr|pbMip@N2XB?;4%+q$p z@d_|c+ZmIUjCtD5n4)CN({{#GMKMp?8PgQSI&Ei6_o&mZIPF%CLRzQYXhHk58{_tA zH^%MLZj9Tf-59q|yD^?FH1o7uXXs4!q{A71VAG!s2Q9^2HvS8Qpz3RXI0=Y{KuxI! zbrQOOCeS#;_Agbl4KY-diX))u&|T_C#{#CY^2*}W~vv?DBbWzkhE+*wFEM`NZM znTru%*nqoi9ENO|WocwtZbSAmTgi6|DTZery0FY2*r%;$;SA41MBG7+4b)_K9wg!{ zB5u80AszuDWhzpjrv;QXQ8+5XY8mJh=Jjfep7J0fVPK9_jN=W@d@wT0+-iQ>Vi&ng zoE{qf1d(#li4V2CLpAm@^+4yT3mX7jgndS59y{{pYV;qI$euuS;=v+sSR+91P$bcr zM;yJH_N0x;V+@+;Or81A9h=zni0Y{Oz?j#g)sv6%tkDI*ag)W1M1p=O;WjbR>* z;FaV)xW;uNx!0>Cdmcws`t=sX;}vZTX@~7pw5LIfr$_W{F$j(sfi0h8JF%+xX*v$yv6IBW2F0dg|n%|zrEMoJLzvxbc) zDKNDRa0H-iY$kcA%{Lkmwl?9rpL}D@MuPq(;(M2f@yc=@EN3JBmw@nGO%6YOLhnvm z9QVnws?AaM;E5?~t`-G1?J?Q1N9|bbXaB|Vf!|T_2RupTlM&f#GBRw|_8mywI1%6n zjLbyjQ$|ikgf(oOipUR)oQ}vIMDT>4Du&ksP6vpCha{f~kmn+da}c4;j0+G+W@I@c znTQB)8%m>f^Kx3|>E`8%Lht6?38ZnEmlpPR^U^W2VlQW5o?`E}q^W_Zd^5Q zC=)sMevdeyY}`D{mxI&C;>n5?uz_jtzXR#N9N-|7#(y;;e7q@qEUG-E5pWSeeCP}o zi&MSwsf-$)m)Usk0DTzvvw_00$i#}kBS23Dx*a7FM?wug;3$%KIfgBO)3szio{(#r zAi!j0qwfY5;_l~x2rC4aHRkAWH=|wA;8WB{clR{VhXag%8_cIcoZr4YU^V662HG;J zPSu%%w6RqGE=5~GF>UZ33pi`l!<5!N=D#JS9QGz73!>=Zfb=JdNO>Q8jx4W^5V1)?E}hQ^ZOj+#V}?%VA)s$&V;v2tjYmC)k^1* zUkwJ2*?bb|9P$@B$7CRbN-&9zgKsI+Ihf?Pn0Gw;WE(P@TZ+cGNKu;{sgIEUp_IuF zGeh5N@^y#tdy_GFCX1HhkvknqibttP9zdB7a8?}tYbyW1l9`$d$^{;o>rgH*WzsHZ zx$cyzT+>Na&vNdRG*@tpNmTJxZu#9M$&)?{pMtqt$spgPCf~@q+M>zxoCLO5Ne^a; zHfoYDtC^YFXi+p~>MBh>=uob*D2XiMB2B*HP!?H~L8PqI@a=%0Q zlSR3KW;sEZAfZxVM#M-dQMcKD1Fko?bN7ItjH{;!Ki_%(7)f=) z0f)s>)eg*_1Pb%krYNYvz9Kga9K}S4&7}vR$<#hty+NJ*9dJ{ry^qBf9&G725{X-0 zkUJ5$3|J$4qDADKR1y1%@TtHtJM$C{+0jJaVvEn>!K*PyXE~4&rae~P!ICAwpO-N0 zYe6ux$kurqpdzx>$oI(B1-P5YwvqD4Mc$)`SXICxiV&Obi$E$*nk4y{DVqGWCpuBU@Mo5)3m~E_5D|GlwX2uq@D46;ZvkBmK|WE?oBiPX{8}Y82Jn|6 z3fUtRj9_o_NdX&$2fLP$B2KA1S8&x>#A%b~N=CbIS!r}g~07!~mV{iK;-f|U$FJ{~aT5-68g47qS3=D)q=G1+Ebx@C_{OOdJG z^3aVH*3tCmB8s9gnsPa?T4+@TW~-^O(j8>edW&|wgE0Y2cUTQ3G+3pO zVW>i8Cc^^EW0u2|&@J0!`QK#0*xYp}Z6dy}ZPlj+vm}*v01swI+P8xx+YQ{obhOj~ z#`}*<2m4ayP=;&wHczY<9>n!5hf$8^vmFKlipNjSiHmiv_*kb*=;(!kjy{?g>xUiO zuY*aGV@!$`6O1t_z?2y3fqr;^7k4nHlLT#QdngPRgU^V?$LPYG#HoMf!j25Aiob4X*v0jl7>lFvOK}RP^iuH#I%(IfQe4%r! zq7FstP_b;>c=ww9<-cF8v6c8=*v4ZkFsWk&COhpbwgS<@ozlnRRX^FWa@q%-*oI5S zv>5Zk+UXt5i@`=Y60Hs6XFB=lSZ!uowp$g{9HcGZU=EPkw)^BbdGDx;nQC_rlq;rD zl7`dGwr?{_onk;F>@;+;c8>AjNV^B;$CkqJ8O)39_F8Dq8;ZLAFK`(SlCVD;a=^}E zqMgGer!27^fO&{x-B>)05{&T-7%Ziu{bD-=ST_w+R;$&D515cRwxixySApJ4ORv>V z+h-}U4*36SYmAxyb+EyKwzYkZ_DPL#MyH=egR|R1#;P%yYJ734~&2M#rmh*Ril%hX=ZQpp)pUrs$IsrhqZ=*Nm2xIRTAv^<>LDmeFJ8QpaS|>?w9rOtqV0n%P;z z^q?l^?-+2}moR$l{PNK2nb;xde{>#UcD*#Z^67RXp|6NF?E#&3dMB)d*i={xs<%kM z(kK-RaX5Eh<;PjEjU^P*Sh8&bTo_Snb=5vZz+X+D#KeIEd?&j_<;C`mzcsy&wfP}d zmazuMgClbx=!>1WVQ0o1Dou}!i?v3FP9nZz2b=&f#_s~{Cgr>-v7=WewHqMWF6Kcd z0hUXrboBjH+mNh)v=|GgXNYc?Ahplp(THfT_Te4~b5+%$A2-b&GR>YHTVRuND9``> z_Ex^qZtvJBlHEI?fpTb!1I^$_#lpqgjWa7<9n zvYH;V2_H2h^m$V@<|&tjYLxuS$q%`vKcu6CKl7X6>-gU>gQo40QisEVF6HLpAo_v3FwD ztJmDU^To~x>_!fUSB<>m1fk=?IW|k26QIerZ>M#zXJW^G5p!sBa8kQ?oIBgQ9I+K~ zz-sFN+p|BgMyAw`UVA9J{0@h(wlibLp8u)!rrCF){0Eftzj%gg%~WG&xM=9;31j=9 z19ukMP2IkR{B=%q?J*#1cPH(=pw)uewycS4hkXRI%V^&~Pz{32?JGxx!jdu8Rm^r! z80&VwHS72t4I@@n2M_jkZ0f#tllblS9M{ne<4tEuh|TbC}go*iGuTws#a z-X=|Z#l@n2D@QT*ikUATG80C7CcM8liQiFZt1%uhF*#%|{O!3outGplj|b>j9eQM& zfZ3nz!}x0f=97#=_Dvlff_uF&lgd=vDSmT~?i8ZqfXw_IWNH}Gx!QvR+ARl%_7$nq zaI#}-;CGJ~{}-z{cBbj=xEW`!Qmu(64yl<>o8s&`if^C!b!fDl>06sQoB#!4ZQ?L; ziQ1u!#8BEddr(6$cx?9AQ%!TCY4_6RRMoEh)Q&3@_<}7pGR>6Z+Ldmj}oo0H>U-FVmozltOm+=kL6Mw77i)!bsPL}*Z{vZ5^wq7{s`{zxZ_ZS zdOA!RePZmzb$9enJ#}eo(B&2BU}$Xq~j2QIumh+b$<=_GBV*;ilF1~KFwB;2{XFXf;U+A z#nyeCbszdW@8uTXVC&A?c?g=g4@GFVM-y=N-=9KMeItJNl4YU{D_c0O(Vf$7_NOD#P%Y~TCD;D@4|{Cg4n*?R1BcyG1-ID-90670WwKz`eA z4t2NF??-0*?EKnyyBwrVM9@S@L9BggfBPHlzb$9O2i|SEt;eR@dhGn!c>8YS?K=;H@kcw_Ul_DM7)ZQr`EmmIv46CG zs2J2wd8y51f7gukYiuUmS@)XA9c1(2_>O-=44uB9iKmXV=}n-+nFKy#q287ztDhI^ zHxGABEIiugFUE%+%7ClIo&I5eYr_7>gZ+&I`?CgEnyUBf?YFV*x2f${r6blGo>p>J z{$CsJqzC%lHWBxs2%2aZVbkq*WbGGWTP=O|%cb@kr1oo~wkjABdY%|%>#^Tkv|mmv z!^=ptwFZ2wBm0%9-PX%Y_KQH2<off@YqG7+J}PaWiMIJnJH6oW+2?xgv%B_jUHg!(eK6CO=R9E(0_O?OAT%Lx zE@0Cc=bV6na{`8P1e?yT`e1=PwN~I5elVW@430WD2VmeFfPr%W29EukoH#Q&~z{=4)t&m6-UI3^z| z9lKu16Tw((^VxXfnh(H{d%%=Gkl2wfgbR+(4ObI*zkKsM)6h!=)zSlw2 zeIKi9H=OL$jl@^MqkGQDGP19Dm$7q0M)vf7A~U`|{N$eJGcDUFKCKs$@tvIlEgyEv zG4ckSgzrNZW*nos7!uurRJq^OgxWf3D?@_aMTV5Dnj-`y(GE#g~t zCNahNzWTEm>0aRb*Ahm06#DAVW~674&p3~fk}kd-D$>j6TXi8Zy}SA{moai!H{aUj zjPxn?9dR)ueY^YaRgr!@d@C;@rhiZ0yek+fE%EimTwM1I=;eE9H6sIi`?A(CGUzbh zskbmv*2i}XBgV0>zl@uX6W}(>S+V)g3o`Dzn4AH%m znCJYIx?v=*cc$|C&R4|$02egG-Ad0Fu!kWU@HI6#1`-{LT=c-OKC7#pJ(nJ@Gxdl4p?8*+aR&H!5bN{$)$`R)`QgJ-(!3k8onX6{)^WU?+`QUSW^G_ zKJ}cV>iQz3bJFdk{){h>Lv}u?`|cv=6nwSH5WgsI{KiZC&%Y3J^jV}v@RyYg(XyS_ zLDPvD-9qXMTZy@;8!?Rv6O0f)PucLu>zLLg<#o+*jN@;=;Ck*2j8|i>Z-~+>sNt7; ziTOfV>4PldJE5r<;(AqsQ&j!l`WP`+<&!_-NnU#^fBP%`yr>~QsH4er#ff>A>u3Fi448ew&sp@elmcxel zM+0RysGKhuMQY&Bye_~CW~jTtyiUj3(GXc0C_U%nr5v>7ABp$its(R?D#f$&$dhy~@hk9_mw`VsNDYfr&v1M;ISXzheu`?> zOYkbbAu>zI(|rc7f%D08zUr@5W6ca7JC;1xE6e!GNxd0Ei6I_U7ARJ|--m_N*@jo+ z;f<Lb+k?Db^$M>OU!l~K8yIiAiSceK zpS@HIUABpNxE^l+8{#g!Yh#FyRJr zz8#-dft^*q-A8%CBg+2xln?MH-AA5pgXFnXwe*wm=gSOn&&$N01s5^Id#c^_y@32J z+o=EcS9l$C88P{Fvh9Pt^b~~KdS!cnG@$w;%=`nB~_)4yt;IU|9G5a#QFK12m zynQyVy+Svm15t9_9|zof6JDG&4*Mf!Lq^}Ldf?iB#5!C0g)Puo`tvwk2ae=ip==>O zWo8`l<`s|`IqL?*t0%CpAM-{H;$y#L%N)P;C~(%kP3tW1aP(UE750&hMbEHhE|niY zi`(_`6^!O8ABEe$17gh0>%c#L#R=d%;XJnL87&-R=KSysu5&k^4(jO_-i7!MS-2Co z@8!p(ko!fuY%@rI^o+**$Sl{l$AertI}g`^OId4Wwa{nMuH=~7^AyZ!jeghv34&$E zt^($mhv>({rrZFT(ck|Gn2CRD17^zJb8tQJhRwj&%_zoo;R$a*cF_rs;CjZ%Y?Ei5 zOlzJSY{d2aCpdy$n9K|=lex2TyGZWjyyarq?Rzj>Dn}g-32?)4vY* zT`v-(~@4W~2UM%ZdrVT4cL(S1H8_sO2l~$G`6GYhx zB3s!*h78$DrtGB%iW>)0K~V%0k>C6D`t^tJ-sil}^ZDG*=XuUK&vO-gzr;X+c3z%f z;dTx5iKFeD-@~|xcKuesF+1@pK$_iD5W>^#awvso*fo9w$h3>-0#w+gP&Tc!i@bor zs_brzL3z^7b^rh0i}4Z_yJcSrAX=V(9?tjIe}@16@P`rnxpMtHM6LRbirV+Qo&O&r z54Z?!*hR0{_S@wDTLt4g5UsoS1b;dY!00$90YCr2@k8_LxWa~j4`Fe!8%csG!0xl{ zutnQ_)q@|go@J*;f&TBwNHeKj)6bGaWF2BaGvhvuH}eohzj}*Co%?`>cqfs@Uh+AO z^Pv-6;q$LCnBzB$?_uBg@jp;* zu^-q9D6p@mUaZjm6>49L?Cr@{XaCk;FxJ~wD-qCOpMDFh)Bf;N@SV4Reg%vd>|2^( z?6ZFw$Agaj_CA!!2kaNW1~zW*f%8$vhxYyT2zX?_eiy*g;lv!oc{%(_UEe{6FDWU9 zImDfZFUld3QhKz*2I>sr9pa_{Ne&xY5RmFn5d%nf_}@%OvK>TkBcQmBePv5Tii8(|l)4?$V>rIldW_Rao~Uw&``cfb@=2>_>MVzc>un2ht%Hy z8Tg&Lfa4A~??aj8P)gId+QEg2XpKWWbrZD?&8d*oIW*GH^$wOa7#kg4rApQ0&>aI` zv%~ue1oSz$H-Pm!Fbcs29FC9vf6=&WKldqE`W-p6xx6>cV;|uDH2yIRF)~d;HGFJZ zvNI&()8dx^9!{&8#8oDyg?t0$<7tn@kW5ay=?8c+?J<3TscApa%X482(=}ZgFaCwN zJ&YpCNN$Yu*WugCc)SR{eT;gP1V?v$TM<0rH@CNVyy!j;T0(9%d{XlSJ$V@w?fOJkIg zB%LvG25}h-H(C>!jL%~sDPnw)0Vrk+UxTrPp~GQ|;|a!9YQReww<(dAF_wJ*V>#oR z6i~qsegb19xU zPtsHJXa4jCd9Uz%G zjV4M8GlVwPsmy0fVLZm{u)&zde2MB(I&%?Kz6|EG|G=2ZtoRp$9cRYafn_n1$HB6h ztEjN#Fmov7=Q6F-x92hMQ-;fDS~CCz%>9o6h0KlPfFkDD0w{}_ib${$<_XF_Wz2`P z!Yi52y#ZFmy!1TSN#@Rv!D^WwdO%sn{EAjbBQwPl#wMnWQg<^`MQ^NynL^F}Y34h> z!PmxIi7wFb4D-|dVC~FV)ViNzE~H&wCo`Bfmlv7G!vL3*TxgK#M3r=inOzQchdE4b$z7%^Rj6U6`)aTe=Cu*9G3JjAP>wTWDS13( z22rkeWqDJ%-@|%G4x<}ulGe&z*5uD%`&hjKFn8AMMUZ%~>?kXGvUc4Bc(F#QbM$4U zx0VyIzvlgJ(>xY%Gym$aT+Uu`i68? zFwOD|R{awAGFcJRV9aK1r~Hz`@~6#1E~{@lu9wH^p#4!H>t+#*MXXG!PQ|S6?c_Fv@AxhZg~7SdQ<&*UmBz0yew;1IT%hLmJnHBV3E5rJ3FO*kVYWgT$tQE95y2kn=2hhz@ z(7vmOb-@q5URL)CKp*Q&J_7n#xwW{^ZPwTRkPNbZ-U%3DW$lA;n5EwW*cdB?Cf_*AIstgd@_rY-M=bkK!6sR{XuuOzHz}uBKi|NGT-eq9khrqz z>0#|<|1HFY_Obu>DtzwjZ>R?sZ6!q^*<5qE?gM7I>dewH3VB>PS3ePY

`%5|>A7sCL9?HAyf9bOivtRxK%6sf;Cn)c;zoRRRu#-Aqe865#$#In3 zwFYrx>~AB%#@XzdfQRg#3jmMUZ{LP*f*pGa@R*%VMQV~Awg>Qp{pxjqD<|hR2HV4# zMtAMTseTu1FXs&vuD6e)xC4nh$D7ic2PY;KMo&&{4VV`vcM-swQ%3!#4<|>0IA6}- zhX~luNsor|07v2oqaP=nny&zk>23H9amt#&0y&BFQGz%xH9!)~IY!SqgcDf|V<^Y% z6F?Y8P3bqB<3>;LFsF|e`VmfV5quGxAIHEVImc;LMRC4N0Yr1^9RYEi_i4Kj&k1=M z$^_2Z)nJL76Rrq2%BkK3V-hEXQeHCW+)IEIjvB{0j;Wk~*5N|OIO``NN#oe^z|uJ* z)R<*(==V-JW^$US0v+cFIv~m7aMpumbKcnqNe)M^0pxO~M+5RW8w(MT&zVg}R0W(W zM<@$9YMf0t7IE&FAt~l;8HTTf^T+}?!TIDnKq)7%3z9NUUjYKjIU!W5DmZP_5L9xy zsLWS$>Z8DFI8&MM)pB;z4!n*t&c5aQbH4ZzJCHJ4{O!zUp*$JtAVot>QQ zRbb~iTZCX2ILWkNFLK6cmwAaZw+V2WvmhJBE1caoAi2tEcLM9;2z=nX##y`xLtp2d zHv(>OUfcl5O-|?ppqEoZg|Clu=s5)RbMDaD&HyK62iPsnrYZ#7<_yr#gPdK?2pHmw z)BgVsCzJBvT}}Wk?P1OdXGrdG?$aZ< w{Il`%Sh2#N8_Ay|Tv%V8B#`(g4fN{>3 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 Pg^{TuDw(dnQl0-F=-EzL literal 0 HcmV?d00001 diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/bin/openblt_stm32f051.map b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/bin/openblt_stm32f051.map new file mode 100644 index 00000000..8cc33b5f --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/bin/openblt_stm32f051.map @@ -0,0 +1,4441 @@ +Archive member included because of file (symbol) + +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + .\..\obj\lib\spl\src\stm32f0xx_rcc.o (__aeabi_uidiv) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_dvmd_tls.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) (__aeabi_idiv0) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o (exit) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) (_global_impure_ptr) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o (__libc_init_array) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o (memset) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) (_exit) + +Discarded input sections + + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + .data 0x00000000 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + .ARM.extab 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\hooks.o + .text 0x00000000 0x0 .\..\obj\hooks.o + .data 0x00000000 0x0 .\..\obj\hooks.o + .bss 0x00000000 0x0 .\..\obj\hooks.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .text 0x00000000 0x0 .\..\obj\led.o + .data 0x00000000 0x0 .\..\obj\led.o + .bss 0x00000000 0x0 .\..\obj\led.o + .debug_macro 0x00000000 0x826 .\..\obj\led.o + .debug_macro 0x00000000 0x1c .\..\obj\led.o + .debug_macro 0x00000000 0x1c .\..\obj\led.o + .debug_macro 0x00000000 0x22 .\..\obj\led.o + .debug_macro 0x00000000 0x66 .\..\obj\led.o + .debug_macro 0x00000000 0x50 .\..\obj\led.o + .debug_macro 0x00000000 0x1c .\..\obj\led.o + .debug_macro 0x00000000 0xa1 .\..\obj\led.o + .debug_macro 0x00000000 0x28 .\..\obj\led.o + .debug_macro 0x00000000 0x8c .\..\obj\led.o + .debug_macro 0x00000000 0x34 .\..\obj\led.o + .debug_macro 0x00000000 0x16 .\..\obj\led.o + .debug_macro 0x00000000 0x44 .\..\obj\led.o + .debug_macro 0x00000000 0x209 .\..\obj\led.o + .debug_macro 0x00000000 0x249 .\..\obj\led.o + .debug_macro 0x00000000 0x5b9e .\..\obj\led.o + .debug_macro 0x00000000 0x2eb .\..\obj\led.o + .debug_macro 0x00000000 0x3cf .\..\obj\led.o + .debug_macro 0x00000000 0x191 .\..\obj\led.o + .debug_macro 0x00000000 0x46 .\..\obj\led.o + .debug_macro 0x00000000 0xd9 .\..\obj\led.o + .debug_macro 0x00000000 0xef .\..\obj\led.o + .debug_macro 0x00000000 0x184 .\..\obj\led.o + .debug_macro 0x00000000 0x7c .\..\obj\led.o + .debug_macro 0x00000000 0x295 .\..\obj\led.o + .debug_macro 0x00000000 0xd5 .\..\obj\led.o + .debug_macro 0x00000000 0x2b7 .\..\obj\led.o + .debug_macro 0x00000000 0x185 .\..\obj\led.o + .debug_macro 0x00000000 0x184 .\..\obj\led.o + .debug_macro 0x00000000 0x2a0 .\..\obj\led.o + .debug_macro 0x00000000 0x70 .\..\obj\led.o + .debug_macro 0x00000000 0xdf .\..\obj\led.o + .debug_macro 0x00000000 0x4e3 .\..\obj\led.o + .debug_macro 0x00000000 0x4c5 .\..\obj\led.o + .debug_macro 0x00000000 0x396 .\..\obj\led.o + .debug_macro 0x00000000 0x750 .\..\obj\led.o + .debug_macro 0x00000000 0x353 .\..\obj\led.o + .debug_macro 0x00000000 0x34 .\..\obj\led.o + .debug_macro 0x00000000 0x3a .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_DeInit + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_Init + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_StructInit + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_Cmd 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ClockModeConfig + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_JitterCmd + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_AutoPowerOffCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_WaitModeCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_AnalogWatchdogCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_AnalogWatchdogThresholdsConfig + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_AnalogWatchdogSingleChannelConfig + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_AnalogWatchdogSingleChannelCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_TempSensorCmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_VrefintCmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_VbatCmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ChannelConfig + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ContinuousModeCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_DiscModeCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_OverrunModeCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_GetCalibrationFactor + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_StopOfConversion + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_StartOfConversion + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_GetConversionValue + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_DMACmd + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_DMARequestModeConfig + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ITConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_GetFlagStatus + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ClearFlag + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_GetITStatus + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ClearITPendingBit + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_info 0x00000000 0x903 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_abbrev 0x00000000 0x1b5 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_loc 0x00000000 0x421 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_aranges + 0x00000000 0x108 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_ranges 0x00000000 0xf8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x17e .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x3c9 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_line 0x00000000 0x692 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_str 0x00000000 0x3f39a .\..\obj\lib\spl\src\stm32f0xx_adc.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_frame 0x00000000 0x200 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_DeInit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_Init + 0x00000000 0x10c .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_FilterInit + 0x00000000 0xfc .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_StructInit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_SlaveStartBank + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_DBGFreeze + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_TTComModeCmd + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_Transmit + 0x00000000 0xdc .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_TransmitStatus + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_CancelTransmit + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_Receive + 0x00000000 0x94 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_FIFORelease + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_MessagePending + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_OperatingModeRequest + 0x00000000 0xac .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_Sleep + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_WakeUp + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_GetLastErrorCode + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_GetReceiveErrorCounter + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_GetLSBTransmitErrorCounter + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_ITConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_GetFlagStatus + 0x00000000 0x64 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_ClearFlag + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_GetITStatus + 0x00000000 0x104 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_ClearITPendingBit + 0x00000000 0xbc .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_info 0x00000000 0xee8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_abbrev 0x00000000 0x264 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_loc 0x00000000 0xd5a .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_aranges + 0x00000000 0xd8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_ranges 0x00000000 0xc8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x1c6 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x3c9 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_line 0x00000000 0x7b5 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_str 0x00000000 0x3f68f .\..\obj\lib\spl\src\stm32f0xx_can.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_can.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_frame 0x00000000 0x1d8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_DeInit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_Init + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_StructInit + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_Cmd 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_ListenModeCmd + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_OwnAddressConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_OwnAddressClear + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_SendData + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_ReceiveData + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_StartOfMessage + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_EndOfMessage + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_ITConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_GetFlagStatus + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_ClearFlag + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_GetITStatus + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_ClearITPendingBit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_info 0x00000000 0x47e .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_abbrev 0x00000000 0x1e4 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_loc 0x00000000 0x194 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_aranges + 0x00000000 0x98 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_ranges 0x00000000 0x88 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x17e .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x18b .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_line 0x00000000 0x561 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_str 0x00000000 0x3f18f .\..\obj\lib\spl\src\stm32f0xx_cec.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_frame 0x00000000 0x120 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_DeInit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_Init + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_StructInit + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_Cmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_SwitchCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_GetOutputLevel + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_WindowCmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_LockConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_info 0x00000000 0x27e .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_abbrev 0x00000000 0x17f .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_loc 0x00000000 0x141 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_aranges + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_ranges 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x178 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0xe9 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_line 0x00000000 0x4b4 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_str 0x00000000 0x3f02d .\..\obj\lib\spl\src\stm32f0xx_comp.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_frame 0x00000000 0x9c .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_DeInit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_ResetDR + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_PolynomialSizeSelect + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_ReverseInputDataSelect + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_ReverseOutputDataCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_SetInitRegister + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_SetPolynomial + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_CalcCRC + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_CalcCRC16bits + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_CalcCRC8bits + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_CalcBlockCRC + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_GetCRC + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_SetIDRegister + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_GetIDRegister + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_info 0x00000000 0x375 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_abbrev 0x00000000 0x190 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_loc 0x00000000 0x154 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_aranges + 0x00000000 0x88 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_ranges 0x00000000 0x78 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x172 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_line 0x00000000 0x528 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_str 0x00000000 0x3f0b6 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_frame 0x00000000 0xf8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_DeInit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_AdjustHSI48CalibrationValue + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_FrequencyErrorCounterCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_AutomaticCalibrationCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_SoftwareSynchronizationGenerate + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_FrequencyErrorCounterReload + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_FrequencyErrorLimitConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_SynchronizationPrescalerConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_SynchronizationSourceConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_SynchronizationPolarityConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetReloadValue + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetHSI48CalibrationValue + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetFrequencyErrorValue + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetFrequencyErrorDirection + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_ITConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetFlagStatus + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_ClearFlag + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetITStatus + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_ClearITPendingBit + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_info 0x00000000 0x400 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_abbrev 0x00000000 0x192 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_loc 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_aranges + 0x00000000 0xb0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_ranges 0x00000000 0xa0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x178 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0xd3 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_line 0x00000000 0x576 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_str 0x00000000 0x3f1c7 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_frame 0x00000000 0x148 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_DeInit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_Init + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_StructInit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_Cmd 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_SoftwareTriggerCmd + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_DualSoftwareTriggerCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_WaveGenerationCmd + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_SetChannel1Data + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_SetChannel2Data + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_SetDualChannelData + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_GetDataOutputValue + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_DMACmd + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_ITConfig + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_GetFlagStatus + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_ClearFlag + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_GetITStatus + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_ClearITPendingBit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_info 0x00000000 0x67a .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_abbrev 0x00000000 0x1c1 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_loc 0x00000000 0x603 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_aranges + 0x00000000 0xa0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_ranges 0x00000000 0x90 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x1a0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x17e .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_line 0x00000000 0x581 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_str 0x00000000 0x3f2c1 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_frame 0x00000000 0x140 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text.DBGMCU_GetREVID + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text.DBGMCU_GetDEVID + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text.DBGMCU_Config + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text.DBGMCU_APB1PeriphConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text.DBGMCU_APB2PeriphConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_info 0x00000000 0x1b9 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_abbrev 0x00000000 0xf9 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_loc 0x00000000 0xae .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_aranges + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_ranges 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x178 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x76 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_line 0x00000000 0x472 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_str 0x00000000 0x3efb7 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_frame 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_DeInit + 0x00000000 0xc0 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_Init + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_StructInit + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_Cmd 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_SetCurrDataCounter + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_GetCurrDataCounter + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_ITConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_GetFlagStatus + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_ClearFlag + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_GetITStatus + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_ClearITPendingBit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_info 0x00000000 0x42d .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_abbrev 0x00000000 0x170 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_loc 0x00000000 0x145 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_aranges + 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_ranges 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x1a2 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x28f .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_line 0x00000000 0x509 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_str 0x00000000 0x3f3d9 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_frame 0x00000000 0xc8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_DeInit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_Init + 0x00000000 0x74 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_StructInit + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_GenerateSWInterrupt + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_GetFlagStatus + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_ClearFlag + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_GetITStatus + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_ClearITPendingBit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_info 0x00000000 0x317 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_abbrev 0x00000000 0x1b5 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_loc 0x00000000 0x17b .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_aranges + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_ranges 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x178 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0xcf .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_line 0x00000000 0x4b8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_str 0x00000000 0x3f0bc .\..\obj\lib\spl\src\stm32f0xx_exti.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_frame 0x00000000 0x98 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_SetLatency + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_PrefetchBufferCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_GetPrefetchBufferStatus + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_Unlock + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_Lock + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_Launch + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_GetUser + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_GetWRP + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_GetRDP + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_ITConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_GetFlagStatus + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_EraseAllPages + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_ProgramHalfWord + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_Erase + 0x00000000 0x80 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_EnableWRP + 0x00000000 0xa0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_RDPConfig + 0x00000000 0x74 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_UserConfig + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_BOOTConfig + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_BOOT0Config + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_BOOT0SWConfig + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_VDDAConfig + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_SRAMParityConfig + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_WriteUser + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_ProgramData + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_DeInit + 0x00000000 0xc0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_StructInit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_PinLockConfig + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_ReadInputData + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_ReadOutputDataBit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_ReadOutputData + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_WriteBit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_Write + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_DeInit + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_Init + 0x00000000 0x64 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_StructInit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_Cmd 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_SoftwareResetCmd + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ITConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_StretchClockCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_StopModeCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_DualAddressCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_OwnAddress2Config + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GeneralCallCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_SlaveByteControlCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_SlaveAddressConfig + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_10BitAddressingModeCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_AutoEndCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ReloadCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_NumberOfBytesConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_MasterRequestConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GenerateSTART + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GenerateSTOP + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_10BitAddressHeaderCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_AcknowledgeConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GetAddressMatched + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GetTransferDirection + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_TransferHandling + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_SMBusAlertCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ClockTimeoutCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ExtendedClockTimeoutCmd + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_IdleClockTimeoutCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_TimeoutAConfig + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_TimeoutBConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_CalculatePEC + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_PECRequestCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GetPEC + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ReadRegister + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_SendData + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ReceiveData + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_DMACmd + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GetFlagStatus + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ClearFlag + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GetITStatus + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ClearITPendingBit + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_info 0x00000000 0xc16 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_abbrev 0x00000000 0x1b2 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_loc 0x00000000 0x5e7 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_aranges + 0x00000000 0x168 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_ranges 0x00000000 0x158 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x190 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x29a .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_line 0x00000000 0x78b .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_str 0x00000000 0x3f478 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_frame 0x00000000 0x2dc .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_WriteAccessCmd + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_SetPrescaler + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_SetReload + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_ReloadCounter + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_SetWindowValue + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_Enable + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_GetFlagStatus + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_info 0x00000000 0x219 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_abbrev 0x00000000 0x111 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_loc 0x00000000 0x4b .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_aranges + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_ranges 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x17e .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x6a .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_line 0x00000000 0x491 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_str 0x00000000 0x3f021 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_frame 0x00000000 0x80 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .text.NVIC_Init + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .text.NVIC_SystemLPConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_misc.o + .text.SysTick_CLKSourceConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_info 0x00000000 0x371 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_abbrev 0x00000000 0x157 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_loc 0x00000000 0x7b .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_aranges + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_ranges 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x172 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_line 0x00000000 0x450 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_str 0x00000000 0x3f061 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_frame 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_DeInit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_BackupAccessCmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_PVDLevelConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_PVDCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_WakeUpPinCmd + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_EnterSleepMode + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_EnterSTOPMode + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_EnterSTANDBYMode + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_GetFlagStatus + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_ClearFlag + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_info 0x00000000 0x420 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_abbrev 0x00000000 0x1b5 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_loc 0x00000000 0x1ad .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_aranges + 0x00000000 0x68 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_ranges 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x17e .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_line 0x00000000 0x50b .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_str 0x00000000 0x3f0e2 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_frame 0x00000000 0xc0 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_DeInit + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HSEConfig + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_AdjustHSICalibrationValue + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HSICmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_AdjustHSI14CalibrationValue + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HSI14Cmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HSI14ADCRequestCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_LSEConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_LSEDriveConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_LSICmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_PLLConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_PLLCmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HSI48Cmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_PREDIV1Config + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_ClockSecuritySystemCmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_MCOConfig + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_SYSCLKConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_GetSYSCLKSource + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HCLKConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_PCLKConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_ADCCLKConfig + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_CECCLKConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_I2CCLKConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_USARTCLKConfig + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_USBCLKConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_RTCCLKConfig + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_RTCCLKCmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_BackupResetCmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_AHBPeriphResetCmd + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_APB2PeriphResetCmd + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_APB1PeriphResetCmd + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_ITConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_GetFlagStatus + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_WaitForHSEStartUp + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_ClearFlag + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_GetITStatus + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_ClearITPendingBit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ByteToBcd2 + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_Bcd2ToByte + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_StructInit + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_WriteProtectionCmd + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_EnterInitMode + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ExitInitMode + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_Init + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_WaitForSynchro + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_DeInit + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_RefClockCmd + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_BypassShadowCmd + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SetTime + 0x00000000 0xa8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TimeStructInit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetTime + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetSubSecond + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SetDate + 0x00000000 0x9c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_DateStructInit + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetDate + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SetAlarm + 0x00000000 0xa0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_AlarmStructInit + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetAlarm + 0x00000000 0x68 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_AlarmCmd + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_AlarmSubSecondConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetAlarmSubSecond + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_WakeUpClockConfig + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SetWakeUpCounter + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetWakeUpCounter + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_WakeUpCmd + 0x00000000 0x68 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_DayLightSavingConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetStoreOperation + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_OutputConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_CalibOutputCmd + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_CalibOutputConfig + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SmoothCalibConfig + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TimeStampCmd + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetTimeStamp + 0x00000000 0x78 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetTimeStampSubSecond + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperTriggerConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperCmd + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperFilterConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperSamplingFreqConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperPinsPrechargeDuration + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TimeStampOnTamperDetectionCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperPullUpCmd + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_WriteBackupRegister + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ReadBackupRegister + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_OutputTypeConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SynchroShiftConfig + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ITConfig + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetFlagStatus + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ClearFlag + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetITStatus + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ClearITPendingBit + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_info 0x00000000 0x10fb .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_abbrev 0x00000000 0x1e0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_loc 0x00000000 0xf6f .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_aranges + 0x00000000 0x1c0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_ranges 0x00000000 0x1b0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x1b2 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x4bf .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_line 0x00000000 0x9de .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_str 0x00000000 0x3f9b4 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_frame 0x00000000 0x450 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_DeInit + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_StructInit + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_Init + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.I2S_StructInit + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.I2S_Init + 0x00000000 0xb4 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_Cmd 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_TIModeCmd + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.I2S_Cmd 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_DataSizeConfig + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_RxFIFOThresholdConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_BiDirectionalLineConfig + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_NSSInternalSoftwareConfig + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_SSOutputCmd + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_NSSPulseModeCmd + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_SendData8 + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_SendData16 + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_ReceiveData8 + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_ReceiveData16 + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_CRCLengthConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_CalculateCRC + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_TransmitCRC + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_GetCRC + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_GetCRCPolynomial + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_DMACmd + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_LastDMATransferCmd + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_ITConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_GetTransmissionFIFOStatus + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_GetReceptionFIFOStatus + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_GetFlagStatus + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_ClearFlag + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_GetITStatus + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_info 0x00000000 0xb64 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_abbrev 0x00000000 0x1ea .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_loc 0x00000000 0x647 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_aranges + 0x00000000 0x110 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_ranges 0x00000000 0x100 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x18a .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x390 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_line 0x00000000 0x6c4 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_str 0x00000000 0x3f55a .\..\obj\lib\spl\src\stm32f0xx_spi.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_frame 0x00000000 0x22c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_DeInit + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_DMAChannelRemapConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_I2CFastModePlusConfig + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_EXTILineConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_BreakConfig + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_GetFlagStatus + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_ClearFlag + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TI1_Config + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TI2_Config + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_DeInit + 0x00000000 0x110 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_TimeBaseInit + 0x00000000 0x88 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_TimeBaseStructInit + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_PrescalerConfig + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_CounterModeConfig + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetCounter + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetAutoreload + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetCounter + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetPrescaler + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_UpdateDisableConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_UpdateRequestConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ARRPreloadConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectOnePulseMode + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetClockDivision + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_Cmd 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_BDTRConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_BDTRStructInit + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_CtrlPWMOutputs + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC1Init + 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC2Init + 0x00000000 0xa0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC3Init + 0x00000000 0x84 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC4Init + 0x00000000 0x64 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OCStructInit + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectOCxM + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetCompare1 + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetCompare2 + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetCompare3 + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetCompare4 + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ForcedOC1Config + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ForcedOC2Config + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ForcedOC3Config + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ForcedOC4Config + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_CCPreloadControl + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC1PreloadConfig + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC2PreloadConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC3PreloadConfig + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC4PreloadConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC1FastConfig + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC2FastConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC3FastConfig + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC4FastConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearOC1Ref + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearOC2Ref + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearOC3Ref + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearOC4Ref + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC1PolarityConfig + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC1NPolarityConfig + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC2PolarityConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC2NPolarityConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC3PolarityConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC3NPolarityConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC4PolarityConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectOCREFClear + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_CCxCmd + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_CCxNCmd + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectCOM + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ICStructInit + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetCapture1 + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetCapture2 + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetCapture3 + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetCapture4 + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetIC1Prescaler + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetIC2Prescaler + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_PWMIConfig + 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetIC3Prescaler + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetIC4Prescaler + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ICInit + 0x00000000 0xcc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ITConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GenerateEvent + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetFlagStatus + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearFlag + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetITStatus + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearITPendingBit + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_DMAConfig + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_DMACmd + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectCCDMA + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_InternalClockConfig + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ITRxExternalClockConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_TIxExternalClockConfig + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectInputTrigger + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectOutputTrigger + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectSlaveMode + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectMasterSlaveMode + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ETRConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ETRClockMode1Config + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ETRClockMode2Config + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_EncoderInterfaceConfig + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectHallSensor + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_RemapConfig + 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_info 0x00000000 0x20ed .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_abbrev 0x00000000 0x26b .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_loc 0x00000000 0x1b7f .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_aranges + 0x00000000 0x2f0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_ranges 0x00000000 0x2e0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x18e .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x74a .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_line 0x00000000 0xc46 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_str 0x00000000 0x3fbf8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_frame 0x00000000 0x690 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DeInit + 0x00000000 0x84 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_StructInit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ClockInit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ClockStructInit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DirectionModeCmd + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_OverSampling8Cmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_OneBitMethodCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_MSBFirstCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DataInvCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_InvPinCmd + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SWAPPinCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ReceiverTimeOutCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetReceiverTimeOut + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetPrescaler + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_STOPModeCmd + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_StopModeWakeUpSourceConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_AutoBaudRateCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_AutoBaudRateConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetAddress + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_MuteModeCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_MuteModeWakeUpConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_AddressDetectionConfig + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_LINBreakDetectLengthConfig + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_LINCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_HalfDuplexCmd + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetGuardTime + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SmartCardCmd + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SmartCardNACKCmd + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetAutoRetryCount + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetBlockLength + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_IrDAConfig + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_IrDACmd + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DECmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DEPolarityConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetDEAssertionTime + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetDEDeassertionTime + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DMACmd + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DMAReceptionErrorConfig + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ITConfig + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_RequestCmd + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ClearFlag + 0x00000000 0x4 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_GetITStatus + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ClearITPendingBit + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_DeInit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_SetPrescaler + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_SetWindowValue + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_EnableIT + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_SetCounter + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_Enable + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_GetFlagStatus + 0x00000000 0x10 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_ClearFlag + 0x00000000 0xc .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_info 0x00000000 0x293 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_abbrev 0x00000000 0x167 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_loc 0x00000000 0xd1 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_aranges + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_ranges 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x2e .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_line 0x00000000 0x4a7 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_str 0x00000000 0x3f061 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_frame 0x00000000 0x9c .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .text 0x00000000 0x0 .\..\obj\lib\system_stm32f0xx.o + .data 0x00000000 0x0 .\..\obj\lib\system_stm32f0xx.o + .bss 0x00000000 0x0 .\..\obj\lib\system_stm32f0xx.o + .text.SystemCoreClockUpdate + 0x00000000 0x90 .\..\obj\lib\system_stm32f0xx.o + .bss.HSEStatus + 0x00000000 0x4 .\..\obj\lib\system_stm32f0xx.o + .data.AHBPrescTable + 0x00000000 0x10 .\..\obj\lib\system_stm32f0xx.o + .bss.StartUpCounter + 0x00000000 0x4 .\..\obj\lib\system_stm32f0xx.o + .data.SystemCoreClock + 0x00000000 0x4 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0xef .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .text 0x00000000 0x0 .\..\obj\main.o + .data 0x00000000 0x0 .\..\obj\main.o + .bss 0x00000000 0x0 .\..\obj\main.o + .debug_macro 0x00000000 0x826 .\..\obj\main.o + .debug_macro 0x00000000 0x1c .\..\obj\main.o + .debug_macro 0x00000000 0x1c .\..\obj\main.o + .debug_macro 0x00000000 0x22 .\..\obj\main.o + .debug_macro 0x00000000 0x66 .\..\obj\main.o + .debug_macro 0x00000000 0x50 .\..\obj\main.o + .debug_macro 0x00000000 0x1c .\..\obj\main.o + .debug_macro 0x00000000 0xa1 .\..\obj\main.o + .debug_macro 0x00000000 0x28 .\..\obj\main.o + .debug_macro 0x00000000 0x8c .\..\obj\main.o + .debug_macro 0x00000000 0x34 .\..\obj\main.o + .debug_macro 0x00000000 0x16 .\..\obj\main.o + .debug_macro 0x00000000 0x44 .\..\obj\main.o + .debug_macro 0x00000000 0x209 .\..\obj\main.o + .debug_macro 0x00000000 0x249 .\..\obj\main.o + .debug_macro 0x00000000 0x5b9e .\..\obj\main.o + .debug_macro 0x00000000 0x2eb .\..\obj\main.o + .debug_macro 0x00000000 0x3cf .\..\obj\main.o + .debug_macro 0x00000000 0x191 .\..\obj\main.o + .debug_macro 0x00000000 0x46 .\..\obj\main.o + .debug_macro 0x00000000 0xd9 .\..\obj\main.o + .debug_macro 0x00000000 0xef .\..\obj\main.o + .debug_macro 0x00000000 0x184 .\..\obj\main.o + .debug_macro 0x00000000 0x7c .\..\obj\main.o + .debug_macro 0x00000000 0x295 .\..\obj\main.o + .debug_macro 0x00000000 0xd5 .\..\obj\main.o + .debug_macro 0x00000000 0x2b7 .\..\obj\main.o + .debug_macro 0x00000000 0x185 .\..\obj\main.o + .debug_macro 0x00000000 0x184 .\..\obj\main.o + .debug_macro 0x00000000 0x2a0 .\..\obj\main.o + .debug_macro 0x00000000 0x70 .\..\obj\main.o + .debug_macro 0x00000000 0xdf .\..\obj\main.o + .debug_macro 0x00000000 0x4e3 .\..\obj\main.o + .debug_macro 0x00000000 0x4c5 .\..\obj\main.o + .debug_macro 0x00000000 0x396 .\..\obj\main.o + .debug_macro 0x00000000 0x750 .\..\obj\main.o + .debug_macro 0x00000000 0x353 .\..\obj\main.o + .debug_macro 0x00000000 0x34 .\..\obj\main.o + .debug_macro 0x00000000 0x3a .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .text 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .text.CpuReset + 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x826 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x22 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x66 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x50 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0xa1 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x28 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x8c .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x34 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x16 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x44 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x209 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x249 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x5b9e .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x2eb .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x3cf .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x191 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x46 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0xd9 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0xef .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x184 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x7c .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x295 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0xd5 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x2b7 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x185 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x184 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x2a0 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x70 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0xdf .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x4e3 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x4c5 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x396 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x750 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x353 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x34 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x00000000 0x3a .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .text 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x826 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x22 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x66 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x50 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0xa1 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x28 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x8c .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x34 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x16 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x44 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x209 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x249 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x5b9e .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x2eb .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x3cf .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x191 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x46 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0xd9 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0xef .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x184 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x7c .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x295 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0xd5 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x2b7 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x185 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x184 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x2a0 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x70 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0xdf .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x4e3 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x4c5 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x396 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x750 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x353 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x34 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x00000000 0x3a .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .text 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_macro 0x00000000 0x826 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_macro 0x00000000 0x22 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_macro 0x00000000 0x66 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_macro 0x00000000 0x50 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_macro 0x00000000 0xa1 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_macro 0x00000000 0x28 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .text 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x826 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x22 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x66 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x50 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0xa1 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x28 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x8c .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x34 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x16 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x44 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x209 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x249 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x5b9e .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x2eb .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x3cf .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x191 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x46 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0xd9 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0xef .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x184 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x7c .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x295 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0xd5 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x2b7 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x185 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x184 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x2a0 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x70 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0xdf .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x4e3 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x4c5 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x396 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x750 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x353 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x34 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x00000000 0x3a .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .text 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x826 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x22 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x66 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x50 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0xa1 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x28 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x8c .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x34 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x16 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x44 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x209 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x249 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x5b9e .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x2eb .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x3cf .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x191 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x46 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0xd9 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0xef .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x184 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x7c .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x295 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0xd5 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x2b7 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x185 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x184 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x2a0 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x70 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0xdf .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x4e3 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x4c5 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x396 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x750 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x353 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x34 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x00000000 0x3a .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\assert.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\assert.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\assert.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\assert.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\assert.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\assert.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\assert.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\assert.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\assert.o + .text 0x00000000 0x0 .\..\obj\~#\~#\~#\source\assert.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\assert.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\assert.o + .debug_macro 0x00000000 0x826 .\..\obj\~#\~#\~#\source\assert.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\assert.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\assert.o + .debug_macro 0x00000000 0x22 .\..\obj\~#\~#\~#\source\assert.o + .debug_macro 0x00000000 0x66 .\..\obj\~#\~#\~#\source\assert.o + .debug_macro 0x00000000 0x50 .\..\obj\~#\~#\~#\source\assert.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\assert.o + .debug_macro 0x00000000 0xa1 .\..\obj\~#\~#\~#\source\assert.o + .debug_macro 0x00000000 0x28 .\..\obj\~#\~#\~#\source\assert.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\backdoor.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\backdoor.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\backdoor.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\backdoor.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\backdoor.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\backdoor.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\backdoor.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\backdoor.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\backdoor.o + .text 0x00000000 0x0 .\..\obj\~#\~#\~#\source\backdoor.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\backdoor.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_macro 0x00000000 0x826 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\backdoor.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\backdoor.o + .debug_macro 0x00000000 0x22 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_macro 0x00000000 0x66 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_macro 0x00000000 0x50 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\backdoor.o + .debug_macro 0x00000000 0xa1 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_macro 0x00000000 0x28 .\..\obj\~#\~#\~#\source\backdoor.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\boot.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\boot.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\boot.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\boot.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\boot.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\boot.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\boot.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\boot.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\boot.o + .text 0x00000000 0x0 .\..\obj\~#\~#\~#\source\boot.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\boot.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\boot.o + .debug_macro 0x00000000 0x826 .\..\obj\~#\~#\~#\source\boot.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\boot.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\boot.o + .debug_macro 0x00000000 0x22 .\..\obj\~#\~#\~#\source\boot.o + .debug_macro 0x00000000 0x66 .\..\obj\~#\~#\~#\source\boot.o + .debug_macro 0x00000000 0x50 .\..\obj\~#\~#\~#\source\boot.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\boot.o + .debug_macro 0x00000000 0xa1 .\..\obj\~#\~#\~#\source\boot.o + .debug_macro 0x00000000 0x28 .\..\obj\~#\~#\~#\source\boot.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\com.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\com.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\com.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\com.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\com.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\com.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\com.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\com.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\com.o + .text 0x00000000 0x0 .\..\obj\~#\~#\~#\source\com.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\com.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\com.o + .debug_macro 0x00000000 0x826 .\..\obj\~#\~#\~#\source\com.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\com.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\com.o + .debug_macro 0x00000000 0x22 .\..\obj\~#\~#\~#\source\com.o + .debug_macro 0x00000000 0x66 .\..\obj\~#\~#\~#\source\com.o + .debug_macro 0x00000000 0x50 .\..\obj\~#\~#\~#\source\com.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\com.o + .debug_macro 0x00000000 0xa1 .\..\obj\~#\~#\~#\source\com.o + .debug_macro 0x00000000 0x28 .\..\obj\~#\~#\~#\source\com.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\cop.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\cop.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\cop.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\cop.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\cop.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\cop.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\cop.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\cop.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\cop.o + .text 0x00000000 0x0 .\..\obj\~#\~#\~#\source\cop.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\cop.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\cop.o + .debug_macro 0x00000000 0x826 .\..\obj\~#\~#\~#\source\cop.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\cop.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\cop.o + .debug_macro 0x00000000 0x22 .\..\obj\~#\~#\~#\source\cop.o + .debug_macro 0x00000000 0x66 .\..\obj\~#\~#\~#\source\cop.o + .debug_macro 0x00000000 0x50 .\..\obj\~#\~#\~#\source\cop.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\cop.o + .debug_macro 0x00000000 0xa1 .\..\obj\~#\~#\~#\source\cop.o + .debug_macro 0x00000000 0x28 .\..\obj\~#\~#\~#\source\cop.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\xcp.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\xcp.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\xcp.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\xcp.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\xcp.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\xcp.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\xcp.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\xcp.o + .group 0x00000000 0x8 .\..\obj\~#\~#\~#\source\xcp.o + .text 0x00000000 0x0 .\..\obj\~#\~#\~#\source\xcp.o + .data 0x00000000 0x0 .\..\obj\~#\~#\~#\source\xcp.o + .bss 0x00000000 0x0 .\..\obj\~#\~#\~#\source\xcp.o + .debug_macro 0x00000000 0x826 .\..\obj\~#\~#\~#\source\xcp.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\xcp.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\xcp.o + .debug_macro 0x00000000 0x22 .\..\obj\~#\~#\~#\source\xcp.o + .debug_macro 0x00000000 0x66 .\..\obj\~#\~#\~#\source\xcp.o + .debug_macro 0x00000000 0x50 .\..\obj\~#\~#\~#\source\xcp.o + .debug_macro 0x00000000 0x1c .\..\obj\~#\~#\~#\source\xcp.o + .debug_macro 0x00000000 0xa1 .\..\obj\~#\~#\~#\source\xcp.o + .debug_macro 0x00000000 0x28 .\..\obj\~#\~#\~#\source\xcp.o + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_dvmd_tls.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_dvmd_tls.o) + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + .data._impure_ptr + 0x00000000 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + .jcr 0x00000000 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + +Memory Configuration + +Name Origin Length Attributes +ROM 0x08000000 0x00002000 xr +RAM 0x200000c0 0x00000f40 xrw +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + 0x00000000 __HEAP_SIZE = 0x0 + 0x00000100 __STACK_SIZE = 0x100 + +.text 0x08000000 0x1714 + *(.isr_vector) + .isr_vector 0x08000000 0xc0 .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o + 0x08000000 __isr_vector + *(.text*) + .text 0x080000c0 0x60 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + .text 0x08000120 0x78 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + 0x08000120 _start + 0x08000120 _mainCRTStartup + .text.CpuUserProgramStartHook + 0x08000198 0x1c .\..\obj\hooks.o + 0x08000198 CpuUserProgramStartHook + .text.CopInitHook + 0x080001b4 0xc .\..\obj\hooks.o + 0x080001b4 CopInitHook + .text.CopServiceHook + 0x080001c0 0x8 .\..\obj\hooks.o + 0x080001c0 CopServiceHook + .text.LedBlinkInit + 0x080001c8 0xc .\..\obj\led.o + 0x080001c8 LedBlinkInit + .text.LedBlinkTask + 0x080001d4 0x58 .\..\obj\led.o + 0x080001d4 LedBlinkTask + .text.LedBlinkExit + 0x0800022c 0x14 .\..\obj\led.o + 0x0800022c LedBlinkExit + .text.FLASH_Unlock + 0x08000240 0x20 .\..\obj\lib\spl\src\stm32f0xx_flash.o + 0x08000240 FLASH_Unlock + .text.FLASH_Lock + 0x08000260 0x10 .\..\obj\lib\spl\src\stm32f0xx_flash.o + 0x08000260 FLASH_Lock + .text.FLASH_ClearFlag + 0x08000270 0xc .\..\obj\lib\spl\src\stm32f0xx_flash.o + 0x08000270 FLASH_ClearFlag + .text.FLASH_GetStatus + 0x0800027c 0x28 .\..\obj\lib\spl\src\stm32f0xx_flash.o + 0x0800027c FLASH_GetStatus + .text.FLASH_WaitForLastOperation + 0x080002a4 0x28 .\..\obj\lib\spl\src\stm32f0xx_flash.o + 0x080002a4 FLASH_WaitForLastOperation + .text.FLASH_ErasePage + 0x080002cc 0x38 .\..\obj\lib\spl\src\stm32f0xx_flash.o + 0x080002cc FLASH_ErasePage + .text.FLASH_ProgramWord + 0x08000304 0x64 .\..\obj\lib\spl\src\stm32f0xx_flash.o + 0x08000304 FLASH_ProgramWord + .text.GPIO_Init + 0x08000368 0xa4 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + 0x08000368 GPIO_Init + .text.GPIO_ReadInputDataBit + 0x0800040c 0xc .\..\obj\lib\spl\src\stm32f0xx_gpio.o + 0x0800040c GPIO_ReadInputDataBit + .text.GPIO_SetBits + 0x08000418 0x4 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + 0x08000418 GPIO_SetBits + .text.GPIO_ResetBits + 0x0800041c 0x4 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + 0x0800041c GPIO_ResetBits + .text.GPIO_PinAFConfig + 0x08000420 0x24 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + 0x08000420 GPIO_PinAFConfig + .text.RCC_GetClocksFreq + 0x08000444 0x19c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + 0x08000444 RCC_GetClocksFreq + .text.RCC_AHBPeriphClockCmd + 0x080005e0 0x1c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + 0x080005e0 RCC_AHBPeriphClockCmd + .text.RCC_APB2PeriphClockCmd + 0x080005fc 0x1c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + 0x080005fc RCC_APB2PeriphClockCmd + .text.RCC_APB1PeriphClockCmd + 0x08000618 0x1c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + 0x08000618 RCC_APB1PeriphClockCmd + .text.SYSCFG_MemoryRemapConfig + 0x08000634 0x14 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + 0x08000634 SYSCFG_MemoryRemapConfig + .text.USART_Init + 0x08000648 0xd4 .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x08000648 USART_Init + .text.USART_Cmd + 0x0800071c 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x0800071c USART_Cmd + .text.USART_SendData + 0x08000734 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x08000734 USART_SendData + .text.USART_ReceiveData + 0x0800073c 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x0800073c USART_ReceiveData + .text.USART_OverrunDetectionConfig + 0x08000744 0x14 .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x08000744 USART_OverrunDetectionConfig + .text.USART_GetFlagStatus + 0x08000758 0xc .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x08000758 USART_GetFlagStatus + .text.SystemInit + 0x08000764 0xbc .\..\obj\lib\system_stm32f0xx.o + 0x08000764 SystemInit + .text.main 0x08000820 0xa0 .\..\obj\main.o + 0x08000820 main + .text.CpuMemCopy + 0x080008c0 0x24 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + 0x080008c0 CpuMemCopy + .text.CpuStartUserProgram + 0x080008e4 0x44 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + 0x080008e4 CpuStartUserProgram + .text.FlashGetSector + 0x08000928 0x38 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .text.FlashWriteBlock + 0x08000960 0x84 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .text.FlashSwitchBlock + 0x080009e4 0x54 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .text.FlashAddToBlock + 0x08000a38 0x90 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .text.FlashInit + 0x08000ac8 0x18 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + 0x08000ac8 FlashInit + .text.FlashWrite + 0x08000ae0 0x58 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + 0x08000ae0 FlashWrite + .text.FlashErase + 0x08000b38 0x118 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + 0x08000b38 FlashErase + .text.FlashWriteChecksum + 0x08000c50 0x44 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + 0x08000c50 FlashWriteChecksum + .text.FlashVerifyChecksum + 0x08000c94 0x58 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + 0x08000c94 FlashVerifyChecksum + .text.FlashDone + 0x08000cec 0x34 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + 0x08000cec FlashDone + .text.FlashGetUserProgBaseAddress + 0x08000d20 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + 0x08000d20 FlashGetUserProgBaseAddress + .text 0x08000d28 0xa8 .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o + 0x08000d28 Reset_Handler + 0x08000d7a NMI_Handler + 0x08000d7c HardFault_Handler + 0x08000d7e SVC_Handler + 0x08000d80 PendSV_Handler + 0x08000d82 SysTick_Handler + 0x08000d84 Default_Handler + 0x08000d86 WWDG_IRQHandler + 0x08000d88 PVD_IRQHandler + 0x08000d8a RTC_IRQHandler + 0x08000d8c FLASH_IRQHandler + 0x08000d8e RCC_IRQHandler + 0x08000d90 EXTI0_1_IRQHandler + 0x08000d92 EXTI2_3_IRQHandler + 0x08000d94 EXTI4_15_IRQHandler + 0x08000d96 TS_IRQHandler + 0x08000d98 DMA1_Channel1_IRQHandler + 0x08000d9a DMA1_Channel2_3_IRQHandler + 0x08000d9c DMA1_Channel4_5_IRQHandler + 0x08000d9e ADC1_COMP_IRQHandler + 0x08000da0 TIM1_BRK_UP_TRG_COM_IRQHandler + 0x08000da2 TIM1_CC_IRQHandler + 0x08000da4 TIM2_IRQHandler + 0x08000da6 TIM3_IRQHandler + 0x08000da8 TIM6_DAC_IRQHandler + 0x08000daa TIM7_IRQHandler + 0x08000dac TIM14_IRQHandler + 0x08000dae TIM15_IRQHandler + 0x08000db0 TIM16_IRQHandler + 0x08000db2 TIM17_IRQHandler + 0x08000db4 I2C1_IRQHandler + 0x08000db6 I2C2_IRQHandler + 0x08000db8 SPI1_IRQHandler + 0x08000dba SPI2_IRQHandler + 0x08000dbc USART1_IRQHandler + 0x08000dbe USART2_IRQHandler + 0x08000dc0 USART3_4_IRQHandler + 0x08000dc2 CEC_IRQHandler + 0x08000dc4 USB_IRQHandler + .text.NvmInit 0x08000dd0 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + 0x08000dd0 NvmInit + .text.NvmWrite + 0x08000dd8 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + 0x08000dd8 NvmWrite + .text.NvmErase + 0x08000de0 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + 0x08000de0 NvmErase + .text.NvmVerifyChecksum + 0x08000de8 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + 0x08000de8 NvmVerifyChecksum + .text.NvmGetUserProgBaseAddress + 0x08000df0 0x8 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + 0x08000df0 NvmGetUserProgBaseAddress + .text.NvmDone 0x08000df8 0x10 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + 0x08000df8 NvmDone + .text.TimerInit + 0x08000e08 0x24 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + 0x08000e08 TimerInit + .text.TimerReset + 0x08000e2c 0xc .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + 0x08000e2c TimerReset + .text.TimerUpdate + 0x08000e38 0x1c .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + 0x08000e38 TimerUpdate + .text.TimerGet + 0x08000e54 0x10 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + 0x08000e54 TimerGet + .text.UartTransmitByte + 0x08000e64 0x34 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .text.UartReceiveByte + 0x08000e98 0x24 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .text.UartInit + 0x08000ebc 0x3c .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + 0x08000ebc UartInit + .text.UartTransmitPacket + 0x08000ef8 0x50 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + 0x08000ef8 UartTransmitPacket + .text.UartReceivePacket + 0x08000f48 0xa0 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + 0x08000f48 UartReceivePacket + .text.AssertFailure + 0x08000fe8 0x18 .\..\obj\~#\~#\~#\source\assert.o + 0x08000fe8 AssertFailure + .text.BackDoorCheck + 0x08001000 0x38 .\..\obj\~#\~#\~#\source\backdoor.o + 0x08001000 BackDoorCheck + .text.BackDoorInit + 0x08001038 0x20 .\..\obj\~#\~#\~#\source\backdoor.o + 0x08001038 BackDoorInit + .text.BootInit + 0x08001058 0x18 .\..\obj\~#\~#\~#\source\boot.o + 0x08001058 BootInit + .text.BootTask + 0x08001070 0x14 .\..\obj\~#\~#\~#\source\boot.o + 0x08001070 BootTask + .text.ComInit 0x08001084 0x18 .\..\obj\~#\~#\~#\source\com.o + 0x08001084 ComInit + .text.ComTask 0x0800109c 0x24 .\..\obj\~#\~#\~#\source\com.o + 0x0800109c ComTask + .text.ComFree 0x080010c0 0x4 .\..\obj\~#\~#\~#\source\com.o + 0x080010c0 ComFree + .text.ComTransmitPacket + 0x080010c4 0x1c .\..\obj\~#\~#\~#\source\com.o + 0x080010c4 ComTransmitPacket + .text.ComGetActiveInterfaceMaxRxLen + 0x080010e0 0x18 .\..\obj\~#\~#\~#\source\com.o + 0x080010e0 ComGetActiveInterfaceMaxRxLen + .text.ComGetActiveInterfaceMaxTxLen + 0x080010f8 0x18 .\..\obj\~#\~#\~#\source\com.o + 0x080010f8 ComGetActiveInterfaceMaxTxLen + .text.ComIsConnected + 0x08001110 0x8 .\..\obj\~#\~#\~#\source\com.o + 0x08001110 ComIsConnected + .text.CopInit 0x08001118 0x8 .\..\obj\~#\~#\~#\source\cop.o + 0x08001118 CopInit + .text.CopService + 0x08001120 0x8 .\..\obj\~#\~#\~#\source\cop.o + 0x08001120 CopService + .text.XcpSetCtoError + 0x08001128 0x14 .\..\obj\~#\~#\~#\source\xcp.o + .text.XcpInit 0x0800113c 0x1c .\..\obj\~#\~#\~#\source\xcp.o + 0x0800113c XcpInit + .text.XcpIsConnected + 0x08001158 0x10 .\..\obj\~#\~#\~#\source\xcp.o + 0x08001158 XcpIsConnected + .text.XcpPacketTransmitted + 0x08001168 0x10 .\..\obj\~#\~#\~#\source\xcp.o + 0x08001168 XcpPacketTransmitted + .text.XcpPacketReceived + 0x08001178 0x2a8 .\..\obj\~#\~#\~#\source\xcp.o + 0x08001178 XcpPacketReceived + .text 0x08001420 0x9c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + 0x08001420 __aeabi_uidiv + 0x08001420 __udivsi3 + 0x080014a8 __aeabi_uidivmod + .text 0x080014bc 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_dvmd_tls.o) + 0x080014bc __aeabi_idiv0 + 0x080014bc __aeabi_ldiv0 + .text.exit 0x080014c0 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + 0x080014c0 exit + .text.__libc_init_array + 0x080014ec 0x4c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + 0x080014ec __libc_init_array + .text.memset 0x08001538 0x10 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + 0x08001538 memset + .text 0x08001548 0x2 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) + 0x08001548 _exit + *(.init) + *fill* 0x0800154a 0x2 + .init 0x0800154c 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + 0x0800154c _init + .init 0x08001550 0x8 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + *(.fini) + .fini 0x08001558 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + 0x08001558 _fini + .fini 0x0800155c 0x8 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend.o *crtend?.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend.o *crtend?.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + *(.rodata*) + .rodata.flashLayout + 0x08001564 0x9c .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .rodata.str1.4 + 0x08001600 0x28 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .rodata.XcpPacketReceived + 0x08001628 0xd8 .\..\obj\~#\~#\~#\source\xcp.o + .rodata.xcpStationId + 0x08001700 0x8 .\..\obj\~#\~#\~#\source\xcp.o + .rodata.str1.1 + 0x08001708 0x2 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + *fill* 0x0800170a 0x2 + .rodata._global_impure_ptr + 0x0800170c 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + 0x0800170c _global_impure_ptr + *(.eh_frame*) + .eh_frame 0x08001710 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + .eh_frame 0x08001710 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + +.glue_7 0x08001714 0x0 + .glue_7 0x00000000 0x0 linker stubs + +.glue_7t 0x08001714 0x0 + .glue_7t 0x00000000 0x0 linker stubs + +.vfp11_veneer 0x08001714 0x0 + .vfp11_veneer 0x00000000 0x0 linker stubs + +.v4_bx 0x08001714 0x0 + .v4_bx 0x00000000 0x0 linker stubs + +.iplt 0x08001714 0x0 + .iplt 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + +.ARM.extab + *(.ARM.extab* .gnu.linkonce.armextab.*) + 0x08001714 __exidx_start = . + +.ARM.exidx 0x08001714 0x8 + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + .ARM.exidx 0x08001714 0x8 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + 0x0800171c __exidx_end = . + 0x0800171c __etext = . + +.rel.dyn 0x0800171c 0x0 + .rel.iplt 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + +.data 0x200000c0 0x7c load address 0x0800171c + 0x200000c0 __data_start__ = . + *(vtable) + *(.data*) + .data.APBAHBPrescTable + 0x200000c0 0x10 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .data.comActiveInterface + 0x200000d0 0x1 .\..\obj\~#\~#\~#\source\com.o + *fill* 0x200000d1 0x3 + .data.impure_data + 0x200000d4 0x60 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + 0x20000134 . = ALIGN (0x4) + 0x20000134 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x20000134 PROVIDE (__preinit_array_end, .) + 0x20000134 . = ALIGN (0x4) + 0x20000134 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*)) + *(.init_array) + .init_array 0x20000134 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + 0x20000138 PROVIDE (__init_array_end, .) + 0x20000138 . = ALIGN (0x4) + 0x20000138 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*)) + *(.fini_array) + .fini_array 0x20000138 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + 0x2000013c PROVIDE (__fini_array_end, .) + 0x2000013c . = ALIGN (0x4) + 0x2000013c __data_end__ = . + +.jcr 0x2000013c 0x0 load address 0x08001798 + .jcr 0x2000013c 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + +.igot.plt 0x2000013c 0x0 load address 0x08001798 + .igot.plt 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + +.bss 0x2000013c 0x518 load address 0x08001798 + 0x2000013c __bss_start__ = . + *(.bss*) + .bss 0x2000013c 0x1c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + .bss.ledBlinkIntervalMs + 0x20000158 0x2 .\..\obj\led.o + .bss.ledOn.6429 + 0x2000015a 0x1 .\..\obj\led.o + *fill* 0x2000015b 0x1 + .bss.nextBlinkEvent.6430 + 0x2000015c 0x4 .\..\obj\led.o + .bss.bootBlockInfo + 0x20000160 0x204 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .bss.blockInfo + 0x20000364 0x204 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .bss.millisecond_counter + 0x20000568 0x4 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .bss.xcpCtoReqPacket.6438 + 0x2000056c 0x44 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .bss.xcpCtoRxInProgress.6440 + 0x200005b0 0x1 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .bss.xcpCtoRxLength.6439 + 0x200005b1 0x1 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + *fill* 0x200005b2 0x2 + .bss.xcpCtoRxStartTime.6441 + 0x200005b4 0x4 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .bss.assert_failure_file + 0x200005b8 0x4 .\..\obj\~#\~#\~#\source\assert.o + .bss.assert_failure_line + 0x200005bc 0x4 .\..\obj\~#\~#\~#\source\assert.o + .bss.backdoorOpen + 0x200005c0 0x1 .\..\obj\~#\~#\~#\source\backdoor.o + *fill* 0x200005c1 0x3 + .bss.backdoorOpenTime + 0x200005c4 0x4 .\..\obj\~#\~#\~#\source\backdoor.o + .bss.xcpCtoReqPacket.4159 + 0x200005c8 0x40 .\..\obj\~#\~#\~#\source\com.o + .bss.xcpInfo 0x20000608 0x4c .\..\obj\~#\~#\~#\source\xcp.o + *(COMMON) + 0x20000654 __bss_end__ = . + +.heap 0x20000658 0x0 + 0x20000658 __end__ = . + 0x20000658 end = __end__ + *(.heap*) + .heap 0x20000658 0x0 .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o + 0x20000658 __HeapLimit = . + +.stack_dummy 0x20000658 0x100 + *(.stack) + .stack 0x20000658 0x100 .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o + 0x20001000 __StackTop = (ORIGIN (RAM) + 0xf40) + 0x20000f00 __StackLimit = (__StackTop - SIZEOF (.stack_dummy)) + 0x20001000 PROVIDE (__stack, __StackTop) + 0x00000001 ASSERT ((__StackLimit >= __HeapLimit), region RAM overflowed with stack) +LOAD .\..\obj\hooks.o +LOAD .\..\obj\led.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_adc.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_can.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_cec.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_comp.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_crc.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_crs.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_dac.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_dma.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_exti.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_flash.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_gpio.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_i2c.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_iwdg.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_misc.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_pwr.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_rcc.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_rtc.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_spi.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_syscfg.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_tim.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_usart.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_wwdg.o +LOAD .\..\obj\lib\system_stm32f0xx.o +LOAD .\..\obj\main.o +LOAD .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o +LOAD .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o +LOAD .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o +LOAD .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o +LOAD .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o +LOAD .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o +LOAD .\..\obj\~#\~#\~#\source\assert.o +LOAD .\..\obj\~#\~#\~#\source\backdoor.o +LOAD .\..\obj\~#\~#\~#\source\boot.o +LOAD .\..\obj\~#\~#\~#\source\com.o +LOAD .\..\obj\~#\~#\~#\source\cop.o +LOAD .\..\obj\~#\~#\~#\source\xcp.o +START GROUP +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libc_n.a +END GROUP +START GROUP +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libc_n.a +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a +END GROUP +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o +OUTPUT(.\..\bin\openblt_stm32f051.elf elf32-littlearm) + +.ARM.attributes + 0x00000000 0x28 + .ARM.attributes + 0x00000000 0x1e c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + .ARM.attributes + 0x0000001e 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + .ARM.attributes + 0x0000004a 0x1b c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + .ARM.attributes + 0x00000065 0x31 .\..\obj\hooks.o + .ARM.attributes + 0x00000096 0x31 .\..\obj\led.o + .ARM.attributes + 0x000000c7 0x31 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .ARM.attributes + 0x000000f8 0x31 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .ARM.attributes + 0x00000129 0x31 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .ARM.attributes + 0x0000015a 0x31 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .ARM.attributes + 0x0000018b 0x31 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .ARM.attributes + 0x000001bc 0x31 .\..\obj\lib\system_stm32f0xx.o + .ARM.attributes + 0x000001ed 0x31 .\..\obj\main.o + .ARM.attributes + 0x0000021e 0x31 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .ARM.attributes + 0x0000024f 0x31 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .ARM.attributes + 0x00000280 0x1b .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o + .ARM.attributes + 0x0000029b 0x31 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .ARM.attributes + 0x000002cc 0x31 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .ARM.attributes + 0x000002fd 0x31 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .ARM.attributes + 0x0000032e 0x31 .\..\obj\~#\~#\~#\source\assert.o + .ARM.attributes + 0x0000035f 0x31 .\..\obj\~#\~#\~#\source\backdoor.o + .ARM.attributes + 0x00000390 0x31 .\..\obj\~#\~#\~#\source\boot.o + .ARM.attributes + 0x000003c1 0x31 .\..\obj\~#\~#\~#\source\com.o + .ARM.attributes + 0x000003f2 0x31 .\..\obj\~#\~#\~#\source\cop.o + .ARM.attributes + 0x00000423 0x31 .\..\obj\~#\~#\~#\source\xcp.o + .ARM.attributes + 0x00000454 0x1e c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + .ARM.attributes + 0x00000472 0x1e c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_dvmd_tls.o) + .ARM.attributes + 0x00000490 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + .ARM.attributes + 0x000004bc 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + .ARM.attributes + 0x000004e8 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + .ARM.attributes + 0x00000514 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + .ARM.attributes + 0x00000540 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) + .ARM.attributes + 0x0000056c 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + .ARM.attributes + 0x00000598 0x1e c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + +.comment 0x00000000 0x46 + .comment 0x00000000 0x46 .\..\obj\hooks.o + 0x47 (size before relaxing) + .comment 0x00000000 0x47 .\..\obj\led.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .comment 0x00000000 0x47 .\..\obj\lib\system_stm32f0xx.o + .comment 0x00000000 0x47 .\..\obj\main.o + .comment 0x00000000 0x47 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .comment 0x00000000 0x47 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .comment 0x00000000 0x47 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .comment 0x00000000 0x47 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .comment 0x00000000 0x47 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .comment 0x00000000 0x47 .\..\obj\~#\~#\~#\source\assert.o + .comment 0x00000000 0x47 .\..\obj\~#\~#\~#\source\backdoor.o + .comment 0x00000000 0x47 .\..\obj\~#\~#\~#\source\boot.o + .comment 0x00000000 0x47 .\..\obj\~#\~#\~#\source\com.o + .comment 0x00000000 0x47 .\..\obj\~#\~#\~#\source\cop.o + .comment 0x00000000 0x47 .\..\obj\~#\~#\~#\source\xcp.o + +.debug_info 0x00000000 0x6119 + .debug_info 0x00000000 0x294 .\..\obj\hooks.o + .debug_info 0x00000294 0x2db .\..\obj\led.o + .debug_info 0x0000056f 0xb3c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_info 0x000010ab 0x721 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_info 0x000017cc 0xa60 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_info 0x0000222c 0x2ba .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_info 0x000024e6 0xf5a .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_info 0x00003440 0x2db .\..\obj\lib\system_stm32f0xx.o + .debug_info 0x0000371b 0x4a0 .\..\obj\main.o + .debug_info 0x00003bbb 0x2b6 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_info 0x00003e71 0x95b .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_info 0x000047cc 0xa6 .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o + .debug_info 0x00004872 0x247 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_info 0x00004ab9 0x174 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_info 0x00004c2d 0x634 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_info 0x00005261 0xf4 .\..\obj\~#\~#\~#\source\assert.o + .debug_info 0x00005355 0x110 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_info 0x00005465 0x11e .\..\obj\~#\~#\~#\source\boot.o + .debug_info 0x00005583 0x294 .\..\obj\~#\~#\~#\source\com.o + .debug_info 0x00005817 0xae .\..\obj\~#\~#\~#\source\cop.o + .debug_info 0x000058c5 0x854 .\..\obj\~#\~#\~#\source\xcp.o + +.debug_abbrev 0x00000000 0x1cb1 + .debug_abbrev 0x00000000 0x142 .\..\obj\hooks.o + .debug_abbrev 0x00000142 0x139 .\..\obj\led.o + .debug_abbrev 0x0000027b 0x20d .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_abbrev 0x00000488 0x1d7 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_abbrev 0x0000065f 0x233 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_abbrev 0x00000892 0x15b .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_abbrev 0x000009ed 0x1bf .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_abbrev 0x00000bac 0x124 .\..\obj\lib\system_stm32f0xx.o + .debug_abbrev 0x00000cd0 0x18a .\..\obj\main.o + .debug_abbrev 0x00000e5a 0x170 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_abbrev 0x00000fca 0x2e0 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_abbrev 0x000012aa 0x14 .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o + .debug_abbrev 0x000012be 0xf9 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_abbrev 0x000013b7 0x118 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_abbrev 0x000014cf 0x201 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_abbrev 0x000016d0 0x9e .\..\obj\~#\~#\~#\source\assert.o + .debug_abbrev 0x0000176e 0x92 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_abbrev 0x00001800 0x63 .\..\obj\~#\~#\~#\source\boot.o + .debug_abbrev 0x00001863 0x184 .\..\obj\~#\~#\~#\source\com.o + .debug_abbrev 0x000019e7 0x63 .\..\obj\~#\~#\~#\source\cop.o + .debug_abbrev 0x00001a4a 0x267 .\..\obj\~#\~#\~#\source\xcp.o + +.debug_aranges 0x00000000 0x838 + .debug_aranges + 0x00000000 0x30 .\..\obj\hooks.o + .debug_aranges + 0x00000030 0x30 .\..\obj\led.o + .debug_aranges + 0x00000060 0x110 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_aranges + 0x00000170 0x80 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_aranges + 0x000001f0 0x160 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_aranges + 0x00000350 0x58 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_aranges + 0x000003a8 0x1a0 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_aranges + 0x00000548 0x28 .\..\obj\lib\system_stm32f0xx.o + .debug_aranges + 0x00000570 0x20 .\..\obj\main.o + .debug_aranges + 0x00000590 0x30 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_aranges + 0x000005c0 0x70 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_aranges + 0x00000630 0x20 .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o + .debug_aranges + 0x00000650 0x48 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_aranges + 0x00000698 0x38 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_aranges + 0x000006d0 0x40 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_aranges + 0x00000710 0x20 .\..\obj\~#\~#\~#\source\assert.o + .debug_aranges + 0x00000730 0x28 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_aranges + 0x00000758 0x28 .\..\obj\~#\~#\~#\source\boot.o + .debug_aranges + 0x00000780 0x50 .\..\obj\~#\~#\~#\source\com.o + .debug_aranges + 0x000007d0 0x28 .\..\obj\~#\~#\~#\source\cop.o + .debug_aranges + 0x000007f8 0x40 .\..\obj\~#\~#\~#\source\xcp.o + +.debug_ranges 0x00000000 0x6f8 + .debug_ranges 0x00000000 0x20 .\..\obj\hooks.o + .debug_ranges 0x00000020 0x20 .\..\obj\led.o + .debug_ranges 0x00000040 0x100 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_ranges 0x00000140 0x70 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_ranges 0x000001b0 0x150 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_ranges 0x00000300 0x48 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_ranges 0x00000348 0x190 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_ranges 0x000004d8 0x18 .\..\obj\lib\system_stm32f0xx.o + .debug_ranges 0x000004f0 0x10 .\..\obj\main.o + .debug_ranges 0x00000500 0x20 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_ranges 0x00000520 0x80 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_ranges 0x000005a0 0x38 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_ranges 0x000005d8 0x28 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_ranges 0x00000600 0x30 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_ranges 0x00000630 0x10 .\..\obj\~#\~#\~#\source\assert.o + .debug_ranges 0x00000640 0x18 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_ranges 0x00000658 0x18 .\..\obj\~#\~#\~#\source\boot.o + .debug_ranges 0x00000670 0x40 .\..\obj\~#\~#\~#\source\com.o + .debug_ranges 0x000006b0 0x18 .\..\obj\~#\~#\~#\source\cop.o + .debug_ranges 0x000006c8 0x30 .\..\obj\~#\~#\~#\source\xcp.o + +.debug_macro 0x00000000 0xc627 + .debug_macro 0x00000000 0x1f2 .\..\obj\hooks.o + .debug_macro 0x000001f2 0x826 .\..\obj\hooks.o + .debug_macro 0x00000a18 0x1c .\..\obj\hooks.o + .debug_macro 0x00000a34 0x1c .\..\obj\hooks.o + .debug_macro 0x00000a50 0x22 .\..\obj\hooks.o + .debug_macro 0x00000a72 0x66 .\..\obj\hooks.o + .debug_macro 0x00000ad8 0x50 .\..\obj\hooks.o + .debug_macro 0x00000b28 0x1c .\..\obj\hooks.o + .debug_macro 0x00000b44 0xa1 .\..\obj\hooks.o + .debug_macro 0x00000be5 0x28 .\..\obj\hooks.o + .debug_macro 0x00000c0d 0x8c .\..\obj\hooks.o + .debug_macro 0x00000c99 0x34 .\..\obj\hooks.o + .debug_macro 0x00000ccd 0x16 .\..\obj\hooks.o + .debug_macro 0x00000ce3 0x44 .\..\obj\hooks.o + .debug_macro 0x00000d27 0x209 .\..\obj\hooks.o + .debug_macro 0x00000f30 0x249 .\..\obj\hooks.o + .debug_macro 0x00001179 0x5b9e .\..\obj\hooks.o + .debug_macro 0x00006d17 0x2eb .\..\obj\hooks.o + .debug_macro 0x00007002 0x3cf .\..\obj\hooks.o + .debug_macro 0x000073d1 0x191 .\..\obj\hooks.o + .debug_macro 0x00007562 0x46 .\..\obj\hooks.o + .debug_macro 0x000075a8 0xd9 .\..\obj\hooks.o + .debug_macro 0x00007681 0xef .\..\obj\hooks.o + .debug_macro 0x00007770 0x184 .\..\obj\hooks.o + .debug_macro 0x000078f4 0x7c .\..\obj\hooks.o + .debug_macro 0x00007970 0x295 .\..\obj\hooks.o + .debug_macro 0x00007c05 0xd5 .\..\obj\hooks.o + .debug_macro 0x00007cda 0x2b7 .\..\obj\hooks.o + .debug_macro 0x00007f91 0x185 .\..\obj\hooks.o + .debug_macro 0x00008116 0x184 .\..\obj\hooks.o + .debug_macro 0x0000829a 0x2a0 .\..\obj\hooks.o + .debug_macro 0x0000853a 0x70 .\..\obj\hooks.o + .debug_macro 0x000085aa 0xdf .\..\obj\hooks.o + .debug_macro 0x00008689 0x4e3 .\..\obj\hooks.o + .debug_macro 0x00008b6c 0x4c5 .\..\obj\hooks.o + .debug_macro 0x00009031 0x396 .\..\obj\hooks.o + .debug_macro 0x000093c7 0x750 .\..\obj\hooks.o + .debug_macro 0x00009b17 0x353 .\..\obj\hooks.o + .debug_macro 0x00009e6a 0x34 .\..\obj\hooks.o + .debug_macro 0x00009e9e 0x3a .\..\obj\hooks.o + .debug_macro 0x00009ed8 0x1f2 .\..\obj\led.o + .debug_macro 0x0000a0ca 0x172 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x0000a23c 0x2b1 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x0000a4ed 0x172 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x0000a65f 0x17f .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x0000a7de 0x190 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x0000a96e 0x4dd .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x0000ae4b 0x172 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x0000afbd 0x17e .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x0000b13b 0x18a .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x0000b2c5 0x34d .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x0000b612 0x16e .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x0000b780 0x1e8 .\..\obj\main.o + .debug_macro 0x0000b968 0x200 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_macro 0x0000bb68 0x20c .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_macro 0x0000bd74 0x9b .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_macro 0x0000be0f 0x1e8 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_macro 0x0000bff7 0x1f4 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_macro 0x0000c1eb 0x91 .\..\obj\~#\~#\~#\source\assert.o + .debug_macro 0x0000c27c 0x97 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_macro 0x0000c313 0x91 .\..\obj\~#\~#\~#\source\boot.o + .debug_macro 0x0000c3a4 0x9b .\..\obj\~#\~#\~#\source\com.o + .debug_macro 0x0000c43f 0x91 .\..\obj\~#\~#\~#\source\cop.o + .debug_macro 0x0000c4d0 0x157 .\..\obj\~#\~#\~#\source\xcp.o + +.debug_line 0x00000000 0x551b + .debug_line 0x00000000 0x50d .\..\obj\hooks.o + .debug_line 0x0000050d 0x50d .\..\obj\led.o + .debug_line 0x00000a1a 0x720 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_line 0x0000113a 0x539 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_line 0x00001673 0x7aa .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_line 0x00001e1d 0x4b5 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_line 0x000022d2 0x824 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_line 0x00002af6 0x465 .\..\obj\lib\system_stm32f0xx.o + .debug_line 0x00002f5b 0x4f6 .\..\obj\main.o + .debug_line 0x00003451 0x52f .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_line 0x00003980 0x699 .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_line 0x00004019 0xb0 .\..\obj\~#\~#\~#\source\armcm0_stm32\gcc\cstart.o + .debug_line 0x000040c9 0x192 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_line 0x0000425b 0x536 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_line 0x00004791 0x59f .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_line 0x00004d30 0x10a .\..\obj\~#\~#\~#\source\assert.o + .debug_line 0x00004e3a 0x126 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_line 0x00004f60 0x11c .\..\obj\~#\~#\~#\source\boot.o + .debug_line 0x0000507c 0x190 .\..\obj\~#\~#\~#\source\com.o + .debug_line 0x0000520c 0x114 .\..\obj\~#\~#\~#\source\cop.o + .debug_line 0x00005320 0x1fb .\..\obj\~#\~#\~#\source\xcp.o + +.debug_str 0x00000000 0x41b6e + .debug_str 0x00000000 0x3f6a9 .\..\obj\hooks.o + 0x3f816 (size before relaxing) + .debug_str 0x0003f6a9 0x6d .\..\obj\led.o + 0x3f80b (size before relaxing) + .debug_str 0x0003f716 0x3c4 .\..\obj\lib\spl\src\stm32f0xx_flash.o + 0x3f339 (size before relaxing) + .debug_str 0x0003fada 0x23d .\..\obj\lib\spl\src\stm32f0xx_gpio.o + 0x3f21d (size before relaxing) + .debug_str 0x0003fd17 0x62f .\..\obj\lib\spl\src\stm32f0xx_rcc.o + 0x3f5a3 (size before relaxing) + .debug_str 0x00040346 0x16e .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + 0x3f086 (size before relaxing) + .debug_str 0x000404b4 0x807 .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x3f84b (size before relaxing) + .debug_str 0x00040cbb 0x67 .\..\obj\lib\system_stm32f0xx.o + 0x3eff0 (size before relaxing) + .debug_str 0x00040d22 0x34 .\..\obj\main.o + 0x3f95e (size before relaxing) + .debug_str 0x00040d56 0x1e1 .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + 0x3f967 (size before relaxing) + .debug_str 0x00040f37 0x30a .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + 0x3fb0e (size before relaxing) + .debug_str 0x00041241 0x48 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + 0x2c63 (size before relaxing) + .debug_str 0x00041289 0x6a .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + 0x3f77c (size before relaxing) + .debug_str 0x000412f3 0x12a .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + 0x3f9dd (size before relaxing) + .debug_str 0x0004141d 0x44 .\..\obj\~#\~#\~#\source\assert.o + 0x2bc3 (size before relaxing) + .debug_str 0x00041461 0x86 .\..\obj\~#\~#\~#\source\backdoor.o + 0x2bff (size before relaxing) + .debug_str 0x000414e7 0x32 .\..\obj\~#\~#\~#\source\boot.o + 0x2bd0 (size before relaxing) + .debug_str 0x00041519 0x10a .\..\obj\~#\~#\~#\source\com.o + 0x2cea (size before relaxing) + .debug_str 0x00041623 0x19 .\..\obj\~#\~#\~#\source\cop.o + 0x2b8f (size before relaxing) + .debug_str 0x0004163c 0x532 .\..\obj\~#\~#\~#\source\xcp.o + 0x3190 (size before relaxing) + +.debug_frame 0x00000000 0x1144 + .debug_frame 0x00000000 0x58 .\..\obj\hooks.o + .debug_frame 0x00000058 0x50 .\..\obj\led.o + .debug_frame 0x000000a8 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_frame 0x00000348 0x108 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_frame 0x00000450 0x2c0 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_frame 0x00000710 0x98 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_frame 0x000007a8 0x35c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_frame 0x00000b04 0x38 .\..\obj\lib\system_stm32f0xx.o + .debug_frame 0x00000b3c 0x38 .\..\obj\main.o + .debug_frame 0x00000b74 0x5c .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_frame 0x00000bd0 0x13c .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_frame 0x00000d0c 0xa0 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_frame 0x00000dac 0x58 .\..\obj\~#\~#\~#\source\armcm0_stm32\timer.o + .debug_frame 0x00000e04 0x98 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_frame 0x00000e9c 0x28 .\..\obj\~#\~#\~#\source\assert.o + .debug_frame 0x00000ec4 0x40 .\..\obj\~#\~#\~#\source\backdoor.o + .debug_frame 0x00000f04 0x40 .\..\obj\~#\~#\~#\source\boot.o + .debug_frame 0x00000f44 0xa0 .\..\obj\~#\~#\~#\source\com.o + .debug_frame 0x00000fe4 0x40 .\..\obj\~#\~#\~#\source\cop.o + .debug_frame 0x00001024 0x6c .\..\obj\~#\~#\~#\source\xcp.o + .debug_frame 0x00001090 0x20 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + .debug_frame 0x000010b0 0x28 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + .debug_frame 0x000010d8 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + .debug_frame 0x00001104 0x20 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + .debug_frame 0x00001124 0x20 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) + +.debug_loc 0x00000000 0x2f2f + .debug_loc 0x00000000 0xa33 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_loc 0x00000a33 0x24e .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_loc 0x00000c81 0x908 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_loc 0x00001589 0x1b9 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_loc 0x00001742 0x8bb .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_loc 0x00001ffd 0x113 .\..\obj\lib\system_stm32f0xx.o + .debug_loc 0x00002110 0xbf .\..\obj\~#\~#\~#\source\armcm0_stm32\cpu.o + .debug_loc 0x000021cf 0x73d .\..\obj\~#\~#\~#\source\armcm0_stm32\flash.o + .debug_loc 0x0000290c 0xa5 .\..\obj\~#\~#\~#\source\armcm0_stm32\nvm.o + .debug_loc 0x000029b1 0x133 .\..\obj\~#\~#\~#\source\armcm0_stm32\uart.o + .debug_loc 0x00002ae4 0x42 .\..\obj\~#\~#\~#\source\assert.o + .debug_loc 0x00002b26 0x42 .\..\obj\~#\~#\~#\source\com.o + .debug_loc 0x00002b68 0x3c7 .\..\obj\~#\~#\~#\source\xcp.o diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/bin/openblt_stm32f051.srec b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/bin/openblt_stm32f051.srec new file mode 100644 index 00000000..78e51ef6 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/bin/openblt_stm32f051.srec @@ -0,0 +1,381 @@ +S02200002E5C2E2E5C62696E5C6F70656E626C745F73746D3332663035312E7372656323 +S3150800000000100020290D00087B0D00087D0D000852 +S3150800001000000000000000000000000000000000D2 +S315080000200000000000000000000000007F0D00082E +S315080000300000000000000000810D0008830D000884 +S31508000040870D0008890D00088B0D00088D0D000826 +S315080000508F0D0008910D0008930D0008950D0008F6 +S31508000060970D0008990D00089B0D00089D0D0008C6 +S315080000709F0D0008A10D0008A30D0008A50D000896 +S31508000080A70D0008A90D0008AB0D0008AD0D000866 +S31508000090AF0D0008B10D0008B30D0008B50D000836 +S315080000A0B70D0008B90D0008BB0D0008BD0D000806 +S315080000B0BF0D0008C10D0008C30D0008C50D0008D6 +S315080000C010B5064C2378002B07D1054B002B02D020 +S315080000D0044800E000BF0123237010BD3C01002046 +S315080000E0000000001017000808B5084B002B03D0C5 +S315080000F00748084900E000BF07480368002B03D0FB +S31508000100064B002B00D0984708BDC04600000000EB +S3150800011010170008400100203C01002000000000E4 +S31508000120164B002B00D1144B9D46402292029A1A78 +S31508000130924600218B460F461348144A121A01F0BC +S31508000140FBF90F4B002B00D098470E4B002B00D025 +S3150800015098470020002104000D000D48002802D011 +S315080001600C4800E000BF01F0C1F92000290000F0AA +S3150800017057FB01F0A5F9C046000008000010002052 +S3150800018000000000000000003C010020540600208A +S31508000190000000000000000008B500F047F89020B5 +S315080001A0C005012100F032F90138431E9841C0B25A +S315080001B008BDC04608B5642000F006F808BDC0466C +S315080001C008B500F007F808BD014B18807047C0460F +S315080001D05801002008B500F03DFE104B1B689842F8 +S315080001E01BD30F4B1B78002B08D101220C4B1A701E +S315080001F00C488021490000F00FF907E00022084B5F +S315080002001A7008488021490000F008F900F022FE1B +S31508000210054B1B88C018014B186008BD5C010020FF +S315080002205A010020000800485801002008B5034874 +S315080002308021490000F0F2F808BDC04600080048D1 +S31508000240044B1B691A0604D5024B034A5A60034A33 +S315080002505A6070470020024023016745AB89EFCDFD +S31508000260024B196980220A431A617047002002402E +S31508000270014BD8607047C04600200240084BDB6837 +S315080002800120DA070BD4064BDB680220DA0606D40F +S31508000290034BDB680420184043425841033070473B +S315080002A00020024010B5041CFFF7E8FF012809D119 +S315080002B0002C09D0FFF7E2FF013C012802D1002CEF +S315080002C0F8D101E0002C00D1052010BD70B5051C41 +S315080002D0B0200003FFF7E6FF042810D1084C236975 +S315080002E00226334323616561226940231343236150 +S315080002F0B0200003FFF7D6FF2369B343236170BD1F +S315080003000020024030B583B0051C0C1C0023019365 +S31508000310B0200003FFF7C6FF042820D1114B196946 +S3150800032001220A431A61A3B22B80B0200003FFF70B +S31508000330B9FF04280ED102350195019B240C1C80B7 +S31508000340B0200003FFF7AEFF064B1A6901218A4366 +S315080003501A6104E0034B1A6901218A431A6103B042 +S3150800036030BDC04600200240F0B54F464646C0B4F0 +S315080003700022002301260327341C9C400D682540D3 +S31508000380A5423BD10C79013C012C1DD884683D1C43 +S315080003909540AC43846085684C7994402C438460CE +S315080003A08488A0461C04240CA146351CA540444656 +S315080003B0AC4384808488A0468D792C1C4D46AC407D +S315080003C045462C43A4B2848004683D1C9540AC4342 +S315080003D0046005680C7994402C430460C468A04600 +S315080003E01D04ED0B3C1CAC40A44644466546AC4394 +S315080003F0C460C568CC7994402C43C460013302328A +S31508000400102BB9D10CBC90469946F0BD008A08401D +S31508000410431E9841C0B27047816170470185704795 +S3150800042010B507230B409B00C90889004018016ACC +S315080004300F249C40A1430162016A9A40131C0B4396 +S31508000440036210BD70B5041C5E4B5B680C2213403A +S31508000450042B0CD002D8002B05D028E0082B0AD094 +S315080004600C2B20D023E0584B0360002022E0564B8B +S31508000470036000201EE0534B5D685A68AD022D0FDD +S315080004800235C0235B021A4202D15048684308E08D +S315080004904C4BDB6A0F21194001314B4800F0C0FF75 +S315080004A06843206006E04A4B0360002002E0464BA2 +S315080004B023600020434B5A681206120F454DA95C6B +S315080004C0C9B22668321CCA40111C62605A685205B5 +S315080004D0520FAA5CD2B2D1400A1CA1601B6BD90587 +S315080004E002D43D4BE36008E0364B5B68590402D4FE +S315080004F05308E36001E09308E360324B1B6B59062F +S3150800050002D4364B236102E080231B0223612D4B64 +S315080005101B6BD90602D42C4B636100E06661294B3C +S315080005201B6B990701D1A26119E0264B1B6B0321AE +S315080005300B40012B01D1A66111E0224B1B6B032155 +S315080005400B40022B03D180231B02A36107E01D4B3E +S315080005501B6B03210B40032B01D11B4BA361194BCA +S31508000560196BC0239B02194201D1E26120E0154BA9 +S315080005701B6BC02292021A4080235B029A4201D169 +S31508000580E66115E00F4B1B6BC02292021A408023CE +S315080005909B029A4203D180231B02E36108E0094BC0 +S315080005A01A6BC0239B021A409A4201D1064BE3619B +S315080005B0044B1B6B1A0602D4054B236200E020622B +S315080005C070BDC0460010024000127A0000093D00C6 +S315080005D0006CDC02C0000020809FD500128000005D +S315080005E0002904D0044B5A691043586103E0024BB2 +S315080005F05A6982435A61704700100240002904D0A4 +S31508000600044B9A691043986103E0024B9A69824346 +S315080006109A61704700100240002904D0044BDA6939 +S315080006201043D86103E0024BDA698243DA61704706 +S3150800063000100240034B1A6803218A4310431860CE +S315080006407047C04600000140F0B5474680B48AB0FE +S31508000650041C0D1C03680122934303604268294B5E +S31508000660134089680B4343600268274B1A40EB68BE +S3150800067069680B4329690B43134303608268234B5C +S3150800068013406A691343836001A8FFF7DBFE204B1A +S315080006909C4201D1079F05E01E4B9C4201D1089F51 +S315080006A000E0039F236819040CD57F00B8462F681D +S315080006B04046391C00F0B4FE061C4046391C00F0C2 +S315080006C0F3FE0AE02A689046381C111C00F0A8FEC2 +S315080006D0061C381C414600F0E7FE2A68520800232B +S315080006E091425B41F6182368190404D533075B0F5A +S315080006F0094A16401E43B6B2A6810AB004BC904603 +S31508000700F0BDC046FFCFFFFFF3E9FFFFFFFCFFFF89 +S315080007100038014000440040F0FF0000002904D0E2 +S31508000720026801231343036003E00368012293432D +S3150800073003607047C905C90D01857047808CC005DF +S31508000740C00D70478268034B134083608368194362 +S3150800075081607047FFEFFFFFC0690840431E98415C +S31508000760C0B27047264B19680122114319605868B0 +S3150800077024490140596018682349014019601868DE +S315080007802249014019605868214901405960D96ACF +S315080007900F208143D962186B1E4901401963596BB2 +S315080007A09143596300229A6011211B4A11605A68C5 +S315080007B05A605A685A605968184A0A405A6059680D +S315080007C0A02292030A435A601968802252040A43F7 +S315080007D01A60191C802292040B681342FCD0084B3D +S315080007E05A6803218A435A60596802220A435A60A2 +S315080007F0191C0C224B681340082BFBD17047C046C6 +S31508000800001002400CB8FFF8FFFFF6FEFFFFFBFFE3 +S31508000810FFFFC0FFACFEFFFF00200240FF7FC0FFC6 +S31508000820F0B5474680B482B0802000030121FFF767 +S31508000830D7FE8024A402201C0121FFF7EDFE201C10 +S315080008400121FFF7CDFE80256D00009501266A4639 +S3150800085016710024947103275771D471174B984663 +S31508000860181C6946FFF780FD4046291CFFF7D6FD90 +S315080008706A461471D47100969025ED05281C6946C0 +S31508000880FFF772FD281C02210122FFF7C9FD281C6B +S3150800089003210122FFF7C4FD0C2300936B465F7109 +S315080008A002236A4613719471D671281C6946FFF7AC +S315080008B05BFD00F0D1FB00F0DBFBFCE7000800481D +S315080008C070B5561EB6B2002A0AD08E1901360C1C0F +S315080008D0451A23782B5500F023FC0134B442F8D18D +S315080008E070BDC04608B500F07FFA00281BD0FFF798 +S315080008F053FC002817D000F0E3FB00F097FA01201C +S315080009000121FFF77BFE00F073FA011C80208005A9 +S31508000910C022FFF7D5FF0320FFF78CFE00F068FA28 +S3150800092062B64368984708BD70B5061C0B4D00248F +S3150800093000F0F6FB2B68B3420AD869685B189E423A +S3150800094006D263001A199200044B9B18187A04E021 +S3150800095001340C350D2CEBD1FF2070BD6415000851 +S31508000960F8B54F464646C0B4071C0068FFF7DCFFDB +S31508000970031C0020FF2B31D0FFF762FC3420FFF761 +S3150800098077FCFFF77BFC012803D1FFF769FC002001 +S3150800099024E03C1D81239B00DB19994604235B4216 +S315080009A0DB1B984643461E193B68F618256800F077 +S315080009B0B7FB301C291CFFF7A5FC042806D13368B1 +S315080009C0AB4205D104344C45ECD103E0002402E0E7 +S315080009D0002400E00124FFF743FC201C0CBC9046D1 +S315080009E09946F8BD38B5041C0D1C104B984207D023 +S315080009F00F4B99420AD0FFF7B3FF002801D111E047 +S31508000A000C4CEB050020002B0FD100E0074C2368A7 +S31508000A109D4209D0201C20C0291C80229200FFF785 +S31508000A204FFF01E0002000E0201C38BD60010020D7 +S31508000A300020000864030020F8B54F464646C0B4B7 +S31508000A40071C0C1C151C1E1C4B0A5B0299460368E6 +S31508000A50013306D14B4608C0494680229200FFF76B +S31508000A602FFF3B684B4505D0381C4946FFF7BAFFB0 +S31508000A70071E1DD03B68E41A3C190434114B9846EE +S31508000A8080239B00994400F04BFB3B1DE31A43452A +S31508000A9006D9381C4946FFF7A5FF071E0AD0041DCC +S31508000AA02B78237001340135013E002EEBD103E08B +S31508000AB0002002E0002000E001200CBC9046994688 +S31508000AC0F8BDC046FF01000001235B42024A1360DD +S31508000AD0024A13607047C046640300206001002084 +S31508000AE070B5041C0D1C161CFFF71EFF031C002006 +S31508000AF0FF2B19D0681E0019FFF716FFFF2812D022 +S31508000B00620A5202094B9A4206D10948211C321C34 +S31508000B102B1CFFF791FF07E00648211C321C2B1CF3 +S31508000B20FFF78AFF00E0002070BDC04600200008DD +S31508000B306001002064030020F8B54F464646C0B45D +S31508000B40041C0E1CFFF7F0FE051C013E3019FFF7CA +S31508000B50EBFE041CFF2D74D00020FF2C72D0A5429A +S31508000B6070D8032D6ED9102C6CD8FFF769FB34208A +S31508000B70FFF77EFBFFF782FB012803D1FFF770FB27 +S31508000B8000205FE0314E0836B146371C002600F0DB +S31508000B90C7FA3B78AB4206D173009A1992002B4BE1 +S31508000BA0D158884606E001360C370D2EEFD10123C1 +S31508000BB05B4298464F46002500F0B2FA3B78A342BE +S31508000BC005D16B005A199200204BD75805E001351C +S31508000BD00C370D2DF0D101277F424E46002500F037 +S31508000BE09FFA3378A34206D16B005A199200174B25 +S31508000BF09B185A6804E001350C360D2DEFD10022FA +S31508000C0041467B1A9B189B0A9BB2002B15D05D1E8A +S31508000C10ADB20135AD02002400F082FA4346E01871 +S31508000C20FFF754FB042803D0FFF71AFB002009E05E +S31508000C308021C9006418AC42EED1FFF711FB0120F0 +S31508000C4000E000200CBC90469946F8BD64150008E3 +S31508000C5000B583B00D4B1B680120013314D00B4B34 +S31508000C6098685A688118D86809181A6989185869D5 +S31508000C7009189A698918DA698B185B42019304483E +S31508000C80042101AAFFF72CFF03B000BD6001002074 +S31508000C90C02000080D4B18680D4B1B68C0180D4B7B +S31508000CA01B68C0180C4B1B68C0180C4B1B68C01877 +S31508000CB00B4B1B68C0180B4B1B68C0180A4B1B68EC +S31508000CC0C01843425841C0B27047C04604200008C5 +S31508000CD000200008082000080C2000081020000842 +S31508000CE01420000818200008C020000808B50A4B80 +S31508000CF01B68013304D00848FFF732FE00280AD0E3 +S31508000D00064B1B680120013305D00448FFF728FE6F +S31508000D10431E9841C0B208BD60010020640300204C +S31508000D20004870470020000872B608490849094A71 +S31508000D30094B9B1A05DD00240859105104349C42BE +S31508000D40FADB0648804706480047000000100020E6 +S31508000D501C170008C00000203C0100206507000899 +S31508000D60210100081849194A002301E00B600431E3 +S31508000D709142FBD3FFF754FDFEE7FEE7FEE7FEE7E9 +S31508000D80FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE72D +S31508000D90FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE71D +S31508000DA0FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE70D +S31508000DB0FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7FD +S31508000DC0FEE7FEE7FEE700003C010020540600208F +S31508000DD008B5FFF779FE08BD08B5FFF781FE08BD1F +S31508000DE008B5FFF7A9FE08BD08B5FFF753FF08BD0C +S31508000DF008B5FFF795FF08BD08B5FFF729FF0028D6 +S31508000E0001D0FFF773FF08BD054B00221A6005499C +S31508000E1059609A6005211960034B1A607047C046ED +S31508000E2010E000E07FBB0000680500200022014BAF +S31508000E301A60704710E000E0044B1B68DA0303D51C +S31508000E40034B1A6801321A607047C04610E000E08A +S31508000E506805002008B5FFF7EFFF014B186808BDC5 +S31508000E606805002010B5041C0A488021FFF774FCA9 +S31508000E70021C0020002A0BD00648211CFFF75AFC4A +S31508000E80044C201C8021FFF767FC0028F9D00120BC +S31508000E9010BDC0460044004010B5041C0648202179 +S31508000EA0FFF75AFC021C0020012A04D10248FFF76A +S31508000EB045FC2070012010BD0044004010B586B0E6 +S31508000EC0E1231B02009300230193029303930593E6 +S31508000ED00C230493074C201C6946FFF7B5FB201C1E +S31508000EE080214901FFF72EFC201C0121FFF716FC83 +S31508000EF006B010BD00440040F8B5061C0D1E402D76 +S31508000F0003D91048842100F06FF8281CFFF7AAFFC0 +S31508000F10012803D00B48882100F066F8002D10D070 +S31508000F200024084F00F0FCF8305DFFF79BFF01280E +S31508000F3003D0381C912100F057F80134A3B2AB4214 +S31508000F40F0D3F8BD0016000838B5051C224B1B78EF +S31508000F50002B15D12148FFF79FFF0024012838D11F +S31508000F601E4B1C78002C34D0FFF774FF1C4B1860FE +S31508000F7000221C4B1A700122174B1A70002428E015 +S31508000F80184B18780130154B1818FFF785FF041E03 +S31508000F90012C11D1134B1A780132D2B21A700F4BA9 +S31508000FA01B78934214D1281C0C490131FFF788FCA1 +S31508000FB00022094B1A700CE0FFF74CFF084B1B6820 +S31508000FC064330024984204D90022034B1A7000E0C7 +S31508000FD00024201C38BDC046B00500206C05002042 +S31508000FE0B4050020B105002008B5034B1860034B73 +S31508000FF0196000F095F8FCE7B8050020BC0500204C +S3150800100008B500F085F8012810D0094B1B78012B8C +S315080010100CD1FFF71FFF074B1B68F533FF339842C8 +S3150800102004D30022024B1A70FFF75CFC08BDC046C9 +S31508001030C0050020C405002008B50122044B1A701B +S31508001040FFF708FF034B1860FFF7DAFF08BDC04635 +S31508001050C0050020C405002008B500F05DF8FFF7BC +S31508001060D3FEFFF7B5FE00F00DF8FFF7E5FF08BD64 +S3150800107008B500F055F8FFF7DFFE00F00FF8FFF7A8 +S31508001080BFFF08BD08B500F059F8FFF717FF0022A3 +S31508001090014B1A7008BDC046D000002008B50648A6 +S315080010A0FFF752FF012805D10022044B1A700248A7 +S315080010B000F062F808BDC046C8050020D000002030 +S315080010C07047C04608B5054B1B78002B02D1C9B23C +S315080010D0FFF712FF00F048F808BDC046D000002010 +S315080010E0044B18780138C0B202238342804140423B +S315080010F080017047D0000020044B18780138C0B230 +S31508001100022383428041404280017047D00000207C +S3150800111008B500F021F808BD08B5FFF74BF808BD7B +S3150800112008B5FFF74DF808BD034BFE22DA701871B3 +S31508001130022144229952704708060020054B0022D6 +S315080011401A709A6443215A5444215A529A705A7012 +S315080011507047C04608060020024B1878431E98417F +S31508001160C0B270470806002000214323014AD15423 +S315080011707047C0460806002038B5041C0378FF2BC4 +S3150800118019D1A44C0023637001252570FF22E27053 +S31508001190102222716371FFF7A3FFA071FFF7ACFF5E +S315080011A0E071FFF7A9FF000A20726572A57208228E +S315080011B04423E25217E1974A1278012A00D028E11F +S315080011C03733DAB2352A00D90AE19300924AD3585E +S315080011D09F464578FFF784FF0138854203DD2220C4 +S315080011E0FFF7A2FFFFE08B4D281D6278A96CFFF779 +S315080011F067FBFF23EB706378A96C5B18AB646278B6 +S3150800120001324423EA52EEE04578FFF769FF0138D8 +S31508001210854203DD2220FFF787FFE4E061687D4D04 +S31508001220A964281D6278FFF74BFBFF23EB706378F0 +S31508001230AA6C9B18AB64627801324423EA52D2E066 +S31508001240744BFF22DA7044689C6401214422995247 +S31508001250C9E0704BFF22DA709B6C4068002808D002 +S31508001260C018002219785218D2B201338342F9D134 +S3150800127000E00022674B0020DA7100241C725C72C1 +S31508001280120E9A7201221A71587198710821442215 +S315080012909952A8E05F4BFF22DA70604A9A640022EE +S315080012A01A715A719A710721D971002119725972E6 +S315080012B0997208214422995295E00020FFF734FFDD +S315080012C091E0544BFF22DA7000221A71597859714D +S315080012D09A71DA711A7206214422995283E04D4BAB +S315080012E000221A705A70FF22DA700121442299529C +S315080012F079E0484B9D6CFFF7F3FE411E621C281CE3 +S31508001300FFF76AFD002803D13120FFF70DFF6AE0D9 +S31508001310404CFF23E370A56CFFF7E2FE013D281859 +S31508001320A06401224423E2525DE04578FFF7D8FE27 +S315080013300238854203DD2220FFF7F6FE53E0354BDF +S31508001340FF22DA700121442299526178002907D1D7 +S31508001350FFF752FD002846D13120FFF7E5FE42E0AF +S315080013602C4B986CA21CFFF737FD002803D13120BF +S31508001370FFF7DAFE37E0274B6278996C52189A64C1 +S3150800138031E0244CFF23E370002525716571FFF7D2 +S31508001390A7FEA071E5712572657207224423E25201 +S315080013A021E01C4B986C6168FFF71AFD002803D1F1 +S315080013B03120FFF7B9FE16E0164BFF22DA7001213D +S315080013C0442299520FE0FFF78DFA124BFF22DA708A +S315080013D001214422995206E03120FFF7A5FE02E0DA +S315080013E02020FFF7A1FE43230A4AD35C012B02D132 +S315080013F01020FFF799FE4423064AD15A0BB2002B58 +S3150800140007DD101C01224323C254033089B2FFF7BB +S3150800141059FE38BD080600202816000800170008DF +S31508001420002934D00123002210B488422CD3012489 +S315080014302407A14204D2814202D209011B01F8E71E +S31508001440E400A14204D2814202D249005B00F8E7D7 +S31508001450884201D3401A1A434C08A04202D3001B03 +S315080014605C0822438C08A04202D3001B9C08224336 +S31508001470CC08A04202D3001BDC082243002803D074 +S315080014801B0901D00909E3E7101C10BC70470028A6 +S3150800149001D00020C04307B4024802A140180290B8 +S315080014A003BDC046190000000029F0D003B5FFF7B8 +S315080014B0B9FF0EBC4243891A1847C0467047C04652 +S315080014C0084B10B5041C002B02D0002100E000BF19 +S315080014D0054B1868836A002B00D09847201C00F03B +S315080014E033F8C046000000000C17000870B50E4B14 +S315080014F00E4D0024ED1AAD101E1CAC4204D0A300FC +S31508001500F35898470134F8E700F020F8084B094DDE +S315080015100024ED1AAD101E1CAC4204D0A300F358EB +S3150800152098470134F8E770BD3401002034010020E3 +S315080015303401002038010020031C8218934202D08F +S3150800154019700133FAE77047FEE70000F8B5C046A0 +S31508001550F8BC08BC9E467047F8B5C046F8BC08BC3F +S315080015609E4670470020000800080000040000009E +S3150800157000280008000800000500000000300008E8 +S3150800158000080000060000000038000800080000F7 +S3150800159007000000004000080008000008000000DE +S315080015A00048000800080000090000000050000874 +S315080015B0000800000A0000000058000800080000A3 +S315080015C00B00000000600008000800000C00000086 +S315080015D000680008000800000D0000000070000800 +S315080015E0000800000E00000000780008000800004F +S315080015F00F000000008000080080000010000000B6 +S315080016002E2E5C2E2E5C2E2E5C2E2E5C536F757243 +S3150800161063655C41524D434D305F53544D33325CE4 +S31508001620756172742E630000F2120008E013000858 +S31508001630E0130008D8130008E0130008E0130008B8 +S31508001640C61300082A130008A2130008821300080C +S31508001650E0130008E0130008E0130008E013000890 +S31508001660E0130008E0130008E0130008E013000880 +S31508001670E0130008E0130008E0130008E013000870 +S31508001680E0130008E0130008E0130008E013000860 +S31508001690E0130008E0130008E0130008E013000850 +S315080016A0E0130008E0130008E0130008E013000840 +S315080016B0E0130008E0130008E0130008E013000830 +S315080016C0E0130008E0130008E0130008E013000820 +S315080016D05212000808120008D21100084012000829 +S315080016E0E0130008E0130008E0130008941200084D +S315080016F0E0130008BA120008C2120008DE12000839 +S315080017004F70656E424C540043000000D400002020 +S3090800171000000000C7 +S30D080017140CEAFF7F010000004A +S3150800171C000000000102030401020304060708097D +S3150800172C040000000000000000000000000000009B +S3150800173C000000000000000000000000000000008F +S3150800174C0000000008170008000000000000000058 +S3150800175C000000000000000000000000000000006F +S3150800176C000000000000000000000000000000005F +S3150800177C000000000000000000000000000000004F +S3110800178C00000000E9000008C100000889 +S70508000000F2 diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/blt_conf.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/blt_conf.h new file mode 100644 index 00000000..e847808b --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/blt_conf.h @@ -0,0 +1,153 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Boot\blt_conf.h +* \brief Bootloader configuration header file. +* \ingroup Boot_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ +#ifndef BLT_CONF_H +#define BLT_CONF_H + +/**************************************************************************************** +* C P U D R I V E R C O N F I G U R A T I O N +****************************************************************************************/ +/* To properly initialize the baudrate clocks of the communication interface, typically + * the speed of the crystal oscillator and/or the speed at which the system runs is + * needed. Set these through configurables BOOT_CPU_XTAL_SPEED_KHZ and + * BOOT_CPU_SYSTEM_SPEED_KHZ, respectively. To enable data exchange with the host that is + * not dependent on the targets architecture, the byte ordering needs to be known. + * Setting BOOT_CPU_BYTE_ORDER_MOTOROLA to 1 selects little endian mode and 0 selects + * big endian mode. + * + * Set BOOT_CPU_USER_PROGRAM_START_HOOK to 1 if you would like a hook function to be + * called the moment the user program is about to be started. This could be used to + * de-initialize application specific parts, for example to stop blinking an LED, etc. + */ +/** \brief Frequency of the external crystal oscillator. */ +#define BOOT_CPU_XTAL_SPEED_KHZ (8000) +/** \brief Desired system speed. */ +#define BOOT_CPU_SYSTEM_SPEED_KHZ (48000) +/** \brief Motorola or Intel style byte ordering. */ +#define BOOT_CPU_BYTE_ORDER_MOTOROLA (0) +/** \brief Enable/disable hook function call right before user program start. */ +#define BOOT_CPU_USER_PROGRAM_START_HOOK (1) + + +/**************************************************************************************** +* C O M M U N I C A T I O N I N T E R F A C E C O N F I G U R A T I O N +****************************************************************************************/ +/* The UART communication interface is selected by setting the BOOT_COM_UART_ENABLE + * configurable to 1. Configurable BOOT_COM_UART_BAUDRATE selects the communication speed + * in bits/second. The maximum amount of data bytes in a message for data transmission + * and reception is set through BOOT_COM_UART_TX_MAX_DATA and BOOT_COM_UART_RX_MAX_DATA, + * respectively. It is common for a microcontroller to have more than 1 UART interface + * on board. The zero-based BOOT_COM_UART_CHANNEL_INDEX selects the UART interface. + * + */ +/** \brief Enable/disable UART transport layer. */ +#define BOOT_COM_UART_ENABLE (1) +/** \brief Configure the desired communication speed. */ +#define BOOT_COM_UART_BAUDRATE (57600) +/** \brief Configure number of bytes in the target->host data packet. */ +#define BOOT_COM_UART_TX_MAX_DATA (64) +/** \brief Configure number of bytes in the host->target data packet. */ +#define BOOT_COM_UART_RX_MAX_DATA (64) +/** \brief Select the desired UART peripheral as a zero based index. */ +#define BOOT_COM_UART_CHANNEL_INDEX (1) + + +/**************************************************************************************** +* B A C K D O O R E N T R Y C O N F I G U R A T I O N +****************************************************************************************/ +/* It is possible to implement an application specific method to force the bootloader to + * stay active after a reset. Such a backdoor entry into the bootloader is desired in + * situations where the user program does not run properly and therefore cannot + * reactivate the bootloader. By enabling these hook functions, the application can + * implement the backdoor, which overrides the default backdoor entry that is programmed + * into the bootloader. When desired for security purposes, these hook functions can + * also be implemented in a way that disables the backdoor entry altogether. + */ +/** \brief Enable/disable the backdoor override hook functions. */ +#define BOOT_BACKDOOR_HOOKS_ENABLE (0) + + +/**************************************************************************************** +* N O N - V O L A T I L E M E M O R Y D R I V E R C O N F I G U R A T I O N +****************************************************************************************/ +/* The NVM driver typically supports erase and program operations of the internal memory + * present on the microcontroller. Through these hook functions the NVM driver can be + * extended to support additional memory types such as external flash memory and serial + * eeproms. The size of the internal memory in kilobytes is specified with configurable + * BOOT_NVM_SIZE_KB. If desired the internal checksum writing and verification method can + * be overridden with a application specific method by enabling configuration switch + * BOOT_NVM_CHECKSUM_HOOKS_ENABLE. + */ +/** \brief Enable/disable the NVM hook function for supporting additional memory devices. */ +#define BOOT_NVM_HOOKS_ENABLE (0) +/** \brief Configure the size of the default memory device (typically flash EEPROM). */ +#define BOOT_NVM_SIZE_KB (64) +/** \brief Enable/disable hooks functions to override the user program checksum handling. */ +#define BOOT_NVM_CHECKSUM_HOOKS_ENABLE (0) + + +/**************************************************************************************** +* W A T C H D O G D R I V E R C O N F I G U R A T I O N +****************************************************************************************/ +/* The COP driver cannot be configured internally in the bootloader, because its use + * and configuration is application specific. The bootloader does need to service the + * watchdog in case it is used. When the application requires the use of a watchdog, + * set BOOT_COP_HOOKS_ENABLE to be able to initialize and service the watchdog through + * hook functions. + */ +/** \brief Enable/disable the hook functions for controlling the watchdog. */ +#define BOOT_COP_HOOKS_ENABLE (1) + + +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + +#endif /* BLT_CONF_H */ +/*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/boot.dox b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/boot.dox new file mode 100644 index 00000000..b3d9aa5e --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/boot.dox @@ -0,0 +1,7 @@ +/** +\defgroup Boot_ARMCM0_STM32_Discovery_STM32F051_GCC Bootloader +\brief Bootloader. +\ingroup ARMCM0_STM32_Discovery_STM32F051_GCC +*/ + + diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/hooks.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/hooks.c new file mode 100644 index 00000000..0be7a6fe --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/hooks.c @@ -0,0 +1,299 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Boot\hooks.c +* \brief Bootloader callback source file. +* \ingroup Boot_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "led.h" /* LED driver header */ +#include "stm32f0xx.h" /* for STM32F0 registers and drivers */ + + +/**************************************************************************************** +* B A C K D O O R E N T R Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_BACKDOOR_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Initializes the backdoor entry option. +** \return none. +** +****************************************************************************************/ +void BackDoorInitHook(void) +{ +} /*** end of BackDoorInitHook ***/ + + +/************************************************************************************//** +** \brief Checks if a backdoor entry is requested. +** \return BLT_TRUE if the backdoor entry is requested, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool BackDoorEntryHook(void) +{ + /* default implementation always activates the bootloader after a reset */ + return BLT_TRUE; +} /*** end of BackDoorEntryHook ***/ +#endif /* BOOT_BACKDOOR_HOOKS_ENABLE > 0 */ + + +/**************************************************************************************** +* C P U D R I V E R H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_CPU_USER_PROGRAM_START_HOOK > 0) +/************************************************************************************//** +** \brief Callback that gets called when the bootloader is about to exit and +** hand over control to the user program. This is the last moment that +** some final checking can be performed and if necessary prevent the +** bootloader from activiting the user program. +** \return BLT_TRUE if it is okay to start the user program, BLT_FALSE to keep +** keep the bootloader active. +** +****************************************************************************************/ +blt_bool CpuUserProgramStartHook(void) +{ + /* clean up the LED driver */ + LedBlinkExit(); + /* additional and optional backdoor entry through the pushbutton on the board. to + * force the bootloader to stay active after reset, keep it pressed during reset. + */ + if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) + { + /* pushbutton pressed, so do not start the user program and keep the + * bootloader active instead. + */ + return BLT_FALSE; + } + /* okay to start the user program.*/ + return BLT_TRUE; +} /*** end of CpuUserProgramStartHook ***/ +#endif /* BOOT_CPU_USER_PROGRAM_START_HOOK > 0 */ + + +/**************************************************************************************** +* W A T C H D O G D R I V E R H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_COP_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Callback that gets called at the end of the internal COP driver +** initialization routine. It can be used to configure and enable the +** watchdog. +** \return none. +** +****************************************************************************************/ +void CopInitHook(void) +{ + /* this function is called upon initialization. might as well use it to initialize + * the LED driver. It is kind of a visual watchdog anyways. + */ + LedBlinkInit(100); +} /*** end of CopInitHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the end of the internal COP driver +** service routine. This gets called upon initialization and during +** potential long lasting loops and routine. It can be used to service +** the watchdog to prevent a watchdog reset. +** \return none. +** +****************************************************************************************/ +void CopServiceHook(void) +{ + /* run the LED blink task. this is a better place to do it than in the main() program + * loop. certain operations such as flash erase can take a long time, which would cause + * a blink interval to be skipped. this function is also called during such operations, + * so no blink intervals will be skipped when calling the LED blink task here. + */ + LedBlinkTask(); +} /*** end of CopServiceHook ***/ +#endif /* BOOT_COP_HOOKS_ENABLE > 0 */ + + +/**************************************************************************************** +* N O N - V O L A T I L E M E M O R Y D R I V E R H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_NVM_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Callback that gets called at the start of the internal NVM driver +** initialization routine. +** \return none. +** +****************************************************************************************/ +void NvmInitHook(void) +{ +} /*** end of NvmInitHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the start of the NVM driver write +** routine. It allows additional memory to be operated on. If the address +** is not within the range of the additional memory, then +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the data hasn't +** been written yet. +** \param addr Start address. +** \param len Length in bytes. +** \param data Pointer to the data buffer. +** \return BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the write +** operation failed. +** +****************************************************************************************/ +blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data) +{ + return BLT_NVM_NOT_IN_RANGE; +} /*** end of NvmWriteHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the start of the NVM driver erase +** routine. It allows additional memory to be operated on. If the address +** is not within the range of the additional memory, then +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the memory +** hasn't been erased yet. +** \param addr Start address. +** \param len Length in bytes. +** \return BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the erase +** operation failed. +** +****************************************************************************************/ +blt_int8u NvmEraseHook(blt_addr addr, blt_int32u len) +{ + return BLT_NVM_NOT_IN_RANGE; +} /*** end of NvmEraseHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the end of the NVM programming session. +** \return BLT_TRUE is successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmDoneHook(void) +{ + return BLT_TRUE; +} /*** end of NvmDoneHook ***/ +#endif /* BOOT_NVM_HOOKS_ENABLE > 0 */ + + +#if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Verifies the checksum, which indicates that a valid user program is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmVerifyChecksumHook(void) +{ + return BLT_TRUE; +} /*** end of NvmVerifyChecksum ***/ + + +/************************************************************************************//** +** \brief Writes a checksum of the user program to non-volatile memory. This is +** performed once the entire user program has been programmed. Through +** the checksum, the bootloader can check if a valid user programming is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmWriteChecksumHook(void) +{ + return BLT_TRUE; +} +#endif /* BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0 */ + + +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + +/*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.depend b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.depend new file mode 100644 index 00000000..31399382 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.depend @@ -0,0 +1,717 @@ +# depslib dependency file v1.0 +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_adc.c + "stm32f0xx_adc.h" + "stm32f0xx_rcc.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_adc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\inc\stm32f0xx.h + "core_cm0.h" + "system_stm32f0xx.h" + + "stm32f0xx_conf.h" + +1461834352 c:\users\voorburg\desktop\stm32f0\cmsis\core_cm0.h + + "core_cmInstr.h" + "core_cmFunc.h" + +1461834353 c:\users\voorburg\desktop\stm32f0\cmsis\core_cminstr.h + + +1461834352 c:\users\voorburg\desktop\stm32f0\cmsis\core_cmfunc.h + + +1461834350 c:\users\voorburg\desktop\stm32f0\inc\system_stm32f0xx.h + +1461834350 c:\users\voorburg\desktop\stm32f0\inc\stm32f0xx_conf.h + "stm32f0xx_adc.h" + "stm32f0xx_can.h" + "stm32f0xx_cec.h" + "stm32f0xx_crc.h" + "stm32f0xx_crs.h" + "stm32f0xx_comp.h" + "stm32f0xx_dac.h" + "stm32f0xx_dbgmcu.h" + "stm32f0xx_dma.h" + "stm32f0xx_exti.h" + "stm32f0xx_flash.h" + "stm32f0xx_gpio.h" + "stm32f0xx_syscfg.h" + "stm32f0xx_i2c.h" + "stm32f0xx_iwdg.h" + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + "stm32f0xx_rtc.h" + "stm32f0xx_spi.h" + "stm32f0xx_tim.h" + "stm32f0xx_usart.h" + "stm32f0xx_wwdg.h" + "stm32f0xx_misc.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_can.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_cec.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_crc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_crs.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_comp.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_dac.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_dbgmcu.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_dma.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_exti.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_flash.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_gpio.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_syscfg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_i2c.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_iwdg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_pwr.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_rcc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_rtc.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_spi.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_tim.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_usart.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_wwdg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_misc.h + "stm32f0xx.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_can.c + "stm32f0xx_can.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_cec.c + "stm32f0xx_cec.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_comp.c + "stm32f0xx_comp.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_crc.c + "stm32f0xx_crc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_crs.c + "stm32f0xx_crs.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_dac.c + "stm32f0xx_dac.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_dbgmcu.c + "stm32f0xx_dbgmcu.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_dma.c + "stm32f0xx_dma.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_exti.c + "stm32f0xx_exti.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_flash.c + "stm32f0xx_flash.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_gpio.c + "stm32f0xx_gpio.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_i2c.c + "stm32f0xx_i2c.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_iwdg.c + "stm32f0xx_iwdg.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_misc.c + "stm32f0xx_misc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_pwr.c + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_rcc.c + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_rtc.c + "stm32f0xx_rtc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_spi.c + "stm32f0xx_spi.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_syscfg.c + "stm32f0xx_syscfg.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_tim.c + "stm32f0xx_tim.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_usart.c + "stm32f0xx_usart.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_wwdg.c + "stm32f0xx_wwdg.h" + "stm32f0xx_rcc.h" + +1461835260 source:c:\users\voorburg\desktop\stm32f0\src\main.c + "stm32f0xx_conf.h" + +1461834350 source:c:\users\voorburg\desktop\stm32f0\src\startup_stm32f0xx.s + +1461834558 source:c:\users\voorburg\desktop\stm32f0\src\system_stm32f0xx.c + "stm32f0xx.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_adc.c + "stm32f0xx_adc.h" + "stm32f0xx_rcc.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_adc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\stm32f0xx.h + "core_cm0.h" + "system_stm32f0xx.h" + + "stm32f0xx_conf.h" + +1461834352 c:\users\voorburg\desktop\stm32f0\lib\cmsis\core_cm0.h + + "core_cmInstr.h" + "core_cmFunc.h" + +1461834353 c:\users\voorburg\desktop\stm32f0\lib\cmsis\core_cminstr.h + + +1461834352 c:\users\voorburg\desktop\stm32f0\lib\cmsis\core_cmfunc.h + + +1461834350 c:\users\voorburg\desktop\stm32f0\src\hw\system_stm32f0xx.h + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\stm32f0xx_conf.h + "stm32f0xx_adc.h" + "stm32f0xx_can.h" + "stm32f0xx_cec.h" + "stm32f0xx_crc.h" + "stm32f0xx_crs.h" + "stm32f0xx_comp.h" + "stm32f0xx_dac.h" + "stm32f0xx_dbgmcu.h" + "stm32f0xx_dma.h" + "stm32f0xx_exti.h" + "stm32f0xx_flash.h" + "stm32f0xx_gpio.h" + "stm32f0xx_syscfg.h" + "stm32f0xx_i2c.h" + "stm32f0xx_iwdg.h" + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + "stm32f0xx_rtc.h" + "stm32f0xx_spi.h" + "stm32f0xx_tim.h" + "stm32f0xx_usart.h" + "stm32f0xx_wwdg.h" + "stm32f0xx_misc.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_can.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_cec.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_crc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_crs.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_comp.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_dac.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_dbgmcu.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_dma.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_exti.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_flash.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_gpio.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_syscfg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_i2c.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_iwdg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_pwr.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_rcc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_rtc.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_spi.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_tim.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_usart.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_wwdg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_misc.h + "stm32f0xx.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_can.c + "stm32f0xx_can.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_cec.c + "stm32f0xx_cec.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_comp.c + "stm32f0xx_comp.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_crc.c + "stm32f0xx_crc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_crs.c + "stm32f0xx_crs.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_dac.c + "stm32f0xx_dac.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_dbgmcu.c + "stm32f0xx_dbgmcu.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_dma.c + "stm32f0xx_dma.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_exti.c + "stm32f0xx_exti.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_flash.c + "stm32f0xx_flash.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_gpio.c + "stm32f0xx_gpio.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_i2c.c + "stm32f0xx_i2c.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_iwdg.c + "stm32f0xx_iwdg.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_misc.c + "stm32f0xx_misc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_pwr.c + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_rcc.c + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_rtc.c + "stm32f0xx_rtc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_spi.c + "stm32f0xx_spi.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_syscfg.c + "stm32f0xx_syscfg.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_tim.c + "stm32f0xx_tim.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_usart.c + "stm32f0xx_usart.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_wwdg.c + "stm32f0xx_wwdg.h" + "stm32f0xx_rcc.h" + +1461834350 source:c:\users\voorburg\desktop\stm32f0\src\hw\startup_stm32f0xx.s + +1461834558 source:c:\users\voorburg\desktop\stm32f0\src\hw\system_stm32f0xx.c + "stm32f0xx.h" + +1461838417 source:c:\users\voorburg\desktop\stm32f0\src\app\main.c + "stm32f0xx_conf.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_adc.c + "stm32f0xx_adc.h" + "stm32f0xx_rcc.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_adc.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\stm32f0xx.h + "core_cm0.h" + "system_stm32f0xx.h" + + "stm32f0xx_conf.h" + +1461834352 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\cmsis\core_cm0.h + + "core_cmInstr.h" + "core_cmFunc.h" + +1461834353 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\cmsis\core_cminstr.h + + +1461834352 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\cmsis\core_cmfunc.h + + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\\system_stm32f0xx.h + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\stm32f0xx_conf.h + "stm32f0xx_adc.h" + "stm32f0xx_can.h" + "stm32f0xx_cec.h" + "stm32f0xx_crc.h" + "stm32f0xx_crs.h" + "stm32f0xx_comp.h" + "stm32f0xx_dac.h" + "stm32f0xx_dbgmcu.h" + "stm32f0xx_dma.h" + "stm32f0xx_exti.h" + "stm32f0xx_flash.h" + "stm32f0xx_gpio.h" + "stm32f0xx_syscfg.h" + "stm32f0xx_i2c.h" + "stm32f0xx_iwdg.h" + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + "stm32f0xx_rtc.h" + "stm32f0xx_spi.h" + "stm32f0xx_tim.h" + "stm32f0xx_usart.h" + "stm32f0xx_wwdg.h" + "stm32f0xx_misc.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_can.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_cec.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_crc.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_crs.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_comp.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_dac.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_dbgmcu.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_dma.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_exti.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_flash.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_gpio.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_syscfg.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_i2c.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_iwdg.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_pwr.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_rcc.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_rtc.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_spi.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_tim.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_usart.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_wwdg.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_misc.h + "stm32f0xx.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_can.c + "stm32f0xx_can.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_cec.c + "stm32f0xx_cec.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_comp.c + "stm32f0xx_comp.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_crc.c + "stm32f0xx_crc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_crs.c + "stm32f0xx_crs.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_dac.c + "stm32f0xx_dac.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_dbgmcu.c + "stm32f0xx_dbgmcu.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_dma.c + "stm32f0xx_dma.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_exti.c + "stm32f0xx_exti.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_flash.c + "stm32f0xx_flash.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_gpio.c + "stm32f0xx_gpio.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_i2c.c + "stm32f0xx_i2c.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_iwdg.c + "stm32f0xx_iwdg.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_misc.c + "stm32f0xx_misc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_pwr.c + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_rcc.c + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_rtc.c + "stm32f0xx_rtc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_spi.c + "stm32f0xx_spi.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_syscfg.c + "stm32f0xx_syscfg.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_tim.c + "stm32f0xx_tim.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_usart.c + "stm32f0xx_usart.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_wwdg.c + "stm32f0xx_wwdg.h" + "stm32f0xx_rcc.h" + +1461927866 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\main.c + "boot.h" + "stm32f0xx.h" + +1461834350 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\startup_stm32f0xx.s + +1461834558 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\system_stm32f0xx.c + "stm32f0xx.h" + +1461856989 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\cstart.s + +1461863332 source:c:\work\software\openblt\target\source\armcm0_stm32\gcc\cstart.s + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\system_stm32f0xx.h + +1461834558 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\system_stm32f0xx.c + "stm32f0xx.h" + +1461928082 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\hooks.c + "boot.h" + "led.h" + "stm32f0xx.h" + +1456845505 c:\work\software\openblt\target\source\boot.h + "types.h" + "assert.h" + "blt_conf.h" + "plausibility.h" + "cpu.h" + "cop.h" + "nvm.h" + "timer.h" + "backdoor.h" + "file.h" + "com.h" + +1461858281 c:\work\software\openblt\target\source\armcm0_stm32\types.h + +1456845505 c:\work\software\openblt\target\source\assert.h + +1461928291 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\\blt_conf.h + +1456845505 c:\work\software\openblt\target\source\plausibility.h + +1456845505 c:\work\software\openblt\target\source\cpu.h + +1456845505 c:\work\software\openblt\target\source\cop.h + +1456845505 c:\work\software\openblt\target\source\nvm.h + +1456845505 c:\work\software\openblt\target\source\timer.h + +1456845505 c:\work\software\openblt\target\source\backdoor.h + +1456845505 c:\work\software\openblt\target\source\file.h + "ff.h" + +1456845505 c:\work\software\openblt\target\source\com.h + "xcp.h" + +1456845506 c:\work\software\openblt\target\source\xcp.h + +1461925958 source:c:\work\software\openblt\target\source\armcm0_stm32\cpu.c + "boot.h" + "stm32f0xx.h" + +1461857921 source:c:\work\software\openblt\target\source\armcm0_stm32\nvm.c + "boot.h" + "flash.h" + +1461857911 c:\work\software\openblt\target\source\armcm0_stm32\flash.h + +1461858254 source:c:\work\software\openblt\target\source\armcm0_stm32\timer.c + "boot.h" + "stm32f0xx.h" + +1461861905 source:c:\work\software\openblt\target\source\armcm0_stm32\flash.c + "boot.h" + "stm32f0xx.h" + +1456845497 source:c:\work\software\openblt\target\source\assert.c + "boot.h" + +1456845497 source:c:\work\software\openblt\target\source\backdoor.c + "boot.h" + +1456845497 source:c:\work\software\openblt\target\source\boot.c + "boot.h" + +1456845497 source:c:\work\software\openblt\target\source\com.c + "boot.h" + "can.h" + "uart.h" + "usb.h" + "net.h" + +1456845505 c:\work\software\openblt\target\source\can.h + +1456845505 c:\work\software\openblt\target\source\uart.h + +1456845506 c:\work\software\openblt\target\source\usb.h + +1456845505 c:\work\software\openblt\target\source\net.h + +1456845497 source:c:\work\software\openblt\target\source\cop.c + "boot.h" + +1456845497 source:c:\work\software\openblt\target\source\xcp.c + "boot.h" + +1461910205 source:c:\work\software\openblt\target\source\armcm0_stm32\uart.c + "boot.h" + "stm32f0xx.h" + +1461862428 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\led.h + +1461909321 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\led.c + "boot.h" + "led.h" + "stm32f0xx.h" + diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.ebp b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.ebp new file mode 100644 index 00000000..25cd9964 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.ebp @@ -0,0 +1,381 @@ + + + + + + + diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.elay b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.elay new file mode 100644 index 00000000..230ef842 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/ide/stm32f0.elay @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/led.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/led.c new file mode 100644 index 00000000..509b4e95 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/led.c @@ -0,0 +1,105 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Boot\led.c +* \brief LED driver source file. +* \ingroup Boot_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "led.h" /* module header */ +#include "stm32f0xx.h" /* for STM32F0 registers and drivers */ + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Holds the desired LED blink interval time. */ +static blt_int16u ledBlinkIntervalMs; + + +/************************************************************************************//** +** \brief Initializes the LED blink driver. +** \param interval_ms Specifies the desired LED blink interval time in milliseconds. +** \return none. +** +****************************************************************************************/ +void LedBlinkInit(blt_int16u interval_ms) +{ + /* store the interval time between LED toggles */ + ledBlinkIntervalMs = interval_ms; +} /*** end of LedBlinkInit ***/ + + +/************************************************************************************//** +** \brief Task function for blinking the LED as a fixed timer interval. +** \return none. +** +****************************************************************************************/ +void LedBlinkTask(void) +{ + static blt_bool ledOn = BLT_FALSE; + static blt_int32u nextBlinkEvent = 0; + + /* check for blink event */ + if (TimerGet() >= nextBlinkEvent) + { + /* toggle the LED state */ + if (ledOn == BLT_FALSE) + { + ledOn = BLT_TRUE; + GPIO_SetBits(GPIOC, GPIO_Pin_8); + } + else + { + ledOn = BLT_FALSE; + GPIO_ResetBits(GPIOC, GPIO_Pin_8); + } + /* schedule the next blink event */ + nextBlinkEvent = TimerGet() + ledBlinkIntervalMs; + } +} /*** end of LedBlinkTask ***/ + + +/************************************************************************************//** +** \brief Cleans up the LED blink driver. This is intended to be used upon program +** exit. +** \return none. +** +****************************************************************************************/ +void LedBlinkExit(void) +{ + /* turn the LED off */ + GPIO_ResetBits(GPIOC, GPIO_Pin_8); +} /*** end of LedBlinkExit ***/ + + +/*********************************** end of led.c **************************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/led.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/led.h new file mode 100644 index 00000000..dcda097c --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/led.h @@ -0,0 +1,45 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Boot\led.h +* \brief LED driver header file. +* \ingroup Boot_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ +#ifndef LED_H +#define LED_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void LedBlinkInit(blt_int16u interval_ms); +void LedBlinkTask(void); +void LedBlinkExit(void); + + +#endif /* LED_H */ +/*********************************** end of led.h **************************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_adc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_adc.h new file mode 100644 index 00000000..6d981652 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_adc.h @@ -0,0 +1,450 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_can.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_can.h new file mode 100644 index 00000000..3bc6b4a0 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_can.h @@ -0,0 +1,643 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_cec.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_cec.h new file mode 100644 index 00000000..c98217f2 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_cec.h @@ -0,0 +1,300 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_comp.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_comp.h new file mode 100644 index 00000000..d1205db4 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_comp.h @@ -0,0 +1,245 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_crc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_crc.h new file mode 100644 index 00000000..72080ac9 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_crc.h @@ -0,0 +1,122 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_crs.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_crs.h new file mode 100644 index 00000000..cf499b64 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_crs.h @@ -0,0 +1,183 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dac.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dac.h new file mode 100644 index 00000000..2a79b892 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dac.h @@ -0,0 +1,312 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dbgmcu.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dbgmcu.h new file mode 100644 index 00000000..1bd2ce71 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dbgmcu.h @@ -0,0 +1,107 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dma.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dma.h new file mode 100644 index 00000000..41400e18 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_dma.h @@ -0,0 +1,377 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_exti.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_exti.h new file mode 100644 index 00000000..e4067b3c --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_exti.h @@ -0,0 +1,216 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_flash.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_flash.h new file mode 100644 index 00000000..4daeecc9 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_flash.h @@ -0,0 +1,430 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_gpio.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_gpio.h new file mode 100644 index 00000000..d98278e4 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_gpio.h @@ -0,0 +1,358 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_i2c.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_i2c.h new file mode 100644 index 00000000..19ef9b68 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_i2c.h @@ -0,0 +1,478 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_iwdg.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_iwdg.h new file mode 100644 index 00000000..e217df34 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_iwdg.h @@ -0,0 +1,140 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_misc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_misc.h new file mode 100644 index 00000000..9a1f6842 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_misc.h @@ -0,0 +1,143 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_pwr.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_pwr.h new file mode 100644 index 00000000..9941f445 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_pwr.h @@ -0,0 +1,197 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_rcc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_rcc.h new file mode 100644 index 00000000..250245f2 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_rcc.h @@ -0,0 +1,608 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_rtc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_rtc.h new file mode 100644 index 00000000..94bd7d16 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_rtc.h @@ -0,0 +1,807 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_spi.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_spi.h new file mode 100644 index 00000000..effa9007 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_spi.h @@ -0,0 +1,588 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_syscfg.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_syscfg.h new file mode 100644 index 00000000..2735f636 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_syscfg.h @@ -0,0 +1,262 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_tim.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_tim.h new file mode 100644 index 00000000..48e00157 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_tim.h @@ -0,0 +1,1186 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_usart.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_usart.h new file mode 100644 index 00000000..797c5f02 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_usart.h @@ -0,0 +1,599 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_wwdg.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_wwdg.h new file mode 100644 index 00000000..cbe8fefd --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/inc/stm32f0xx_wwdg.h @@ -0,0 +1,109 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_adc.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_adc.c new file mode 100644 index 00000000..0c1964cc --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_adc.c @@ -0,0 +1,1240 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_can.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_can.c new file mode 100644 index 00000000..6eb990d0 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_can.c @@ -0,0 +1,1631 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_cec.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_cec.c new file mode 100644 index 00000000..6042b6cd --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_cec.c @@ -0,0 +1,607 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_comp.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_comp.c new file mode 100644 index 00000000..48464a2c --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_comp.c @@ -0,0 +1,408 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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_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)<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<CSR &= (uint32_t)(~((uint32_t)1<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<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<
© COPYRIGHT 2014 STMicroelectronics
+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_crs.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_crs.c new file mode 100644 index 00000000..7e325e16 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_crs.c @@ -0,0 +1,466 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dac.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dac.c new file mode 100644 index 00000000..6a299fe1 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dac.c @@ -0,0 +1,692 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dbgmcu.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dbgmcu.c new file mode 100644 index 00000000..3b34412e --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dbgmcu.c @@ -0,0 +1,218 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dma.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dma.c new file mode 100644 index 00000000..dab0b926 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_dma.c @@ -0,0 +1,705 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_exti.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_exti.c new file mode 100644 index 00000000..fd056447 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_exti.c @@ -0,0 +1,314 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_flash.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_flash.c new file mode 100644 index 00000000..59925207 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_flash.c @@ -0,0 +1,1256 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_gpio.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_gpio.c new file mode 100644 index 00000000..c8eee37e --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_gpio.c @@ -0,0 +1,540 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_i2c.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_i2c.c new file mode 100644 index 00000000..7ff42e89 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_i2c.c @@ -0,0 +1,1585 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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_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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_iwdg.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_iwdg.c new file mode 100644 index 00000000..333b2842 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_iwdg.c @@ -0,0 +1,293 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_misc.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_misc.c new file mode 100644 index 00000000..7e28b6a3 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_misc.c @@ -0,0 +1,167 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_pwr.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_pwr.c new file mode 100644 index 00000000..add2a7f8 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_pwr.c @@ -0,0 +1,566 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_rcc.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_rcc.c new file mode 100644 index 00000000..ed585613 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_rcc.c @@ -0,0 +1,1741 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_rtc.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_rtc.c new file mode 100644 index 00000000..4d28bff6 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_rtc.c @@ -0,0 +1,2518 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_spi.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_spi.c new file mode 100644 index 00000000..7eec0ef4 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_spi.c @@ -0,0 +1,1334 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_syscfg.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_syscfg.c new file mode 100644 index 00000000..fe474cc0 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_syscfg.c @@ -0,0 +1,320 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_tim.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_tim.c new file mode 100644 index 00000000..fa756f0f --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_tim.c @@ -0,0 +1,3349 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_usart.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_usart.c new file mode 100644 index 00000000..f697397d --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_usart.c @@ -0,0 +1,2096 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_wwdg.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_wwdg.c new file mode 100644 index 00000000..9ff2f921 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/SPL/src/stm32f0xx_wwdg.c @@ -0,0 +1,303 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/arm_common_tables.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/arm_common_tables.h new file mode 100644 index 00000000..34f910f9 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/arm_common_tables.h @@ -0,0 +1,35 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010 ARM Limited. All rights reserved. +* +* $Date: 11. November 2010 +* $Revision: V1.0.2 +* +* 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 +* +* Version 1.0.2 2010/11/11 +* Documentation updated. +* +* Version 1.0.1 2010/10/05 +* Production release and review comments incorporated. +* +* Version 1.0.0 2010/09/20 +* Production release and review comments incorporated. +* -------------------------------------------------------------------- */ + +#ifndef _ARM_COMMON_TABLES_H +#define _ARM_COMMON_TABLES_H + +#include "arm_math.h" + +extern uint16_t armBitRevTable[256]; +extern q15_t armRecipTableQ15[64]; +extern q31_t armRecipTableQ31[64]; +extern const q31_t realCoefAQ31[1024]; +extern const q31_t realCoefBQ31[1024]; + +#endif /* ARM_COMMON_TABLES_H */ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/arm_math.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/arm_math.h new file mode 100644 index 00000000..d8901db1 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/arm_math.h @@ -0,0 +1,7051 @@ +/* ---------------------------------------------------------------------- + * Copyright (C) 2010 ARM Limited. All rights reserved. + * + * $Date: 15. July 2011 + * $Revision: V1.0.10 + * + * Project: CMSIS DSP Library + * Title: arm_math.h + * + * Description: Public header file for CMSIS DSP Library + * + * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 + * + * Version 1.0.10 2011/7/15 + * Big Endian support added and Merged M0 and M3/M4 Source code. + * + * Version 1.0.3 2010/11/29 + * Re-organized the CMSIS folders and updated documentation. + * + * Version 1.0.2 2010/11/11 + * Documentation updated. + * + * Version 1.0.1 2010/10/05 + * Production release and review comments incorporated. + * + * Version 1.0.0 2010/09/20 + * Production release and review comments incorporated. + * -------------------------------------------------------------------- */ + +/** + \mainpage CMSIS DSP Software Library + * + * Introduction + * + * 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 modules 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. + * + * Processor Support + * + * The library is completely written in C and is fully CMSIS compliant. + * High performance is achieved through maximum use of Cortex-M4 intrinsics. + * + * The supplied library source code also builds and runs on the Cortex-M3 and Cortex-M0 processor, + * with the DSP intrinsics being emulated through software. + * + * + * Toolchain Support + * + * The library has been developed and tested with MDK-ARM version 4.21. + * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. + * + * Using the Library + * + * The library installer contains prebuilt versions of the libraries in the Lib 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 arm_math.h which is placed in the Include 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 arm_math.h 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 depending on the target processor in the application. + * + * Examples + * + * The library ships with a number of examples which demonstrate how to use the library functions. + * + * Building the Library + * + * The library installer contains project files to re build libraries on MDK Tool chain in the CMSIS\DSP_Lib\Source\ARM 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 + * + * Each library project have differant pre-processor macros. + * + * 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_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 for checking on the input and output sizes of matrices + * + * ARM_MATH_ROUNDING: + * Define macro for rounding on support functions + * + * __FPU_PRESENT: + * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries + * + * + * The project can be built by opening the appropriate project in MDK-ARM 4.21 chain and defining the optional pre processor MACROs detailed above. + * + * Copyright Notice + * + * Copyright (C) 2010 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: + *
+ *     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;
+ * 
+ * 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 numRows X numCols + * and the values are arranged in row order. That is, the + * matrix element (i, j) is stored at: + *
+ *     pData[i*numCols + j]
+ * 
+ * + * \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 arm_mat_init_f32(), arm_mat_init_q31() + * and arm_mat_init_q15() 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: + *
+ * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
+ * 
+ * where nRows specifies the number of rows, nColumns + * specifies the number of columns, and pData 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: + *
+ *     ARM_MATH_SIZE_MISMATCH
+ * 
+ * Otherwise the functions return + *
+ *     ARM_MATH_SUCCESS
+ * 
+ * There is some overhead associated with this matrix size checking. + * The matrix size checking is enabled via the #define + *
+ *     ARM_MATH_MATRIX_CHECK
+ * 
+ * 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 ARM_MATH_SUCCESS. + */ + +/** + * @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" +#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 +#define PI 3.14159265358979f + + /** + * @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 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. + */ +#define __SIMD32(addr) (*(int32_t **) & (addr)) + +#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) + /** + * @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) ) + +#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) && defined ( __CC_ARM ) +#define __CLZ __clz +#endif + +#if defined (ARM_MATH_CM0) && ((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) + + 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 */ + + + + /* + * @brief C custom defined intrinsic function for M3 and M0 processors + */ +#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) + + /* + * @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 = (char) x; + s = (char) 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 = (char) x; + s = (char) 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))); + } + + + + +#endif /* (ARM_MATH_CM3) || defined (ARM_MATH_CM0) */ + + + /** + * @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 + * numTaps 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS 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 ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS 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 ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + 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; + float32_t x1; + float32_t 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 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; + + /** + * @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; + + /** + * @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; + + /** + * @brief Processing function for the Q15 CFFT/CIFFT. + * @param[in] *S points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc); + + /** + * @brief Initialization function for the Q15 CFFT/CIFFT. + * @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_q15( + arm_cfft_radix4_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Processing function for the Q31 CFFT/CIFFT. + * @param[in] *S points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc); + + /** + * @brief Initialization function for the Q31 CFFT/CIFFT. + * @param[in,out] *S points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_q31( + arm_cfft_radix4_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Processing function for the floating-point CFFT/CIFFT. + * @param[in] *S points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Initialization function for the floating-point CFFT/CIFFT. + * @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_f32( + arm_cfft_radix4_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + + + /*---------------------------------------------------------------------- + * Internal functions prototypes FFT function + ----------------------------------------------------------------------*/ + + /** + * @brief Core function for the floating-point CFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to the twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_f32( + float32_t * pSrc, + uint16_t fftLen, + float32_t * pCoef, + uint16_t twidCoefModifier); + + /** + * @brief Core function for the floating-point CIFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @param[in] onebyfftLen value of 1/fftLen. + * @return none. + */ + + void arm_radix4_butterfly_inverse_f32( + float32_t * pSrc, + uint16_t fftLen, + float32_t * pCoef, + uint16_t twidCoefModifier, + float32_t onebyfftLen); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftSize length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table. + * @param[in] *pBitRevTab points to the bit reversal table. + * @return none. + */ + + void arm_bitreversal_f32( + float32_t *pSrc, + uint16_t fftSize, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @brief Core function for the Q31 CFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_q31( + q31_t *pSrc, + uint32_t fftLen, + q31_t *pCoef, + uint32_t twidCoefModifier); + + /** + * @brief Core function for the Q31 CIFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_inverse_q31( + q31_t * pSrc, + uint32_t fftLen, + q31_t * pCoef, + uint32_t twidCoefModifier); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table + * @param[in] *pBitRevTab points to bit reversal table. + * @return none. + */ + + void arm_bitreversal_q31( + q31_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @brief Core function for the Q15 CFFT butterfly process. + * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef16 points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_q15( + q15_t *pSrc16, + uint32_t fftLen, + q15_t *pCoef16, + uint32_t twidCoefModifier); + + /** + * @brief Core function for the Q15 CIFFT butterfly process. + * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef16 points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_inverse_q15( + q15_t *pSrc16, + uint32_t fftLen, + q15_t *pCoef16, + uint32_t twidCoefModifier); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table + * @param[in] *pBitRevTab points to bit reversal table. + * @return none. + */ + + void arm_bitreversal_q15( + q15_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @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; + + /** + * @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; + + /** + * @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; + + /** + * @brief Processing function for the Q15 RFFT/RIFFT. + * @param[in] *S points to an instance of the Q15 RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_q15( + const arm_rfft_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst); + + /** + * @brief Initialization function for the Q15 RFFT/RIFFT. + * @param[in, out] *S points to an instance of the Q15 RFFT/RIFFT structure. + * @param[in] *S_CFFT points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + 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); + + /** + * @brief Processing function for the Q31 RFFT/RIFFT. + * @param[in] *S points to an instance of the Q31 RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_q31( + const arm_rfft_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst); + + /** + * @brief Initialization function for the Q31 RFFT/RIFFT. + * @param[in, out] *S points to an instance of the Q31 RFFT/RIFFT structure. + * @param[in, out] *S_CFFT points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + 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); + + /** + * @brief Initialization function for the floating-point RFFT/RIFFT. + * @param[in,out] *S points to an instance of the floating-point RFFT/RIFFT structure. + * @param[in,out] *S_CFFT points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + 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); + + /** + * @brief Processing function for the floating-point RFFT/RIFFT. + * @param[in] *S points to an instance of the floating-point RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_f32( + const arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst); + + /** + * @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 fftLenReal 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 N 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 N 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 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 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. + * @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. + * @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 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. + * @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 + * blockSize is not a multiple of M. + */ + + 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 + * blockSize is not a multiple of M. + */ + + 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 + * blockSize is not a multiple of M. + */ + + 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 numTaps is not a multiple of the interpolation factor L. + */ + + 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 numTaps is not a multiple of the interpolation factor L. + */ + + 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 numTaps is not a multiple of the interpolation factor L. + */ + + 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. + * @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 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. + * @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. + * S points to an instance of the PID control data structure. in + * is the input sample value. The functions return the output value. + * + * \par Algorithm: + *
+   *    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  
+ * + * \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. + * + * Scaling and Overflow Behavior: + * \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. + * + * Scaling and Overflow Behavior: + * \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; + + /* Implementation of PID controller */ + + #ifdef ARM_MATH_CM0 + + /* acc = A0 * x[n] */ + acc = ((q31_t) S->A0 )* in ; + + #else + + /* acc = A0 * x[n] */ + acc = (q31_t) __SMUAD(S->A0, in); + + #endif + + #ifdef ARM_MATH_CM0 + + /* 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] ; + + #else + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc = __SMLALD(S->A1, (q31_t)__SIMD32(S->state), acc); + + #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 Ia, Ib and Ic to calculate currents + * in the two-phase orthogonal stator axis Ialpha and Ibeta. + * When Ialpha is superposed with Ia as shown in the figure below + * \image html clarke.gif Stator current space vector and its components in (a,b). + * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta + * can be calculated using only Ia and Ib. + * + * 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 Ia and Ib are the instantaneous stator phases and + * pIalpha and pIbeta 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 a + * @param[in] Ib input three-phase coordinate b + * @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 a + * @param[in] Ib input three-phase coordinate b + * @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. + * + * Scaling and Overflow Behavior: + * \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 pIa and pIb are the instantaneous stator phases and + * Ialpha and Ibeta 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 a + * @param[out] *pIb points to output three-phase coordinate b + * @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 a + * @param[out] *pIb points to output three-phase coordinate b + * @return none. + * + * Scaling and Overflow Behavior: + * \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 Ialpha and the Ibeta 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 Ialpha and Ibeta are the stator vector components, + * pId and pIq are rotor vector components and cosVal and sinVal 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. + * + * Scaling and Overflow Behavior: + * \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 pIalpha and pIbeta are the stator vector components, + * Id and Iq are rotor vector components and cosVal and sinVal 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. + * + * Scaling and Overflow Behavior: + * \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: + *
+   *       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
+   * 
+ * + * \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. + * S points to an instance of the Linear Interpolate function data structure. + * x 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 = (x - S->x1) / xSpacing; + + if(i < 0) + { + /* Iniatilize output for below specified range as least output value of table */ + y = pYData[0]; + } + else if(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 x 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 >= (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 x 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 >= (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 x 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 */ + 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 >= (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 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: + *
+   *      x1 = x0 - f(x0)/f'(x0)
+   * 
+ * where x1 is the current estimate, + * x0 is the previous estimate and + * f'(x0) is the derivative of f() evaluated at x0. + * For the square root function, the algorithm reduces to: + *
+   *     x0 = in/2                         [initial guess]
+   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
+   * 
+ */ + + + /** + * @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 + * in 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 + * in 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 + * in 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 f(x, y) 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. + * + * Algorithm + * \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: + *
+   *   typedef struct
+   *   {
+   *     uint16_t numRows;
+   *     uint16_t numCols;
+   *     float32_t *pData;
+   * } arm_bilinear_interp_instance_f32;
+   * 
+ * + * \par + * where numRows specifies the number of rows in the table; + * numCols specifies the number of columns in the table; + * and pData points to an array of size numRows*numCols values. + * The data table pTable is organized in row order and the supplied data values fall on integer indexes. + * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. + * + * \par + * Let (x, y) specify the desired interpolation point. Then define: + *
+   *     XF = floor(x)
+   *     YF = floor(y)
+   * 
+ * \par + * The interpolated output point is computed as: + *
+   *  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)
+   * 
+ * 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 + */ + + + + + + +#ifdef __cplusplus +} +#endif + + +#endif /* _ARM_MATH_H */ + + +/** + * + * End of file. + */ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cm0.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cm0.h new file mode 100644 index 00000000..edd52217 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cm0.h @@ -0,0 +1,665 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V2.10 + * @date 19. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ +#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 + + +/** \mainpage CMSIS Cortex-M0 + + This documentation describes the CMSIS Cortex-M Core Peripheral Access Layer. + It consists of: + + - Cortex-M Core Register Definitions + - Cortex-M functions + - Cortex-M instructions + + The CMSIS Cortex-M0 Core Peripheral Access Layer contains C and assembly functions that ease + access to the Cortex-M Core + */ + +/** \defgroup CMSIS_MISRA_Exceptions CMSIS MISRA-C:2004 Compliance Exceptions + CMSIS violates following MISRA-C2004 Rules: + + - Violates MISRA 2004 Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + - Violates MISRA 2004 Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + - Violates MISRA 2004 Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** \defgroup CMSIS_core_definitions CMSIS Core Definitions + This file defines all structures and symbols for CMSIS core: + - CMSIS version number + - Cortex-M core + - Cortex-M core Revision Number + @{ + */ + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (0x02) /*!< [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (0x10) /*!< [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 core */ + + +#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 available 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 + +/*!< __FPU_USED to be checked prior to making use of FPU specific registers and functions */ +#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__ ) + /* add preprocessor checks */ +#endif + +#include /*!< 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) */ +#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 CMSIS_core_definitions */ + + + +/******************************************************************************* + * Register Abstraction + ******************************************************************************/ +/** \defgroup CMSIS_core_register CMSIS Core Register + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register +*/ + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CORE CMSIS Core + Type definitions for the Cortex-M Core Registers + @{ + */ + +/** \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 CMSIS NVIC + Type definitions for the Cortex-M 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 CMSIS SCB + Type definitions for the Cortex-M 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 CMSIS SysTick + Type definitions for the Cortex-M 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 CMSIS Core Debug + 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 + @{ + */ + +/* Memory mapping of Cortex-M0 Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space 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 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 + ******************************************************************************/ +/** \defgroup CMSIS_Core_FunctionInterface CMSIS Core Function Interface + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions +*/ + + + +/* ########################## NVIC functions #################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions CMSIS Core NVIC Functions + @{ + */ + +/* 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 + + This function enables a device specific interrupt in the NVIC interrupt controller. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the external interrupt to enable + */ +static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Disable External Interrupt + + This function disables a device specific interrupt in the NVIC interrupt controller. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the external interrupt to disable + */ +static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Get Pending Interrupt + + This function reads the pending register in the NVIC and returns the pending bit + for the specified interrupt. + + \param [in] IRQn Number of the interrupt for get pending + \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 + + This function sets the pending bit for the specified interrupt. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the interrupt for set pending + */ +static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Clear Pending Interrupt + + This function clears the pending bit for the specified interrupt. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the interrupt for clear pending + */ +static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + + +/** \brief Set Interrupt Priority + + This function sets the priority for the specified interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + Note: The priority cannot be set for every core interrupt. + + \param [in] IRQn Number of the interrupt for set priority + \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 + + This function reads the priority for the specified interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + The returned priority value is automatically aligned to the implemented + priority bits of the microcontroller. + + \param [in] IRQn Number of the interrupt for get priority + \return Interrupt Priority + */ +static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */ + else { + return((uint32_t)((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** \brief System Reset + + This function initiate 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 CMSIS Core SysTick Functions + @{ + */ + +#if (__Vendor_SysTickConfig == 0) + +/** \brief System Tick Configuration + + This function initialises the system tick timer and its interrupt and start the system tick timer. + Counter is in free running mode to generate periodical interrupts. + + \param [in] ticks Number of ticks between two interrupts + \return 0 Function succeeded + \return 1 Function failed + */ +static __INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ + + SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ + 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cmFunc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cmFunc.h new file mode 100644 index 00000000..c999b1c8 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cmFunc.h @@ -0,0 +1,609 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V2.10 + * @date 26. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#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 ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR 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 + +#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"); +} + + +/** \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"); +} + + +/** \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) ); +} + + +/** \brief Get ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR 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) ); +} + + +/** \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) ); +} + + +/** \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) ); +} + + +#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"); +} + + +/** \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"); +} + + +/** \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) ); +} + + +/** \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) ); +} + +#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; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + 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) + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) ); +#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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cmInstr.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cmInstr.h new file mode 100644 index 00000000..ceb4f875 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/cmsis/core_cmInstr.h @@ -0,0 +1,585 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V2.10 + * @date 19. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#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 + */ +static __INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} + + +/** \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 + */ +static __INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} + + +#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 + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \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) +{ + uint32_t result; + + __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \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" : "=r" (result) : "r" (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) +{ + uint32_t result; + + __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +#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) +{ + uint8_t result; + + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); + 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) +{ + uint16_t result; + + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); + 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) : "r" (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) : "r" (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) : "r" (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) : "r" (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"); +} + + +/** \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) +{ + uint8_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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/stm32f0xx.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/stm32f0xx.h new file mode 100644 index 00000000..3b7a0f9b --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/stm32f0xx.h @@ -0,0 +1,5111 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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 + +/** @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; /*!
© COPYRIGHT 2014 STMicroelectronics
+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/system_stm32f0xx.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/system_stm32f0xx.c new file mode 100644 index 00000000..77ea0174 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/system_stm32f0xx.c @@ -0,0 +1,383 @@ +/** + ****************************************************************************** + * @file system_stm32f0xx.c + * @author MCD Application Team + * @version V1.0.0 + * @date 23-March-2012 + * @brief CMSIS Cortex-M0 Device Peripheral Access Layer System Source File. + * This file contains the system clock configuration for STM32F0xx devices, + * and is customized for use with STM32F0-DISCOVERY Kit. + * The STM32F0xx is configured to run at 48 MHz, following the three + * configuration below: + * - PLL_SOURCE_HSI (default): HSI (~8MHz) used to clock the PLL, and + * the PLL is used as system clock source. + * - PLL_SOURCE_HSE : HSE (8MHz) used to clock the PLL, and + * the PLL is used as system clock source. + * - PLL_SOURCE_HSE_BYPASS : HSE bypassed with an external clock + * (8MHz, coming from ST-Link) used to clock + * the PLL, and the PLL is used as system + * clock source. + * + * + * 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 selected (see above). + * 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. + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * 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 + * @{ + */ +/* Select the PLL clock source */ + +#define PLL_SOURCE_HSI // HSI (~8MHz) used to clock the PLL, and the PLL is used as system clock source +//#define PLL_SOURCE_HSE // HSE (8MHz) used to clock the PLL, and the PLL is used as system clock source +//#define PLL_SOURCE_HSE_BYPASS // HSE bypassed with an external clock (8MHz, coming from ST-Link) used to clock + // the PLL, and the PLL is used as system clock source + +/** + * @} + */ + +/** @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 + */ +__IO uint32_t StartUpCounter = 0, HSEStatus = 0; +static void SetSysClock(void) +{ + /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/ +#if defined (PLL_SOURCE_HSI) + /* At this stage the HSI is already enabled */ + + /* 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 = (HSI/2) * 12 = ~48 MHz */ + 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) + { + } +#else + #if defined (PLL_SOURCE_HSE) + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + #elif defined (PLL_SOURCE_HSE_BYPASS) + /* HSE oscillator bypassed with external clock */ + RCC->CR |= (uint32_t)(RCC_CR_HSEON | RCC_CR_HSEBYP); + #endif /* PLL_SOURCE_HSE */ + + /* 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 */ + } +#endif /* PLL_SOURCE_HSI */ +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/system_stm32f0xx.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/system_stm32f0xx.h new file mode 100644 index 00000000..09630700 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/lib/system_stm32f0xx.h @@ -0,0 +1,104 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/main.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/main.c new file mode 100644 index 00000000..94ea3564 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Boot/main.c @@ -0,0 +1,117 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Boot\main.c +* \brief Bootloader application source file. +* \ingroup Boot_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "stm32f0xx.h" /* for STM32F0 registers and drivers */ + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static void Init(void); + + +/************************************************************************************//** +** \brief This is the entry point for the bootloader application and is called +** by the reset interrupt vector after the C-startup routines executed. +** \return Program return code. +** +****************************************************************************************/ +int main(void) +{ + /* initialize the microcontroller */ + Init(); + /* initialize the bootloader */ + BootInit(); + + /* start the infinite program loop */ + while (1) + { + /* run the bootloader task */ + BootTask(); + } + + /* program should never get here */ + return 0; +} /*** end of main ***/ + + +/************************************************************************************//** +** \brief Initializes the microcontroller. +** \return none. +** +****************************************************************************************/ +static void Init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + /* enable the GPIO LED clock */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); + /* enable the USART2 clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); + /* enable the USART2 Tx/Rx and pushbutton GPIO clock */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); + + /* configure the GPIO_LED pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOC, &GPIO_InitStructure); + /* turn the LED off */ + GPIO_ResetBits(GPIOC, GPIO_Pin_8); + + /* configure the pushbutton pin as input */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* configure alternate function for the USART2 Tx/Rx pins */ + GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1); + /* Configure USART2 pins: Rx (PA2) and Tx (PA3) */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(GPIOA, &GPIO_InitStructure); +} /*** end of Init ***/ + + +/*********************************** end of main.c *************************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/bin/demoprog_stm32f051.elf b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/bin/demoprog_stm32f051.elf new file mode 100644 index 0000000000000000000000000000000000000000..da561ceb8032fca1a9298a4c5587b496f4ccc7dc GIT binary patch literal 383423 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�Zfrzu`17eFKbA7`lPPU)$>+M8o9mIM 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 z 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 literal 0 HcmV?d00001 diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/bin/demoprog_stm32f051.map b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/bin/demoprog_stm32f051.map new file mode 100644 index 00000000..6eb8ed7a --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/bin/demoprog_stm32f051.map @@ -0,0 +1,3680 @@ +Archive member included because of file (symbol) + +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + .\..\obj\lib\spl\src\stm32f0xx_rcc.o (__aeabi_uidiv) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_dvmd_tls.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) (__aeabi_idiv0) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o (exit) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) (_global_impure_ptr) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o (__libc_init_array) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o (memset) +c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) + c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) (_exit) + +Discarded input sections + + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + .data 0x00000000 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + .ARM.extab 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\boot.o + .text 0x00000000 0x0 .\..\obj\boot.o + .data 0x00000000 0x0 .\..\obj\boot.o + .bss 0x00000000 0x0 .\..\obj\boot.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\led.o + .text 0x00000000 0x0 .\..\obj\led.o + .data 0x00000000 0x0 .\..\obj\led.o + .bss 0x00000000 0x0 .\..\obj\led.o + .debug_macro 0x00000000 0x826 .\..\obj\led.o + .debug_macro 0x00000000 0x66 .\..\obj\led.o + .debug_macro 0x00000000 0x8c .\..\obj\led.o + .debug_macro 0x00000000 0x34 .\..\obj\led.o + .debug_macro 0x00000000 0x16 .\..\obj\led.o + .debug_macro 0x00000000 0x44 .\..\obj\led.o + .debug_macro 0x00000000 0x209 .\..\obj\led.o + .debug_macro 0x00000000 0x249 .\..\obj\led.o + .debug_macro 0x00000000 0x5b9e .\..\obj\led.o + .debug_macro 0x00000000 0x2eb .\..\obj\led.o + .debug_macro 0x00000000 0x3cf .\..\obj\led.o + .debug_macro 0x00000000 0x191 .\..\obj\led.o + .debug_macro 0x00000000 0x46 .\..\obj\led.o + .debug_macro 0x00000000 0xd9 .\..\obj\led.o + .debug_macro 0x00000000 0xef .\..\obj\led.o + .debug_macro 0x00000000 0x184 .\..\obj\led.o + .debug_macro 0x00000000 0x7c .\..\obj\led.o + .debug_macro 0x00000000 0x295 .\..\obj\led.o + .debug_macro 0x00000000 0xd5 .\..\obj\led.o + .debug_macro 0x00000000 0x2b7 .\..\obj\led.o + .debug_macro 0x00000000 0x185 .\..\obj\led.o + .debug_macro 0x00000000 0x184 .\..\obj\led.o + .debug_macro 0x00000000 0x2a0 .\..\obj\led.o + .debug_macro 0x00000000 0x70 .\..\obj\led.o + .debug_macro 0x00000000 0xdf .\..\obj\led.o + .debug_macro 0x00000000 0x4e3 .\..\obj\led.o + .debug_macro 0x00000000 0x4c5 .\..\obj\led.o + .debug_macro 0x00000000 0x396 .\..\obj\led.o + .debug_macro 0x00000000 0x750 .\..\obj\led.o + .debug_macro 0x00000000 0x353 .\..\obj\led.o + .debug_macro 0x00000000 0x34 .\..\obj\led.o + .debug_macro 0x00000000 0x3a .\..\obj\led.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_DeInit + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_Init + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_StructInit + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_Cmd 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ClockModeConfig + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_JitterCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_AutoPowerOffCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_WaitModeCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_AnalogWatchdogCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_AnalogWatchdogThresholdsConfig + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_AnalogWatchdogSingleChannelConfig + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_AnalogWatchdogSingleChannelCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_TempSensorCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_VrefintCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_VbatCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ChannelConfig + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ContinuousModeCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_DiscModeCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_OverrunModeCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_GetCalibrationFactor + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_StopOfConversion + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_StartOfConversion + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_GetConversionValue + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_DMACmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_DMARequestModeConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ITConfig + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_GetFlagStatus + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ClearFlag + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_GetITStatus + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .text.ADC_ClearITPendingBit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_info 0x00000000 0x8d1 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_abbrev 0x00000000 0x18d .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_aranges + 0x00000000 0x108 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_ranges 0x00000000 0xf8 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x17e .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x3c9 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_line 0x00000000 0x68f .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_str 0x00000000 0x3f380 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .debug_frame 0x00000000 0x3d0 .\..\obj\lib\spl\src\stm32f0xx_adc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_DeInit + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_Init + 0x00000000 0x1cc .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_FilterInit + 0x00000000 0x190 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_StructInit + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_SlaveStartBank + 0x00000000 0x74 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_DBGFreeze + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_TTComModeCmd + 0x00000000 0xc8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_Transmit + 0x00000000 0x1dc .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_TransmitStatus + 0x00000000 0xd4 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_CancelTransmit + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_Receive + 0x00000000 0x1b4 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_FIFORelease + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_MessagePending + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_OperatingModeRequest + 0x00000000 0x128 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_Sleep + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_WakeUp + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_GetLastErrorCode + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_GetReceiveErrorCounter + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_GetLSBTransmitErrorCounter + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_ITConfig + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_GetFlagStatus + 0x00000000 0xf0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_ClearFlag + 0x00000000 0x6c .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_GetITStatus + 0x00000000 0x1f0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CAN_ClearITPendingBit + 0x00000000 0xe8 .\..\obj\lib\spl\src\stm32f0xx_can.o + .text.CheckITStatus + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_info 0x00000000 0xb79 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_abbrev 0x00000000 0x1e5 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_aranges + 0x00000000 0xe0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_ranges 0x00000000 0xd0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x1c6 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_macro 0x00000000 0x3c9 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_line 0x00000000 0x78f .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_str 0x00000000 0x3f675 .\..\obj\lib\spl\src\stm32f0xx_can.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_can.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_can.o + .debug_frame 0x00000000 0x330 .\..\obj\lib\spl\src\stm32f0xx_can.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_DeInit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_Init + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_StructInit + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_Cmd 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_ListenModeCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_OwnAddressConfig + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_OwnAddressClear + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_SendData + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_ReceiveData + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_StartOfMessage + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_EndOfMessage + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_ITConfig + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_GetFlagStatus + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_ClearFlag + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_GetITStatus + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_cec.o + .text.CEC_ClearITPendingBit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_info 0x00000000 0x431 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_abbrev 0x00000000 0x1ba .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_aranges + 0x00000000 0x98 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_ranges 0x00000000 0x88 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x17e .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_macro 0x00000000 0x18b .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_line 0x00000000 0x55f .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_str 0x00000000 0x3f175 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_cec.o + .debug_frame 0x00000000 0x1fc .\..\obj\lib\spl\src\stm32f0xx_cec.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_DeInit + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_Init + 0x00000000 0x64 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_StructInit + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_Cmd + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_SwitchCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_GetOutputLevel + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_WindowCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .text.COMP_LockConfig + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_info 0x00000000 0x279 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_abbrev 0x00000000 0x161 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_aranges + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_ranges 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x178 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_macro 0x00000000 0xe9 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_line 0x00000000 0x4ba .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_str 0x00000000 0x3f02a .\..\obj\lib\spl\src\stm32f0xx_comp.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_comp.o + .debug_frame 0x00000000 0x10c .\..\obj\lib\spl\src\stm32f0xx_comp.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_DeInit + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_ResetDR + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_PolynomialSizeSelect + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_ReverseInputDataSelect + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_ReverseOutputDataCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_SetInitRegister + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_SetPolynomial + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_CalcCRC + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_CalcCRC16bits + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_CalcCRC8bits + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_CalcBlockCRC + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_GetCRC + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_SetIDRegister + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .text.CRC_GetIDRegister + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_info 0x00000000 0x36f .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_abbrev 0x00000000 0x172 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_aranges + 0x00000000 0x88 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_ranges 0x00000000 0x78 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x172 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_macro 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_line 0x00000000 0x52f .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_str 0x00000000 0x3f0b3 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .debug_frame 0x00000000 0x1c0 .\..\obj\lib\spl\src\stm32f0xx_crc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_DeInit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_AdjustHSI48CalibrationValue + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_FrequencyErrorCounterCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_AutomaticCalibrationCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_SoftwareSynchronizationGenerate + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_FrequencyErrorCounterReload + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_FrequencyErrorLimitConfig + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_SynchronizationPrescalerConfig + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_SynchronizationSourceConfig + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_SynchronizationPolarityConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetReloadValue + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetHSI48CalibrationValue + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetFrequencyErrorValue + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetFrequencyErrorDirection + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_ITConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetFlagStatus + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_ClearFlag + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_GetITStatus + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .text.CRS_ClearITPendingBit + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_info 0x00000000 0x3ae .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_abbrev 0x00000000 0x168 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_aranges + 0x00000000 0xb0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_ranges 0x00000000 0xa0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x178 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_macro 0x00000000 0xd3 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_line 0x00000000 0x576 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_str 0x00000000 0x3f1ad .\..\obj\lib\spl\src\stm32f0xx_crs.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .debug_frame 0x00000000 0x258 .\..\obj\lib\spl\src\stm32f0xx_crs.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_DeInit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_Init + 0x00000000 0x68 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_StructInit + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_Cmd 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_SoftwareTriggerCmd + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_DualSoftwareTriggerCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_WaveGenerationCmd + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_SetChannel1Data + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_SetChannel2Data + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_SetDualChannelData + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_GetDataOutputValue + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_DMACmd + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_ITConfig + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_GetFlagStatus + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_ClearFlag + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_GetITStatus + 0x00000000 0x64 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .text.DAC_ClearITPendingBit + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_info 0x00000000 0x617 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_abbrev 0x00000000 0x188 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_aranges + 0x00000000 0xa0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_ranges 0x00000000 0x90 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x1a0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_macro 0x00000000 0x17e .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_line 0x00000000 0x57c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_str 0x00000000 0x3f2a7 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_dac.o + .debug_frame 0x00000000 0x22c .\..\obj\lib\spl\src\stm32f0xx_dac.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text.DBGMCU_GetREVID + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text.DBGMCU_GetDEVID + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text.DBGMCU_Config + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text.DBGMCU_APB1PeriphConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .text.DBGMCU_APB2PeriphConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_info 0x00000000 0x1b9 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_abbrev 0x00000000 0xea .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_aranges + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_ranges 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x178 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_macro 0x00000000 0x76 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_line 0x00000000 0x472 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_str 0x00000000 0x3efb4 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .debug_frame 0x00000000 0xa8 .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_DeInit + 0x00000000 0xf8 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_Init + 0x00000000 0x78 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_StructInit + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_Cmd 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_SetCurrDataCounter + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_GetCurrDataCounter + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_ITConfig + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_GetFlagStatus + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_ClearFlag + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_GetITStatus + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .text.DMA_ClearITPendingBit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_info 0x00000000 0x432 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_abbrev 0x00000000 0x161 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_aranges + 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_ranges 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x1a2 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_macro 0x00000000 0x28f .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_line 0x00000000 0x512 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_str 0x00000000 0x3f3d6 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .debug_frame 0x00000000 0x170 .\..\obj\lib\spl\src\stm32f0xx_dma.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_DeInit + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_Init + 0x00000000 0xd8 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_StructInit + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_GenerateSWInterrupt + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_GetFlagStatus + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_ClearFlag + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_GetITStatus + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .text.EXTI_ClearITPendingBit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_info 0x00000000 0x315 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_abbrev 0x00000000 0x197 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_aranges + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_ranges 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x178 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_macro 0x00000000 0xcf .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_line 0x00000000 0x4bf .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_str 0x00000000 0x3f0b9 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_exti.o + .debug_frame 0x00000000 0x10c .\..\obj\lib\spl\src\stm32f0xx_exti.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_SetLatency + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_PrefetchBufferCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_GetPrefetchBufferStatus + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_Unlock + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_Lock + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_ErasePage + 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_EraseAllPages + 0x00000000 0x68 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_ProgramWord + 0x00000000 0xb0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_ProgramHalfWord + 0x00000000 0x78 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_Unlock + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_Lock + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_Launch + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_Erase + 0x00000000 0xd8 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_EnableWRP + 0x00000000 0x188 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_RDPConfig + 0x00000000 0xdc .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_UserConfig + 0x00000000 0xa0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_BOOTConfig + 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_BOOT0Config + 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_BOOT0SWConfig + 0x00000000 0x88 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_VDDAConfig + 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_SRAMParityConfig + 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_WriteUser + 0x00000000 0x84 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_ProgramData + 0x00000000 0x84 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_GetUser + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_GetWRP + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_OB_GetRDP + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_ITConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_GetFlagStatus + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_ClearFlag + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_GetStatus + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .text.FLASH_WaitForLastOperation + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_info 0x00000000 0x83c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_abbrev 0x00000000 0x1dc .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_aranges + 0x00000000 0x110 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_ranges 0x00000000 0x100 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x172 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_macro 0x00000000 0x2b1 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_line 0x00000000 0x724 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_str 0x00000000 0x3f336 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .debug_frame 0x00000000 0x3d4 .\..\obj\lib\spl\src\stm32f0xx_flash.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_DeInit + 0x00000000 0xf0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_StructInit + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_PinLockConfig + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_ReadInputDataBit + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_ReadInputData + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_ReadOutputDataBit + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_ReadOutputData + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_WriteBit + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .text.GPIO_Write + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_DeInit + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_Init + 0x00000000 0xd0 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_StructInit + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_Cmd 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_SoftwareResetCmd + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ITConfig + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_StretchClockCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_StopModeCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_DualAddressCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_OwnAddress2Config + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GeneralCallCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_SlaveByteControlCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_SlaveAddressConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_10BitAddressingModeCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_AutoEndCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ReloadCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_NumberOfBytesConfig + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_MasterRequestConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GenerateSTART + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GenerateSTOP + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_10BitAddressHeaderCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_AcknowledgeConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GetAddressMatched + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GetTransferDirection + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_TransferHandling + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_SMBusAlertCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ClockTimeoutCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ExtendedClockTimeoutCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_IdleClockTimeoutCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_TimeoutAConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_TimeoutBConfig + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_CalculatePEC + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_PECRequestCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GetPEC + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ReadRegister + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_SendData + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ReceiveData + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_DMACmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GetFlagStatus + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ClearFlag + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_GetITStatus + 0x00000000 0x88 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .text.I2C_ClearITPendingBit + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_info 0x00000000 0xbbb .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_abbrev 0x00000000 0x18a .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_aranges + 0x00000000 0x168 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_ranges 0x00000000 0x158 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x190 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_macro 0x00000000 0x29a .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_line 0x00000000 0x793 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_str 0x00000000 0x3f45e .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .debug_frame 0x00000000 0x550 .\..\obj\lib\spl\src\stm32f0xx_i2c.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_WriteAccessCmd + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_SetPrescaler + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_SetReload + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_ReloadCounter + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_SetWindowValue + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_Enable + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .text.IWDG_GetFlagStatus + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_info 0x00000000 0x21b .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_abbrev 0x00000000 0x111 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_aranges + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_ranges 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x17e .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_macro 0x00000000 0x6a .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_line 0x00000000 0x492 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_str 0x00000000 0x3f01e .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .debug_frame 0x00000000 0xe8 .\..\obj\lib\spl\src\stm32f0xx_iwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .text.NVIC_Init + 0x00000000 0xac .\..\obj\lib\spl\src\stm32f0xx_misc.o + .text.NVIC_SystemLPConfig + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .text.SysTick_CLKSourceConfig + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_info 0x00000000 0x372 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_abbrev 0x00000000 0x148 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_aranges + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_ranges 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x172 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_line 0x00000000 0x452 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_str 0x00000000 0x3f05e .\..\obj\lib\spl\src\stm32f0xx_misc.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .debug_frame 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_misc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_DeInit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_BackupAccessCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_PVDLevelConfig + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_PVDCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_WakeUpPinCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_EnterSleepMode + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_EnterSTOPMode + 0x00000000 0x84 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_EnterSTANDBYMode + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_GetFlagStatus + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .text.PWR_ClearFlag + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_info 0x00000000 0x3d1 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_abbrev 0x00000000 0x18b .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_aranges + 0x00000000 0x68 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_ranges 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x17e .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_line 0x00000000 0x50e .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_str 0x00000000 0x3f0c8 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .debug_frame 0x00000000 0x148 .\..\obj\lib\spl\src\stm32f0xx_pwr.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_DeInit + 0x00000000 0x88 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HSEConfig + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_WaitForHSEStartUp + 0x00000000 0x60 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_AdjustHSICalibrationValue + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HSICmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_AdjustHSI14CalibrationValue + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HSI14Cmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HSI14ADCRequestCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_LSEConfig + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_LSEDriveConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_LSICmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_PLLConfig + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_PLLCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HSI48Cmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_PREDIV1Config + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_ClockSecuritySystemCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_MCOConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_SYSCLKConfig + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_GetSYSCLKSource + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_HCLKConfig + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_PCLKConfig + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_ADCCLKConfig + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_CECCLKConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_I2CCLKConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_USARTCLKConfig + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_USBCLKConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_RTCCLKConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_RTCCLKCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_BackupResetCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_APB2PeriphClockCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_AHBPeriphResetCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_APB2PeriphResetCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_APB1PeriphResetCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_ITConfig + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_GetFlagStatus + 0x00000000 0x90 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_ClearFlag + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_GetITStatus + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .text.RCC_ClearITPendingBit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_DeInit + 0x00000000 0xac .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_Init + 0x00000000 0x88 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_StructInit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_WriteProtectionCmd + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_EnterInitMode + 0x00000000 0x80 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ExitInitMode + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_WaitForSynchro + 0x00000000 0x98 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_RefClockCmd + 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_BypassShadowCmd + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SetTime + 0x00000000 0x128 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TimeStructInit + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetTime + 0x00000000 0xa0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetSubSecond + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SetDate + 0x00000000 0x134 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_DateStructInit + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetDate + 0x00000000 0xa8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SetAlarm + 0x00000000 0x124 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_AlarmStructInit + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetAlarm + 0x00000000 0xd8 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_AlarmCmd + 0x00000000 0xb0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_AlarmSubSecondConfig + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetAlarmSubSecond + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_WakeUpClockConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SetWakeUpCounter + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetWakeUpCounter + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_WakeUpCmd + 0x00000000 0xac .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_DayLightSavingConfig + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetStoreOperation + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_OutputConfig + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_CalibOutputCmd + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_CalibOutputConfig + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SmoothCalibConfig + 0x00000000 0x94 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TimeStampCmd + 0x00000000 0x64 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetTimeStamp + 0x00000000 0x120 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetTimeStampSubSecond + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperTriggerConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperFilterConfig + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperSamplingFreqConfig + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperPinsPrechargeDuration + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TimeStampOnTamperDetectionCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_TamperPullUpCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_WriteBackupRegister + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ReadBackupRegister + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_OutputTypeConfig + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_SynchroShiftConfig + 0x00000000 0xb0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ITConfig + 0x00000000 0x78 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetFlagStatus + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ClearFlag + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_GetITStatus + 0x00000000 0x80 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ClearITPendingBit + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_ByteToBcd2 + 0x00000000 0x50 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .text.RTC_Bcd2ToByte + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_info 0x00000000 0xf0e .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_abbrev 0x00000000 0x1ba .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_aranges + 0x00000000 0x1c0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_ranges 0x00000000 0x1b0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x1b2 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_macro 0x00000000 0x4bf .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_line 0x00000000 0x9bf .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_str 0x00000000 0x3f9b1 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .debug_frame 0x00000000 0x6a0 .\..\obj\lib\spl\src\stm32f0xx_rtc.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_DeInit + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_StructInit + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_Init + 0x00000000 0x104 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.I2S_StructInit + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.I2S_Init + 0x00000000 0x1c0 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_Cmd 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_TIModeCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.I2S_Cmd 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_DataSizeConfig + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_RxFIFOThresholdConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_BiDirectionalLineConfig + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_NSSInternalSoftwareConfig + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_SSOutputCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_NSSPulseModeCmd + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_SendData8 + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_SendData16 + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_ReceiveData8 + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_ReceiveData16 + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_CRCLengthConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_CalculateCRC + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_TransmitCRC + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_GetCRC + 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_GetCRCPolynomial + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_DMACmd + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_LastDMATransferCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_ITConfig + 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_GetTransmissionFIFOStatus + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_GetReceptionFIFOStatus + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_GetFlagStatus + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_ClearFlag + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .text.SPI_I2S_GetITStatus + 0x00000000 0xb0 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_info 0x00000000 0xaaf .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_abbrev 0x00000000 0x1a6 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_aranges + 0x00000000 0x110 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_ranges 0x00000000 0x100 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x18a .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_macro 0x00000000 0x390 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_line 0x00000000 0x6ce .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_str 0x00000000 0x3f517 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .debug_frame 0x00000000 0x3f0 .\..\obj\lib\spl\src\stm32f0xx_spi.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_DeInit + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_MemoryRemapConfig + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_DMAChannelRemapConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_I2CFastModePlusConfig + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_EXTILineConfig + 0x00000000 0x90 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_BreakConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_GetFlagStatus + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .text.SYSCFG_ClearFlag + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_info 0x00000000 0x2b1 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_abbrev 0x00000000 0x14c .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_aranges + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_ranges 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x172 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_macro 0x00000000 0x17e .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_line 0x00000000 0x4b8 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_str 0x00000000 0x3f083 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .debug_frame 0x00000000 0x110 .\..\obj\lib\spl\src\stm32f0xx_syscfg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_DeInit + 0x00000000 0x140 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_TimeBaseInit + 0x00000000 0xf0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_TimeBaseStructInit + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_PrescalerConfig + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_CounterModeConfig + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetCounter + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetAutoreload + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetCounter + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetPrescaler + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_UpdateDisableConfig + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_UpdateRequestConfig + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ARRPreloadConfig + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectOnePulseMode + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetClockDivision + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_Cmd 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_BDTRConfig + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_BDTRStructInit + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_CtrlPWMOutputs + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC1Init + 0x00000000 0x1a4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC2Init + 0x00000000 0x1b8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC3Init + 0x00000000 0x1a8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC4Init + 0x00000000 0x134 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OCStructInit + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectOCxM + 0x00000000 0xc0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetCompare1 + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetCompare2 + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetCompare3 + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetCompare4 + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ForcedOC1Config + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ForcedOC2Config + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ForcedOC3Config + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ForcedOC4Config + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_CCPreloadControl + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC1PreloadConfig + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC2PreloadConfig + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC3PreloadConfig + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC4PreloadConfig + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC1FastConfig + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC2FastConfig + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC3FastConfig + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC4FastConfig + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearOC1Ref + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearOC2Ref + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearOC3Ref + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearOC4Ref + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC1PolarityConfig + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC1NPolarityConfig + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC2PolarityConfig + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC2NPolarityConfig + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC3PolarityConfig + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC3NPolarityConfig + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_OC4PolarityConfig + 0x00000000 0x5c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectOCREFClear + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_CCxCmd + 0x00000000 0x64 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_CCxNCmd + 0x00000000 0x64 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectCOM + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ICInit + 0x00000000 0xb0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ICStructInit + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_PWMIConfig + 0x00000000 0xe8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetCapture1 + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetCapture2 + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetCapture3 + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetCapture4 + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetIC1Prescaler + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetIC2Prescaler + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetIC3Prescaler + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SetIC4Prescaler + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ITConfig + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GenerateEvent + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetFlagStatus + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearFlag + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_GetITStatus + 0x00000000 0x80 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ClearITPendingBit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_DMAConfig + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_DMACmd + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectCCDMA + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_InternalClockConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ITRxExternalClockConfig + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_TIxExternalClockConfig + 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ETRClockMode1Config + 0x00000000 0x98 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ETRClockMode2Config + 0x00000000 0x4c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectInputTrigger + 0x00000000 0x54 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectOutputTrigger + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectSlaveMode + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectMasterSlaveMode + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_ETRConfig + 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_EncoderInterfaceConfig + 0x00000000 0xf4 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_SelectHallSensor + 0x00000000 0x40 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TIM_RemapConfig + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TI1_Config + 0x00000000 0xc8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TI2_Config + 0x00000000 0xf0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TI3_Config + 0x00000000 0xe8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .text.TI4_Config + 0x00000000 0xf8 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_info 0x00000000 0x1c73 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_abbrev 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_aranges + 0x00000000 0x300 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_ranges 0x00000000 0x2f0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x18e .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_macro 0x00000000 0x74a .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_line 0x00000000 0xc6d .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_str 0x00000000 0x3fbc7 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .debug_frame 0x00000000 0xbb0 .\..\obj\lib\spl\src\stm32f0xx_tim.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DeInit + 0x00000000 0xa4 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_StructInit + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ClockInit + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ClockStructInit + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DirectionModeCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_OverSampling8Cmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_OneBitMethodCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_MSBFirstCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DataInvCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_InvPinCmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SWAPPinCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ReceiverTimeOutCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetReceiverTimeOut + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetPrescaler + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_STOPModeCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_StopModeWakeUpSourceConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_AutoBaudRateCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_AutoBaudRateConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SendData + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetAddress + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_MuteModeCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_MuteModeWakeUpConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_AddressDetectionConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_LINBreakDetectLengthConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_LINCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_HalfDuplexCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetGuardTime + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SmartCardCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SmartCardNACKCmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetAutoRetryCount + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetBlockLength + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_IrDAConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_IrDACmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DECmd + 0x00000000 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DEPolarityConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetDEAssertionTime + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_SetDEDeassertionTime + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DMACmd + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_DMAReceptionErrorConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ITConfig + 0x00000000 0x84 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_RequestCmd + 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_OverrunDetectionConfig + 0x00000000 0x2c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ClearFlag + 0x00000000 0x18 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_GetITStatus + 0x00000000 0xb4 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .text.USART_ClearITPendingBit + 0x00000000 0x30 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_usart.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .data 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .bss 0x00000000 0x0 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_DeInit + 0x00000000 0x20 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_SetPrescaler + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_SetWindowValue + 0x00000000 0x38 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_EnableIT + 0x00000000 0x1c .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_SetCounter + 0x00000000 0x24 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_Enable + 0x00000000 0x28 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_GetFlagStatus + 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .text.WWDG_ClearFlag + 0x00000000 0x14 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_info 0x00000000 0x23b .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_abbrev 0x00000000 0x134 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_aranges + 0x00000000 0x58 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_ranges 0x00000000 0x48 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0xef .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_macro 0x00000000 0x2e .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_line 0x00000000 0x4ab .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_str 0x00000000 0x3f037 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .ARM.attributes + 0x00000000 0x31 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .debug_frame 0x00000000 0x104 .\..\obj\lib\spl\src\stm32f0xx_wwdg.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\lib\system_stm32f0xx.o + .text 0x00000000 0x0 .\..\obj\lib\system_stm32f0xx.o + .data 0x00000000 0x0 .\..\obj\lib\system_stm32f0xx.o + .bss 0x00000000 0x0 .\..\obj\lib\system_stm32f0xx.o + .data.AHBPrescTable + 0x00000000 0x10 .\..\obj\lib\system_stm32f0xx.o + .text.SystemCoreClockUpdate + 0x00000000 0xd0 .\..\obj\lib\system_stm32f0xx.o + .bss.StartUpCounter + 0x00000000 0x4 .\..\obj\lib\system_stm32f0xx.o + .bss.HSEStatus + 0x00000000 0x4 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x826 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x8c .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x16 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x44 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x209 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x249 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x5b9e .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x2eb .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x3cf .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x191 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x46 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0xd9 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0xef .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x7c .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x295 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0xd5 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x2b7 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x185 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x184 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x2a0 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x70 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0xdf .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x4e3 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x4c5 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x396 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x750 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x353 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x34 .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x00000000 0x3a .\..\obj\lib\system_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .group 0x00000000 0x8 .\..\obj\main.o + .text 0x00000000 0x0 .\..\obj\main.o + .data 0x00000000 0x0 .\..\obj\main.o + .bss 0x00000000 0x0 .\..\obj\main.o + .debug_macro 0x00000000 0x826 .\..\obj\main.o + .debug_macro 0x00000000 0x66 .\..\obj\main.o + .debug_macro 0x00000000 0x8c .\..\obj\main.o + .debug_macro 0x00000000 0x34 .\..\obj\main.o + .debug_macro 0x00000000 0x16 .\..\obj\main.o + .debug_macro 0x00000000 0x44 .\..\obj\main.o + .debug_macro 0x00000000 0x209 .\..\obj\main.o + .debug_macro 0x00000000 0x249 .\..\obj\main.o + .debug_macro 0x00000000 0x5b9e .\..\obj\main.o + .debug_macro 0x00000000 0x2eb .\..\obj\main.o + .debug_macro 0x00000000 0x3cf .\..\obj\main.o + .debug_macro 0x00000000 0x191 .\..\obj\main.o + .debug_macro 0x00000000 0x46 .\..\obj\main.o + .debug_macro 0x00000000 0xd9 .\..\obj\main.o + .debug_macro 0x00000000 0xef .\..\obj\main.o + .debug_macro 0x00000000 0x184 .\..\obj\main.o + .debug_macro 0x00000000 0x7c .\..\obj\main.o + .debug_macro 0x00000000 0x295 .\..\obj\main.o + .debug_macro 0x00000000 0xd5 .\..\obj\main.o + .debug_macro 0x00000000 0x2b7 .\..\obj\main.o + .debug_macro 0x00000000 0x185 .\..\obj\main.o + .debug_macro 0x00000000 0x184 .\..\obj\main.o + .debug_macro 0x00000000 0x2a0 .\..\obj\main.o + .debug_macro 0x00000000 0x70 .\..\obj\main.o + .debug_macro 0x00000000 0xdf .\..\obj\main.o + .debug_macro 0x00000000 0x4e3 .\..\obj\main.o + .debug_macro 0x00000000 0x4c5 .\..\obj\main.o + .debug_macro 0x00000000 0x396 .\..\obj\main.o + .debug_macro 0x00000000 0x750 .\..\obj\main.o + .debug_macro 0x00000000 0x353 .\..\obj\main.o + .debug_macro 0x00000000 0x34 .\..\obj\main.o + .debug_macro 0x00000000 0x3a .\..\obj\main.o + .data 0x00000000 0x0 .\..\obj\startup_stm32f0xx.o + .bss 0x00000000 0x0 .\..\obj\startup_stm32f0xx.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .group 0x00000000 0x8 .\..\obj\timer.o + .text 0x00000000 0x0 .\..\obj\timer.o + .data 0x00000000 0x0 .\..\obj\timer.o + .bss 0x00000000 0x0 .\..\obj\timer.o + .text.TimerDeinit + 0x00000000 0x14 .\..\obj\timer.o + .debug_macro 0x00000000 0x826 .\..\obj\timer.o + .debug_macro 0x00000000 0x66 .\..\obj\timer.o + .debug_macro 0x00000000 0x8c .\..\obj\timer.o + .debug_macro 0x00000000 0x34 .\..\obj\timer.o + .debug_macro 0x00000000 0x16 .\..\obj\timer.o + .debug_macro 0x00000000 0x44 .\..\obj\timer.o + .debug_macro 0x00000000 0x209 .\..\obj\timer.o + .debug_macro 0x00000000 0x249 .\..\obj\timer.o + .debug_macro 0x00000000 0x5b9e .\..\obj\timer.o + .debug_macro 0x00000000 0x2eb .\..\obj\timer.o + .debug_macro 0x00000000 0x3cf .\..\obj\timer.o + .debug_macro 0x00000000 0x191 .\..\obj\timer.o + .debug_macro 0x00000000 0x46 .\..\obj\timer.o + .debug_macro 0x00000000 0xd9 .\..\obj\timer.o + .debug_macro 0x00000000 0xef .\..\obj\timer.o + .debug_macro 0x00000000 0x184 .\..\obj\timer.o + .debug_macro 0x00000000 0x7c .\..\obj\timer.o + .debug_macro 0x00000000 0x295 .\..\obj\timer.o + .debug_macro 0x00000000 0xd5 .\..\obj\timer.o + .debug_macro 0x00000000 0x2b7 .\..\obj\timer.o + .debug_macro 0x00000000 0x185 .\..\obj\timer.o + .debug_macro 0x00000000 0x184 .\..\obj\timer.o + .debug_macro 0x00000000 0x2a0 .\..\obj\timer.o + .debug_macro 0x00000000 0x70 .\..\obj\timer.o + .debug_macro 0x00000000 0xdf .\..\obj\timer.o + .debug_macro 0x00000000 0x4e3 .\..\obj\timer.o + .debug_macro 0x00000000 0x4c5 .\..\obj\timer.o + .debug_macro 0x00000000 0x396 .\..\obj\timer.o + .debug_macro 0x00000000 0x750 .\..\obj\timer.o + .debug_macro 0x00000000 0x353 .\..\obj\timer.o + .debug_macro 0x00000000 0x34 .\..\obj\timer.o + .debug_macro 0x00000000 0x3a .\..\obj\timer.o + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_dvmd_tls.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_dvmd_tls.o) + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + .data._impure_ptr + 0x00000000 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + .jcr 0x00000000 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + .text 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + .data 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + .bss 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + +Memory Configuration + +Name Origin Length Attributes +ROM 0x08002000 0x0000e000 xr +RAM 0x200000c0 0x00001f40 xrw +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + 0x00000000 __HEAP_SIZE = 0x0 + 0x00000100 __STACK_SIZE = 0x100 + +.text 0x08002000 0xfcc + *(.isr_vector) + .isr_vector 0x08002000 0xc4 .\..\obj\startup_stm32f0xx.o + 0x08002000 __isr_vector + *(.text*) + .text 0x080020c4 0x60 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + .text 0x08002124 0x78 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + 0x08002124 _start + 0x08002124 _mainCRTStartup + .text.NVIC_SystemReset + 0x0800219c 0x1c .\..\obj\boot.o + .text.BootComInit + 0x080021b8 0xc .\..\obj\boot.o + 0x080021b8 BootComInit + .text.BootComCheckActivationRequest + 0x080021c4 0xc .\..\obj\boot.o + 0x080021c4 BootComCheckActivationRequest + .text.BootActivate + 0x080021d0 0xc .\..\obj\boot.o + 0x080021d0 BootActivate + .text.BootComUartInit + 0x080021dc 0xb8 .\..\obj\boot.o + .text.BootComUartCheckActivationRequest + 0x08002294 0x80 .\..\obj\boot.o + .text.UartReceiveByte + 0x08002314 0x3c .\..\obj\boot.o + .text.LedInit 0x08002350 0x58 .\..\obj\led.o + 0x08002350 LedInit + .text.LedToggle + 0x080023a8 0x6c .\..\obj\led.o + 0x080023a8 LedToggle + .text.GPIO_Init + 0x08002414 0x138 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + 0x08002414 GPIO_Init + .text.GPIO_SetBits + 0x0800254c 0x1c .\..\obj\lib\spl\src\stm32f0xx_gpio.o + 0x0800254c GPIO_SetBits + .text.GPIO_ResetBits + 0x08002568 0x1c .\..\obj\lib\spl\src\stm32f0xx_gpio.o + 0x08002568 GPIO_ResetBits + .text.GPIO_PinAFConfig + 0x08002584 0x9c .\..\obj\lib\spl\src\stm32f0xx_gpio.o + 0x08002584 GPIO_PinAFConfig + .text.RCC_GetClocksFreq + 0x08002620 0x264 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + 0x08002620 RCC_GetClocksFreq + .text.RCC_AHBPeriphClockCmd + 0x08002884 0x3c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + 0x08002884 RCC_AHBPeriphClockCmd + .text.RCC_APB1PeriphClockCmd + 0x080028c0 0x3c .\..\obj\lib\spl\src\stm32f0xx_rcc.o + 0x080028c0 RCC_APB1PeriphClockCmd + .text.USART_Init + 0x080028fc 0x174 .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x080028fc USART_Init + .text.USART_Cmd + 0x08002a70 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x08002a70 USART_Cmd + .text.USART_ReceiveData + 0x08002aac 0x1c .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x08002aac USART_ReceiveData + .text.USART_GetFlagStatus + 0x08002ac8 0x3c .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x08002ac8 USART_GetFlagStatus + .text.SystemInit + 0x08002b04 0x8c .\..\obj\lib\system_stm32f0xx.o + 0x08002b04 SystemInit + .text.SetSysClock + 0x08002b90 0x88 .\..\obj\lib\system_stm32f0xx.o + .text.main 0x08002c18 0x18 .\..\obj\main.o + 0x08002c18 main + .text.Init 0x08002c30 0x10 .\..\obj\main.o + .text 0x08002c40 0xa4 .\..\obj\startup_stm32f0xx.o + 0x08002c40 Reset_Handler + 0x08002c8e NMI_Handler + 0x08002c90 HardFault_Handler + 0x08002c92 SVC_Handler + 0x08002c94 PendSV_Handler + 0x08002c98 Default_Handler + 0x08002c9a WWDG_IRQHandler + 0x08002c9c PVD_IRQHandler + 0x08002c9e RTC_IRQHandler + 0x08002ca0 FLASH_IRQHandler + 0x08002ca2 RCC_IRQHandler + 0x08002ca4 EXTI0_1_IRQHandler + 0x08002ca6 EXTI2_3_IRQHandler + 0x08002ca8 EXTI4_15_IRQHandler + 0x08002caa TS_IRQHandler + 0x08002cac DMA1_Channel1_IRQHandler + 0x08002cae DMA1_Channel2_3_IRQHandler + 0x08002cb0 DMA1_Channel4_5_IRQHandler + 0x08002cb2 ADC1_COMP_IRQHandler + 0x08002cb4 TIM1_BRK_UP_TRG_COM_IRQHandler + 0x08002cb6 TIM1_CC_IRQHandler + 0x08002cb8 TIM2_IRQHandler + 0x08002cba TIM3_IRQHandler + 0x08002cbc TIM6_DAC_IRQHandler + 0x08002cbe TIM7_IRQHandler + 0x08002cc0 TIM14_IRQHandler + 0x08002cc2 TIM15_IRQHandler + 0x08002cc4 TIM16_IRQHandler + 0x08002cc6 TIM17_IRQHandler + 0x08002cc8 I2C1_IRQHandler + 0x08002cca I2C2_IRQHandler + 0x08002ccc SPI1_IRQHandler + 0x08002cce SPI2_IRQHandler + 0x08002cd0 USART1_IRQHandler + 0x08002cd2 USART2_IRQHandler + 0x08002cd4 USART3_4_IRQHandler + 0x08002cd6 CEC_IRQHandler + 0x08002cd8 USB_IRQHandler + .text.NVIC_SetPriority + 0x08002ce4 0xe0 .\..\obj\timer.o + .text.SysTick_Config + 0x08002dc4 0x4c .\..\obj\timer.o + .text.TimerInit + 0x08002e10 0x28 .\..\obj\timer.o + 0x08002e10 TimerInit + .text.TimerSet + 0x08002e38 0x18 .\..\obj\timer.o + 0x08002e38 TimerSet + .text.TimerGet + 0x08002e50 0x14 .\..\obj\timer.o + 0x08002e50 TimerGet + .text.SysTick_Handler + 0x08002e64 0x18 .\..\obj\timer.o + 0x08002e64 SysTick_Handler + .text 0x08002e7c 0x9c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + 0x08002e7c __aeabi_uidiv + 0x08002e7c __udivsi3 + 0x08002f04 __aeabi_uidivmod + .text 0x08002f18 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_dvmd_tls.o) + 0x08002f18 __aeabi_idiv0 + 0x08002f18 __aeabi_ldiv0 + .text.exit 0x08002f1c 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + 0x08002f1c exit + .text.__libc_init_array + 0x08002f48 0x4c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + 0x08002f48 __libc_init_array + .text.memset 0x08002f94 0x10 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + 0x08002f94 memset + .text 0x08002fa4 0x2 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) + 0x08002fa4 _exit + *(.init) + *fill* 0x08002fa6 0x2 + .init 0x08002fa8 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + 0x08002fa8 _init + .init 0x08002fac 0x8 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + *(.fini) + .fini 0x08002fb4 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + 0x08002fb4 _fini + .fini 0x08002fb8 0x8 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend.o *crtend?.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend.o *crtend?.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + *(.rodata*) + .rodata.str1.1 + 0x08002fc0 0x2 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + *fill* 0x08002fc2 0x2 + .rodata._global_impure_ptr + 0x08002fc4 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + 0x08002fc4 _global_impure_ptr + *(.eh_frame*) + .eh_frame 0x08002fc8 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + .eh_frame 0x08002fc8 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + +.glue_7 0x08002fcc 0x0 + .glue_7 0x00000000 0x0 linker stubs + +.glue_7t 0x08002fcc 0x0 + .glue_7t 0x00000000 0x0 linker stubs + +.vfp11_veneer 0x08002fcc 0x0 + .vfp11_veneer 0x00000000 0x0 linker stubs + +.v4_bx 0x08002fcc 0x0 + .v4_bx 0x00000000 0x0 linker stubs + +.iplt 0x08002fcc 0x0 + .iplt 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + +.ARM.extab + *(.ARM.extab* .gnu.linkonce.armextab.*) + 0x08002fcc __exidx_start = . + +.ARM.exidx 0x08002fcc 0x8 + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + .ARM.exidx 0x08002fcc 0x8 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + 0x08002fd4 __exidx_end = . + 0x08002fd4 __etext = . + +.rel.dyn 0x08002fd4 0x0 + .rel.iplt 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + +.data 0x200000c0 0x7c load address 0x08002fd4 + 0x200000c0 __data_start__ = . + *(vtable) + *(.data*) + .data.APBAHBPrescTable + 0x200000c0 0x10 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .data.SystemCoreClock + 0x200000d0 0x4 .\..\obj\lib\system_stm32f0xx.o + 0x200000d0 SystemCoreClock + .data.impure_data + 0x200000d4 0x60 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + 0x20000134 . = ALIGN (0x4) + 0x20000134 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x20000134 PROVIDE (__preinit_array_end, .) + 0x20000134 . = ALIGN (0x4) + 0x20000134 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*)) + *(.init_array) + .init_array 0x20000134 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + 0x20000138 PROVIDE (__init_array_end, .) + 0x20000138 . = ALIGN (0x4) + 0x20000138 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*)) + *(.fini_array) + .fini_array 0x20000138 0x4 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + 0x2000013c PROVIDE (__fini_array_end, .) + 0x2000013c . = ALIGN (0x4) + 0x2000013c __data_end__ = . + +.jcr 0x2000013c 0x0 load address 0x08003050 + .jcr 0x2000013c 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + +.igot.plt 0x2000013c 0x0 load address 0x08003050 + .igot.plt 0x00000000 0x0 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + +.bss 0x2000013c 0x74 load address 0x08003050 + 0x2000013c __bss_start__ = . + *(.bss*) + .bss 0x2000013c 0x1c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + .bss.xcpCtoRxInProgress.6374 + 0x20000158 0x1 .\..\obj\boot.o + *fill* 0x20000159 0x3 + .bss.xcpCtoReqPacket.6372 + 0x2000015c 0x44 .\..\obj\boot.o + .bss.xcpCtoRxLength.6373 + 0x200001a0 0x1 .\..\obj\boot.o + *fill* 0x200001a1 0x3 + .bss.timer_counter_last.6357 + 0x200001a4 0x4 .\..\obj\led.o + .bss.led_toggle_state.6356 + 0x200001a8 0x1 .\..\obj\led.o + *fill* 0x200001a9 0x3 + .bss.millisecond_counter + 0x200001ac 0x4 .\..\obj\timer.o + *(COMMON) + 0x200001b0 __bss_end__ = . + +.heap 0x200001b0 0x0 + 0x200001b0 __end__ = . + 0x200001b0 end = __end__ + *(.heap*) + .heap 0x200001b0 0x0 .\..\obj\startup_stm32f0xx.o + 0x200001b0 __HeapLimit = . + +.stack_dummy 0x200001b0 0x100 + *(.stack) + .stack 0x200001b0 0x100 .\..\obj\startup_stm32f0xx.o + 0x20002000 __StackTop = (ORIGIN (RAM) + 0x1f40) + 0x20001f00 __StackLimit = (__StackTop - SIZEOF (.stack_dummy)) + 0x20002000 PROVIDE (__stack, __StackTop) + 0x00000001 ASSERT ((__StackLimit >= __HeapLimit), region RAM overflowed with stack) +LOAD .\..\obj\boot.o +LOAD .\..\obj\led.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_adc.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_can.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_cec.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_comp.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_crc.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_crs.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_dac.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_dbgmcu.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_dma.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_exti.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_flash.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_gpio.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_i2c.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_iwdg.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_misc.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_pwr.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_rcc.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_rtc.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_spi.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_syscfg.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_tim.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_usart.o +LOAD .\..\obj\lib\spl\src\stm32f0xx_wwdg.o +LOAD .\..\obj\lib\system_stm32f0xx.o +LOAD .\..\obj\main.o +LOAD .\..\obj\startup_stm32f0xx.o +LOAD .\..\obj\timer.o +START GROUP +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libc_n.a +END GROUP +START GROUP +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libc_n.a +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a +END GROUP +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o +LOAD c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o +OUTPUT(.\..\bin\demoprog_stm32f051.elf elf32-littlearm) + +.ARM.attributes + 0x00000000 0x28 + .ARM.attributes + 0x00000000 0x1e c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crti.o + .ARM.attributes + 0x0000001e 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtbegin.o + .ARM.attributes + 0x0000004a 0x1b c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m/crt0.o + .ARM.attributes + 0x00000065 0x31 .\..\obj\boot.o + .ARM.attributes + 0x00000096 0x31 .\..\obj\led.o + .ARM.attributes + 0x000000c7 0x31 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .ARM.attributes + 0x000000f8 0x31 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .ARM.attributes + 0x00000129 0x31 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .ARM.attributes + 0x0000015a 0x31 .\..\obj\lib\system_stm32f0xx.o + .ARM.attributes + 0x0000018b 0x31 .\..\obj\main.o + .ARM.attributes + 0x000001bc 0x1b .\..\obj\startup_stm32f0xx.o + .ARM.attributes + 0x000001d7 0x31 .\..\obj\timer.o + .ARM.attributes + 0x00000208 0x1e c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + .ARM.attributes + 0x00000226 0x1e c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_dvmd_tls.o) + .ARM.attributes + 0x00000244 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + .ARM.attributes + 0x00000270 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-impure.o) + .ARM.attributes + 0x0000029c 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + .ARM.attributes + 0x000002c8 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + .ARM.attributes + 0x000002f4 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) + .ARM.attributes + 0x00000320 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o + .ARM.attributes + 0x0000034c 0x1e c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtn.o + +.comment 0x00000000 0x46 + .comment 0x00000000 0x46 .\..\obj\boot.o + 0x47 (size before relaxing) + .comment 0x00000000 0x47 .\..\obj\led.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .comment 0x00000000 0x47 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .comment 0x00000000 0x47 .\..\obj\lib\system_stm32f0xx.o + .comment 0x00000000 0x47 .\..\obj\main.o + .comment 0x00000000 0x47 .\..\obj\timer.o + +.debug_info 0x00000000 0x2f33 + .debug_info 0x00000000 0x5bb .\..\obj\boot.o + .debug_info 0x000005bb 0x2f2 .\..\obj\led.o + .debug_info 0x000008ad 0x5d7 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_info 0x00000e84 0xa24 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_info 0x000018a8 0xe4e .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_info 0x000026f6 0x2cc .\..\obj\lib\system_stm32f0xx.o + .debug_info 0x000029c2 0x9d .\..\obj\main.o + .debug_info 0x00002a5f 0x90 .\..\obj\startup_stm32f0xx.o + .debug_info 0x00002aef 0x444 .\..\obj\timer.o + +.debug_abbrev 0x00000000 0xab2 + .debug_abbrev 0x00000000 0x181 .\..\obj\boot.o + .debug_abbrev 0x00000181 0x10b .\..\obj\led.o + .debug_abbrev 0x0000028c 0x1a0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_abbrev 0x0000042c 0x1f1 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_abbrev 0x0000061d 0x161 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_abbrev 0x0000077e 0x11a .\..\obj\lib\system_stm32f0xx.o + .debug_abbrev 0x00000898 0x5d .\..\obj\main.o + .debug_abbrev 0x000008f5 0x14 .\..\obj\startup_stm32f0xx.o + .debug_abbrev 0x00000909 0x1a9 .\..\obj\timer.o + +.debug_aranges 0x00000000 0x4c0 + .debug_aranges + 0x00000000 0x50 .\..\obj\boot.o + .debug_aranges + 0x00000050 0x28 .\..\obj\led.o + .debug_aranges + 0x00000078 0x80 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_aranges + 0x000000f8 0x160 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_aranges + 0x00000258 0x1a0 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_aranges + 0x000003f8 0x30 .\..\obj\lib\system_stm32f0xx.o + .debug_aranges + 0x00000428 0x28 .\..\obj\main.o + .debug_aranges + 0x00000450 0x20 .\..\obj\startup_stm32f0xx.o + .debug_aranges + 0x00000470 0x50 .\..\obj\timer.o + +.debug_ranges 0x00000000 0x420 + .debug_ranges 0x00000000 0x40 .\..\obj\boot.o + .debug_ranges 0x00000040 0x18 .\..\obj\led.o + .debug_ranges 0x00000058 0x70 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_ranges 0x000000c8 0x150 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_ranges 0x00000218 0x190 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_ranges 0x000003a8 0x20 .\..\obj\lib\system_stm32f0xx.o + .debug_ranges 0x000003c8 0x18 .\..\obj\main.o + .debug_ranges 0x000003e0 0x40 .\..\obj\timer.o + +.debug_macro 0x00000000 0xb164 + .debug_macro 0x00000000 0x199 .\..\obj\boot.o + .debug_macro 0x00000199 0x826 .\..\obj\boot.o + .debug_macro 0x000009bf 0x66 .\..\obj\boot.o + .debug_macro 0x00000a25 0x8c .\..\obj\boot.o + .debug_macro 0x00000ab1 0x34 .\..\obj\boot.o + .debug_macro 0x00000ae5 0x16 .\..\obj\boot.o + .debug_macro 0x00000afb 0x44 .\..\obj\boot.o + .debug_macro 0x00000b3f 0x209 .\..\obj\boot.o + .debug_macro 0x00000d48 0x249 .\..\obj\boot.o + .debug_macro 0x00000f91 0x5b9e .\..\obj\boot.o + .debug_macro 0x00006b2f 0x2eb .\..\obj\boot.o + .debug_macro 0x00006e1a 0x3cf .\..\obj\boot.o + .debug_macro 0x000071e9 0x191 .\..\obj\boot.o + .debug_macro 0x0000737a 0x46 .\..\obj\boot.o + .debug_macro 0x000073c0 0xd9 .\..\obj\boot.o + .debug_macro 0x00007499 0xef .\..\obj\boot.o + .debug_macro 0x00007588 0x184 .\..\obj\boot.o + .debug_macro 0x0000770c 0x7c .\..\obj\boot.o + .debug_macro 0x00007788 0x295 .\..\obj\boot.o + .debug_macro 0x00007a1d 0xd5 .\..\obj\boot.o + .debug_macro 0x00007af2 0x2b7 .\..\obj\boot.o + .debug_macro 0x00007da9 0x185 .\..\obj\boot.o + .debug_macro 0x00007f2e 0x184 .\..\obj\boot.o + .debug_macro 0x000080b2 0x2a0 .\..\obj\boot.o + .debug_macro 0x00008352 0x70 .\..\obj\boot.o + .debug_macro 0x000083c2 0xdf .\..\obj\boot.o + .debug_macro 0x000084a1 0x4e3 .\..\obj\boot.o + .debug_macro 0x00008984 0x4c5 .\..\obj\boot.o + .debug_macro 0x00008e49 0x396 .\..\obj\boot.o + .debug_macro 0x000091df 0x750 .\..\obj\boot.o + .debug_macro 0x0000992f 0x353 .\..\obj\boot.o + .debug_macro 0x00009c82 0x34 .\..\obj\boot.o + .debug_macro 0x00009cb6 0x3a .\..\obj\boot.o + .debug_macro 0x00009cf0 0x19f .\..\obj\led.o + .debug_macro 0x00009e8f 0x172 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x0000a001 0x17f .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_macro 0x0000a180 0x190 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x0000a310 0x4dd .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_macro 0x0000a7ed 0x18a .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x0000a977 0x34d .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_macro 0x0000acc4 0x16e .\..\obj\lib\system_stm32f0xx.o + .debug_macro 0x0000ae32 0x199 .\..\obj\main.o + .debug_macro 0x0000afcb 0x199 .\..\obj\timer.o + +.debug_line 0x00000000 0x2d19 + .debug_line 0x00000000 0x510 .\..\obj\boot.o + .debug_line 0x00000510 0x47a .\..\obj\led.o + .debug_line 0x0000098a 0x547 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_line 0x00000ed1 0x7a1 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_line 0x00001672 0x823 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_line 0x00001e95 0x485 .\..\obj\lib\system_stm32f0xx.o + .debug_line 0x0000231a 0x47c .\..\obj\main.o + .debug_line 0x00002796 0x9d .\..\obj\startup_stm32f0xx.o + .debug_line 0x00002833 0x4e6 .\..\obj\timer.o + +.debug_str 0x00000000 0x4055c + .debug_str 0x00000000 0x3f294 .\..\obj\boot.o + 0x3f432 (size before relaxing) + .debug_str 0x0003f294 0x65 .\..\obj\led.o + 0x3f2db (size before relaxing) + .debug_str 0x0003f2f9 0x173 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + 0x3f1f4 (size before relaxing) + .debug_str 0x0003f46c 0x665 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + 0x3f5a0 (size before relaxing) + .debug_str 0x0003fad1 0x768 .\..\obj\lib\spl\src\stm32f0xx_usart.o + 0x3f808 (size before relaxing) + .debug_str 0x00040239 0x8b .\..\obj\lib\system_stm32f0xx.o + 0x3efed (size before relaxing) + .debug_str 0x000402c4 0xf .\..\obj\main.o + 0x3f0a5 (size before relaxing) + .debug_str 0x000402d3 0x289 .\..\obj\timer.o + 0x3f39a (size before relaxing) + +.debug_frame 0x00000000 0x1078 + .debug_frame 0x00000000 0xdc .\..\obj\boot.o + .debug_frame 0x000000dc 0x50 .\..\obj\led.o + .debug_frame 0x0000012c 0x1b0 .\..\obj\lib\spl\src\stm32f0xx_gpio.o + .debug_frame 0x000002dc 0x524 .\..\obj\lib\spl\src\stm32f0xx_rcc.o + .debug_frame 0x00000800 0x630 .\..\obj\lib\spl\src\stm32f0xx_usart.o + .debug_frame 0x00000e30 0x68 .\..\obj\lib\system_stm32f0xx.o + .debug_frame 0x00000e98 0x48 .\..\obj\main.o + .debug_frame 0x00000ee0 0xe4 .\..\obj\timer.o + .debug_frame 0x00000fc4 0x20 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m\libgcc.a(_udivsi3.o) + .debug_frame 0x00000fe4 0x28 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-exit.o) + .debug_frame 0x0000100c 0x2c c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-init.o) + .debug_frame 0x00001038 0x20 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libg_n.a(lib_a-memset.o) + .debug_frame 0x00001058 0x20 c:/program files (x86)/embitz/0.42/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv6-m\libnosys_s.a(_exit.o) diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/bin/demoprog_stm32f051.srec b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/bin/demoprog_stm32f051.srec new file mode 100644 index 00000000..db5076ae --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/bin/demoprog_stm32f051.srec @@ -0,0 +1,264 @@ +S02300002E5C2E2E5C62696E5C64656D6F70726F675F73746D3332663035312E73726563B9 +S3150800200000200020412C00088F2C0008912C000885 +S3150800201000000000000000000000000000000000B2 +S31508002020000000000000000000000000932C0008DB +S315080020300000000000000000952C0008652E00082E +S315080020409B2C00089D2C00089F2C0008A12C00083A +S31508002050A32C0008A52C0008A72C0008A92C00080A +S31508002060AB2C0008AD2C0008AF2C0008B12C0008DA +S31508002070B32C0008B52C0008B72C0008B92C0008AA +S31508002080BB2C0008BD2C0008BF2C0008C12C00087A +S31508002090C32C0008C52C0008C72C0008C92C00084A +S315080020A0CB2C0008CD2C0008CF2C0008D12C00081A +S315080020B0D32C0008D52C0008D72C0008D92C0008EA +S315080020C0EE11AA5510B5064C2378002B07D1054BFF +S315080020D0002B02D0044800E000BF0123237010BD86 +S315080020E03C01002000000000C82F000808B5084B76 +S315080020F0002B03D00748084900E000BF07480368DB +S31508002100002B03D0064B002B00D0984708BDC046CD +S3150800211000000000C82F0008400100203C010020F4 +S3150800212000000000164B002B00D1144B9D464022A0 +S3150800213092029A1A924600218B460F461348144A71 +S31508002140121A00F027FF0F4B002B00D098470E4BB2 +S31508002150002B00D098470020002104000D000D48F0 +S31508002160002802D00C4800E000BF00F0EDFE200079 +S31508002170290000F051FD00F0D1FEC046000008001D +S315080021800020002000000000000000003C010020A4 +S31508002190B0010020000000000000000080B500AF7C +S315080021A0BFF34F8F024B034ADA60BFF34F8FFEE748 +S315080021B000ED00E00400FA0580B500AF00F00EF867 +S315080021C0BD4680BD80B500AF00F064F8BD4680BD51 +S315080021D080B500AFFFF7E2FFBD4680BD80B588B089 +S315080021E000AF80239B02181C012100F069FB8023A5 +S315080021F09B02181C012100F045FB9023DB05181CE7 +S315080022000221012200F0BEF99023DB05181C0321E8 +S31508002210012200F0B7F93B1C18330C221A603B1C4C +S31508002220183303225A713B1C183302221A713B1CBD +S31508002230183300229A713B1C18330122DA71902355 +S31508002240DA053B1C1833101C191C00F0E3F83B1C7C +S31508002250E12212021A603B1C00225A603B1C002233 +S315080022609A603B1C0022DA603B1C00225A613B1C28 +S315080022700C221A61064A3B1C101C191C00F03EFB76 +S31508002280034B181C012100F0F3FBBD4608B080BDC6 +S315080022900044004080B500AF1B4B1B78002B0DD1C6 +S315080022A01A4B181C00F036F8031C012B2AD1164BC2 +S315080022B001221A70164B00221A7023E0144B1B7861 +S315080022C05A1C124BD318181C00F024F8031C012BB7 +S315080022D018D10F4B1B780133DAB20D4B1A700B4B22 +S315080022E01A780B4B1B789A420CD1074B00221A70AE +S315080022F0064B5B78FF2B05D1044B9B78002B01D14D +S31508002300FFF766FFBD4680BD580100205C0100202E +S31508002310A001002080B582B000AF78600B4B181C76 +S31508002320202100F0D1FB031C012B09D1074B181CF7 +S3150800233000F0BCFB031CDAB27B681A70012300E0CC +S315080023400023181CBD4602B080BDC04600440040AC +S3150800235080B582B000AF80231B03181C012100F052 +S3150800236091FA3B1C802292001A603B1C01221A71CA +S315080023703B1C00229A713B1C03225A713B1C00220B +S31508002380DA71084A3B1C101C191C00F043F8054A70 +S3150800239080239B00101C191C00F0E6F8BD4602B00D +S315080023A080BDC0460008004880B582B000AF00F086 +S315080023B04FFD031C7B60144B1B687A68D21AF42302 +S315080023C0FF339A4200D81BE0104B1B78002B0AD12A +S315080023D00E4B01221A700E4A80239B00101C191CF2 +S315080023E000F0B4F809E0094B00221A70084A802365 +S315080023F09B00101C191C00F0B7F8034B7A681A608A +S31508002400BD4602B080BDC046A4010020A801002038 +S315080024100008004880B586B000AF786039600023B0 +S315080024207B6100233B610023FB6000237B6185E021 +S315080024307B690122101C9840031C3B613B681B68A2 +S315080024403A691340FB60FA683B699A4273D13B6864 +S315080024501B79012B03D03B681B79022B38D17B688B +S315080024609B687A6952000321081C9040021CD243DB +S315080024701A407B689A607B689A683B685B79191C86 +S315080024807B695B00081C9840031C1A437B689A60AA +S315080024907B689B889BB27A6992B20121081C90409E +S315080024A0021C92B2D24392B213409AB27B689A80C7 +S315080024B07B689B889AB23B689B79191C7B699BB29F +S315080024C0081C9840031C9BB213439AB27B689A80F7 +S315080024D07B681B687A6952000321081C9040021C1D +S315080024E0D2431A407B681A607B681A683B681B7976 +S315080024F0191C7B695B00081C9840031C1A437B68FF +S315080025001A607B68DB687A6992B252000321081C5C +S315080025109040021CD2431A407B68DA607B68DA680E +S315080025203B68DB79191C7B695B00081C9840031C17 +S315080025301A437B68DA607B6901337B617B690F2B01 +S3150800254000D875E7BD4606B080BDC04680B582B0E6 +S3150800255000AF78600A1CBB1C1A80BB1C1A887B68F3 +S315080025609A61BD4602B080BD80B582B000AF786082 +S315080025700A1CBB1C1A807B68BA1C12881A85BD46C1 +S3150800258002B080BD90B585B000AF7860BB1C1980DD +S315080025907B1C1A700023FB600023BB607B1C1A7827 +S315080025A0BB1C198807230B409B00111C99400B1C68 +S315080025B0FB60BB1C1B88DB089BB21A1CBB1C1B8858 +S315080025C0DB089BB2191C7B6808318900CB58B91CFB +S315080025D008880721014089000F20041C8C40211C13 +S315080025E0C94319407B6808329200D150BB1C1B882E +S315080025F0DB089BB21A1C7B6808329200D258FB682B +S315080026001343BB60BB1C1B88DB089BB21A1C7B6888 +S3150800261008329200B968D150BD4605B090BDC04693 +S3150800262080B588B000AF78600023BB6100237B616A +S3150800263000233B610023FB600023BB600023FB6192 +S31508002640894B5A680C231340BB61BB69042B0CD019 +S3150800265002D8002B05D03AE0082B0AD00C2B32D032 +S3150800266035E07B68814A1A6035E07B687F4A1A60E4 +S3150800267031E07D4B5A68F0239B0313407B617A4B0C +S315080026805A68C0235B0213403B617B699B0C02338B +S315080026907B613B69002B04D17B69754A5343FB6117 +S315080026A00DE0714BDA6A0F2313400133FB606F4864 +S315080026B0F96800F0E3FB031C7A695343FB617B6806 +S315080026C0FA691A6007E07B686A4A1A6003E07B6861 +S315080026D0664A1A60C046644B5A68F0231340BB61C9 +S315080026E0BB691B09BB61644ABB69D3181B78DBB29B +S315080026F0BB607B681A68BB68DA407B685A605A4BCD +S315080027005A68E023DB001340BB61BB691B0ABB6147 +S31508002710594ABB69D3181B78DBB2BB607B685A6819 +S31508002720BB68DA407B689A604F4B1A6B80235B0064 +S31508002730134003D17B68514ADA6010E04A4B5A6865 +S315080027408023DB01134005D17B689B685A087B68A8 +S31508002750DA6004E07B689B689A087B68DA60424B1B +S315080027601A6B4023134003D17B68454A1A6103E07C +S315080027707B68802212021A613B4B1A6B10231340A6 +S3150800278003D17B68394A5A6103E07B681A687B681B +S315080027905A61354B1A6B0323134004D17B689A6838 +S315080027A07B689A611EE0304B1A6B03231340012B9A +S315080027B004D17B681A687B689A6113E02A4B1A6B06 +S315080027C003231340022B04D17B68802212029A61EC +S315080027D008E0254B1A6B03231340032B02D17B68B1 +S315080027E0224A9A61204B1A6BC0239B02134004D1DC +S315080027F07B689A687B68DA6127E01B4B1A6BC023F3 +S315080028009B021A4080235B029A4204D17B681A68AD +S315080028107B68DA6119E0144B1A6BC0239B021A40D5 +S3150800282080239B029A4204D17B6880221202DA61D5 +S315080028300BE00D4B1A6BC0239B021A40C0239B0268 +S315080028409A4202D17B68094ADA61074B1A6B8023E0 +S31508002850134003D17B68074A1A6202E07B68FA696B +S315080028601A62BD4608B080BD0010024000127A0008 +S3150800287000093D00006CDC02C0000020809FD500E6 +S315080028801280000080B582B000AF78600A1CFB1C7D +S315080028901A70FB1C1B78002B06D0084B074A516997 +S315080028A07A680A435A6106E0044B044A5269796811 +S315080028B0C9430A405A61BD4602B080BD00100240B5 +S315080028C080B582B000AF78600A1CFB1C1A70FB1C2E +S315080028D01B78002B06D0084B074AD1697A680A4349 +S315080028E0DA6106E0044B044AD2697968C9430A40AA +S315080028F0DA61BD4602B080BD0010024080B58EB0D8 +S3150800290000AF7860396000237B6300233B630023B4 +S31508002910FB627B681B680122191C91430A1C7B68B1 +S315080029201A607B685B68FB62FA6A4B4B1340FB6272 +S315080029303B689B68FA6A1343FB627B68FA6A5A60CB +S315080029407B681B68FB62FA6A444B1340FB623B6870 +S315080029505A683B68DB681A433B681B691343FA6A83 +S315080029601343FB627B68FA6A1A607B689B68FB62A2 +S31508002970FA6A3B4B1340FB623B685B69FA6A13438E +S31508002980FB627B68FA6A9A603B1C0833181CFFF7DF +S3150800299047FE7A68334B9A4204D13B1C08339B693D +S315080029A03B630CE07A68304B9A4204D13B1C0833EF +S315080029B0DB693B6303E03B1C08339B683B637B682E +S315080029C01A6880231B02134014D03B6B5A003B68DD +S315080029D01B68101C191C00F051FA031C7B633B6B27 +S315080029E05A003B681B68101C191C00F08BFA0B1C5C +S315080029F0FB6210E03B681B68386B191C00F03EFA56 +S31508002A00031C7B633B681B683A6B101C191C00F09F +S31508002A1079FA0B1CFB623B681B685A08FB6A9A42E8 +S31508002A2002D87B6B01337B637B681A6880231B02A1 +S31508002A3013400AD07A6B0F2313405B08FB627A6B4C +S31508002A400A4B1A40FB6A13437B637B6B9AB27B681B +S31508002A509A81BD460EB080BDFFCFFFFFF3E9FFFFA9 +S31508002A60FFFCFFFF0038014000440040F0FF000073 +S31508002A7080B582B000AF78600A1CFB1C1A70FB1C7C +S31508002A801B78002B06D07B681B6801221A437B68DB +S31508002A901A6007E07B681B680122191C91430A1C0F +S31508002AA07B681A60BD4602B080BDC04680B582B05C +S31508002AB000AF78607B689B8C9BB2DB05DB0D9BB215 +S31508002AC0181CBD4602B080BD80B584B000AF7860E2 +S31508002AD039603B1C0F3300221A707B68DB693A6841 +S31508002AE0134004D03B1C0F3301221A7003E03B1C31 +S31508002AF00F3300221A703B1C0F331B78181CBD4677 +S31508002B0004B080BD80B500AF1B4B1B4A126801217B +S31508002B100A431A60184B184A5168184A0A405A60FC +S31508002B20154B154A1168164A0A401A60124B124A82 +S31508002B301168144A0A401A600F4B0F4A5168124A24 +S31508002B400A405A600C4B0C4AD26A0F218A43DA6251 +S31508002B50094B094A116B0D4A0A401A63064B064A85 +S31508002B60526B01218A435A63034B00229A6000F094 +S31508002B700FF8BD4680BDC046001002400CB8FFF8ED +S31508002B80FFFFF6FEFFFFFBFFFFFFC0FFACFEFFFFE8 +S31508002B9080B500AF1D4B11221A601D4B1C4A5268A6 +S31508002BA05A601B4B1A4A52685A60194B184A5168A0 +S31508002BB0184A0A405A60164B154A5268A0218903DA +S31508002BC00A435A60124B124A1268802149040A4382 +S31508002BD01A60C0460E4B1A6880239B041340F9D02E +S31508002BE00B4B0B4A526803218A435A60084B084A22 +S31508002BF0526802210A435A60C046054B5A680C239C +S31508002C001340082BF9D1BD4680BDC04600200240BE +S31508002C1000100240FF7FC0FF80B500AF00F008F843 +S31508002C20FFF7CAFAFFF7C0FBFFF7CCFAFAE7C04688 +S31508002C3080B500AFFFF78CFB00F0EAF8BD4680BD13 +S31508002C4007490849084A094B9B1A05DD0024085913 +S31508002C50105104349C42FADB054880470548004772 +S31508002C6000200020D42F0008C00000203C010020CE +S31508002C70052B0008252100081849194A002301E0F8 +S31508002C800B6004319142FBD3FFF7C6FFFEE7FEE770 +S31508002C90FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7FE +S31508002CA0FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7EE +S31508002CB0FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7DE +S31508002CC0FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7CE +S31508002CD0FEE7FEE7FEE7FEE7FEE700003C01002010 +S31508002CE0B0010020B0B582B000AF021C3960FB1DF0 +S31508002CF01A70FB1D1B787F2B32D93049FB1D1B78B8 +S31508002D001A1C0F231340083B98082C4AFB1D1B78F6 +S31508002D101C1C0F232340083B9B0806339B00D31833 +S31508002D205B68FA1D1278141C03222240D200FF2485 +S31508002D30251C95402A1CD2431A403B689C01FF2358 +S31508002D401C40FB1D1B781D1C03232B40DB00251C88 +S31508002D509D402B1C1A43831D9B00CB185A6029E003 +S31508002D60174BFA1D127852B292081549F81D0078C9 +S31508002D7040B28008C03080004158F81D0078041C15 +S31508002D8003202040C000FF24251C8540281CC04382 +S31508002D90084039688C01FF210C40F91D09780D1C83 +S31508002DA003212940C900251C8D40291C0143C03236 +S31508002DB09200D150BD4602B0B0BDC04600ED00E05D +S31508002DC000E100E080B582B000AF78607A680E4B0B +S31508002DD09A4201D9012312E00C4B7A681202120AB0 +S31508002DE0013A5A6001235B42181C0321FFF77AFF58 +S31508002DF0064B00229A60054B07221A600023181C0E +S31508002E00BD4602B080BDC046FFFFFF0010E000E0EF +S31508002E1080B500AF074B1B68181CFA23990000F011 +S31508002E202DF8031C181CFFF7CDFF002000F004F84E +S31508002E30BD4680BDD000002080B582B000AF786066 +S31508002E40024B7A681A60BD4602B080BDAC0100200C +S31508002E5080B500AF024B1B68181CBD4680BDC04636 +S31508002E60AC01002080B500AF034B1B685A1C024B0F +S31508002E701A60BD4680BDC046AC010020002934D08A +S31508002E800123002210B488422CD301242407A1422E +S31508002E9004D2814202D209011B01F8E7E400A142EB +S31508002EA004D2814202D249005B00F8E7884201D386 +S31508002EB0401A1A434C08A04202D3001B5C0822435E +S31508002EC08C08A04202D3001B9C082243CC08A042CF +S31508002ED002D3001BDC082243002803D01B0901D0BB +S31508002EE00909E3E7101C10BC7047002801D0002030 +S31508002EF0C04307B4024802A14018029003BDC04669 +S31508002F00190000000029F0D003B5FFF7B9FF0EBC81 +S31508002F104243891A1847C0467047C046084B10B541 +S31508002F20041C002B02D0002100E000BF054B1868E6 +S31508002F30836A002B00D09847201C00F033F8C0465F +S31508002F4000000000C42F000870B50E4B0E4D00247B +S31508002F50ED1AAD101E1CAC4204D0A300F3589847D6 +S31508002F600134F8E700F020F8084B094D0024ED1A63 +S31508002F70AD101E1CAC4204D0A300F3589847013488 +S31508002F80F8E770BD34010020340100203401002028 +S31508002F9038010020031C8218934202D019700133AD +S31508002FA0FAE77047FEE70000F8B5C046F8BC08BC6B +S31508002FB09E467047F8B5C046F8BC08BC9E467047A2 +S31108002FC043000000D400002000000000C0 +S30D08002FCC58F1FF7F0100000027 +S31508002FD400000000010203040102030406070809AD +S31508002FE4006CDC0200000000000000000000000085 +S31508002FF400000000000000000000000000000000BF +S3150800300400000000C02F00080000000000000000B7 +S31508003014000000000000000000000000000000009E +S31508003024000000000000000000000000000000008E +S31508003034000000000000000000000000000000007E +S3110800304400000000ED200008C520000870 +S70508002000D2 diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/boot.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/boot.c new file mode 100644 index 00000000..07a596d9 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/boot.c @@ -0,0 +1,208 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Prog\boot.c +* \brief Demo program bootloader interface source file. +* \ingroup Prog_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +#if (BOOT_COM_UART_ENABLE > 0) +static void BootComUartInit(void); +static void BootComUartCheckActivationRequest(void); +#endif + +/************************************************************************************//** +** \brief Initializes the communication interface. +** \return none. +** +****************************************************************************************/ +void BootComInit(void) +{ +#if (BOOT_COM_UART_ENABLE > 0) + BootComUartInit(); +#endif +} /*** end of BootComInit ***/ + + +/************************************************************************************//** +** \brief Receives the CONNECT request from the host, which indicates that the +** bootloader should be activated and, if so, activates it. +** \return none. +** +****************************************************************************************/ +void BootComCheckActivationRequest(void) +{ +#if (BOOT_COM_UART_ENABLE > 0) + BootComUartCheckActivationRequest(); +#endif +} /*** end of BootComCheckActivationRequest ***/ + + +/************************************************************************************//** +** \brief Bootloader activation function. +** \return none. +** +****************************************************************************************/ +void BootActivate(void) +{ + /* perform software reset to activate the bootoader again */ + NVIC_SystemReset(); +} /*** end of BootActivate ***/ + + +#if (BOOT_COM_UART_ENABLE > 0) +/**************************************************************************************** +* U N I V E R S A L A S Y N C H R O N O U S R X T X I N T E R F A C E +****************************************************************************************/ + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static unsigned char UartReceiveByte(unsigned char *data); + + +/************************************************************************************//** +** \brief Initializes the UART communication interface. +** \return none. +** +****************************************************************************************/ +static void BootComUartInit(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + USART_InitTypeDef USART_InitStructure; + + /* enable UART peripheral clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); + /* enable GPIO peripheral clock for transmitter and receiver pins */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); + /* configure alternate function for the USART2 Tx/Rx pins */ + GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1); + /* Configure USART2 pins: Rx (PA2) and Tx (PA3) */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(GPIOA, &GPIO_InitStructure); + /* configure UART communication parameters */ + USART_InitStructure.USART_BaudRate = BOOT_COM_UART_BAUDRATE; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_Init(USART2, &USART_InitStructure); + /* enable UART */ + USART_Cmd(USART2, ENABLE); +} /*** end of BootComUartInit ***/ + + +/************************************************************************************//** +** \brief Receives the CONNECT request from the host, which indicates that the +** bootloader should be activated and, if so, activates it. +** \return none. +** +****************************************************************************************/ +static void BootComUartCheckActivationRequest(void) +{ + static unsigned char xcpCtoReqPacket[BOOT_COM_UART_RX_MAX_DATA+1]; + static unsigned char xcpCtoRxLength; + static unsigned char xcpCtoRxInProgress = 0; + + /* start of cto packet received? */ + if (xcpCtoRxInProgress == 0) + { + /* store the message length when received */ + if (UartReceiveByte(&xcpCtoReqPacket[0]) == 1) + { + /* indicate that a cto packet is being received */ + xcpCtoRxInProgress = 1; + + /* reset packet data count */ + xcpCtoRxLength = 0; + } + } + else + { + /* store the next packet byte */ + if (UartReceiveByte(&xcpCtoReqPacket[xcpCtoRxLength+1]) == 1) + { + /* increment the packet data count */ + xcpCtoRxLength++; + + /* check to see if the entire packet was received */ + if (xcpCtoRxLength == xcpCtoReqPacket[0]) + { + /* done with cto packet reception */ + xcpCtoRxInProgress = 0; + + /* check if this was an XCP CONNECT command */ + if ((xcpCtoReqPacket[1] == 0xff) && (xcpCtoReqPacket[2] == 0x00)) + { + /* connection request received so start the bootloader */ + BootActivate(); + } + } + } + } +} /*** end of BootComUartCheckActivationRequest ***/ + + +/************************************************************************************//** +** \brief Receives a communication interface byte if one is present. +** \param data Pointer to byte where the data is to be stored. +** \return 1 if a byte was received, 0 otherwise. +** +****************************************************************************************/ +static unsigned char UartReceiveByte(unsigned char *data) +{ + /* check flag to see if a byte was received */ + if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET) + { + /* retrieve and store the newly received byte */ + *data = (unsigned char)USART_ReceiveData(USART2); + /* all done */ + return 1; + } + /* still here to no new byte received */ + return 0; +} /*** end of UartReceiveByte ***/ +#endif /* BOOT_COM_UART_ENABLE > 0 */ + + +/*********************************** end of boot.c *************************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/boot.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/boot.h new file mode 100644 index 00000000..737e249e --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/boot.h @@ -0,0 +1,45 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Prog\boot.h +* \brief Demo program bootloader interface header file. +* \ingroup Prog_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ +#ifndef BOOT_H +#define BOOT_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void BootComInit(void); +void BootComCheckActivationRequest(void); +void BootActivate(void); + + +#endif /* BOOT_H */ +/*********************************** end of boot.h *************************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/header.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/header.h new file mode 100644 index 00000000..42d7b9ba --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/header.h @@ -0,0 +1,47 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Prog\header.h +* \brief Generic header file. +* \ingroup Prog_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ +#ifndef HEADER_H +#define HEADER_H + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "../Boot/blt_conf.h" /* bootloader configuration */ +#include "stm32f0xx.h" /* for STM32F0 registers and drivers */ +#include "boot.h" /* bootloader interface driver */ +#include "led.h" /* LED driver */ +#include "timer.h" /* Timer driver */ + + +#endif /* HEADER_H */ +/*********************************** end of header.h ***********************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.depend b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.depend new file mode 100644 index 00000000..1f371408 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.depend @@ -0,0 +1,942 @@ +# depslib dependency file v1.0 +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_adc.c + "stm32f0xx_adc.h" + "stm32f0xx_rcc.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_adc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\inc\stm32f0xx.h + "core_cm0.h" + "system_stm32f0xx.h" + + "stm32f0xx_conf.h" + +1461834352 c:\users\voorburg\desktop\stm32f0\cmsis\core_cm0.h + + "core_cmInstr.h" + "core_cmFunc.h" + +1461834353 c:\users\voorburg\desktop\stm32f0\cmsis\core_cminstr.h + + +1461834352 c:\users\voorburg\desktop\stm32f0\cmsis\core_cmfunc.h + + +1461834350 c:\users\voorburg\desktop\stm32f0\inc\system_stm32f0xx.h + +1461834350 c:\users\voorburg\desktop\stm32f0\inc\stm32f0xx_conf.h + "stm32f0xx_adc.h" + "stm32f0xx_can.h" + "stm32f0xx_cec.h" + "stm32f0xx_crc.h" + "stm32f0xx_crs.h" + "stm32f0xx_comp.h" + "stm32f0xx_dac.h" + "stm32f0xx_dbgmcu.h" + "stm32f0xx_dma.h" + "stm32f0xx_exti.h" + "stm32f0xx_flash.h" + "stm32f0xx_gpio.h" + "stm32f0xx_syscfg.h" + "stm32f0xx_i2c.h" + "stm32f0xx_iwdg.h" + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + "stm32f0xx_rtc.h" + "stm32f0xx_spi.h" + "stm32f0xx_tim.h" + "stm32f0xx_usart.h" + "stm32f0xx_wwdg.h" + "stm32f0xx_misc.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_can.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_cec.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_crc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_crs.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_comp.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_dac.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_dbgmcu.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_dma.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_exti.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_flash.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_gpio.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_syscfg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_i2c.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_iwdg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_pwr.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_rcc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_rtc.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_spi.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_tim.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_usart.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_wwdg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\spl\inc\stm32f0xx_misc.h + "stm32f0xx.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_can.c + "stm32f0xx_can.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_cec.c + "stm32f0xx_cec.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_comp.c + "stm32f0xx_comp.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_crc.c + "stm32f0xx_crc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_crs.c + "stm32f0xx_crs.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_dac.c + "stm32f0xx_dac.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_dbgmcu.c + "stm32f0xx_dbgmcu.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_dma.c + "stm32f0xx_dma.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_exti.c + "stm32f0xx_exti.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_flash.c + "stm32f0xx_flash.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_gpio.c + "stm32f0xx_gpio.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_i2c.c + "stm32f0xx_i2c.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_iwdg.c + "stm32f0xx_iwdg.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_misc.c + "stm32f0xx_misc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_pwr.c + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_rcc.c + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_rtc.c + "stm32f0xx_rtc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_spi.c + "stm32f0xx_spi.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_syscfg.c + "stm32f0xx_syscfg.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_tim.c + "stm32f0xx_tim.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_usart.c + "stm32f0xx_usart.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\spl\src\stm32f0xx_wwdg.c + "stm32f0xx_wwdg.h" + "stm32f0xx_rcc.h" + +1461835260 source:c:\users\voorburg\desktop\stm32f0\src\main.c + "stm32f0xx_conf.h" + +1461834350 source:c:\users\voorburg\desktop\stm32f0\src\startup_stm32f0xx.s + +1461834558 source:c:\users\voorburg\desktop\stm32f0\src\system_stm32f0xx.c + "stm32f0xx.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_adc.c + "stm32f0xx_adc.h" + "stm32f0xx_rcc.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_adc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\stm32f0xx.h + "core_cm0.h" + "system_stm32f0xx.h" + + "stm32f0xx_conf.h" + +1461834352 c:\users\voorburg\desktop\stm32f0\lib\cmsis\core_cm0.h + + "core_cmInstr.h" + "core_cmFunc.h" + +1461834353 c:\users\voorburg\desktop\stm32f0\lib\cmsis\core_cminstr.h + + +1461834352 c:\users\voorburg\desktop\stm32f0\lib\cmsis\core_cmfunc.h + + +1461834350 c:\users\voorburg\desktop\stm32f0\src\hw\system_stm32f0xx.h + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\stm32f0xx_conf.h + "stm32f0xx_adc.h" + "stm32f0xx_can.h" + "stm32f0xx_cec.h" + "stm32f0xx_crc.h" + "stm32f0xx_crs.h" + "stm32f0xx_comp.h" + "stm32f0xx_dac.h" + "stm32f0xx_dbgmcu.h" + "stm32f0xx_dma.h" + "stm32f0xx_exti.h" + "stm32f0xx_flash.h" + "stm32f0xx_gpio.h" + "stm32f0xx_syscfg.h" + "stm32f0xx_i2c.h" + "stm32f0xx_iwdg.h" + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + "stm32f0xx_rtc.h" + "stm32f0xx_spi.h" + "stm32f0xx_tim.h" + "stm32f0xx_usart.h" + "stm32f0xx_wwdg.h" + "stm32f0xx_misc.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_can.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_cec.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_crc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_crs.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_comp.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_dac.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_dbgmcu.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_dma.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_exti.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_flash.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_gpio.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_syscfg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_i2c.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_iwdg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_pwr.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_rcc.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_rtc.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_spi.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_tim.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_usart.h + "stm32f0xx.h" + +1461834351 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_wwdg.h + "stm32f0xx.h" + +1461834350 c:\users\voorburg\desktop\stm32f0\lib\spl\inc\stm32f0xx_misc.h + "stm32f0xx.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_can.c + "stm32f0xx_can.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_cec.c + "stm32f0xx_cec.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_comp.c + "stm32f0xx_comp.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_crc.c + "stm32f0xx_crc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_crs.c + "stm32f0xx_crs.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_dac.c + "stm32f0xx_dac.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_dbgmcu.c + "stm32f0xx_dbgmcu.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_dma.c + "stm32f0xx_dma.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_exti.c + "stm32f0xx_exti.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_flash.c + "stm32f0xx_flash.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_gpio.c + "stm32f0xx_gpio.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_i2c.c + "stm32f0xx_i2c.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_iwdg.c + "stm32f0xx_iwdg.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_misc.c + "stm32f0xx_misc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_pwr.c + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_rcc.c + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_rtc.c + "stm32f0xx_rtc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_spi.c + "stm32f0xx_spi.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_syscfg.c + "stm32f0xx_syscfg.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_tim.c + "stm32f0xx_tim.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_usart.c + "stm32f0xx_usart.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\users\voorburg\desktop\stm32f0\lib\spl\src\stm32f0xx_wwdg.c + "stm32f0xx_wwdg.h" + "stm32f0xx_rcc.h" + +1461834350 source:c:\users\voorburg\desktop\stm32f0\src\hw\startup_stm32f0xx.s + +1461834558 source:c:\users\voorburg\desktop\stm32f0\src\hw\system_stm32f0xx.c + "stm32f0xx.h" + +1461838417 source:c:\users\voorburg\desktop\stm32f0\src\app\main.c + "stm32f0xx_conf.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_adc.c + "stm32f0xx_adc.h" + "stm32f0xx_rcc.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_adc.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\stm32f0xx.h + "core_cm0.h" + "system_stm32f0xx.h" + + "stm32f0xx_conf.h" + +1461834352 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\cmsis\core_cm0.h + + "core_cmInstr.h" + "core_cmFunc.h" + +1461834353 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\cmsis\core_cminstr.h + + +1461834352 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\cmsis\core_cmfunc.h + + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\\system_stm32f0xx.h + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\stm32f0xx_conf.h + "stm32f0xx_adc.h" + "stm32f0xx_can.h" + "stm32f0xx_cec.h" + "stm32f0xx_crc.h" + "stm32f0xx_crs.h" + "stm32f0xx_comp.h" + "stm32f0xx_dac.h" + "stm32f0xx_dbgmcu.h" + "stm32f0xx_dma.h" + "stm32f0xx_exti.h" + "stm32f0xx_flash.h" + "stm32f0xx_gpio.h" + "stm32f0xx_syscfg.h" + "stm32f0xx_i2c.h" + "stm32f0xx_iwdg.h" + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + "stm32f0xx_rtc.h" + "stm32f0xx_spi.h" + "stm32f0xx_tim.h" + "stm32f0xx_usart.h" + "stm32f0xx_wwdg.h" + "stm32f0xx_misc.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_can.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_cec.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_crc.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_crs.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_comp.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_dac.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_dbgmcu.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_dma.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_exti.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_flash.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_gpio.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_syscfg.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_i2c.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_iwdg.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_pwr.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_rcc.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_rtc.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_spi.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_tim.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_usart.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_wwdg.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\inc\stm32f0xx_misc.h + "stm32f0xx.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_can.c + "stm32f0xx_can.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_cec.c + "stm32f0xx_cec.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_comp.c + "stm32f0xx_comp.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_crc.c + "stm32f0xx_crc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_crs.c + "stm32f0xx_crs.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_dac.c + "stm32f0xx_dac.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_dbgmcu.c + "stm32f0xx_dbgmcu.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_dma.c + "stm32f0xx_dma.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_exti.c + "stm32f0xx_exti.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_flash.c + "stm32f0xx_flash.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_gpio.c + "stm32f0xx_gpio.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_i2c.c + "stm32f0xx_i2c.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_iwdg.c + "stm32f0xx_iwdg.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_misc.c + "stm32f0xx_misc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_pwr.c + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_rcc.c + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_rtc.c + "stm32f0xx_rtc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_spi.c + "stm32f0xx_spi.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_syscfg.c + "stm32f0xx_syscfg.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_tim.c + "stm32f0xx_tim.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_usart.c + "stm32f0xx_usart.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\spl\src\stm32f0xx_wwdg.c + "stm32f0xx_wwdg.h" + "stm32f0xx_rcc.h" + +1461912096 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\main.c + "boot.h" + "stm32f0xx.h" + +1461834350 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\startup_stm32f0xx.s + +1461834558 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\system_stm32f0xx.c + "stm32f0xx.h" + +1461856989 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\cstart.s + +1461863332 source:c:\work\software\openblt\target\source\armcm0_stm32\gcc\cstart.s + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\system_stm32f0xx.h + +1461834558 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\lib\system_stm32f0xx.c + "stm32f0xx.h" + +1461910321 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\hooks.c + "boot.h" + "led.h" + "stm32f0xx.h" + +1456845505 c:\work\software\openblt\target\source\boot.h + "types.h" + "assert.h" + "blt_conf.h" + "plausibility.h" + "cpu.h" + "cop.h" + "nvm.h" + "timer.h" + "backdoor.h" + "file.h" + "com.h" + +1461858281 c:\work\software\openblt\target\source\armcm0_stm32\types.h + +1456845505 c:\work\software\openblt\target\source\assert.h + +1461910117 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\\blt_conf.h + +1456845505 c:\work\software\openblt\target\source\plausibility.h + +1456845505 c:\work\software\openblt\target\source\cpu.h + +1456845505 c:\work\software\openblt\target\source\cop.h + +1456845505 c:\work\software\openblt\target\source\nvm.h + +1456845505 c:\work\software\openblt\target\source\timer.h + +1456845505 c:\work\software\openblt\target\source\backdoor.h + +1456845505 c:\work\software\openblt\target\source\file.h + "ff.h" + +1456845505 c:\work\software\openblt\target\source\com.h + "xcp.h" + +1456845506 c:\work\software\openblt\target\source\xcp.h + +1461860885 source:c:\work\software\openblt\target\source\armcm0_stm32\cpu.c + "boot.h" + "stm32f0xx.h" + +1461857921 source:c:\work\software\openblt\target\source\armcm0_stm32\nvm.c + "boot.h" + "flash.h" + +1461857911 c:\work\software\openblt\target\source\armcm0_stm32\flash.h + +1461858254 source:c:\work\software\openblt\target\source\armcm0_stm32\timer.c + "boot.h" + "stm32f0xx.h" + +1461861905 source:c:\work\software\openblt\target\source\armcm0_stm32\flash.c + "boot.h" + "stm32f0xx.h" + +1456845497 source:c:\work\software\openblt\target\source\assert.c + "boot.h" + +1456845497 source:c:\work\software\openblt\target\source\backdoor.c + "boot.h" + +1456845497 source:c:\work\software\openblt\target\source\boot.c + "boot.h" + +1456845497 source:c:\work\software\openblt\target\source\com.c + "boot.h" + "can.h" + "uart.h" + "usb.h" + "net.h" + +1456845505 c:\work\software\openblt\target\source\can.h + +1456845505 c:\work\software\openblt\target\source\uart.h + +1456845506 c:\work\software\openblt\target\source\usb.h + +1456845505 c:\work\software\openblt\target\source\net.h + +1456845497 source:c:\work\software\openblt\target\source\cop.c + "boot.h" + +1456845497 source:c:\work\software\openblt\target\source\xcp.c + "boot.h" + +1461910205 source:c:\work\software\openblt\target\source\armcm0_stm32\uart.c + "boot.h" + "stm32f0xx.h" + +1461862428 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\led.h + +1461909321 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\led.c + "boot.h" + "led.h" + "stm32f0xx.h" + +1461920749 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\led.c + "header.h" + +1461926885 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\header.h + "../Boot/blt_conf.h" + "stm32f0xx.h" + "boot.h" + "led.h" + "timer.h" + +1461910117 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\boot\blt_conf.h + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\stm32f0xx.h + "core_cm0.h" + "system_stm32f0xx.h" + + "stm32f0xx_conf.h" + +1461834352 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\cmsis\core_cm0.h + + "core_cmInstr.h" + "core_cmFunc.h" + +1461834353 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\cmsis\core_cminstr.h + + +1461834352 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\cmsis\core_cmfunc.h + + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\system_stm32f0xx.h + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\stm32f0xx_conf.h + "stm32f0xx_adc.h" + "stm32f0xx_can.h" + "stm32f0xx_cec.h" + "stm32f0xx_crc.h" + "stm32f0xx_crs.h" + "stm32f0xx_comp.h" + "stm32f0xx_dac.h" + "stm32f0xx_dbgmcu.h" + "stm32f0xx_dma.h" + "stm32f0xx_exti.h" + "stm32f0xx_flash.h" + "stm32f0xx_gpio.h" + "stm32f0xx_syscfg.h" + "stm32f0xx_i2c.h" + "stm32f0xx_iwdg.h" + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + "stm32f0xx_rtc.h" + "stm32f0xx_spi.h" + "stm32f0xx_tim.h" + "stm32f0xx_usart.h" + "stm32f0xx_wwdg.h" + "stm32f0xx_misc.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_adc.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_can.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_cec.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_crc.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_crs.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_comp.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_dac.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_dbgmcu.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_dma.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_exti.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_flash.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_gpio.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_syscfg.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_i2c.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_iwdg.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_pwr.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_rcc.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_rtc.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_spi.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_tim.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_usart.h + "stm32f0xx.h" + +1461834351 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_wwdg.h + "stm32f0xx.h" + +1461834350 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\inc\stm32f0xx_misc.h + "stm32f0xx.h" + +1461920608 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\led.h + +1461920902 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\timer.h + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_adc.c + "stm32f0xx_adc.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_can.c + "stm32f0xx_can.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_cec.c + "stm32f0xx_cec.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_comp.c + "stm32f0xx_comp.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_crc.c + "stm32f0xx_crc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_crs.c + "stm32f0xx_crs.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_dac.c + "stm32f0xx_dac.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_dbgmcu.c + "stm32f0xx_dbgmcu.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_dma.c + "stm32f0xx_dma.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_exti.c + "stm32f0xx_exti.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_flash.c + "stm32f0xx_flash.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_gpio.c + "stm32f0xx_gpio.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_i2c.c + "stm32f0xx_i2c.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_iwdg.c + "stm32f0xx_iwdg.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_misc.c + "stm32f0xx_misc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_pwr.c + "stm32f0xx_pwr.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_rcc.c + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_rtc.c + "stm32f0xx_rtc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_spi.c + "stm32f0xx_spi.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_syscfg.c + "stm32f0xx_syscfg.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_tim.c + "stm32f0xx_tim.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_usart.c + "stm32f0xx_usart.h" + "stm32f0xx_rcc.h" + +1461834351 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\spl\src\stm32f0xx_wwdg.c + "stm32f0xx_wwdg.h" + "stm32f0xx_rcc.h" + +1461834558 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\lib\system_stm32f0xx.c + "stm32f0xx.h" + +1461921881 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\startup_stm32f0xx.s + +1461920975 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\timer.c + "header.h" + +1461921078 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\main.c + "header.h" + +1461927158 source:c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\boot.c + "header.h" + +1453815157 c:\work\software\openblt\target\demo\armcm0_stm32_discovery_stm32f051_gcc\prog\boot.h + diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.ebp b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.ebp new file mode 100644 index 00000000..6273f936 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.ebp @@ -0,0 +1,305 @@ + + + + + + + diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.elay b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.elay new file mode 100644 index 00000000..f7cce81a --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/ide/stm32f0.elay @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/led.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/led.c new file mode 100644 index 00000000..786efad5 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/led.c @@ -0,0 +1,108 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Prog\led.c +* \brief LED driver source file. +* \ingroup Prog_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Toggle interval time in milliseconds. */ +#define LED_TOGGLE_MS (500) + + +/************************************************************************************//** +** \brief Initializes the LED. The board doesn't have a dedicted LED so an +** indicator on the LCD is used instead. +** \return none. +** +****************************************************************************************/ +void LedInit(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + /* enable the GPIO_LED Clock */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); + /* configure the GPIO_LED pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_ResetBits(GPIOC, GPIO_Pin_9); +} /*** end of LedInit ***/ + + +/************************************************************************************//** +** \brief Toggles the LED at a fixed time interval. +** \return none. +** +****************************************************************************************/ +void LedToggle(void) +{ + static unsigned char led_toggle_state = 0; + static unsigned long timer_counter_last = 0; + unsigned long timer_counter_now; + + /* check if toggle interval time passed */ + timer_counter_now = TimerGet(); + if ( (timer_counter_now - timer_counter_last) < LED_TOGGLE_MS) + { + /* not yet time to toggle */ + return; + } + + /* determine toggle action */ + if (led_toggle_state == 0) + { + led_toggle_state = 1; + /* turn the LED on */ + GPIO_SetBits(GPIOC, GPIO_Pin_9); + } + else + { + led_toggle_state = 0; + /* turn the LED off */ + GPIO_ResetBits(GPIOC, GPIO_Pin_9); + } + + /* store toggle time to determine next toggle interval */ + timer_counter_last = timer_counter_now; +} /*** end of LedToggle ***/ + + +/*********************************** end of led.c **************************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/led.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/led.h new file mode 100644 index 00000000..edd8c832 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/led.h @@ -0,0 +1,44 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Prog\led.h +* \brief LED driver header file. +* \ingroup Prog_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ +#ifndef LED_H +#define LED_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void LedInit(void); +void LedToggle(void); + + +#endif /* LED_H */ +/*********************************** end of led.h **************************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_adc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_adc.h new file mode 100644 index 00000000..6d981652 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_adc.h @@ -0,0 +1,450 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_can.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_can.h new file mode 100644 index 00000000..3bc6b4a0 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_can.h @@ -0,0 +1,643 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_cec.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_cec.h new file mode 100644 index 00000000..c98217f2 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_cec.h @@ -0,0 +1,300 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_comp.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_comp.h new file mode 100644 index 00000000..d1205db4 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_comp.h @@ -0,0 +1,245 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_crc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_crc.h new file mode 100644 index 00000000..72080ac9 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_crc.h @@ -0,0 +1,122 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_crs.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_crs.h new file mode 100644 index 00000000..cf499b64 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_crs.h @@ -0,0 +1,183 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dac.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dac.h new file mode 100644 index 00000000..2a79b892 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dac.h @@ -0,0 +1,312 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dbgmcu.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dbgmcu.h new file mode 100644 index 00000000..1bd2ce71 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dbgmcu.h @@ -0,0 +1,107 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dma.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dma.h new file mode 100644 index 00000000..41400e18 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_dma.h @@ -0,0 +1,377 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_exti.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_exti.h new file mode 100644 index 00000000..e4067b3c --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_exti.h @@ -0,0 +1,216 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_flash.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_flash.h new file mode 100644 index 00000000..4daeecc9 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_flash.h @@ -0,0 +1,430 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_gpio.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_gpio.h new file mode 100644 index 00000000..d98278e4 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_gpio.h @@ -0,0 +1,358 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_i2c.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_i2c.h new file mode 100644 index 00000000..19ef9b68 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_i2c.h @@ -0,0 +1,478 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_iwdg.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_iwdg.h new file mode 100644 index 00000000..e217df34 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_iwdg.h @@ -0,0 +1,140 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_misc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_misc.h new file mode 100644 index 00000000..9a1f6842 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_misc.h @@ -0,0 +1,143 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_pwr.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_pwr.h new file mode 100644 index 00000000..9941f445 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_pwr.h @@ -0,0 +1,197 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_rcc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_rcc.h new file mode 100644 index 00000000..250245f2 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_rcc.h @@ -0,0 +1,608 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_rtc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_rtc.h new file mode 100644 index 00000000..94bd7d16 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_rtc.h @@ -0,0 +1,807 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_spi.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_spi.h new file mode 100644 index 00000000..effa9007 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_spi.h @@ -0,0 +1,588 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_syscfg.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_syscfg.h new file mode 100644 index 00000000..2735f636 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_syscfg.h @@ -0,0 +1,262 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_tim.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_tim.h new file mode 100644 index 00000000..48e00157 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_tim.h @@ -0,0 +1,1186 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_usart.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_usart.h new file mode 100644 index 00000000..797c5f02 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_usart.h @@ -0,0 +1,599 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_wwdg.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_wwdg.h new file mode 100644 index 00000000..cbe8fefd --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/inc/stm32f0xx_wwdg.h @@ -0,0 +1,109 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_adc.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_adc.c new file mode 100644 index 00000000..0c1964cc --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_adc.c @@ -0,0 +1,1240 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_can.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_can.c new file mode 100644 index 00000000..6eb990d0 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_can.c @@ -0,0 +1,1631 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_cec.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_cec.c new file mode 100644 index 00000000..6042b6cd --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_cec.c @@ -0,0 +1,607 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_comp.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_comp.c new file mode 100644 index 00000000..48464a2c --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_comp.c @@ -0,0 +1,408 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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_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)<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<CSR &= (uint32_t)(~((uint32_t)1<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<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<
© COPYRIGHT 2014 STMicroelectronics
+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_crs.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_crs.c new file mode 100644 index 00000000..7e325e16 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_crs.c @@ -0,0 +1,466 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dac.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dac.c new file mode 100644 index 00000000..6a299fe1 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dac.c @@ -0,0 +1,692 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dbgmcu.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dbgmcu.c new file mode 100644 index 00000000..3b34412e --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dbgmcu.c @@ -0,0 +1,218 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dma.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dma.c new file mode 100644 index 00000000..dab0b926 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_dma.c @@ -0,0 +1,705 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_exti.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_exti.c new file mode 100644 index 00000000..fd056447 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_exti.c @@ -0,0 +1,314 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_flash.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_flash.c new file mode 100644 index 00000000..59925207 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_flash.c @@ -0,0 +1,1256 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_gpio.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_gpio.c new file mode 100644 index 00000000..c8eee37e --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_gpio.c @@ -0,0 +1,540 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_i2c.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_i2c.c new file mode 100644 index 00000000..7ff42e89 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_i2c.c @@ -0,0 +1,1585 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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_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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_iwdg.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_iwdg.c new file mode 100644 index 00000000..333b2842 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_iwdg.c @@ -0,0 +1,293 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_misc.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_misc.c new file mode 100644 index 00000000..7e28b6a3 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_misc.c @@ -0,0 +1,167 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_pwr.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_pwr.c new file mode 100644 index 00000000..add2a7f8 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_pwr.c @@ -0,0 +1,566 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_rcc.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_rcc.c new file mode 100644 index 00000000..ed585613 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_rcc.c @@ -0,0 +1,1741 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_rtc.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_rtc.c new file mode 100644 index 00000000..4d28bff6 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_rtc.c @@ -0,0 +1,2518 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_spi.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_spi.c new file mode 100644 index 00000000..7eec0ef4 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_spi.c @@ -0,0 +1,1334 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_syscfg.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_syscfg.c new file mode 100644 index 00000000..fe474cc0 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_syscfg.c @@ -0,0 +1,320 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_tim.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_tim.c new file mode 100644 index 00000000..fa756f0f --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_tim.c @@ -0,0 +1,3349 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_usart.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_usart.c new file mode 100644 index 00000000..f697397d --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_usart.c @@ -0,0 +1,2096 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_wwdg.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_wwdg.c new file mode 100644 index 00000000..9ff2f921 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/SPL/src/stm32f0xx_wwdg.c @@ -0,0 +1,303 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/arm_common_tables.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/arm_common_tables.h new file mode 100644 index 00000000..34f910f9 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/arm_common_tables.h @@ -0,0 +1,35 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010 ARM Limited. All rights reserved. +* +* $Date: 11. November 2010 +* $Revision: V1.0.2 +* +* 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 +* +* Version 1.0.2 2010/11/11 +* Documentation updated. +* +* Version 1.0.1 2010/10/05 +* Production release and review comments incorporated. +* +* Version 1.0.0 2010/09/20 +* Production release and review comments incorporated. +* -------------------------------------------------------------------- */ + +#ifndef _ARM_COMMON_TABLES_H +#define _ARM_COMMON_TABLES_H + +#include "arm_math.h" + +extern uint16_t armBitRevTable[256]; +extern q15_t armRecipTableQ15[64]; +extern q31_t armRecipTableQ31[64]; +extern const q31_t realCoefAQ31[1024]; +extern const q31_t realCoefBQ31[1024]; + +#endif /* ARM_COMMON_TABLES_H */ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/arm_math.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/arm_math.h new file mode 100644 index 00000000..d8901db1 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/arm_math.h @@ -0,0 +1,7051 @@ +/* ---------------------------------------------------------------------- + * Copyright (C) 2010 ARM Limited. All rights reserved. + * + * $Date: 15. July 2011 + * $Revision: V1.0.10 + * + * Project: CMSIS DSP Library + * Title: arm_math.h + * + * Description: Public header file for CMSIS DSP Library + * + * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 + * + * Version 1.0.10 2011/7/15 + * Big Endian support added and Merged M0 and M3/M4 Source code. + * + * Version 1.0.3 2010/11/29 + * Re-organized the CMSIS folders and updated documentation. + * + * Version 1.0.2 2010/11/11 + * Documentation updated. + * + * Version 1.0.1 2010/10/05 + * Production release and review comments incorporated. + * + * Version 1.0.0 2010/09/20 + * Production release and review comments incorporated. + * -------------------------------------------------------------------- */ + +/** + \mainpage CMSIS DSP Software Library + * + * Introduction + * + * 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 modules 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. + * + * Processor Support + * + * The library is completely written in C and is fully CMSIS compliant. + * High performance is achieved through maximum use of Cortex-M4 intrinsics. + * + * The supplied library source code also builds and runs on the Cortex-M3 and Cortex-M0 processor, + * with the DSP intrinsics being emulated through software. + * + * + * Toolchain Support + * + * The library has been developed and tested with MDK-ARM version 4.21. + * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. + * + * Using the Library + * + * The library installer contains prebuilt versions of the libraries in the Lib 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 arm_math.h which is placed in the Include 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 arm_math.h 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 depending on the target processor in the application. + * + * Examples + * + * The library ships with a number of examples which demonstrate how to use the library functions. + * + * Building the Library + * + * The library installer contains project files to re build libraries on MDK Tool chain in the CMSIS\DSP_Lib\Source\ARM 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 + * + * Each library project have differant pre-processor macros. + * + * 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_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 for checking on the input and output sizes of matrices + * + * ARM_MATH_ROUNDING: + * Define macro for rounding on support functions + * + * __FPU_PRESENT: + * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries + * + * + * The project can be built by opening the appropriate project in MDK-ARM 4.21 chain and defining the optional pre processor MACROs detailed above. + * + * Copyright Notice + * + * Copyright (C) 2010 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: + *
+ *     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;
+ * 
+ * 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 numRows X numCols + * and the values are arranged in row order. That is, the + * matrix element (i, j) is stored at: + *
+ *     pData[i*numCols + j]
+ * 
+ * + * \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 arm_mat_init_f32(), arm_mat_init_q31() + * and arm_mat_init_q15() 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: + *
+ * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
+ * 
+ * where nRows specifies the number of rows, nColumns + * specifies the number of columns, and pData 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: + *
+ *     ARM_MATH_SIZE_MISMATCH
+ * 
+ * Otherwise the functions return + *
+ *     ARM_MATH_SUCCESS
+ * 
+ * There is some overhead associated with this matrix size checking. + * The matrix size checking is enabled via the #define + *
+ *     ARM_MATH_MATRIX_CHECK
+ * 
+ * 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 ARM_MATH_SUCCESS. + */ + +/** + * @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" +#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 +#define PI 3.14159265358979f + + /** + * @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 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. + */ +#define __SIMD32(addr) (*(int32_t **) & (addr)) + +#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) + /** + * @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) ) + +#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) && defined ( __CC_ARM ) +#define __CLZ __clz +#endif + +#if defined (ARM_MATH_CM0) && ((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) + + 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 */ + + + + /* + * @brief C custom defined intrinsic function for M3 and M0 processors + */ +#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) + + /* + * @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 = (char) x; + s = (char) 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 = (char) x; + s = (char) 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))); + } + + + + +#endif /* (ARM_MATH_CM3) || defined (ARM_MATH_CM0) */ + + + /** + * @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 + * numTaps 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS 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 ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS 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 ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS 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 + 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; + float32_t x1; + float32_t 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 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; + + /** + * @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; + + /** + * @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; + + /** + * @brief Processing function for the Q15 CFFT/CIFFT. + * @param[in] *S points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc); + + /** + * @brief Initialization function for the Q15 CFFT/CIFFT. + * @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_q15( + arm_cfft_radix4_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Processing function for the Q31 CFFT/CIFFT. + * @param[in] *S points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc); + + /** + * @brief Initialization function for the Q31 CFFT/CIFFT. + * @param[in,out] *S points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_q31( + arm_cfft_radix4_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Processing function for the floating-point CFFT/CIFFT. + * @param[in] *S points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Initialization function for the floating-point CFFT/CIFFT. + * @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_f32( + arm_cfft_radix4_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + + + /*---------------------------------------------------------------------- + * Internal functions prototypes FFT function + ----------------------------------------------------------------------*/ + + /** + * @brief Core function for the floating-point CFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to the twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_f32( + float32_t * pSrc, + uint16_t fftLen, + float32_t * pCoef, + uint16_t twidCoefModifier); + + /** + * @brief Core function for the floating-point CIFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @param[in] onebyfftLen value of 1/fftLen. + * @return none. + */ + + void arm_radix4_butterfly_inverse_f32( + float32_t * pSrc, + uint16_t fftLen, + float32_t * pCoef, + uint16_t twidCoefModifier, + float32_t onebyfftLen); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftSize length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table. + * @param[in] *pBitRevTab points to the bit reversal table. + * @return none. + */ + + void arm_bitreversal_f32( + float32_t *pSrc, + uint16_t fftSize, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @brief Core function for the Q31 CFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_q31( + q31_t *pSrc, + uint32_t fftLen, + q31_t *pCoef, + uint32_t twidCoefModifier); + + /** + * @brief Core function for the Q31 CIFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_inverse_q31( + q31_t * pSrc, + uint32_t fftLen, + q31_t * pCoef, + uint32_t twidCoefModifier); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table + * @param[in] *pBitRevTab points to bit reversal table. + * @return none. + */ + + void arm_bitreversal_q31( + q31_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @brief Core function for the Q15 CFFT butterfly process. + * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef16 points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_q15( + q15_t *pSrc16, + uint32_t fftLen, + q15_t *pCoef16, + uint32_t twidCoefModifier); + + /** + * @brief Core function for the Q15 CIFFT butterfly process. + * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef16 points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_inverse_q15( + q15_t *pSrc16, + uint32_t fftLen, + q15_t *pCoef16, + uint32_t twidCoefModifier); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table + * @param[in] *pBitRevTab points to bit reversal table. + * @return none. + */ + + void arm_bitreversal_q15( + q15_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @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; + + /** + * @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; + + /** + * @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; + + /** + * @brief Processing function for the Q15 RFFT/RIFFT. + * @param[in] *S points to an instance of the Q15 RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_q15( + const arm_rfft_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst); + + /** + * @brief Initialization function for the Q15 RFFT/RIFFT. + * @param[in, out] *S points to an instance of the Q15 RFFT/RIFFT structure. + * @param[in] *S_CFFT points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + 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); + + /** + * @brief Processing function for the Q31 RFFT/RIFFT. + * @param[in] *S points to an instance of the Q31 RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_q31( + const arm_rfft_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst); + + /** + * @brief Initialization function for the Q31 RFFT/RIFFT. + * @param[in, out] *S points to an instance of the Q31 RFFT/RIFFT structure. + * @param[in, out] *S_CFFT points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + 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); + + /** + * @brief Initialization function for the floating-point RFFT/RIFFT. + * @param[in,out] *S points to an instance of the floating-point RFFT/RIFFT structure. + * @param[in,out] *S_CFFT points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + 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); + + /** + * @brief Processing function for the floating-point RFFT/RIFFT. + * @param[in] *S points to an instance of the floating-point RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_f32( + const arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst); + + /** + * @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 fftLenReal 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 N 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 N 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 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 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. + * @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. + * @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 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. + * @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 + * blockSize is not a multiple of M. + */ + + 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 + * blockSize is not a multiple of M. + */ + + 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 + * blockSize is not a multiple of M. + */ + + 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 numTaps is not a multiple of the interpolation factor L. + */ + + 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 numTaps is not a multiple of the interpolation factor L. + */ + + 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 numTaps is not a multiple of the interpolation factor L. + */ + + 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. + * @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 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. + * @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. + * S points to an instance of the PID control data structure. in + * is the input sample value. The functions return the output value. + * + * \par Algorithm: + *
+   *    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  
+ * + * \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. + * + * Scaling and Overflow Behavior: + * \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. + * + * Scaling and Overflow Behavior: + * \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; + + /* Implementation of PID controller */ + + #ifdef ARM_MATH_CM0 + + /* acc = A0 * x[n] */ + acc = ((q31_t) S->A0 )* in ; + + #else + + /* acc = A0 * x[n] */ + acc = (q31_t) __SMUAD(S->A0, in); + + #endif + + #ifdef ARM_MATH_CM0 + + /* 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] ; + + #else + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc = __SMLALD(S->A1, (q31_t)__SIMD32(S->state), acc); + + #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 Ia, Ib and Ic to calculate currents + * in the two-phase orthogonal stator axis Ialpha and Ibeta. + * When Ialpha is superposed with Ia as shown in the figure below + * \image html clarke.gif Stator current space vector and its components in (a,b). + * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta + * can be calculated using only Ia and Ib. + * + * 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 Ia and Ib are the instantaneous stator phases and + * pIalpha and pIbeta 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 a + * @param[in] Ib input three-phase coordinate b + * @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 a + * @param[in] Ib input three-phase coordinate b + * @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. + * + * Scaling and Overflow Behavior: + * \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 pIa and pIb are the instantaneous stator phases and + * Ialpha and Ibeta 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 a + * @param[out] *pIb points to output three-phase coordinate b + * @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 a + * @param[out] *pIb points to output three-phase coordinate b + * @return none. + * + * Scaling and Overflow Behavior: + * \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 Ialpha and the Ibeta 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 Ialpha and Ibeta are the stator vector components, + * pId and pIq are rotor vector components and cosVal and sinVal 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. + * + * Scaling and Overflow Behavior: + * \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 pIalpha and pIbeta are the stator vector components, + * Id and Iq are rotor vector components and cosVal and sinVal 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. + * + * Scaling and Overflow Behavior: + * \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: + *
+   *       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
+   * 
+ * + * \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. + * S points to an instance of the Linear Interpolate function data structure. + * x 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 = (x - S->x1) / xSpacing; + + if(i < 0) + { + /* Iniatilize output for below specified range as least output value of table */ + y = pYData[0]; + } + else if(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 x 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 >= (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 x 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 >= (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 x 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 */ + 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 >= (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 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: + *
+   *      x1 = x0 - f(x0)/f'(x0)
+   * 
+ * where x1 is the current estimate, + * x0 is the previous estimate and + * f'(x0) is the derivative of f() evaluated at x0. + * For the square root function, the algorithm reduces to: + *
+   *     x0 = in/2                         [initial guess]
+   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
+   * 
+ */ + + + /** + * @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 + * in 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 + * in 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 + * in 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 f(x, y) 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. + * + * Algorithm + * \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: + *
+   *   typedef struct
+   *   {
+   *     uint16_t numRows;
+   *     uint16_t numCols;
+   *     float32_t *pData;
+   * } arm_bilinear_interp_instance_f32;
+   * 
+ * + * \par + * where numRows specifies the number of rows in the table; + * numCols specifies the number of columns in the table; + * and pData points to an array of size numRows*numCols values. + * The data table pTable is organized in row order and the supplied data values fall on integer indexes. + * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. + * + * \par + * Let (x, y) specify the desired interpolation point. Then define: + *
+   *     XF = floor(x)
+   *     YF = floor(y)
+   * 
+ * \par + * The interpolated output point is computed as: + *
+   *  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)
+   * 
+ * 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 + */ + + + + + + +#ifdef __cplusplus +} +#endif + + +#endif /* _ARM_MATH_H */ + + +/** + * + * End of file. + */ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cm0.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cm0.h new file mode 100644 index 00000000..edd52217 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cm0.h @@ -0,0 +1,665 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V2.10 + * @date 19. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ +#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 + + +/** \mainpage CMSIS Cortex-M0 + + This documentation describes the CMSIS Cortex-M Core Peripheral Access Layer. + It consists of: + + - Cortex-M Core Register Definitions + - Cortex-M functions + - Cortex-M instructions + + The CMSIS Cortex-M0 Core Peripheral Access Layer contains C and assembly functions that ease + access to the Cortex-M Core + */ + +/** \defgroup CMSIS_MISRA_Exceptions CMSIS MISRA-C:2004 Compliance Exceptions + CMSIS violates following MISRA-C2004 Rules: + + - Violates MISRA 2004 Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + - Violates MISRA 2004 Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + - Violates MISRA 2004 Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** \defgroup CMSIS_core_definitions CMSIS Core Definitions + This file defines all structures and symbols for CMSIS core: + - CMSIS version number + - Cortex-M core + - Cortex-M core Revision Number + @{ + */ + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (0x02) /*!< [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (0x10) /*!< [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 core */ + + +#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 available 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 + +/*!< __FPU_USED to be checked prior to making use of FPU specific registers and functions */ +#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__ ) + /* add preprocessor checks */ +#endif + +#include /*!< 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) */ +#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 CMSIS_core_definitions */ + + + +/******************************************************************************* + * Register Abstraction + ******************************************************************************/ +/** \defgroup CMSIS_core_register CMSIS Core Register + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register +*/ + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CORE CMSIS Core + Type definitions for the Cortex-M Core Registers + @{ + */ + +/** \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 CMSIS NVIC + Type definitions for the Cortex-M 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 CMSIS SCB + Type definitions for the Cortex-M 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 CMSIS SysTick + Type definitions for the Cortex-M 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 CMSIS Core Debug + 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 + @{ + */ + +/* Memory mapping of Cortex-M0 Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space 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 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 + ******************************************************************************/ +/** \defgroup CMSIS_Core_FunctionInterface CMSIS Core Function Interface + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions +*/ + + + +/* ########################## NVIC functions #################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions CMSIS Core NVIC Functions + @{ + */ + +/* 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 + + This function enables a device specific interrupt in the NVIC interrupt controller. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the external interrupt to enable + */ +static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Disable External Interrupt + + This function disables a device specific interrupt in the NVIC interrupt controller. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the external interrupt to disable + */ +static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Get Pending Interrupt + + This function reads the pending register in the NVIC and returns the pending bit + for the specified interrupt. + + \param [in] IRQn Number of the interrupt for get pending + \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 + + This function sets the pending bit for the specified interrupt. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the interrupt for set pending + */ +static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + + +/** \brief Clear Pending Interrupt + + This function clears the pending bit for the specified interrupt. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the interrupt for clear pending + */ +static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + + +/** \brief Set Interrupt Priority + + This function sets the priority for the specified interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + Note: The priority cannot be set for every core interrupt. + + \param [in] IRQn Number of the interrupt for set priority + \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 + + This function reads the priority for the specified interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + The returned priority value is automatically aligned to the implemented + priority bits of the microcontroller. + + \param [in] IRQn Number of the interrupt for get priority + \return Interrupt Priority + */ +static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */ + else { + return((uint32_t)((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** \brief System Reset + + This function initiate 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 CMSIS Core SysTick Functions + @{ + */ + +#if (__Vendor_SysTickConfig == 0) + +/** \brief System Tick Configuration + + This function initialises the system tick timer and its interrupt and start the system tick timer. + Counter is in free running mode to generate periodical interrupts. + + \param [in] ticks Number of ticks between two interrupts + \return 0 Function succeeded + \return 1 Function failed + */ +static __INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ + + SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ + 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cmFunc.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cmFunc.h new file mode 100644 index 00000000..c999b1c8 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cmFunc.h @@ -0,0 +1,609 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V2.10 + * @date 26. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#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 ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR 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 + +#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"); +} + + +/** \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"); +} + + +/** \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) ); +} + + +/** \brief Get ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR 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) ); +} + + +/** \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) ); +} + + +/** \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) ); +} + + +#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"); +} + + +/** \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"); +} + + +/** \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) ); +} + + +/** \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) ); +} + +#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; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + 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) + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) ); +#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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cmInstr.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cmInstr.h new file mode 100644 index 00000000..ceb4f875 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/cmsis/core_cmInstr.h @@ -0,0 +1,585 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V2.10 + * @date 19. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#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 + */ +static __INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} + + +/** \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 + */ +static __INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} + + +#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 + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \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) +{ + uint32_t result; + + __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \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" : "=r" (result) : "r" (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) +{ + uint32_t result; + + __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +#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) +{ + uint8_t result; + + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); + 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) +{ + uint16_t result; + + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); + 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) : "r" (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) : "r" (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) : "r" (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) : "r" (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"); +} + + +/** \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) +{ + uint8_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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/stm32f0xx.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/stm32f0xx.h new file mode 100644 index 00000000..3b7a0f9b --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/stm32f0xx.h @@ -0,0 +1,5111 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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 + +/** @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; /*!
© COPYRIGHT 2014 STMicroelectronics
+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/system_stm32f0xx.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/system_stm32f0xx.c new file mode 100644 index 00000000..77ea0174 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/system_stm32f0xx.c @@ -0,0 +1,383 @@ +/** + ****************************************************************************** + * @file system_stm32f0xx.c + * @author MCD Application Team + * @version V1.0.0 + * @date 23-March-2012 + * @brief CMSIS Cortex-M0 Device Peripheral Access Layer System Source File. + * This file contains the system clock configuration for STM32F0xx devices, + * and is customized for use with STM32F0-DISCOVERY Kit. + * The STM32F0xx is configured to run at 48 MHz, following the three + * configuration below: + * - PLL_SOURCE_HSI (default): HSI (~8MHz) used to clock the PLL, and + * the PLL is used as system clock source. + * - PLL_SOURCE_HSE : HSE (8MHz) used to clock the PLL, and + * the PLL is used as system clock source. + * - PLL_SOURCE_HSE_BYPASS : HSE bypassed with an external clock + * (8MHz, coming from ST-Link) used to clock + * the PLL, and the PLL is used as system + * clock source. + * + * + * 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 selected (see above). + * 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. + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * 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 + * @{ + */ +/* Select the PLL clock source */ + +#define PLL_SOURCE_HSI // HSI (~8MHz) used to clock the PLL, and the PLL is used as system clock source +//#define PLL_SOURCE_HSE // HSE (8MHz) used to clock the PLL, and the PLL is used as system clock source +//#define PLL_SOURCE_HSE_BYPASS // HSE bypassed with an external clock (8MHz, coming from ST-Link) used to clock + // the PLL, and the PLL is used as system clock source + +/** + * @} + */ + +/** @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 + */ +__IO uint32_t StartUpCounter = 0, HSEStatus = 0; +static void SetSysClock(void) +{ + /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/ +#if defined (PLL_SOURCE_HSI) + /* At this stage the HSI is already enabled */ + + /* 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 = (HSI/2) * 12 = ~48 MHz */ + 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) + { + } +#else + #if defined (PLL_SOURCE_HSE) + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + #elif defined (PLL_SOURCE_HSE_BYPASS) + /* HSE oscillator bypassed with external clock */ + RCC->CR |= (uint32_t)(RCC_CR_HSEON | RCC_CR_HSEBYP); + #endif /* PLL_SOURCE_HSE */ + + /* 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 */ + } +#endif /* PLL_SOURCE_HSI */ +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/system_stm32f0xx.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/system_stm32f0xx.h new file mode 100644 index 00000000..09630700 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/lib/system_stm32f0xx.h @@ -0,0 +1,104 @@ +/** + ****************************************************************************** + * @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 + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * 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/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/main.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/main.c new file mode 100644 index 00000000..2bbcde5c --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/main.c @@ -0,0 +1,86 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Prog\main.c +* \brief Demo program application source file. +* \ingroup Prog_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static void Init(void); + + +/************************************************************************************//** +** \brief This is the entry point for the bootloader application and is called +** by the reset interrupt vector after the C-startup routines executed. +** \return none. +** +****************************************************************************************/ +int main(void) +{ + /* initialize the microcontroller */ + Init(); + /* initialize the bootloader interface */ + BootComInit(); + + /* start the infinite program loop */ + while (1) + { + /* toggle LED with a fixed frequency */ + LedToggle(); + /* check for bootloader activation request */ + BootComCheckActivationRequest(); + } + /* set program exit code. note that the program should never get here */ + return 0; +} /*** end of main ***/ + + +/************************************************************************************//** +** \brief Initializes the microcontroller. +** \return none. +** +****************************************************************************************/ +static void Init(void) +{ + /* init the led driver */ + LedInit(); + /* init the timer driver */ + TimerInit(); +} /*** end of Init ***/ + + +/*********************************** end of main.c *************************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/prog.dox b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/prog.dox new file mode 100644 index 00000000..d186bdad --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/prog.dox @@ -0,0 +1,7 @@ +/** +\defgroup Prog_ARMCM0_STM32_Discovery_STM32F051_GCC User Program +\brief User Program. +\ingroup ARMCM0_STM32_Discovery_STM32F051_GCC +*/ + + diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/startup_stm32f0xx.S b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/startup_stm32f0xx.S new file mode 100644 index 00000000..7a12a216 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/startup_stm32f0xx.S @@ -0,0 +1,250 @@ +/* File: startup_ARMCM0.S + * Purpose: startup file for Cortex-M0 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V1.3 + * Date: 08 Feb 2012 + * + * Copyright (c) 2012, 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 the 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 ARM LIMITED 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. + */ + .syntax unified + .arch armv6-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0xC00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .isr_vector + .align 2 + .globl __isr_vector +__isr_vector: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + // External Interrupts + .long WWDG_IRQHandler // Window Watchdog + .long PVD_IRQHandler // PVD through EXTI Line detect + .long RTC_IRQHandler // RTC through EXTI Line + .long FLASH_IRQHandler // FLASH + .long RCC_IRQHandler // RCC + .long EXTI0_1_IRQHandler // EXTI Line 0 and 1 + .long EXTI2_3_IRQHandler // EXTI Line 2 and 3 + .long EXTI4_15_IRQHandler // EXTI Line 4 to 15 + .long TS_IRQHandler // TS + .long DMA1_Channel1_IRQHandler // DMA1 Channel 1 + .long DMA1_Channel2_3_IRQHandler // DMA1 Channel 2 and Channel 3 + .long DMA1_Channel4_5_IRQHandler // DMA1 Channel 4 and Channel 5 + .long ADC1_COMP_IRQHandler // ADC1, COMP1 and COMP2 + .long TIM1_BRK_UP_TRG_COM_IRQHandler // TIM1 Break, Update, Trigger and Commutation + .long TIM1_CC_IRQHandler // TIM1 Capture Compare + .long TIM2_IRQHandler // TIM2 + .long TIM3_IRQHandler // TIM3 + .long TIM6_DAC_IRQHandler // TIM6 and DAC + .long TIM7_IRQHandler // Not all devices!! + .long TIM14_IRQHandler // TIM14 + .long TIM15_IRQHandler // TIM15 + .long TIM16_IRQHandler // TIM16 + .long TIM17_IRQHandler // TIM17 + .long I2C1_IRQHandler // I2C1 + .long I2C2_IRQHandler // I2C2 + .long SPI1_IRQHandler // SPI1 + .long SPI2_IRQHandler // SPI2 + .long USART1_IRQHandler // USART1 + .long USART2_IRQHandler // USART2 + .long USART3_4_IRQHandler // Not all devices!! + .long CEC_IRQHandler // CEC + .long USB_IRQHandler // Not all devices!! + .long 0x55AA11EE // Reserved for OpenBLT checksum + + .size __isr_vector, . - __isr_vector + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Initialize the stackpointer. this is done automatically after a reset event, but + * this program is started by the bootloader and not a reset event. */ + ldr r1, =__StackTop + +/* Loop to copy data from read only memory to RAM. The ranges + * of copy from/to are specified by following symbols evaluated in + * linker script. + * __etext: End of code section, i.e., begin of data sections to copy from. + * __data_start__/__data_end__: RAM address range that data should be + * copied to. Both must be aligned to 4 bytes boundary. */ + + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .flash_to_ram_loop_end + + movs r4, 0 +.flash_to_ram_loop: + ldr r0, [r1,r4] + str r0, [r2,r4] + adds r4, 4 + cmp r4, r3 + blt .flash_to_ram_loop +.flash_to_ram_loop_end: + +#ifndef __NO_SYSTEM_INIT + ldr r0, =SystemInit + blx r0 +#endif + + ldr r0, =_start + bx r0 + .pool + .size Reset_Handler, . - Reset_Handler + +/* Our weak _start alternative if we don't use the library _start + * The zero init section must be cleared, otherwise the librtary is + * doing that */ + .align 1 + .thumb_func + .weak _start + .type _start, %function +_start: + + /* Zero fill the bss segment. */ + ldr r1, = __bss_start__ + ldr r2, = __bss_end__ + movs r3, #0 + b .fill_zero_bss +.loop_zero_bss: + str r3, [r1] + adds r1, 4 + +.fill_zero_bss: + cmp r1, r2 + bcc .loop_zero_bss + + /* Jump to our main */ + bl main + b . + .size _start, . - _start + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .align 1 + .thumb_func + .weak \handler_name + .type \handler_name, %function +\handler_name : + b . + .size \handler_name, . - \handler_name + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + def_irq_handler Default_Handler + + // External Interrupts + def_irq_handler WWDG_IRQHandler // Window Watchdog + def_irq_handler PVD_IRQHandler // PVD through EXTI Line detect + def_irq_handler RTC_IRQHandler // RTC through EXTI Line + def_irq_handler FLASH_IRQHandler // FLASH + def_irq_handler RCC_IRQHandler // RCC + def_irq_handler EXTI0_1_IRQHandler // EXTI Line 0 and 1 + def_irq_handler EXTI2_3_IRQHandler // EXTI Line 2 and 3 + def_irq_handler EXTI4_15_IRQHandler // EXTI Line 4 to 15 + def_irq_handler TS_IRQHandler // TS + def_irq_handler DMA1_Channel1_IRQHandler // DMA1 Channel 1 + def_irq_handler DMA1_Channel2_3_IRQHandler // DMA1 Channel 2 and Channel 3 + def_irq_handler DMA1_Channel4_5_IRQHandler // DMA1 Channel 4 and Channel 5 + def_irq_handler ADC1_COMP_IRQHandler // ADC1, COMP1 and COMP2 + def_irq_handler TIM1_BRK_UP_TRG_COM_IRQHandler // TIM1 Break, Update, Trigger and Commutation + def_irq_handler TIM1_CC_IRQHandler // TIM1 Capture Compare + def_irq_handler TIM2_IRQHandler // TIM2 + def_irq_handler TIM3_IRQHandler // TIM3 + def_irq_handler TIM6_DAC_IRQHandler // TIM6 and DAC + def_irq_handler TIM7_IRQHandler // Not all devices!! + def_irq_handler TIM14_IRQHandler // TIM14 + def_irq_handler TIM15_IRQHandler // TIM15 + def_irq_handler TIM16_IRQHandler // TIM16 + def_irq_handler TIM17_IRQHandler // TIM17 + def_irq_handler I2C1_IRQHandler // I2C1 + def_irq_handler I2C2_IRQHandler // I2C2 + def_irq_handler SPI1_IRQHandler // SPI1 + def_irq_handler SPI2_IRQHandler // SPI2 + def_irq_handler USART1_IRQHandler // USART1 + def_irq_handler USART2_IRQHandler // USART2 + def_irq_handler USART3_4_IRQHandler // Not all devices!! + def_irq_handler CEC_IRQHandler // CEC + def_irq_handler USB_IRQHandler // Not all devices!! + + .end diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/stm32f051r8_flash.ld b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/stm32f051r8_flash.ld new file mode 100644 index 00000000..6e71a1fc --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/stm32f051r8_flash.ld @@ -0,0 +1,186 @@ +/* ---------------------------------------------------------------------------- */ +/* Em::Blocks embedded development Support */ +/* ---------------------------------------------------------------------------- */ +/* Copyright (c) 2014, EmBlocks */ +/* */ +/* All rights reserved. */ +/* */ +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following condition is met: */ +/* */ +/* - Redistributions of source code must retain the above copyright notice, */ +/* this list of conditions and the disclaimer below. */ +/* */ +/* EmBlocks's name may not be used to endorse or promote products derived from */ +/* this software without specific prior written permission. */ +/* */ +/* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY EBLOCKS "AS IS" AND ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE */ +/* DISCLAIMED. IN NO EVENT SHALL EMBLOCKS 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. */ +/* ---------------------------------------------------------------------------- */ + +/*------------------------------------------------------------------------------ + * Linker script for running in internal FLASH on the STM32F051R8 + *----------------------------------------------------------------------------*/ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +SEARCH_DIR(.) + +/* Memory Spaces Definitions */ +MEMORY +{ + /* The first part in flash is reserved for OpenBLT */ + ROM (rx) : ORIGIN = 0x08002000, LENGTH = 64K - 8K + /* The first 192 bytes in RAM are reserved for OpenBLT. Right before + * starting this program, OpenBLT copies our interrupt vector table + * to the start of RAM and remap the RAM to also appear at address + * 0x00000000. + */ + RAM (rwx) : ORIGIN = 0x200000C0, LENGTH = 8K - 192 +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ + + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > ROM + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > ROM + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > ROM + __exidx_end = .; + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss (NOLOAD): + { + __bss_start__ = .; + *(.bss*) + *(COMMON) + __bss_end__ = .; + } > RAM + + .heap (NOLOAD): + { + __end__ = .; + end = __end__; + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (NOLOAD): + { + *(.stack) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/timer.c b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/timer.c new file mode 100644 index 00000000..479e9018 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/timer.c @@ -0,0 +1,111 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Prog\timer.c +* \brief Timer driver source file. +* \ingroup Prog_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Local variable for storing the number of milliseconds that have elapsed since + * startup. + */ +static unsigned long millisecond_counter; + + +/************************************************************************************//** +** \brief Initializes the timer. +** \return none. +** +****************************************************************************************/ +void TimerInit(void) +{ + /* configure the SysTick timer for 1 ms period */ + SysTick_Config(SystemCoreClock / 1000); + /* reset the millisecond counter */ + TimerSet(0); +} /*** end of TimerInit ***/ + + +/************************************************************************************//** +** \brief Stops and disables the timer. +** \return none. +** +****************************************************************************************/ +void TimerDeinit(void) +{ + SysTick->CTRL = 0; +} /*** end of TimerDeinit ***/ + + +/************************************************************************************//** +** \brief Sets the initial counter value of the millisecond timer. +** \param timer_value initialize value of the millisecond timer. +** \return none. +** +****************************************************************************************/ +void TimerSet(unsigned long timer_value) +{ + /* set the millisecond counter */ + millisecond_counter = timer_value; +} /*** end of TimerSet ***/ + + +/************************************************************************************//** +** \brief Obtains the counter value of the millisecond timer. +** \return Current value of the millisecond timer. +** +****************************************************************************************/ +unsigned long TimerGet(void) +{ + /* read and return the millisecond counter value */ + return millisecond_counter; +} /*** end of TimerGet ***/ + + +/************************************************************************************//** +** \brief Interrupt service routine of the timer. +** \return none. +** +****************************************************************************************/ +void SysTick_Handler(void) +{ + /* increment the millisecond counter */ + millisecond_counter++; +} /*** end of SysTick_Handler ***/ + + +/*********************************** end of timer.c ************************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/timer.h b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/timer.h new file mode 100644 index 00000000..97babeb1 --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/Prog/timer.h @@ -0,0 +1,45 @@ +/************************************************************************************//** +* \file Demo\ARMCM0_STM32_Discovery_STM32F051_GCC\Prog\timer.h +* \brief Timer driver header file. +* \ingroup Prog_ARMCM0_STM32_Discovery_STM32F051_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ +#ifndef TIMER_H +#define TIMER_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void TimerInit(void); +void TimerDeinit(void); +void TimerSet(unsigned long timer_value); +unsigned long TimerGet(void); + +#endif /* TIMER_H */ +/*********************************** end of timer.h ************************************/ diff --git a/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/demo.dox b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/demo.dox new file mode 100644 index 00000000..21f1630e --- /dev/null +++ b/Target/Demo/ARMCM0_STM32_Discovery_STM32F051_GCC/demo.dox @@ -0,0 +1,8 @@ +/** +\defgroup ARMCM0_STM32_Discovery_STM32F051_GCC Demo for STM32F0-Discovery/GCC +\brief Preconfigured programs for the STM32F0-Discovery board and the GCC compiler. +\details Refer to http://feaser.com/openblt/doku.php?id=manual:demos + for detailed getting started instructions. +*/ + + diff --git a/Target/Source/ARMCM0_STM32/GCC/cstart.S b/Target/Source/ARMCM0_STM32/GCC/cstart.S new file mode 100644 index 00000000..8651b7c0 --- /dev/null +++ b/Target/Source/ARMCM0_STM32/GCC/cstart.S @@ -0,0 +1,252 @@ +/* File: cstart.s + * Purpose: startup file for Cortex-M0 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V1.3 + * Date: 08 Feb 2012 + * + * Copyright (c) 2012, 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 the 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 ARM LIMITED 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. + */ + .syntax unified + .arch armv6-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0xC00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .isr_vector + .align 2 + .globl __isr_vector +__isr_vector: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + // External Interrupts + .long WWDG_IRQHandler // Window Watchdog + .long PVD_IRQHandler // PVD through EXTI Line detect + .long RTC_IRQHandler // RTC through EXTI Line + .long FLASH_IRQHandler // FLASH + .long RCC_IRQHandler // RCC + .long EXTI0_1_IRQHandler // EXTI Line 0 and 1 + .long EXTI2_3_IRQHandler // EXTI Line 2 and 3 + .long EXTI4_15_IRQHandler // EXTI Line 4 to 15 + .long TS_IRQHandler // TS + .long DMA1_Channel1_IRQHandler // DMA1 Channel 1 + .long DMA1_Channel2_3_IRQHandler // DMA1 Channel 2 and Channel 3 + .long DMA1_Channel4_5_IRQHandler // DMA1 Channel 4 and Channel 5 + .long ADC1_COMP_IRQHandler // ADC1, COMP1 and COMP2 + .long TIM1_BRK_UP_TRG_COM_IRQHandler // TIM1 Break, Update, Trigger and Commutation + .long TIM1_CC_IRQHandler // TIM1 Capture Compare + .long TIM2_IRQHandler // TIM2 + .long TIM3_IRQHandler // TIM3 + .long TIM6_DAC_IRQHandler // TIM6 and DAC + .long TIM7_IRQHandler // Not all devices!! + .long TIM14_IRQHandler // TIM14 + .long TIM15_IRQHandler // TIM15 + .long TIM16_IRQHandler // TIM16 + .long TIM17_IRQHandler // TIM17 + .long I2C1_IRQHandler // I2C1 + .long I2C2_IRQHandler // I2C2 + .long SPI1_IRQHandler // SPI1 + .long SPI2_IRQHandler // SPI2 + .long USART1_IRQHandler // USART1 + .long USART2_IRQHandler // USART2 + .long USART3_4_IRQHandler // Not all devices!! + .long CEC_IRQHandler // CEC + .long USB_IRQHandler // Not all devices!! + + .size __isr_vector, . - __isr_vector + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Disable interrupts first */ + cpsid i + +/* Initialize the stackpointer. this is done automatically after a reset event. + * the bootloader performs a software reset by calling this reset handler, in + * which case the stackpointer is not yet initialized. */ + ldr r1, =__StackTop + +/* Loop to copy data from read only memory to RAM. The ranges + * of copy from/to are specified by following symbols evaluated in + * linker script. + * __etext: End of code section, i.e., begin of data sections to copy from. + * __data_start__/__data_end__: RAM address range that data should be + * copied to. Both must be aligned to 4 bytes boundary. */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .flash_to_ram_loop_end + + movs r4, 0 +.flash_to_ram_loop: + ldr r0, [r1,r4] + str r0, [r2,r4] + adds r4, 4 + cmp r4, r3 + blt .flash_to_ram_loop +.flash_to_ram_loop_end: + +#ifndef __NO_SYSTEM_INIT + ldr r0, =SystemInit + blx r0 +#endif + + ldr r0, =_start + bx r0 + .pool + .size Reset_Handler, . - Reset_Handler + +/* Our weak _start alternative if we don't use the library _start + * The zero init section must be cleared, otherwise the librtary is + * doing that */ + .align 1 + .thumb_func + .weak _start + .type _start, %function +_start: + + /* Zero fill the bss segment. */ + ldr r1, = __bss_start__ + ldr r2, = __bss_end__ + movs r3, #0 + b .fill_zero_bss +.loop_zero_bss: + str r3, [r1] + adds r1, 4 + +.fill_zero_bss: + cmp r1, r2 + bcc .loop_zero_bss + + /* Jump to our main */ + bl main + b . + .size _start, . - _start + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .align 1 + .thumb_func + .weak \handler_name + .type \handler_name, %function +\handler_name : + b . + .size \handler_name, . - \handler_name + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + def_irq_handler Default_Handler + + // External Interrupts + def_irq_handler WWDG_IRQHandler // Window Watchdog + def_irq_handler PVD_IRQHandler // PVD through EXTI Line detect + def_irq_handler RTC_IRQHandler // RTC through EXTI Line + def_irq_handler FLASH_IRQHandler // FLASH + def_irq_handler RCC_IRQHandler // RCC + def_irq_handler EXTI0_1_IRQHandler // EXTI Line 0 and 1 + def_irq_handler EXTI2_3_IRQHandler // EXTI Line 2 and 3 + def_irq_handler EXTI4_15_IRQHandler // EXTI Line 4 to 15 + def_irq_handler TS_IRQHandler // TS + def_irq_handler DMA1_Channel1_IRQHandler // DMA1 Channel 1 + def_irq_handler DMA1_Channel2_3_IRQHandler // DMA1 Channel 2 and Channel 3 + def_irq_handler DMA1_Channel4_5_IRQHandler // DMA1 Channel 4 and Channel 5 + def_irq_handler ADC1_COMP_IRQHandler // ADC1, COMP1 and COMP2 + def_irq_handler TIM1_BRK_UP_TRG_COM_IRQHandler // TIM1 Break, Update, Trigger and Commutation + def_irq_handler TIM1_CC_IRQHandler // TIM1 Capture Compare + def_irq_handler TIM2_IRQHandler // TIM2 + def_irq_handler TIM3_IRQHandler // TIM3 + def_irq_handler TIM6_DAC_IRQHandler // TIM6 and DAC + def_irq_handler TIM7_IRQHandler // Not all devices!! + def_irq_handler TIM14_IRQHandler // TIM14 + def_irq_handler TIM15_IRQHandler // TIM15 + def_irq_handler TIM16_IRQHandler // TIM16 + def_irq_handler TIM17_IRQHandler // TIM17 + def_irq_handler I2C1_IRQHandler // I2C1 + def_irq_handler I2C2_IRQHandler // I2C2 + def_irq_handler SPI1_IRQHandler // SPI1 + def_irq_handler SPI2_IRQHandler // SPI2 + def_irq_handler USART1_IRQHandler // USART1 + def_irq_handler USART2_IRQHandler // USART2 + def_irq_handler USART3_4_IRQHandler // Not all devices!! + def_irq_handler CEC_IRQHandler // CEC + def_irq_handler USB_IRQHandler // Not all devices!! + + .end diff --git a/Target/Source/ARMCM0_STM32/GCC/memory.x b/Target/Source/ARMCM0_STM32/GCC/memory.x new file mode 100644 index 00000000..1fbf0085 --- /dev/null +++ b/Target/Source/ARMCM0_STM32/GCC/memory.x @@ -0,0 +1,155 @@ +/*------------------------------------------------------------------------------ + * Linker script for running OpenBLT in internal FLASH on the STM32F0xx + *----------------------------------------------------------------------------*/ +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +SEARCH_DIR(.) + +/* Memory Spaces Definitions */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 8K + /* do not use the first 192 bytes because this is where + * the bootloader copies the user program vector table + * right before it starts the user program. + */ + RAM (rwx) : ORIGIN = 0x200000C0, LENGTH = 4K - 192 +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ + + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > ROM + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > ROM + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > ROM + __exidx_end = .; + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss (NOLOAD): + { + __bss_start__ = .; + *(.bss*) + *(COMMON) + __bss_end__ = .; + } > RAM + + .heap (NOLOAD): + { + __end__ = .; + end = __end__; + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (NOLOAD): + { + *(.stack) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/Target/Source/ARMCM0_STM32/cpu.c b/Target/Source/ARMCM0_STM32/cpu.c new file mode 100644 index 00000000..e4f569d8 --- /dev/null +++ b/Target/Source/ARMCM0_STM32/cpu.c @@ -0,0 +1,165 @@ +/************************************************************************************//** +* \file Source\ARMCM0_STM32\cpu.c +* \brief Bootloader cpu module source file. +* \ingroup Target_ARMCM0_STM32 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "stm32f0xx.h" /* for STM32F0 registers and drivers */ + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Pointer to the user program's reset vector. */ +#define CPU_USER_PROGRAM_STARTADDR_PTR ((blt_addr)(NvmGetUserProgBaseAddress() + 0x00000004)) +/** \brief Pointer to the user program's vector table. */ +#define CPU_USER_PROGRAM_VECTABLE_OFFSET ((blt_int32u)NvmGetUserProgBaseAddress()) +/** \brief Size in bytes of the user program's vector table */ +#define CPU_USER_PROGRAM_VECTABLE_SIZE (0xC0u) +/** \brief Start address of the user program's RAM where its vector table will be copied + * to. + */ +#define CPU_USER_PROGRAM_RAM_BASEADDR ((blt_addr)(0x20000000)) + + +/**************************************************************************************** +* Hook functions +****************************************************************************************/ +#if (BOOT_CPU_USER_PROGRAM_START_HOOK > 0) +extern blt_bool CpuUserProgramStartHook(void); +#endif + + +/**************************************************************************************** +* External functions +****************************************************************************************/ +extern void Reset_Handler(void); /* implemented in C-startup */ + + +/************************************************************************************//** +** \brief Starts the user program, if one is present. In this case this function +** does not return. +** \return none. +** +****************************************************************************************/ +void CpuStartUserProgram(void) +{ + void (*pProgResetHandler)(void); + + /* check if a user program is present by verifying the checksum */ + if (NvmVerifyChecksum() == BLT_FALSE) + { + /* not a valid user program so it cannot be started */ + return; + } +#if (BOOT_CPU_USER_PROGRAM_START_HOOK > 0) + /* invoke callback */ + if (CpuUserProgramStartHook() == BLT_FALSE) + { + /* callback requests the user program to not be started */ + return; + } +#endif +#if (BOOT_COM_ENABLE > 0) + /* release the communication interface */ + ComFree(); +#endif + /* reset the timer */ + TimerReset(); + + /* enable system configuration peripheral, which is needed to remap the RAM later on */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + /* copy user program vector's to RAM */ + CpuMemCopy(CPU_USER_PROGRAM_RAM_BASEADDR, CPU_USER_PROGRAM_VECTABLE_OFFSET, + CPU_USER_PROGRAM_VECTABLE_SIZE); + /* remap RAM so that it also appears at address 0x00000000. this way the user program's + * vector table in RAM is used instead of the bootloader's vector table in flash. + */ + SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM); + /* set the address where the bootloader needs to jump to. this is the address of + * the 2nd entry in the user program's vector table. this address points to the + * user program's reset handler. + */ + pProgResetHandler = (void(*)(void))(*((blt_addr *)CPU_USER_PROGRAM_STARTADDR_PTR)); + /* The Cortex-M0 core has interrupts enabled out of reset. the bootloader + * explicitly disables these for security reasons in the C-startup. + * Enable them here again, so it does not have to be done by the user + * program. + */ + __enable_irq(); + /* start the user program by activating its reset interrupt service routine */ + pProgResetHandler(); +} /*** end of CpuStartUserProgram ***/ + + +/************************************************************************************//** +** \brief Copies data from the source to the destination address. +** \param dest Destination address for the data. +** \param src Source address of the data. +** \param len length of the data in bytes. +** \return none. +** +****************************************************************************************/ +void CpuMemCopy(blt_addr dest, blt_addr src, blt_int16u len) +{ + blt_int8u *from, *to; + + /* set casted pointers */ + from = (blt_int8u *)src; + to = (blt_int8u *)dest; + + /* copy all bytes from source address to destination address */ + while (len-- > 0) + { + /* store byte value from source to destination */ + *to++ = *from++; + /* keep the watchdog happy */ + CopService(); + } +} /*** end of CpuMemCopy ***/ + + +/************************************************************************************//** +** \brief Perform a soft reset of the microcontroller by starting from the reset ISR. +** \return none. +** +****************************************************************************************/ +void CpuReset(void) +{ + /* perform a software reset by calling the reset ISR routine */ + Reset_Handler(); +} /*** end of CpuReset ***/ + + +/*********************************** end of cpu.c **************************************/ diff --git a/Target/Source/ARMCM0_STM32/flash.c b/Target/Source/ARMCM0_STM32/flash.c new file mode 100644 index 00000000..320f9875 --- /dev/null +++ b/Target/Source/ARMCM0_STM32/flash.c @@ -0,0 +1,757 @@ +/************************************************************************************//** +* \file Source\ARMCM0_STM32\flash.c +* \brief Bootloader flash driver source file. +* \ingroup Target_ARMCM0_STM32 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "stm32f0xx.h" /* for STM32F0 registers and drivers */ + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Value for an invalid flash sector. */ +#define FLASH_INVALID_SECTOR (0xff) +/** \brief Value for an invalid flash address. */ +#define FLASH_INVALID_ADDRESS (0xffffffff) +/** \brief Standard size of a flash block for writing. */ +#define FLASH_WRITE_BLOCK_SIZE (512) +/** \brief Total numbers of sectors in array flashLayout[]. */ +#define FLASH_TOTAL_SECTORS (sizeof(flashLayout)/sizeof(flashLayout[0])) +#if (BOOT_NVM_SIZE_KB > 64) +/** \brief Number of bytes to erase per erase operation. */ +#define FLASH_ERASE_BLOCK_SIZE (0x800) +#else +/** \brief Number of bytes to erase per erase operation. */ +#define FLASH_ERASE_BLOCK_SIZE (0x400) +#endif +/** \brief Offset into the user program's vector table where the checksum is located. */ +#define FLASH_VECTOR_TABLE_CS_OFFSET (0xC0) + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +/** \brief Flash sector descriptor type. */ +typedef struct +{ + blt_addr sector_start; /**< sector start address */ + blt_int32u sector_size; /**< sector size in bytes */ + blt_int8u sector_num; /**< sector number */ +} tFlashSector; + +/** \brief Structure type for grouping flash block information. + * \details Programming is done per block of max FLASH_WRITE_BLOCK_SIZE. for this a + * flash block manager is implemented in this driver. this flash block manager + * depends on this flash block info structure. It holds the base address of + * the flash block and the data that should be programmed into the flash + * block. The .base_addr must be a multiple of FLASH_WRITE_BLOCK_SIZE. + */ +typedef struct +{ + blt_addr base_addr; + blt_int8u data[FLASH_WRITE_BLOCK_SIZE]; +} tFlashBlockInfo; + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static blt_bool FlashInitBlock(tFlashBlockInfo *block, blt_addr address); +static tFlashBlockInfo *FlashSwitchBlock(tFlashBlockInfo *block, blt_addr base_addr); +static blt_bool FlashAddToBlock(tFlashBlockInfo *block, blt_addr address, + blt_int8u *data, blt_int32u len); +static blt_bool FlashWriteBlock(tFlashBlockInfo *block); +static blt_bool FlashEraseSectors(blt_int8u first_sector, blt_int8u last_sector); +static blt_int8u FlashGetSector(blt_addr address); +static blt_addr FlashGetSectorBaseAddr(blt_int8u sector); +static blt_addr FlashGetSectorSize(blt_int8u sector); + + +/**************************************************************************************** +* Local constant declarations +****************************************************************************************/ +/** \brief Array with the layout of the flash memory. + * \details Also controls what part of the flash memory is reserved for the bootloader. + * If the bootloader size changes, the reserved sectors for the bootloader + * might need adjustment to make sure the bootloader doesn't get overwritten. + * The current flash layout does not reflect the minimum sector size of the + * physical flash (1 - 2kb), because this would make the table quit long and + * a waste of ROM. The minimum sector size is only really needed when erasing + * the flash. This can still be done in combination with macro + * FLASH_ERASE_BLOCK_SIZE. + * Note that the term sector here is used in a different meaning than in the + * controller's reference manual. + * + */ +static const tFlashSector flashLayout[] = +{ + /* space is reserved for the bootloader configuration of the demo programs. it might + * grow/shrink depending when the bootloader is reconfigured and or customized. make + * sure to update the reserved space for the bootloader here in that case, as well as + * the start address of the user program in its linker command script. + */ + /* { 0x08000000, 0x00800, 0}, flash sector 0 - reserved for bootloader */ + /* { 0x08000800, 0x00800, 1}, flash sector 1 - reserved for bootloader */ + /* { 0x08001000, 0x00800, 2}, flash sector 2 - reserved for bootloader */ + /* { 0x08001800, 0x00800, 3}, flash sector 3 - reserved for bootloader */ + { 0x08002000, 0x00800, 4}, /* flash sector 4 - 2kb */ + { 0x08002800, 0x00800, 5}, /* flash sector 5 - 2kb */ + { 0x08003000, 0x00800, 6}, /* flash sector 6 - 2kb */ + { 0x08003800, 0x00800, 7}, /* flash sector 7 - 2kb */ +#if (BOOT_NVM_SIZE_KB > 16) + { 0x08004000, 0x00800, 8}, /* flash sector 8 - 2kb */ + { 0x08004800, 0x00800, 9}, /* flash sector 9 - 2kb */ + { 0x08005000, 0x00800, 10}, /* flash sector 10 - 2kb */ + { 0x08005800, 0x00800, 11}, /* flash sector 11 - 2kb */ + { 0x08006000, 0x00800, 12}, /* flash sector 12 - 2kb */ + { 0x08006800, 0x00800, 13}, /* flash sector 13 - 2kb */ + { 0x08007000, 0x00800, 14}, /* flash sector 14 - 2kb */ + { 0x08007800, 0x00800, 15}, /* flash sector 15 - 2kb */ +#endif +#if (BOOT_NVM_SIZE_KB > 32) + { 0x08008000, 0x08000, 16}, /* flash sector 16 - 32kb */ +#endif +#if (BOOT_NVM_SIZE_KB > 64) + { 0x08010000, 0x08000, 17}, /* flash sector 17 - 32kb */ + { 0x08018000, 0x08000, 18}, /* flash sector 18 - 32kb */ +#endif +#if (BOOT_NVM_SIZE_KB > 128) + { 0x08020000, 0x08000, 19}, /* flash sector 19 - 32kb */ + { 0x08028000, 0x08000, 20}, /* flash sector 20 - 32kb */ + { 0x08030000, 0x08000, 21}, /* flash sector 21 - 32kb */ + { 0x08038000, 0x08000, 22}, /* flash sector 22 - 32kb */ +#endif +#if (BOOT_NVM_SIZE_KB > 256) +#error "BOOT_NVM_SIZE_KB > 256 is currently not supported." +#endif +}; + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Local variable with information about the flash block that is currently + * being operated on. + * \details The smallest amount of flash that can be programmed is + * FLASH_WRITE_BLOCK_SIZE. A flash block manager is implemented in this driver + * and stores info in this variable. Whenever new data should be flashed, it + * is first added to a RAM buffer, which is part of this variable. Whenever + * the RAM buffer, which has the size of a flash block, is full or data needs + * to be written to a different block, the contents of the RAM buffer are + * programmed to flash. The flash block manager requires some software + * overhead, yet results is faster flash programming because data is first + * harvested, ideally until there is enough to program an entire flash block, + * before the flash device is actually operated on. + */ +static tFlashBlockInfo blockInfo; + +/** \brief Local variable with information about the flash boot block. + * \details The first block of the user program holds the vector table, which on the + * STM32 is also the where the checksum is written to. Is it likely that + * the vector table is first flashed and then, at the end of the programming + * sequence, the checksum. This means that this flash block need to be written + * to twice. Normally this is not a problem with flash memory, as long as you + * write the same values to those bytes that are not supposed to be changed + * and the locations where you do write to are still in the erased 0xFF state. + * Unfortunately, writing twice to flash this way, does not work reliably on + * all micros. This is why we need to have an extra block, the bootblock, + * placed under the management of the block manager. This way is it possible + * to implement functionality so that the bootblock is only written to once + * at the end of the programming sequence. + */ +static tFlashBlockInfo bootBlockInfo; + + +/************************************************************************************//** +** \brief Initializes the flash driver. +** \return none. +** +****************************************************************************************/ +void FlashInit(void) +{ + /* init the flash block info structs by setting the address to an invalid address */ + blockInfo.base_addr = FLASH_INVALID_ADDRESS; + bootBlockInfo.base_addr = FLASH_INVALID_ADDRESS; +} /*** end of FlashInit ***/ + + +/************************************************************************************//** +** \brief Writes the data to flash through a flash block manager. Note that this +** function also checks that no data is programmed outside the flash +** memory region, so the bootloader can never be overwritten. +** \param addr Start address. +** \param len Length in bytes. +** \param data Pointer to the data buffer. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool FlashWrite(blt_addr addr, blt_int32u len, blt_int8u *data) +{ + blt_addr base_addr; + + /* make sure the addresses are within the flash device */ + if ((FlashGetSector(addr) == FLASH_INVALID_SECTOR) || \ + (FlashGetSector(addr+len-1) == FLASH_INVALID_SECTOR)) + { + return BLT_FALSE; + } + + /* if this is the bootblock, then let the boot block manager handle it */ + base_addr = (addr/FLASH_WRITE_BLOCK_SIZE)*FLASH_WRITE_BLOCK_SIZE; + if (base_addr == flashLayout[0].sector_start) + { + /* let the boot block manager handle it */ + return FlashAddToBlock(&bootBlockInfo, addr, data, len); + } + /* let the block manager handle it */ + return FlashAddToBlock(&blockInfo, addr, data, len); +} /*** end of FlashWrite ***/ + + +/************************************************************************************//** +** \brief Erases the flash memory. Note that this function also checks that no +** data is erased outside the flash memory region, so the bootloader can +** never be erased. +** \param addr Start address. +** \param len Length in bytes. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool FlashErase(blt_addr addr, blt_int32u len) +{ + blt_int8u first_sector; + blt_int8u last_sector; + + /* obtain the first and last sector number */ + first_sector = FlashGetSector(addr); + last_sector = FlashGetSector(addr+len-1); + /* check them */ + if ((first_sector == FLASH_INVALID_SECTOR) || (last_sector == FLASH_INVALID_SECTOR)) + { + return BLT_FALSE; + } + /* erase the sectors */ + return FlashEraseSectors(first_sector, last_sector); +} /*** end of FlashErase ***/ + + +/************************************************************************************//** +** \brief Writes a checksum of the user program to non-volatile memory. This is +** performed once the entire user program has been programmed. Through +** the checksum, the bootloader can check if the programming session +** was completed, which indicates that a valid user programming is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool FlashWriteChecksum(void) +{ + blt_int32u signature_checksum = 0; + + /* for the STM32 target we defined the checksum as the Two's complement value of the + * sum of the first 7 exception addresses. + * + * Layout of the vector table: + * 0x08000000 Initial stack pointer + * 0x08000004 Reset Handler + * 0x08000008 NMI Handler + * 0x0800000C Hard Fault Handler + * 0x08000010 Reserved + * 0x08000014 Reserved + * 0x08000018 Reserved + * + * signature_checksum = Two's complement of (SUM(exception address values)) + * + * the bootloader writes this 32-bit checksum value right after the vector table + * of the user program. note that this means one extra dummy entry must be added + * at the end of the user program's vector table to reserve storage space for the + * checksum. + */ + + /* first check that the bootblock contains valid data. if not, this means the + * bootblock is not part of the reprogramming this time and therefore no + * new checksum needs to be written + */ + if (bootBlockInfo.base_addr == FLASH_INVALID_ADDRESS) + { + return BLT_TRUE; + } + + /* compute the checksum. note that the user program's vectors are not yet written + * to flash but are present in the bootblock data structure at this point. + */ + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x00])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x04])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x08])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x0C])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x10])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x14])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x18])); + signature_checksum = ~signature_checksum; /* one's complement */ + signature_checksum += 1; /* two's complement */ + + /* write the checksum */ + return FlashWrite(flashLayout[0].sector_start+FLASH_VECTOR_TABLE_CS_OFFSET, + sizeof(blt_addr), (blt_int8u *)&signature_checksum); +} /*** end of FlashWriteChecksum ***/ + + +/************************************************************************************//** +** \brief Verifies the checksum, which indicates that a valid user program is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool FlashVerifyChecksum(void) +{ + blt_int32u signature_checksum = 0; + + /* verify the checksum based on how it was written by CpuWriteChecksum() */ + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x04)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x08)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x0C)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x10)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x14)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x18)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+FLASH_VECTOR_TABLE_CS_OFFSET)); + /* sum should add up to an unsigned 32-bit value of 0 */ + if (signature_checksum == 0) + { + /* checksum okay */ + return BLT_TRUE; + } + /* checksum incorrect */ + return BLT_FALSE; +} /*** end of FlashVerifyChecksum ***/ + + +/************************************************************************************//** +** \brief Finalizes the flash driver operations. There could still be data in +** the currently active block that needs to be flashed. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool FlashDone(void) +{ + /* check if there is still data waiting to be programmed in the boot block */ + if (bootBlockInfo.base_addr != FLASH_INVALID_ADDRESS) + { + if (FlashWriteBlock(&bootBlockInfo) == BLT_FALSE) + { + return BLT_FALSE; + } + } + + /* check if there is still data waiting to be programmed */ + if (blockInfo.base_addr != FLASH_INVALID_ADDRESS) + { + if (FlashWriteBlock(&blockInfo) == BLT_FALSE) + { + return BLT_FALSE; + } + } + /* still here so all is okay */ + return BLT_TRUE; +} /*** end of FlashDone ***/ + + +/************************************************************************************//** +** \brief Obtains the base address of the flash memory available to the user program. +** This is basically the first address in the flashLayout table. +** \return Base address. +** +****************************************************************************************/ +blt_addr FlashGetUserProgBaseAddress(void) +{ + return flashLayout[0].sector_start; +} /*** end of FlashGetUserProgBaseAddress ***/ + + +/************************************************************************************//** +** \brief Copies data currently in flash to the block->data and sets the +** base address. +** \param block Pointer to flash block info structure to operate on. +** \param address Base address of the block data. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool FlashInitBlock(tFlashBlockInfo *block, blt_addr address) +{ + /* check address alignment */ + if ((address % FLASH_WRITE_BLOCK_SIZE) != 0) + { + return BLT_FALSE; + } + /* make sure that we are initializing a new block and not the same one */ + if (block->base_addr == address) + { + /* block already initialized, so nothing to do */ + return BLT_TRUE; + } + /* set the base address and copies the current data from flash */ + block->base_addr = address; + CpuMemCopy((blt_addr)block->data, address, FLASH_WRITE_BLOCK_SIZE); + return BLT_TRUE; +} /*** end of FlashInitBlock ***/ + + +/************************************************************************************//** +** \brief Switches blocks by programming the current one and initializing the +** next. +** \param block Pointer to flash block info structure to operate on. +** \param base_addr Base address of the next block. +** \return The pointer of the block info struct that is no being used, or a NULL +** pointer in case of error. +** +****************************************************************************************/ +static tFlashBlockInfo *FlashSwitchBlock(tFlashBlockInfo *block, blt_addr base_addr) +{ + /* check if a switch needs to be made away from the boot block. in this case the boot + * block shouldn't be written yet, because this is done at the end of the programming + * session by FlashDone(), this is right after the checksum was written. + */ + if (block == &bootBlockInfo) + { + /* switch from the boot block to the generic block info structure */ + block = &blockInfo; + } + /* check if a switch back into the bootblock is needed. in this case the generic block + * doesn't need to be written here yet. + */ + else if (base_addr == flashLayout[0].sector_start) + { + /* switch from the generic block to the boot block info structure */ + block = &bootBlockInfo; + base_addr = flashLayout[0].sector_start; + } + else + { + /* need to switch to a new block, so program the current one and init the next */ + if (FlashWriteBlock(block) == BLT_FALSE) + { + return BLT_NULL; + } + } + + /* initialize tne new block when necessary */ + if (FlashInitBlock(block, base_addr) == BLT_FALSE) + { + return BLT_NULL; + } + + /* still here to all is okay */ + return block; +} /*** end of FlashSwitchBlock ***/ + + +/************************************************************************************//** +** \brief Programming is done per block. This function adds data to the block +** that is currently collecting data to be written to flash. If the +** address is outside of the current block, the current block is written +** to flash an a new block is initialized. +** \param block Pointer to flash block info structure to operate on. +** \param address Flash destination address. +** \param data Pointer to the byte array with data. +** \param len Number of bytes to add to the block. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool FlashAddToBlock(tFlashBlockInfo *block, blt_addr address, + blt_int8u *data, blt_int32u len) +{ + blt_addr current_base_addr; + blt_int8u *dst; + blt_int8u *src; + + /* determine the current base address */ + current_base_addr = (address/FLASH_WRITE_BLOCK_SIZE)*FLASH_WRITE_BLOCK_SIZE; + + /* make sure the blockInfo is not uninitialized */ + if (block->base_addr == FLASH_INVALID_ADDRESS) + { + /* initialize the blockInfo struct for the current block */ + if (FlashInitBlock(block, current_base_addr) == BLT_FALSE) + { + return BLT_FALSE; + } + } + + /* check if the new data fits in the current block */ + if (block->base_addr != current_base_addr) + { + /* need to switch to a new block, so program the current one and init the next */ + block = FlashSwitchBlock(block, current_base_addr); + if (block == BLT_NULL) + { + return BLT_FALSE; + } + } + + /* add the data to the current block, but check for block overflow */ + dst = &(block->data[address - block->base_addr]); + src = data; + do + { + /* keep the watchdog happy */ + CopService(); + /* buffer overflow? */ + if ((blt_addr)(dst-&(block->data[0])) >= FLASH_WRITE_BLOCK_SIZE) + { + /* need to switch to a new block, so program the current one and init the next */ + block = FlashSwitchBlock(block, current_base_addr+FLASH_WRITE_BLOCK_SIZE); + if (block == BLT_NULL) + { + return BLT_FALSE; + } + /* reset destination pointer */ + dst = &(block->data[0]); + } + /* write the data to the buffer */ + *dst = *src; + /* update pointers */ + dst++; + src++; + /* decrement byte counter */ + len--; + } + while (len > 0); + /* still here so all is good */ + return BLT_TRUE; +} /*** end of FlashAddToBlock ***/ + + +/************************************************************************************//** +** \brief Programs FLASH_WRITE_BLOCK_SIZE bytes to flash from the block->data +** array. +** \param block Pointer to flash block info structure to operate on. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool FlashWriteBlock(tFlashBlockInfo *block) +{ + blt_int8u sector_num; + blt_bool result = BLT_TRUE; + blt_addr prog_addr; + blt_int32u prog_data; + blt_int32u word_cnt; + + /* check that address is actually within flash */ + sector_num = FlashGetSector(block->base_addr); + if (sector_num == FLASH_INVALID_SECTOR) + { + return BLT_FALSE; + } + /* unlock the flash array */ + FLASH_Unlock(); + /* clear pending flags (if any) */ + FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR); + /* check that the flash peripheral is not busy */ + if (FLASH_GetStatus() == FLASH_BUSY) + { + /* lock the flash array again */ + FLASH_Lock(); + /* could not perform erase operation */ + return BLT_FALSE; + } + + /* program all words in the block one by one */ + for (word_cnt=0; word_cnt<(FLASH_WRITE_BLOCK_SIZE/sizeof(blt_int32u)); word_cnt++) + { + prog_addr = block->base_addr + (word_cnt * sizeof(blt_int32u)); + prog_data = *(volatile blt_int32u *)(&block->data[word_cnt * sizeof(blt_int32u)]); + /* keep the watchdog happy */ + CopService(); + /* program the word */ + if (FLASH_ProgramWord(prog_addr, prog_data) != FLASH_COMPLETE) + { + result = BLT_FALSE; + break; + } + /* verify that the written data is actually there */ + if (*(volatile blt_int32u*)prog_addr != prog_data) + { + result = BLT_FALSE; + break; + } + } + /* lock the flash array again */ + FLASH_Lock(); + /* still here so all is okay */ + return result; +} /*** end of FlashWriteBlock ***/ + + +/************************************************************************************//** +** \brief Erases the flash sectors from first_sector up until last_sector. +** \param first_sector First flash sector number. +** \param last_sector Last flash sector number. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool FlashEraseSectors(blt_int8u first_sector, blt_int8u last_sector) +{ + blt_int16u nr_of_blocks; + blt_int16u block_cnt; + blt_addr start_addr; + blt_addr end_addr; + + /* validate the sector numbers */ + if (first_sector > last_sector) + { + return BLT_FALSE; + } + if ((first_sector < flashLayout[0].sector_num) || \ + (last_sector > flashLayout[FLASH_TOTAL_SECTORS-1].sector_num)) + { + return BLT_FALSE; + } + /* unlock the flash array */ + FLASH_Unlock(); + /* clear pending flags (if any) */ + FLASH_ClearFlag( FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR ); + /* check that the flash peripheral is not busy */ + if (FLASH_GetStatus() == FLASH_BUSY) + { + /* lock the flash array again */ + FLASH_Lock(); + /* could not perform erase operation */ + return BLT_FALSE; + } + /* determine how many blocks need to be erased */ + start_addr = FlashGetSectorBaseAddr(first_sector); + end_addr = FlashGetSectorBaseAddr(last_sector) + FlashGetSectorSize(last_sector) - 1; + nr_of_blocks = (end_addr - start_addr + 1) / FLASH_ERASE_BLOCK_SIZE; + /* erase all blocks one by one */ + for (block_cnt=0; block_cnt= flashLayout[sectorIdx].sector_start) && \ + (address < (flashLayout[sectorIdx].sector_start + \ + flashLayout[sectorIdx].sector_size))) + { + /* return the sector number */ + return flashLayout[sectorIdx].sector_num; + } + } + /* still here so no valid sector found */ + return FLASH_INVALID_SECTOR; +} /*** end of FlashGetSector ***/ + + +/************************************************************************************//** +** \brief Determines the flash sector base address. +** \param sector Sector to get the base address of. +** \return Flash sector base address or FLASH_INVALID_ADDRESS. +** +****************************************************************************************/ +static blt_addr FlashGetSectorBaseAddr(blt_int8u sector) +{ + blt_int8u sectorIdx; + + /* search through the sectors to find the right one */ + for (sectorIdx = 0; sectorIdx < FLASH_TOTAL_SECTORS; sectorIdx++) + { + /* keep the watchdog happy */ + CopService(); + if (flashLayout[sectorIdx].sector_num == sector) + { + return flashLayout[sectorIdx].sector_start; + } + } + /* still here so no valid sector found */ + return FLASH_INVALID_ADDRESS; +} /*** end of FlashGetSectorBaseAddr ***/ + + +/************************************************************************************//** +** \brief Determines the flash sector size. +** \param sector Sector to get the size of. +** \return Flash sector size or 0. +** +****************************************************************************************/ +static blt_addr FlashGetSectorSize(blt_int8u sector) +{ + blt_int8u sectorIdx; + + /* search through the sectors to find the right one */ + for (sectorIdx = 0; sectorIdx < FLASH_TOTAL_SECTORS; sectorIdx++) + { + /* keep the watchdog happy */ + CopService(); + if (flashLayout[sectorIdx].sector_num == sector) + { + return flashLayout[sectorIdx].sector_size; + } + } + /* still here so no valid sector found */ + return 0; +} /*** end of FlashGetSectorSize ***/ + + +/*********************************** end of flash.c ************************************/ diff --git a/Target/Source/ARMCM0_STM32/flash.h b/Target/Source/ARMCM0_STM32/flash.h new file mode 100644 index 00000000..1188191c --- /dev/null +++ b/Target/Source/ARMCM0_STM32/flash.h @@ -0,0 +1,49 @@ +/************************************************************************************//** +* \file Source\ARMCM0_STM32\flash.c +* \brief Bootloader flash driver source file. +* \ingroup Target_ARMCM0_STM32 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ +#ifndef FLASH_H +#define FLASH_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void FlashInit(void); +blt_bool FlashWrite(blt_addr addr, blt_int32u len, blt_int8u *data); +blt_bool FlashErase(blt_addr addr, blt_int32u len); +blt_bool FlashWriteChecksum(void); +blt_bool FlashVerifyChecksum(void); +blt_bool FlashDone(void); +blt_addr FlashGetUserProgBaseAddress(void); + + +#endif /* FLASH_H */ +/*********************************** end of flash.h ************************************/ diff --git a/Target/Source/ARMCM0_STM32/nvm.c b/Target/Source/ARMCM0_STM32/nvm.c new file mode 100644 index 00000000..dee2f569 --- /dev/null +++ b/Target/Source/ARMCM0_STM32/nvm.c @@ -0,0 +1,229 @@ +/************************************************************************************//** +* \file Source\ARMCM0_STM32\nvm.c +* \brief Bootloader non-volatile memory driver source file. +* \ingroup Target_ARMCM0_STM32 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "flash.h" + + +/**************************************************************************************** +* Hook functions +****************************************************************************************/ +#if (BOOT_NVM_HOOKS_ENABLE > 0) +extern void NvmInitHook(void); +extern blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data); +extern blt_int8u NvmEraseHook(blt_addr addr, blt_int32u len); +extern blt_bool NvmDoneHook(void); +#endif + +#if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0) +extern blt_bool NvmWriteChecksumHook(void); +extern blt_bool NvmVerifyChecksumHook(void); +#endif + + + +/************************************************************************************//** +** \brief Initializes the NVM driver. +** \return none. +** +****************************************************************************************/ +void NvmInit(void) +{ +#if (BOOT_NVM_HOOKS_ENABLE > 0) + /* give the application a chance to initialize a driver for operating on NVM + * that is not by default supported by this driver. + */ + NvmInitHook(); +#endif + + /* init the internal driver */ + FlashInit(); +} /*** end of NvmInit ***/ + + +/************************************************************************************//** +** \brief Programs the non-volatile memory. +** \param addr Start address. +** \param len Length in bytes. +** \param data Pointer to the data buffer. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmWrite(blt_addr addr, blt_int32u len, blt_int8u *data) +{ +#if (BOOT_NVM_HOOKS_ENABLE > 0) + blt_int8u result = BLT_NVM_NOT_IN_RANGE; +#endif + +#if (BOOT_NVM_HOOKS_ENABLE > 0) + /* give the application a chance to operate on memory that is not by default supported + * by this driver. + */ + result = NvmWriteHook(addr, len, data); + + /* process the return code */ + if (result == BLT_NVM_OKAY) + { + /* data was within range of the additionally supported memory and succesfully + * programmed, so we are all done. + */ + return BLT_TRUE; + } + else if (result == BLT_NVM_ERROR) + { + /* data was within range of the additionally supported memory and attempted to be + * programmed, but an error occurred, so we can't continue. + */ + return BLT_FALSE; + } +#endif + + /* still here so the internal driver should try and perform the program operation */ + return FlashWrite(addr, len, data); +} /*** end of NvmWrite ***/ + + +/************************************************************************************//** +** \brief Erases the non-volatile memory. +** \param addr Start address. +** \param len Length in bytes. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmErase(blt_addr addr, blt_int32u len) +{ +#if (BOOT_NVM_HOOKS_ENABLE > 0) + blt_int8u result = BLT_NVM_NOT_IN_RANGE; +#endif + +#if (BOOT_NVM_HOOKS_ENABLE > 0) + /* give the application a chance to operate on memory that is not by default supported + * by this driver. + */ + result = NvmEraseHook(addr, len); + + /* process the return code */ + if (result == BLT_NVM_OKAY) + { + /* address was within range of the additionally supported memory and succesfully + * erased, so we are all done. + */ + return BLT_TRUE; + } + else if (result == BLT_NVM_ERROR) + { + /* address was within range of the additionally supported memory and attempted to be + * erased, but an error occurred, so we can't continue. + */ + return BLT_FALSE; + } +#endif + + /* still here so the internal driver should try and perform the erase operation */ + return FlashErase(addr, len); +} /*** end of NvmErase ***/ + + +/************************************************************************************//** +** \brief Verifies the checksum, which indicates that a valid user program is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmVerifyChecksum(void) +{ +#if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0) + /* check checksum using the application specific method. */ + return NvmVerifyChecksumHook(); +#else + /* check checksum using the interally supported method. */ + return FlashVerifyChecksum(); +#endif +} /*** end of NvmVerifyChecksum ***/ + + +/************************************************************************************//** +** \brief Obtains the base address of the non-volatile memory available to the user +** program. This is typically that start of the vector table. +** \return Base address. +** +****************************************************************************************/ +blt_addr NvmGetUserProgBaseAddress(void) +{ + return FlashGetUserProgBaseAddress(); +} /*** end of NvmGetUserProgBaseAddress ***/ + + +/************************************************************************************//** +** \brief Once all erase and programming operations are completed, this +** function is called, so at the end of the programming session and +** right before a software reset is performed. It is used to calculate +** a checksum and program this into flash. This checksum is later used +** to determine if a valid user program is present in flash. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmDone(void) +{ +#if (BOOT_NVM_HOOKS_ENABLE > 0) + /* give the application's NVM driver a chance to finish up */ + if (NvmDoneHook() == BLT_FALSE) + { + /* error so no need to continue */ + return BLT_FALSE; + } +#endif + +#if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0) + /* compute and write checksum, using the application specific method. */ + if (NvmWriteChecksumHook() == BLT_FALSE) + { + return BLT_FALSE; + } +#else + /* compute and write checksum, which is programmed by the internal driver. */ + if (FlashWriteChecksum() == BLT_FALSE) + { + return BLT_FALSE; + } +#endif + + /* finish up internal driver operations */ + return FlashDone(); +} /*** end of NvmDone ***/ + + +/*********************************** end of nvm.c **************************************/ diff --git a/Target/Source/ARMCM0_STM32/target.dox b/Target/Source/ARMCM0_STM32/target.dox new file mode 100644 index 00000000..8a45bf40 --- /dev/null +++ b/Target/Source/ARMCM0_STM32/target.dox @@ -0,0 +1,8 @@ +/** +\defgroup Target_ARMCM0_STM32 Target ARMCM0 STM32 +\brief Target dependent code for the ARMCM0 STM32 microcontroller family. +\details This module implements the bootloader's target dependent part for the + ARMCM0 STM32 microcontroller family. +*/ + + diff --git a/Target/Source/ARMCM0_STM32/timer.c b/Target/Source/ARMCM0_STM32/timer.c new file mode 100644 index 00000000..b92f5694 --- /dev/null +++ b/Target/Source/ARMCM0_STM32/timer.c @@ -0,0 +1,115 @@ +/************************************************************************************//** +* \file Source\ARMCM0_STM32\timer.c +* \brief Bootloader timer driver source file. +* \ingroup Target_ARMCM0_STM32 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "stm32f0xx.h" /* for STM32F0 registers and drivers */ + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Local variable for storing the number of milliseconds that have elapsed since + * startup. + */ +static blt_int32u millisecond_counter; + + +/************************************************************************************//** +** \brief Initializes the polling based millisecond timer driver. +** \return none. +** +****************************************************************************************/ +void TimerInit(void) +{ + /* reset the timer configuration */ + TimerReset(); + /* configure the systick frequency as a 1 ms event generator */ + SysTick->LOAD = BOOT_CPU_SYSTEM_SPEED_KHZ - 1; + /* reset the current counter value */ + SysTick->VAL = 0; + /* select core clock as source and enable the timer */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; + /* reset the millisecond counter value */ + millisecond_counter = 0; +} /*** end of TimerInit ***/ + + +/************************************************************************************//** +** \brief Reset the timer by placing the timer back into it's default reset +** configuration. +** \return none. +** +****************************************************************************************/ +void TimerReset(void) +{ + /* set the systick's status and control register back into the default reset value */ + SysTick->CTRL = 0; +} /* end of TimerReset */ + + +/************************************************************************************//** +** \brief Updates the millisecond timer. +** \return none. +** +****************************************************************************************/ +void TimerUpdate(void) +{ + /* check if the millisecond event occurred */ + if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0) + { + /* increment the millisecond counter */ + millisecond_counter++; + } +} /*** end of TimerUpdate ***/ + + +/************************************************************************************//** +** \brief Obtains the counter value of the millisecond timer. +** \return Current value of the millisecond timer. +** +****************************************************************************************/ +blt_int32u TimerGet(void) +{ + /* updating timer here allows this function to be called in a loop with timeout + * detection. + */ + TimerUpdate(); + /* read and return the amount of milliseconds that passed since initialization */ + return millisecond_counter; +} /*** end of TimerGet ***/ + + +/*********************************** end of timer.c ************************************/ diff --git a/Target/Source/ARMCM0_STM32/types.h b/Target/Source/ARMCM0_STM32/types.h new file mode 100644 index 00000000..0dc36898 --- /dev/null +++ b/Target/Source/ARMCM0_STM32/types.h @@ -0,0 +1,63 @@ +/************************************************************************************//** +* \file Source\ARMCM0_STM32\types.h +* \brief Bootloader types header file. +* \ingroup Target_ARMCM0_STM32 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ +#ifndef TYPES_H +#define TYPES_H + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Boolean true value. */ +#define BLT_TRUE (1) +/** \brief Boolean false value. */ +#define BLT_FALSE (0) +/** \brief NULL pointer value. */ +#define BLT_NULL ((void *)0) + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +typedef unsigned char blt_bool; /**< boolean type */ +typedef char blt_char; /**< character type */ +typedef unsigned long blt_addr; /**< memory address type */ +typedef unsigned char blt_int8u; /**< 8-bit unsigned integer */ +typedef signed char blt_int8s; /**< 8-bit signed integer */ +typedef unsigned short blt_int16u; /**< 16-bit unsigned integer */ +typedef signed short blt_int16s; /**< 16-bit signed integer */ +typedef unsigned int blt_int32u; /**< 32-bit unsigned integer */ +typedef signed int blt_int32s; /**< 32-bit signed integer */ + + +#endif /* TYPES_H */ +/*********************************** end of types.h ************************************/ diff --git a/Target/Source/ARMCM0_STM32/uart.c b/Target/Source/ARMCM0_STM32/uart.c new file mode 100644 index 00000000..db027a7e --- /dev/null +++ b/Target/Source/ARMCM0_STM32/uart.c @@ -0,0 +1,264 @@ +/************************************************************************************//** +* \file Source\ARMCM0_STM32\uart.c +* \brief Bootloader UART communication interface source file. +* \ingroup Target_ARMCM0_STM32 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "stm32f0xx.h" /* for STM32F0 registers and drivers */ + + +#if (BOOT_COM_UART_ENABLE > 0) +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Timeout time for the reception of a CTO packet. The timer is started upon + * reception of the first packet byte. + */ +#define UART_CTO_RX_PACKET_TIMEOUT_MS (100u) +/* map the configured UART channel index to the STM32's USART peripheral */ +#if (BOOT_COM_UART_CHANNEL_INDEX == 0) +/** \brief Set UART base address to USART1. */ +#define USART_CHANNEL USART1 +#elif (BOOT_COM_UART_CHANNEL_INDEX == 1) +/** \brief Set UART base address to USART2. */ +#define USART_CHANNEL USART2 +#elif (BOOT_COM_UART_CHANNEL_INDEX == 2) +/** \brief Set UART base address to USART3. */ +#define USART_CHANNEL USART3 +#elif (BOOT_COM_UART_CHANNEL_INDEX == 3) +/** \brief Set UART base address to USART4. */ +#define USART_CHANNEL USART4 +#elif (BOOT_COM_UART_CHANNEL_INDEX == 4) +/** \brief Set UART base address to USART5. */ +#define USART_CHANNEL USART5 +#elif (BOOT_COM_UART_CHANNEL_INDEX == 5) +/** \brief Set UART base address to USART6. */ +#define USART_CHANNEL USART6 +#elif (BOOT_COM_UART_CHANNEL_INDEX == 6) +/** \brief Set UART base address to USART7. */ +#define USART_CHANNEL USART7 +#elif (BOOT_COM_UART_CHANNEL_INDEX == 7) +/** \brief Set UART base address to USART8. */ +#define USART_CHANNEL USART8 +#endif + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static blt_bool UartReceiveByte(blt_int8u *data); +static blt_bool UartTransmitByte(blt_int8u data); + + +/************************************************************************************//** +** \brief Initializes the UART communication interface. +** \return none. +** +****************************************************************************************/ +void UartInit(void) +{ + USART_InitTypeDef USART_InitStructure; + + /* the current implementation supports USART1 - USART8. throw an assertion error in + * case a different UART channel is configured. + */ + ASSERT_CT((BOOT_COM_UART_CHANNEL_INDEX == 0) || + (BOOT_COM_UART_CHANNEL_INDEX == 1) || + (BOOT_COM_UART_CHANNEL_INDEX == 2) || + (BOOT_COM_UART_CHANNEL_INDEX == 3) || + (BOOT_COM_UART_CHANNEL_INDEX == 4) || + (BOOT_COM_UART_CHANNEL_INDEX == 5) || + (BOOT_COM_UART_CHANNEL_INDEX == 6) || + (BOOT_COM_UART_CHANNEL_INDEX == 7)); + /* initialize the uart for the specified communication speed */ + USART_InitStructure.USART_BaudRate = BOOT_COM_UART_BAUDRATE; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_Init(USART_CHANNEL, &USART_InitStructure); + /* Overrun is ignored in BLT code, it is better to switch OVR detection off. */ + USART_OverrunDetectionConfig(USART_CHANNEL, USART_OVRDetection_Disable); + /* enable UART */ + USART_Cmd(USART_CHANNEL, ENABLE); +} /*** end of UartInit ***/ + + +/************************************************************************************//** +** \brief Transmits a packet formatted for the communication interface. +** \param data Pointer to byte array with data that it to be transmitted. +** \param len Number of bytes that are to be transmitted. +** \return none. +** +****************************************************************************************/ +void UartTransmitPacket(blt_int8u *data, blt_int8u len) +{ + blt_int16u data_index; + blt_bool result; + + /* verify validity of the len-paramenter */ + ASSERT_RT(len <= BOOT_COM_UART_TX_MAX_DATA); + + /* first transmit the length of the packet */ + result = UartTransmitByte(len); + ASSERT_RT(result == BLT_TRUE); + + /* transmit all the packet bytes one-by-one */ + for (data_index = 0; data_index < len; data_index++) + { + /* keep the watchdog happy */ + CopService(); + /* write byte */ + result = UartTransmitByte(data[data_index]); + ASSERT_RT(result == BLT_TRUE); + } +} /*** end of UartTransmitPacket ***/ + + +/************************************************************************************//** +** \brief Receives a communication interface packet if one is present. +** \param data Pointer to byte array where the data is to be stored. +** \return BLT_TRUE if a packet was received, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool UartReceivePacket(blt_int8u *data) +{ + static blt_int8u xcpCtoReqPacket[BOOT_COM_UART_RX_MAX_DATA+1]; /* one extra for length */ + static blt_int8u xcpCtoRxLength; + static blt_bool xcpCtoRxInProgress = BLT_FALSE; + static blt_int32u xcpCtoRxStartTime = 0; + + /* start of cto packet received? */ + if (xcpCtoRxInProgress == BLT_FALSE) + { + /* store the message length when received */ + if (UartReceiveByte(&xcpCtoReqPacket[0]) == BLT_TRUE) + { + if (xcpCtoReqPacket[0] > 0) + { + /* store the start time */ + xcpCtoRxStartTime = TimerGet(); + /* reset packet data count */ + xcpCtoRxLength = 0; + /* indicate that a cto packet is being received */ + xcpCtoRxInProgress = BLT_TRUE; + } + } + } + else + { + /* store the next packet byte */ + if (UartReceiveByte(&xcpCtoReqPacket[xcpCtoRxLength+1]) == BLT_TRUE) + { + /* increment the packet data count */ + xcpCtoRxLength++; + + /* check to see if the entire packet was received */ + if (xcpCtoRxLength == xcpCtoReqPacket[0]) + { + /* copy the packet data */ + CpuMemCopy((blt_int32u)data, (blt_int32u)&xcpCtoReqPacket[1], xcpCtoRxLength); + /* done with cto packet reception */ + xcpCtoRxInProgress = BLT_FALSE; + /* packet reception complete */ + return BLT_TRUE; + } + } + else + { + /* check packet reception timeout */ + if (TimerGet() > (xcpCtoRxStartTime + UART_CTO_RX_PACKET_TIMEOUT_MS)) + { + /* cancel cto packet reception due to timeout. note that that automaticaly + * discards the already received packet bytes, allowing the host to retry. + */ + xcpCtoRxInProgress = BLT_FALSE; + } + } + } + /* packet reception not yet complete */ + return BLT_FALSE; +} /*** end of UartReceivePacket ***/ + + +/************************************************************************************//** +** \brief Receives a communication interface byte if one is present. +** \param data Pointer to byte where the data is to be stored. +** \return BLT_TRUE if a byte was received, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool UartReceiveByte(blt_int8u *data) +{ + /* check flag to see if a byte was received */ + if (USART_GetFlagStatus(USART_CHANNEL, USART_FLAG_RXNE) == SET) + { + /* retrieve and store the newly received byte */ + *data = (unsigned char)USART_ReceiveData(USART_CHANNEL); + /* all done */ + return BLT_TRUE; + } + /* still here to no new byte received */ + return BLT_FALSE; +} /*** end of UartReceiveByte ***/ + + +/************************************************************************************//** +** \brief Transmits a communication interface byte. +** \param data Value of byte that is to be transmitted. +** \return BLT_TRUE if the byte was transmitted, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool UartTransmitByte(blt_int8u data) +{ + /* check if tx holding register can accept new data */ + if (USART_GetFlagStatus(USART_CHANNEL, USART_FLAG_TXE) == RESET) + { + /* UART not ready. should not happen */ + return BLT_FALSE; + } + /* write byte to transmit holding register */ + USART_SendData(USART_CHANNEL, data); + /* wait for tx holding register to be empty */ + while (USART_GetFlagStatus(USART_CHANNEL, USART_FLAG_TXE) == RESET) + { + ; + } + /* byte transmitted */ + return BLT_TRUE; +} /*** end of UartTransmitByte ***/ +#endif /* BOOT_COM_UART_ENABLE > 0 */ + + +/*********************************** end of uart.c *************************************/