From ff37c69f4a51c0073e834b3226dabb9c14033f57 Mon Sep 17 00:00:00 2001 From: Fixxer Date: Sun, 9 Jun 2013 10:05:35 +0200 Subject: [PATCH] dziala --- Soft/Suwmiarka/Suwmiarka.cbp | 8 +- Soft/Suwmiarka/Suwmiarka.depend | 41 +- Soft/Suwmiarka/Suwmiarka.layout | 336 +- Soft/Suwmiarka/bin/Debug/Suwmiarka | Bin 151270 -> 160194 bytes Soft/Suwmiarka/caliper.c | 227 + Soft/Suwmiarka/caliper.h | 37 + Soft/Suwmiarka/hardware.h | 7 +- Soft/Suwmiarka/hw_config.c | 38 +- Soft/Suwmiarka/key.c | 22 +- Soft/Suwmiarka/key.h | 10 +- Soft/Suwmiarka/main.c | 155 +- Soft/Suwmiarka/obj/Debug/caliper.o | Bin 0 -> 10188 bytes Soft/Suwmiarka/obj/Debug/hw_config.o | Bin 11372 -> 10712 bytes Soft/Suwmiarka/obj/Debug/key.o | Bin 6124 -> 5548 bytes Soft/Suwmiarka/obj/Debug/main.o | Bin 6004 -> 11688 bytes Soft/Suwmiarka/obj/Debug/spi.o | Bin 0 -> 8440 bytes Soft/Suwmiarka/obj/Debug/stm32_it.o | Bin 5968 -> 5052 bytes Soft/Suwmiarka/obj/Debug/system_stm32f10x.o | Bin 6448 -> 6008 bytes Soft/Suwmiarka/obj/Debug/usb_core.o | Bin 20344 -> 19432 bytes Soft/Suwmiarka/obj/Debug/usb_desc.o | Bin 3252 -> 3220 bytes Soft/Suwmiarka/obj/Debug/usb_endp.o | Bin 4024 -> 3636 bytes Soft/Suwmiarka/obj/Debug/usb_init.o | Bin 5956 -> 5668 bytes Soft/Suwmiarka/obj/Debug/usb_int.o | Bin 5536 -> 5172 bytes Soft/Suwmiarka/obj/Debug/usb_istr.o | Bin 6200 -> 5876 bytes Soft/Suwmiarka/obj/Debug/usb_mem.o | Bin 3912 -> 3552 bytes Soft/Suwmiarka/obj/Debug/usb_prop.o | Bin 16548 -> 15700 bytes Soft/Suwmiarka/obj/Debug/usb_pwr.o | Bin 8188 -> 7696 bytes Soft/Suwmiarka/obj/Debug/usb_regs.o | Bin 26228 -> 23868 bytes Soft/Suwmiarka/obj/Debug/usb_sil.o | Bin 4340 -> 3916 bytes Soft/Suwmiarka/spi.c | 113 +- Soft/Suwmiarka/spi.h | 20 +- Soft/Suwmiarka/stm32_it.c | 34 - Soft/Suwmiarka/stm32_it.h | 5 +- Soft/Suwmiarka_CrossWorks/STM32Template.hzp | 119 + Soft/Suwmiarka_CrossWorks/STM32Template.hzs | 77 + .../THUMB Debug/STM32Template.elf | Bin 0 -> 298627 bytes .../THUMB Debug/STM32Template.ld | 276 + .../THUMB Debug/STM32Template.map | 3619 +++++++ .../THUMB Debug/STM32_Startup.d | 3 + .../THUMB Debug/STM32_Startup.o | Bin 0 -> 4612 bytes .../THUMB Debug/caliper.d | 21 + .../THUMB Debug/caliper.o | Bin 0 -> 12464 bytes .../THUMB Debug/hw_config.d | 32 + .../THUMB Debug/hw_config.o | Bin 0 -> 13632 bytes Soft/Suwmiarka_CrossWorks/THUMB Debug/key.d | 21 + Soft/Suwmiarka_CrossWorks/THUMB Debug/key.o | Bin 0 -> 7400 bytes Soft/Suwmiarka_CrossWorks/THUMB Debug/main.d | 39 + Soft/Suwmiarka_CrossWorks/THUMB Debug/main.o | Bin 0 -> 14488 bytes Soft/Suwmiarka_CrossWorks/THUMB Debug/misc.d | 18 + Soft/Suwmiarka_CrossWorks/THUMB Debug/misc.o | Bin 0 -> 7548 bytes Soft/Suwmiarka_CrossWorks/THUMB Debug/pio.d | 17 + Soft/Suwmiarka_CrossWorks/THUMB Debug/pwm.d | 20 + .../Suwmiarka_CrossWorks/THUMB Debug/serial.d | 22 + Soft/Suwmiarka_CrossWorks/THUMB Debug/spi.d | 19 + .../THUMB Debug/stm32_it.d | 33 + .../THUMB Debug/stm32_it.o | Bin 0 -> 7740 bytes .../THUMB Debug/stm32f10x_adc.d | 19 + .../THUMB Debug/stm32f10x_adc.o | Bin 0 -> 26224 bytes .../THUMB Debug/stm32f10x_bkp.d | 19 + .../THUMB Debug/stm32f10x_bkp.o | Bin 0 -> 11992 bytes .../THUMB Debug/stm32f10x_can.d | 19 + .../THUMB Debug/stm32f10x_can.o | Bin 0 -> 20504 bytes .../THUMB Debug/stm32f10x_cec.d | 19 + .../THUMB Debug/stm32f10x_cec.o | Bin 0 -> 10948 bytes .../THUMB Debug/stm32f10x_crc.d | 19 + .../THUMB Debug/stm32f10x_crc.o | Bin 0 -> 5884 bytes .../THUMB Debug/stm32f10x_dac.d | 19 + .../THUMB Debug/stm32f10x_dac.o | Bin 0 -> 10760 bytes .../THUMB Debug/stm32f10x_dbgmcu.d | 19 + .../THUMB Debug/stm32f10x_dbgmcu.o | Bin 0 -> 4336 bytes .../THUMB Debug/stm32f10x_dma.d | 18 + .../THUMB Debug/stm32f10x_dma.o | Bin 0 -> 10516 bytes .../THUMB Debug/stm32f10x_exti.d | 18 + .../THUMB Debug/stm32f10x_exti.o | Bin 0 -> 8188 bytes .../THUMB Debug/stm32f10x_flash.d | 19 + .../THUMB Debug/stm32f10x_flash.o | Bin 0 -> 22020 bytes .../THUMB Debug/stm32f10x_fsmc.d | 19 + .../THUMB Debug/stm32f10x_fsmc.o | Bin 0 -> 18436 bytes .../THUMB Debug/stm32f10x_gpio.d | 18 + .../THUMB Debug/stm32f10x_gpio.o | Bin 0 -> 15504 bytes .../THUMB Debug/stm32f10x_i2c.d | 19 + .../THUMB Debug/stm32f10x_i2c.o | Bin 0 -> 23372 bytes .../THUMB Debug/stm32f10x_iwdg.d | 19 + .../THUMB Debug/stm32f10x_iwdg.o | Bin 0 -> 5928 bytes .../THUMB Debug/stm32f10x_pwr.d | 18 + .../THUMB Debug/stm32f10x_pwr.o | Bin 0 -> 8856 bytes .../THUMB Debug/stm32f10x_rcc.d | 18 + .../THUMB Debug/stm32f10x_rcc.o | Bin 0 -> 22756 bytes .../THUMB Debug/stm32f10x_rtc.d | 19 + .../THUMB Debug/stm32f10x_rtc.o | Bin 0 -> 11204 bytes .../THUMB Debug/stm32f10x_sdio.d | 19 + .../THUMB Debug/stm32f10x_sdio.o | Bin 0 -> 20248 bytes .../THUMB Debug/stm32f10x_spi.d | 18 + .../THUMB Debug/stm32f10x_spi.o | Bin 0 -> 18652 bytes .../THUMB Debug/stm32f10x_tim.d | 18 + .../THUMB Debug/stm32f10x_tim.o | Bin 0 -> 62504 bytes .../THUMB Debug/stm32f10x_usart.d | 18 + .../THUMB Debug/stm32f10x_usart.o | Bin 0 -> 22140 bytes .../THUMB Debug/stm32f10x_wwdg.d | 19 + .../THUMB Debug/stm32f10x_wwdg.o | Bin 0 -> 6924 bytes .../THUMB Debug/system_stm32f10x.d | 18 + .../THUMB Debug/system_stm32f10x.o | Bin 0 -> 7824 bytes .../THUMB Debug/systick.d | 18 + Soft/Suwmiarka_CrossWorks/THUMB Debug/tc.d | 13 + Soft/Suwmiarka_CrossWorks/THUMB Debug/tc.o | Bin 0 -> 8364 bytes .../THUMB Debug/thumb_crt0.d | 2 + .../THUMB Debug/thumb_crt0.o | Bin 0 -> 3344 bytes .../THUMB Debug/usb_core.d | 30 + .../THUMB Debug/usb_core.o | Bin 0 -> 27900 bytes .../THUMB Debug/usb_desc.d | 31 + .../THUMB Debug/usb_desc.o | Bin 0 -> 3820 bytes .../THUMB Debug/usb_endp.d | 31 + .../THUMB Debug/usb_endp.o | Bin 0 -> 4384 bytes .../THUMB Debug/usb_init.d | 30 + .../THUMB Debug/usb_init.o | Bin 0 -> 6920 bytes .../THUMB Debug/usb_int.d | 30 + .../THUMB Debug/usb_int.o | Bin 0 -> 7024 bytes .../THUMB Debug/usb_istr.d | 33 + .../THUMB Debug/usb_istr.o | Bin 0 -> 7684 bytes .../THUMB Debug/usb_mem.d | 30 + .../THUMB Debug/usb_mem.o | Bin 0 -> 4208 bytes .../THUMB Debug/usb_prop.d | 33 + .../THUMB Debug/usb_prop.o | Bin 0 -> 22140 bytes .../THUMB Debug/usb_pwr.d | 31 + .../THUMB Debug/usb_pwr.o | Bin 0 -> 10148 bytes .../THUMB Debug/usb_regs.d | 30 + .../THUMB Debug/usb_regs.o | Bin 0 -> 36480 bytes .../THUMB Debug/usb_sil.d | 30 + .../THUMB Debug/usb_sil.o | Bin 0 -> 4868 bytes Soft/Suwmiarka_CrossWorks/THUMB Debug/vfd.d | 17 + Soft/Suwmiarka_CrossWorks/THUMB Debug/vfd.o | Bin 0 -> 6464 bytes Soft/Suwmiarka_CrossWorks/caliper.c | 225 + Soft/Suwmiarka_CrossWorks/caliper.c.bak | 231 + Soft/Suwmiarka_CrossWorks/caliper.h | 37 + Soft/Suwmiarka_CrossWorks/hardware.h | 51 + Soft/Suwmiarka_CrossWorks/hardware.h~ | 46 + Soft/Suwmiarka_CrossWorks/hw_config.c | 268 + Soft/Suwmiarka_CrossWorks/hw_config.c.bak | 268 + Soft/Suwmiarka_CrossWorks/hw_config.h | 58 + Soft/Suwmiarka_CrossWorks/key.c | 127 + Soft/Suwmiarka_CrossWorks/key.h | 25 + Soft/Suwmiarka_CrossWorks/main.c | 292 + Soft/Suwmiarka_CrossWorks/main.c.bak | 292 + Soft/Suwmiarka_CrossWorks/misc.c | 223 + Soft/Suwmiarka_CrossWorks/misc.h | 219 + Soft/Suwmiarka_CrossWorks/pio.c~ | 23 + Soft/Suwmiarka_CrossWorks/platform_config.h | 203 + Soft/Suwmiarka_CrossWorks/spi.c | 143 + Soft/Suwmiarka_CrossWorks/spi.h | 22 + Soft/Suwmiarka_CrossWorks/stm32_it.c | 228 + Soft/Suwmiarka_CrossWorks/stm32_it.h | 56 + Soft/Suwmiarka_CrossWorks/stm32f10x.h | 8319 +++++++++++++++++ Soft/Suwmiarka_CrossWorks/stm32f10x_adc.c | 1306 +++ Soft/Suwmiarka_CrossWorks/stm32f10x_adc.h | 482 + Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.c | 307 + Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.h | 194 + Soft/Suwmiarka_CrossWorks/stm32f10x_can.c | 1166 +++ Soft/Suwmiarka_CrossWorks/stm32f10x_can.h | 583 ++ Soft/Suwmiarka_CrossWorks/stm32f10x_cec.c | 432 + Soft/Suwmiarka_CrossWorks/stm32f10x_cec.h | 209 + Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h | 78 + .../Suwmiarka_CrossWorks/stm32f10x_conf.h.bak | 78 + Soft/Suwmiarka_CrossWorks/stm32f10x_crc.c | 159 + Soft/Suwmiarka_CrossWorks/stm32f10x_crc.h | 93 + Soft/Suwmiarka_CrossWorks/stm32f10x_dac.c | 570 ++ Soft/Suwmiarka_CrossWorks/stm32f10x_dac.h | 316 + Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.c | 161 + Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.h | 118 + Soft/Suwmiarka_CrossWorks/stm32f10x_dma.c | 711 ++ Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h | 438 + Soft/Suwmiarka_CrossWorks/stm32f10x_exti.c | 268 + Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h | 183 + Soft/Suwmiarka_CrossWorks/stm32f10x_flash.c | 1683 ++++ Soft/Suwmiarka_CrossWorks/stm32f10x_flash.h | 425 + Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.c | 863 ++ Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.h | 732 ++ Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.c | 647 ++ Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h | 384 + Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.c | 1285 +++ Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.h | 670 ++ Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.c | 189 + Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.h | 139 + Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.c | 306 + Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h | 155 + Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.c | 1469 +++ Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h | 726 ++ Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.c | 338 + Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.h | 134 + Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.c | 798 ++ Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.h | 530 ++ Soft/Suwmiarka_CrossWorks/stm32f10x_spi.c | 907 ++ Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h | 486 + Soft/Suwmiarka_CrossWorks/stm32f10x_tim.c | 2888 ++++++ Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h | 1137 +++ Soft/Suwmiarka_CrossWorks/stm32f10x_usart.c | 1055 +++ Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h | 411 + Soft/Suwmiarka_CrossWorks/stm32f10x_wwdg.c | 223 + Soft/Suwmiarka_CrossWorks/stm32f10x_wwdg.h | 114 + Soft/Suwmiarka_CrossWorks/system_stm32f10x.c | 916 ++ Soft/Suwmiarka_CrossWorks/systick.h | 12 + Soft/Suwmiarka_CrossWorks/usb_conf.h | 93 + Soft/Suwmiarka_CrossWorks/usb_core.c | 1033 ++ Soft/Suwmiarka_CrossWorks/usb_core.h | 259 + Soft/Suwmiarka_CrossWorks/usb_def.h | 92 + Soft/Suwmiarka_CrossWorks/usb_desc.c | 317 + Soft/Suwmiarka_CrossWorks/usb_desc.h | 70 + Soft/Suwmiarka_CrossWorks/usb_endp.c | 97 + Soft/Suwmiarka_CrossWorks/usb_init.c | 76 + Soft/Suwmiarka_CrossWorks/usb_init.h | 62 + Soft/Suwmiarka_CrossWorks/usb_int.c | 195 + Soft/Suwmiarka_CrossWorks/usb_int.h | 45 + Soft/Suwmiarka_CrossWorks/usb_istr.c | 237 + Soft/Suwmiarka_CrossWorks/usb_istr.c.bak | 237 + Soft/Suwmiarka_CrossWorks/usb_istr.h | 95 + Soft/Suwmiarka_CrossWorks/usb_lib.h | 52 + Soft/Suwmiarka_CrossWorks/usb_mem.c | 87 + Soft/Suwmiarka_CrossWorks/usb_mem.h | 45 + Soft/Suwmiarka_CrossWorks/usb_prop.c | 492 + Soft/Suwmiarka_CrossWorks/usb_prop.c.bak | 492 + Soft/Suwmiarka_CrossWorks/usb_prop.h | 83 + Soft/Suwmiarka_CrossWorks/usb_pwr.c | 318 + Soft/Suwmiarka_CrossWorks/usb_pwr.h | 70 + Soft/Suwmiarka_CrossWorks/usb_regs.c | 760 ++ Soft/Suwmiarka_CrossWorks/usb_regs.h | 680 ++ Soft/Suwmiarka_CrossWorks/usb_sil.c | 103 + Soft/Suwmiarka_CrossWorks/usb_sil.h | 46 + Soft/Suwmiarka_CrossWorks/usb_type.h | 54 + notatki.txt | 4 +- 228 files changed, 50869 insertions(+), 361 deletions(-) create mode 100644 Soft/Suwmiarka/caliper.c create mode 100644 Soft/Suwmiarka/caliper.h create mode 100644 Soft/Suwmiarka/obj/Debug/caliper.o create mode 100644 Soft/Suwmiarka/obj/Debug/spi.o create mode 100644 Soft/Suwmiarka_CrossWorks/STM32Template.hzp create mode 100644 Soft/Suwmiarka_CrossWorks/STM32Template.hzs create mode 100755 Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32Template.elf create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32Template.ld create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32Template.map create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32_Startup.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32_Startup.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/caliper.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/caliper.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/hw_config.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/hw_config.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/key.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/key.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/main.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/main.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/misc.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/misc.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/pio.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/pwm.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/serial.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/spi.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32_it.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32_it.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_adc.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_adc.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_bkp.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_bkp.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_can.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_can.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_cec.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_cec.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_crc.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_crc.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dac.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dac.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dbgmcu.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dbgmcu.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dma.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dma.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_exti.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_exti.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_flash.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_flash.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_fsmc.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_fsmc.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_gpio.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_gpio.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_i2c.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_i2c.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_iwdg.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_iwdg.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_pwr.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_pwr.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rcc.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rcc.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rtc.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rtc.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_sdio.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_sdio.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_spi.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_spi.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_tim.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_tim.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_usart.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_usart.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_wwdg.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_wwdg.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/system_stm32f10x.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/system_stm32f10x.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/systick.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/tc.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/tc.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/thumb_crt0.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/thumb_crt0.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_core.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_core.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_desc.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_desc.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_endp.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_endp.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_init.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_init.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_int.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_int.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_istr.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_istr.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_mem.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_mem.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_prop.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_prop.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_pwr.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_pwr.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_regs.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_regs.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_sil.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_sil.o create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/vfd.d create mode 100644 Soft/Suwmiarka_CrossWorks/THUMB Debug/vfd.o create mode 100644 Soft/Suwmiarka_CrossWorks/caliper.c create mode 100644 Soft/Suwmiarka_CrossWorks/caliper.c.bak create mode 100644 Soft/Suwmiarka_CrossWorks/caliper.h create mode 100644 Soft/Suwmiarka_CrossWorks/hardware.h create mode 100644 Soft/Suwmiarka_CrossWorks/hardware.h~ create mode 100644 Soft/Suwmiarka_CrossWorks/hw_config.c create mode 100644 Soft/Suwmiarka_CrossWorks/hw_config.c.bak create mode 100644 Soft/Suwmiarka_CrossWorks/hw_config.h create mode 100644 Soft/Suwmiarka_CrossWorks/key.c create mode 100644 Soft/Suwmiarka_CrossWorks/key.h create mode 100644 Soft/Suwmiarka_CrossWorks/main.c create mode 100644 Soft/Suwmiarka_CrossWorks/main.c.bak create mode 100644 Soft/Suwmiarka_CrossWorks/misc.c create mode 100644 Soft/Suwmiarka_CrossWorks/misc.h create mode 100644 Soft/Suwmiarka_CrossWorks/pio.c~ create mode 100644 Soft/Suwmiarka_CrossWorks/platform_config.h create mode 100644 Soft/Suwmiarka_CrossWorks/spi.c create mode 100644 Soft/Suwmiarka_CrossWorks/spi.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32_it.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32_it.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_adc.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_adc.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_can.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_can.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_cec.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_cec.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h.bak create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_crc.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_crc.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_dac.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_dac.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_dma.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_exti.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_flash.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_flash.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_spi.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_tim.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_usart.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_wwdg.c create mode 100644 Soft/Suwmiarka_CrossWorks/stm32f10x_wwdg.h create mode 100644 Soft/Suwmiarka_CrossWorks/system_stm32f10x.c create mode 100644 Soft/Suwmiarka_CrossWorks/systick.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_conf.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_core.c create mode 100644 Soft/Suwmiarka_CrossWorks/usb_core.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_def.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_desc.c create mode 100644 Soft/Suwmiarka_CrossWorks/usb_desc.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_endp.c create mode 100644 Soft/Suwmiarka_CrossWorks/usb_init.c create mode 100644 Soft/Suwmiarka_CrossWorks/usb_init.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_int.c create mode 100644 Soft/Suwmiarka_CrossWorks/usb_int.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_istr.c create mode 100644 Soft/Suwmiarka_CrossWorks/usb_istr.c.bak create mode 100644 Soft/Suwmiarka_CrossWorks/usb_istr.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_lib.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_mem.c create mode 100644 Soft/Suwmiarka_CrossWorks/usb_mem.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_prop.c create mode 100644 Soft/Suwmiarka_CrossWorks/usb_prop.c.bak create mode 100644 Soft/Suwmiarka_CrossWorks/usb_prop.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_pwr.c create mode 100644 Soft/Suwmiarka_CrossWorks/usb_pwr.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_regs.c create mode 100644 Soft/Suwmiarka_CrossWorks/usb_regs.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_sil.c create mode 100644 Soft/Suwmiarka_CrossWorks/usb_sil.h create mode 100644 Soft/Suwmiarka_CrossWorks/usb_type.h diff --git a/Soft/Suwmiarka/Suwmiarka.cbp b/Soft/Suwmiarka/Suwmiarka.cbp index d870234..d75d508 100644 --- a/Soft/Suwmiarka/Suwmiarka.cbp +++ b/Soft/Suwmiarka/Suwmiarka.cbp @@ -51,6 +51,10 @@ + + + - - - diff --git a/Soft/Suwmiarka/Suwmiarka.depend b/Soft/Suwmiarka/Suwmiarka.depend index 229120d..240feb5 100644 --- a/Soft/Suwmiarka/Suwmiarka.depend +++ b/Soft/Suwmiarka/Suwmiarka.depend @@ -1,5 +1,5 @@ # depslib dependency file v1.0 -1369041219 source:/mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/hw_config.c +1369573619 source:/mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/hw_config.c "hw_config.h" "usb_lib.h" "usb_desc.h" @@ -178,19 +178,24 @@ 1358792848 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/usb_pwr.h -1368956929 source:/mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/main.c +1369591622 source:/mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/main.c "hw_config.h" "usb_lib.h" "usb_pwr.h" + "hardware.h" + "key.h" + "caliper.h" + "systick.h" + -1368728266 source:/mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/stm32_it.c +1369570978 source:/mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/stm32_it.c "stm32_it.h" "usb_istr.h" "usb_lib.h" "usb_pwr.h" "hw_config.h" -1358792848 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/stm32_it.h +1369571888 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/stm32_it.h "platform_config.h" 1358792848 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/usb_istr.h @@ -304,21 +309,39 @@ 1358792870 source:/mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/startup_stm32f10x_md.s -1369041354 source:/mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/key.c +1369587429 source:/mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/key.c "key.h" "systick.h" "hardware.h" "stm32f10x.h" - -1369041329 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/key.h +1369567841 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/key.h -1369041219 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/systick.h +1369573575 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/systick.h "stm32f10x.h" -1368965832 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/hardware.h +1369581453 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/hardware.h "stm32f10x.h" +1369327526 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/spi.h + + +1369334970 source:/mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/spi.c + "spi.h" + "hardware.h" + "stm32f10x.h" + + +1369582315 source:/mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/caliper.c + "caliper.h" + "systick.h" + "hardware.h" + "stm32f10x.h" + + +1369573035 /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka/caliper.h + + diff --git a/Soft/Suwmiarka/Suwmiarka.layout b/Soft/Suwmiarka/Suwmiarka.layout index 59f375a..807e3c5 100644 --- a/Soft/Suwmiarka/Suwmiarka.layout +++ b/Soft/Suwmiarka/Suwmiarka.layout @@ -1,184 +1,39 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + + + + + + + + + + + + + + + + @@ -186,9 +41,104 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -196,9 +146,59 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Soft/Suwmiarka/bin/Debug/Suwmiarka b/Soft/Suwmiarka/bin/Debug/Suwmiarka index 249bbcf2f56deaae4ba283ea0911458a6a8c9990..66e9634db617400fc60175fd7ac56817662653e8 100755 GIT binary patch literal 160194 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 |_ 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 W*8yVC*31>B`~{?ub6FGN@XV1xic0zn-R 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

1&+oW=!y3oTOXhrBh2~DOV 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 +//------------------------zmienne prywatne-------------------------// +uint32_t Caliper_Timestamp; +int32_t Caliper_AbsValue,Caliper_RelValue; +uint8_t Caliper_State,Caliper_ISR_State; +EXTI_TypeDef *EXTI_Regs=EXTI_BASE; +//------------------------zmienne zewnętrzne-------------------------// +extern __IO uint32_t Tick; + +//-----------------------------Funkcje------------------------------// +void Caliper_Initialize(void) +{ + + GPIO_InitTypeDef GPIO_Conf; + EXTI_InitTypeDef EXTI_Conf; + NVIC_InitTypeDef NVIC_Conf; + + //włącz zegar GPIOA,EXTI + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); + + //CLK,DATA - wejście + GPIO_Conf.GPIO_Pin=CLK|DATA; + GPIO_Conf.GPIO_Mode=GPIO_Mode_IN_FLOATING; + GPIO_Conf.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOA,&GPIO_Conf); + + + //przerwanie na narastającym zboczu CLK + GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,5); + EXTI_ClearITPendingBit(CLK); + EXTI_Conf.EXTI_Line = CLK; + EXTI_Conf.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_Conf.EXTI_Trigger = EXTI_Trigger_Falling; + EXTI_Conf.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_Conf); + NVIC_Conf.NVIC_IRQChannel = EXTI9_5_IRQn; + NVIC_Conf.NVIC_IRQChannelPreemptionPriority = 10; //priorytet 10 , wyżej niż USB (tam jest 11 i 12) + NVIC_Conf.NVIC_IRQChannelSubPriority = 0; + NVIC_Conf.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_Conf); + + + + // Inicjalizuj zmienne + Caliper_State=0; + Caliper_ISR_State=0; + Caliper_AbsValue=0; + Caliper_RelValue=0; + Caliper_Timestamp=0; +} + +uint32_t Caliper_GetAbsVal (void) +{ + return Caliper_AbsValue; +} + +uint32_t Caliper_GetRelVal (void) +{ + return Caliper_RelValue; +} + +uint8_t Caliper_GetState (void) +{ + //jezeli suwmiarka nie nadawała przez 500ms - jest odłączona + if(Tick-Caliper_Timestamp>CALIPER_MEAS_TIMEOUT) + Caliper_State &= !CALIPER_CONNECTED; + //zwróć stan suwmiarki + return Caliper_State; +} + +int8_t Caliper_ISRWait(uint32_t Pin,uint8_t Value) +{ + uint32_t tmp,timestamp; + + timestamp=Tick; + + while(1) + { + tmp=PIO_Read(GPIOA)&Pin; + + if(tmp && Value) + return NO_ERROR; + + if ( !tmp && !Value) + return NO_ERROR; + + if(Tick-timestamp>CALIPER_ISR_TIMEOUT) + return TIMEOUT; + } + +} + +void EXTI9_5_IRQHandler(void) +{ + uint8_t BitCntr,Caliper_ISRState; + int32_t Caliper_AbsValueTmp,Caliper_RelValueTmp; + GPIO_SetBits(GPIOA,LED2); + Caliper_ISRState=CALIPER_START; + Caliper_AbsValueTmp=0; + Caliper_RelValueTmp=0; + + while(1) + { + switch(Caliper_ISRState) + { + + //bit startu + case CALIPER_START: + //czekaj na narastające zbocze CLK + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + + GPIO_ResetBits(GPIOA,LED2); + //przejdź do odczytu bezwzględnego położenia swumiarki + BitCntr=0; + Caliper_ISRState=CALIPER_ABS_DATA; + break; + + //bezwzględne położenie swumiarki + case CALIPER_ABS_DATA: + //czekaj na narastające zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + //zapisz kolejny bit + GPIO_SetBits(GPIOA,LED2); + if(PIO_Read(GPIOA)&DATA) + Caliper_AbsValueTmp |= (1<=23) + Caliper_ISRState=CALIPER_MIDDLE; + break; + + //bit środkowy + case CALIPER_MIDDLE: + //czekaj na narastające zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + //przejdź do odczytu względnego położenia swumiarki + BitCntr=0; + Caliper_ISRState=CALIPER_REL_DATA; + break; + + case CALIPER_REL_DATA: + //czekaj na narastające zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + //zapisz kolejny bit + if(PIO_Read(GPIOA)&DATA) + Caliper_RelValueTmp |= (1<=23) + Caliper_ISRState=CALIPER_END; + break; + + case CALIPER_END: + //czekaj na opadające zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + + //dane odebrane + //konwertuj na liczby ze znakiem (uzupełnij najstarsze bity znakiem) i zapisz + Caliper_AbsValue=(Caliper_AbsValueTmp<<9)>>9; + Caliper_RelValue=(Caliper_RelValueTmp<<9)>>9; + //oznacz żę suwmiarka jets podłączona, zapisz moment odebrania danych + Caliper_Timestamp=Tick; + Caliper_State |= CALIPER_CONNECTED; + //wyczyść flagę przerwania i kończ + EXTI_ClearITPendingBit(CLK); + return; + + case CALIPER_TIMEOUT: + //wyczyść flagę przerwania i kończ + EXTI_ClearITPendingBit(CLK); + return; + + default: + break; + + } + } + +} diff --git a/Soft/Suwmiarka/caliper.h b/Soft/Suwmiarka/caliper.h new file mode 100644 index 0000000..d41b201 --- /dev/null +++ b/Soft/Suwmiarka/caliper.h @@ -0,0 +1,37 @@ +/* nazwa pliku: suwmiarka.h + opis: Odczyt z suwmiarki - nagłówek +*/ + +#ifndef __SUWMIARKA_H +#define __SUWMIARKA_H + +#include + +//-----------------------------Stałe------------------------------// +//kody klawiszy +#define CALIPER_ISR_TIMEOUT 2 //2ms na wykonanie przerwania od suwmiarki +#define CALIPER_MEAS_TIMEOUT 500 //jezeli suwmiarka nie nadaje przez 500ms - jest odłączona + +//bity w Caliper_State +#define CALIPER_CONNECTED 0x01 + +//zwracane wartoĵści Caliper_ISRWait() +#define NO_ERROR 0 +#define TIMEOUT -1 + +//Caliper_ISRState - wartości +#define CALIPER_START 0 +#define CALIPER_ABS_DATA 1 +#define CALIPER_MIDDLE 2 +#define CALIPER_REL_DATA 3 +#define CALIPER_END 4 +#define CALIPER_TIMEOUT 5 + +//-----------------------------Funkcje------------------------------// +void Caliper_Initialize (void); +uint32_t Caliper_GetAbsVal (void); +uint32_t Caliper_GetRelVal (void); +uint8_t Caliper_GetState (void); + +#endif + diff --git a/Soft/Suwmiarka/hardware.h b/Soft/Suwmiarka/hardware.h index e6ff4a3..391afaa 100644 --- a/Soft/Suwmiarka/hardware.h +++ b/Soft/Suwmiarka/hardware.h @@ -9,11 +9,10 @@ //PORT A #define KEY1 (1<<0) #define KEY2 (1<<1) - #define LED1 (1<<3) + #define LED1 (1<<2) #define LED2 (1<<4) - #define SCK1 (1<<5) - #define MISO1 (1<<6) - #define MOSI1 (1<<7) + #define CLK (1<<5) + #define DATA (1<<7) //PORT B diff --git a/Soft/Suwmiarka/hw_config.c b/Soft/Suwmiarka/hw_config.c index 64b5eb0..985dfcb 100644 --- a/Soft/Suwmiarka/hw_config.c +++ b/Soft/Suwmiarka/hw_config.c @@ -141,53 +141,21 @@ void USB_Interrupts_Config(void) /* 2 bit for pre-emption priority, 2 bits for subpriority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); -#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS) - NVIC_InitStructure.NVIC_IRQChannel = USB_LP_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - /* Enable the USB Wake-up interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = USB_FS_WKUP_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - -#elif defined(STM32F37X) - /* Enable the USB interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = USB_LP_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - /* Enable the USB Wake-up interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - -#else /* Enable the USB interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 12; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Enable the USB Wake-up interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 11; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); -#endif /* STM32L1XX_XD */ - /* Enable the DMA1 Channel1 Interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; - NVIC_Init(&NVIC_InitStructure); + } diff --git a/Soft/Suwmiarka/key.c b/Soft/Suwmiarka/key.c index a136614..855bd41 100644 --- a/Soft/Suwmiarka/key.c +++ b/Soft/Suwmiarka/key.c @@ -1,16 +1,14 @@ /* nazwa pliku: key.c - opis: Miernik C02 - Odczyt klawiszy + opis: Odczyt klawiszy */ #include "key.h" #include "systick.h" #include "hardware.h" #include "stm32f10x.h" -#include #include -//------------------------zmienne globalne-------------------------// +//------------------------zmienne prywatne-------------------------// uint8_t key,new_key; //------------------------zmienne zewnętrzne-------------------------// extern __IO uint32_t Tick; @@ -45,7 +43,7 @@ void Key_Initialize (void) * \opis funkcja sprawdza stan klawiszy */ -void Key_Poll (void) +uint8_t Key_Poll (void) { static uint8_t key_code_tmp,key_code_old; static uint32_t timestamp; @@ -64,7 +62,7 @@ void Key_Poll (void) //2 - debounce if(key_code_tmp != key_code_old) { - timestamp=xTaskGetTickCount(); + timestamp=Tick; } //zapisz ostatni kod klawisza @@ -79,7 +77,19 @@ void Key_Poll (void) if(key) new_key=1; } + } + + + //zwróć kod klawisza + if(new_key) + { + new_key=0; + return key; + } + else + return 0; + #else return; #endif diff --git a/Soft/Suwmiarka/key.h b/Soft/Suwmiarka/key.h index b9f885e..994fa5b 100644 --- a/Soft/Suwmiarka/key.h +++ b/Soft/Suwmiarka/key.h @@ -1,6 +1,5 @@ /* nazwa pliku: key.h - opis: Miernik C02 - Odczyt klawiszy - nagłówek + opis: Odczyt klawiszy - nagłówek */ #ifndef __KEY_H @@ -11,16 +10,15 @@ //-----------------------------Stałe------------------------------// //kody klawiszy #define KEY_IDLE 0 -#define KEY_BRIGHT 1 -#define KEY_SELECT 2 -#define KEY_EXECUTE 3 +#define KEY_MEAS 1 +#define KEY_2 2 #define DEBOUNCE_DELAY 50 //50ms //-----------------------------Funkcje------------------------------// void Key_Initialize (void); -void Key_Poll (void); +uint8_t Key_Poll (void); uint8_t Key_Get (void); void Key_ClearEvent (void); diff --git a/Soft/Suwmiarka/main.c b/Soft/Suwmiarka/main.c index f78d637..30c8cdd 100644 --- a/Soft/Suwmiarka/main.c +++ b/Soft/Suwmiarka/main.c @@ -31,27 +31,48 @@ #include "usb_lib.h" #include "usb_pwr.h" #include "hardware.h" -#include "key.h" -#include "spi.h" +#include "key.h" +#include "caliper.h" +#include "systick.h" +#include /* Private typedef -----------------------------------------------------------*/ -typedef struct { +typedef struct +{ uint8_t modifier; uint8_t reserved; uint8_t keycode[6]; -} keyboard_report_t; +} keyboard_report_t; + +typedef struct +{ + uint8_t len; + uint32_t total; + uint8_t data[32] +}debug_struct_t; /* Private define ------------------------------------------------------------*/ #define PA3 (1<<3) -#define PA4 (1<<4) +#define PA4 (1<<4) +#define BUF_LEN 32 +/*przeliczenie wyniku z suwmiarki na mm +Jednostka danych to 1/1224.1 mm (wyznaczona doświadczalnie) +przeliczam na mm, z dokładnością do 0,01m: + +*/ +#define OFFSET -7680 +#define SCALE_MUL 1000 +#define SCALE_DIV 12241 /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ - - keyboard_report_t KeyRep; + keyboard_report_t KeyRep; //raport USB HID + uint8_t measure[BUF_LEN],ByteCntr; //dane z suwmiarki + debug_struct_t DebugStruct[128]; /* Extern variables ----------------------------------------------------------*/ __IO uint8_t PrevXferComplete = 1; __IO uint32_t Tick; -extern __IO uint32_t bDeviceState; -/* Private function prototypes -----------------------------------------------*/ +extern __IO uint32_t bDeviceState; + +/* Private function prototypes ----11-------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ @@ -68,7 +89,7 @@ void Wait(uint32_t period) * Description : Konwertuje kod klawisza ASCII na HID. *******************************************************************************/ -uint8_t USB_AsciiToHid(uint8_t *key) +uint8_t USB_AsciiToHid(uint8_t key) { if (key >= 'A' && key <= 'Z') @@ -90,6 +111,8 @@ uint8_t USB_AsciiToHid(uint8_t *key) return 30 + key - '1'; } } + else if (key==10) + return 40; return 0; // return nothing if not alpha-numeric } @@ -102,28 +125,16 @@ uint8_t USB_AsciiToHid(uint8_t *key) void USB_SendText(uint8_t *text,uint8_t length) { uint32_t i,j,k; - for(i=0,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 Oir%b?XrKEuw*P-D^=7RA literal 11372 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 diff --git a/Soft/Suwmiarka/obj/Debug/key.o b/Soft/Suwmiarka/obj/Debug/key.o index 2721e49f60d9ddca3f1c66bcdcbc1bcc3d7e3dff..4ce64b81586c1a78f1510698c2b7ee413f4bb0e0 100644 GIT binary patch literal 5548 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 a8;yI7^23@R(_F1%DAhWKzO3~Xt^Y4SDIFL9 literal 6124 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 diff --git a/Soft/Suwmiarka/obj/Debug/main.o b/Soft/Suwmiarka/obj/Debug/main.o index 080d08e1ab3f0ce737355a5ba61a4ab65d0bc620..2895ab3ec4790449cbcc38fd2164296965e12b3b 100644 GIT binary patch literal 11688 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 CG7(Y$ literal 6004 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 tMfER=|B{Gx{AawGSMfo`{}a61q0s;U literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka/obj/Debug/stm32_it.o b/Soft/Suwmiarka/obj/Debug/stm32_it.o index 557a1b148503758d9401888cbfd6a4b253dfeb31..0212654502354ace326f1606f5cebc1434d8e5e5 100644 GIT binary patch literal 5052 zcma)AYiwLc6`r~K@Wx)dj-9k=63VtX)THrU$2MsaqB?#g@itk<^&?Fy=;nI&+FoV% zu66frV}}GRgpw9TC8$!%4_-nQR0!Ilwo;`eYJUJiAo`=K03jrVgai`&pr}%jkYc`X z?%dt$M*}0ze&>AW%*?qn=boMQmyew~E~OMflcHNRG$GD4D@$xZLATg0I>gEw;?-Nn zS8gtz5N}hy{ntBV*!Sb)=*e9Rkq@L{oZNXX@ZpjxZ;Dq}Kf1lTatmufKK}4Mv5#QHo+W2ARiQ-=P(J-Q4bj*wj(CI2 zL{TwK#|eqp337?1e?yB#V@1bw=Gev0e`*#&Jc`fEP>C&CrU`3|7}(Pvu- z-;f6Z!{`YPjmzf=-;$$X#?c3SmdnT=$_YRT{T$gQsY1CS$vlmI&1ZiFQT|3Q0l3j` zkxkr!6lscolQy}9k^BUF^EK+C03yA(}Sw zFOW|R_|wHQorB3EAht-E>6DnM`F>28#@@AP7pyp#G;oT^Fu^gZF$oQEStVoCm!m`; zyCE)6RE_?44&_U1_vI*&$q@EsD%|bc74GomD3K`=_T|al=i3#gd^t*F;)H#>pnqC% zmlbyVa+Jt)3j6MZZu)kGy}leJGReZe2ch$bxevr6z8obo^}@cR(A5hCU*eduUyc&T zmE72~3Fwo)UE#DZM~NjRH+-o(zFpy>FDHmhUc`_9sJ4X9i|CA(c*&OAc}`0iFZ zK1BT}>-B|f5;<&$8;}h7pSD(HvZ|;mvujm1JzI3rrkO4kXVdffeA;r$Jx;~3du(gA zm>w`6Hv4F<|E;wboqVZQutmD;cON7E~N4c z7Ob{Y$PL%#=HOYXIPJ+?iQl6+5FWTPnq8*x!laE<$VeNq7T6HbKjTI-xXHp|6l~uyu6^@?3 z#!j87ua&jSS<68Pb%sHz|xu{ATO2)NRJI ztZl}#gmLX4ewJ`HmMh;san*Q^PbNfQV|n6N#86wqCd}$`*|TPWp6la6Ah~wQ#Qu81 zELff;%-L#Hm?R5)0dqxXt^$*it=U=Eemc-fm3-LIaxG`xUNg2-bnL(z%Ly}IDVJ>| zh&eQwH7(C`i?cOv?U*^&D%%ME|8AdzCu)*92M!uQe};l?LE+s6eM>+BZ?^k;hHq^( zo_?(Hd$g`@8jx?Iha1;odkCHW|I3f@1Y;no`Q8f=f!GUMIKKB0UkZhl@x{=C_>Mvj z#y}L$!RK`fx&=0V9R@N@LkRRQAtDgJu+DD}7E5t}Zh_wu(8KY4hlkMjK-DqRK zj*hKhn5vzHUw@zg>BIICdLUE32ESB@V0>)fLk~Yk5)beiI6g-^dhi@uAqTkvQT!N# zeo8^NU}~cJKGpoot(XS{YZI?}oR9Nz&G3A0-32|E1h$X}tQPl|8)KxvvSOi5__dg4>$mmuF_RlDB2c(OEuu1@K}6Q^vke-9QC#1WO zd(eaVz6AMDNdG$IV5 zJE1#PmnXUkYpzb=o5sd_!^SWF4L6BRt|#GJ&xTvwy6eUIOP;!z+~M{{Q-!yB>-jD`k2-~uk~|U yM@p*kyt{GyHLYLQ`b%1WS?lV2vEDmce_z{wuXS~9u&Z;!eEjbX<5NF3q5l__IF&8{ literal 5968 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 diff --git a/Soft/Suwmiarka/obj/Debug/system_stm32f10x.o b/Soft/Suwmiarka/obj/Debug/system_stm32f10x.o index a127e9e65eaebcad888c427258fa704f2576e239..f691052c6621addadadb06e5f345bdca18576135 100644 GIT binary patch delta 2742 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 diff --git a/Soft/Suwmiarka/obj/Debug/usb_desc.o b/Soft/Suwmiarka/obj/Debug/usb_desc.o index e0c82e8957c60cbb4ac7c6f69ca64673805ae6d8..9d7c70ee7aadc83f2cffe852b6519e196d3d2c95 100644 GIT binary patch delta 948 zcmY+D%S%*o6vxl+-ut_cc{npop@W6OWQyV3P)my5L=hxHwNMCav{8rb8lyvH!AOx% zxlm3nT0~J&v=EB2MG+Mw(c=$@a8sLT6$Nc7sdIjFZ`ft-`JTsT&hK#MHxE-+Qj@jG zmnQHdTa`3G0xG6jzLahV08OO~(M~ElDRECFs36RJ6zZS3(CCuYg#DF8lO}&rv(8bZ zPm?b?I=EoSMI}}ji!I5LSjR{VL*~5^LaaJY8rC%dC6K!)Ft>3x%N!$L2x~RTEqd+K zWD?+v@(_)4T$DOl2q77Ty&*?o4d6_ZukTqP8(@zE>|20s1*e&@3p&p%OXYSS1Fnj) zs+|tu3g%XcwF)eAHu>tcHR8Y$Ze73)1Y8Y-f33;P&J_HF8}-dSI1}it4Prs&i8w{qqX$o;FwWm4i5|!MryI$sKlE_w>>!I^{ZM$ zZi?(Z*nW8bsh!2XzFYx2<$2M93vz=Hm^3fptl5U2%tvAduUctmB3vFbhVxd9d`_2a z920gDe_L^}8>4o;GZCR>6BNTOc8%<&70+YVPRq0ba2qe$Y4I9o?dm8MP7tP^pSWn( z%O<+a)2iEMCmtPi0FKZ?;zY!-%c+*{LI6*3%BjRj=L3$0;v)Lsawsbj>gLh0dWPYYgD6AHQd%)4u!hAJzmwiiY5>^{mSPcKC4zYZ4&u$0u2r T15B0U1YBol1^o}W5v}AeQ+kSG delta 1005 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 diff --git a/Soft/Suwmiarka/obj/Debug/usb_init.o b/Soft/Suwmiarka/obj/Debug/usb_init.o index d5adc4e974ed71c8e7ef2d64fa751fa620b3ef66..b5860c20c2bd27aaa33cdf0a21555f7cf5662311 100644 GIT binary patch literal 5668 zcma)AYm6jS6~0x~J=0V3V0K=+><-epyY8^;bnlC0U7kHXy_;rt9(K=wYlNn{yJn`{ zp6a2xdS_+@7g!?@MV1%|F$9S6Pl%{dB8Vtxc&HFH;twD(z9PyGBvCPt;P+MC+g&qC z@MfyMdmi`PbIv{Y*6lf+Id)jnG@+U%MnsDeVy4@dMECnJA_hgDxcR%{n;l2Zt2SRB zJGy0I>P=nW?6x0``83}VaJMYnd*tRP#Z$`edb~R#gzhsV+V$vYcVpJm0Y{8WZCz_? z1IzdeXnp6!d~31aKvCDDp9E!G1F3#sngYH31*-OuGgTxf67{GWX@A}T#G+p(GuFNt z8j(n};&_x@Mg2(oNywtt;MEq{g?IZya8EN1J%fJihfoo*r(i^jokmxW-2AGFz^jgC9u^suqK6JD6tk-aMInQ>~KlJ-oG;eLh|^{u*DA$4OwMa+xo-Aw`2 zX7+R3>0n&U+{5s04yX<@&vCZ|lxdDp^VWdsG!vAa38*gfSCoDJ0)M_D65U6*H^!<7_~6nct%3*K}y;TYF6q!gwU0 z2F!nQ++*kYvQ6f9IK%gYY@nC`&N_78GWu2#lYx`7)O|wXD)(X#~~QqX8iOC2+Th-pl5@Cg!xsl zjOPL>V%A7KA5bx~%YDtYCF2J{T$I1^$m7IKi0C-1N~Sq zJ@wDosI_FhEtwD-2E~ppln?#E5+%eHU4h>_x){}!ZTE~pJg`5QKAP>nqU%yH1|OwN}|Ny}Xvb!v`1YFouha)09D#9oSGpUvcF@?zO{(`_tyg$b*ELM#RDdzMqS+;TxCqb>^XGd{PHnJyF?b91)q zXKzuCm|?tGtXmKeV>tp(Jh$S^kK6T%&k39Cc4Z!a>{N_*2BeOAk@Y^7^Ut6UASMoY~gj!e$R z({X=C2rN;_MzyhS8uh}|?92yjfqY|mv0}L=tYp46=Ovq@$V^w9vc1Cm7V@*{bS9sd z^|r(_lq1>ZX7P)3YHp5OrXY9NbZ%<8>D~YE*{>Vs&`&@n zmz&B3%e5x@TqZwzY=%V^m zYEam5rL@j*WGu@?^POJ4+N$DA5lhW&t77+07cSi7)C@LdYW%nW_>qVs>GYxaNWRu^ zOSZcjPuI%!nC+An;>RkU9pAfq&)&rDkBuJKcY!Rp)LtBW7SCj%jqn6a<4CesMkn@( zHnV-AL+^_WXoK2DW0Q8Swpsg78$ZwZ*ogPgG@;+v)733DfmV&5h*VGPHvLOls=FOT zqQ1K5Sw*1d2DqSlu3b%FGEXGR+#ZP{YA8Ww*)BHbaf0K7l6|XKbnTOhs@6(jMa#9E zd88^dwpwv)rH$!CqEuU4#2G9SsoX@u@^GdU8{XP6bFQ^$t2q82JReH@=HZ&*H~z*7 zeQ1iH8%2V4fv1|%yA}-9r|dZN;_S$# zWXC~={d;#1KZ(Gjf8;Cwme5yY&=sq&_c}YWDOnYC*k0FAkWbpfjjL(zM)Wy``C%)f zo*!P9Kgw^z6V~g&2HC>_vQft8EFP>G-SpcP(A%d7Aa&Rt!lU}6J?QOXM>gfcgP_B4 z3?PnP@E8YC+QR_V4bQJqR;<-XxO57;Kl|&?$=dzB266G#* zyja6T93MVn2>$OR#CZ}wOvJK}NcpJ5LlRRG4@=BT{DeeXVpU>Y;wg#DH|M`gBKHjG zZ%E{xB>kAgCnf$w;!6@=k@&jAe@TpDu{nOH#8ru(lXzC*{SqIR__)O9B)%;1j}qUK z$U>z39*M&eFO+yd;+Vu~iPuT2N<1a;c8T{$d`RNACH_d_ixOXz_)#1U^ka|2%OoC^ zcwFMV#D>H(67QDyfW${6{y^e$5?>->&Ri7mpf0l?t_>82_5>do{edAc;-ld-}OXPWtpRWGB HjQsxq2*7=8 literal 5956 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 delta 2282 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 diff --git a/Soft/Suwmiarka/obj/Debug/usb_pwr.o b/Soft/Suwmiarka/obj/Debug/usb_pwr.o index c6b32d22772f0b122d3bab2bd6ef813318d58e2f..2cb37320758319f75a38596753bee38549e453be 100644 GIT binary patch delta 3601 zcmZ8jYiv}<6`r||y?fX8#ooK?C&r66fMM~2*nq)ovB9roF>EnP%B!+XY;a=MYhsFt zXf~v3lQxjrnMjG6s)eXh$wMf?sggcW_*a@%Z9#3+lC*WzA5{=YkP4BMH12oqo;6NJ zp83xAoik_7%-nm|pKYAnFd1>XT|v!k@}Ne9MexnWE-j;X-Wj`d)QV|;>`eUkXnDFL zQ8DqsIWso#7y0t`Pog)(yT>&lPNTn#{u}h`=&mkAOQPa{i1{wf-u`@cZDQLEpH`k8 znpq9Ygw;Po`YJF3tN|#s^1cUVYGG;Gu5=8jYvoJQJu@|l-B?n;Ioo*U+>*qu^gSLI zvG}EGp03LE%BplJSO8ONW{T&{a4{nYt{%`AyJ;IS0t;C)K3G(e`kuZhv&j?!WuqBV z!jLH`#LMW^Ca@W5n)IE3q+fuouUP9T{>Pzcnt7YFYvf&%B!^}#K^pyj8nz9PVwer& zzC?k^aZj-h!>##EUxt$Stq{O4%;D5H!mWRRnZpSDDY}mai{xEoknBHUtdpN2$o?2< zj26$<+ZGgC>}6v4?2x78&<~llFF^J(AYfqJ8!wM7PQ=kB-}` zah=9CZy`PUv=n(~MFuCm66Mi0y_3!p*5|0tJANv`6A@Yi+j22@9$L@y=pt_ud1`YW zTH5m%B9BhRqQ&zs(g`HxG{BV`Og+tQT}GQ$yt6 zqOzKelZad(eX&0Soz+Mq90U83Lca>zS9bw=;bu~-^(Me6gCLyC7^O1?Q*)L<)`k8Q zB&%(P;xqf;kpAi(n(zy6!b{$S9&bV$M%{S^qv2o>rqhjLe9kA7LFml@|H?wlEj$IU z^w)it^5ASS($_^gEf6&4MaU1UQyEZ-qo zNmgA!u)Us~QbwL7ZJAeM_8=l3l2YR{F=iEuo|45KNgtI zM_wc4-m}xSwojK6swqF}=01TmEeN+J_Na&R6Rn3IJybt1oT{&@s~;I2sNcVDUw!|f zgSDyA)L`vk|G;p4Q{CFSd&xcb_XYp7zo1u|yW??x&vc)&NBT!bQ~M+M08amML0lGj z>~QMQ;r*$>he%ep3vbCrb-iefB^UXsah|Fs_`GaZ=Y#F4!tGPfxc8~cZZXRK$c@?; z%W%#p*;V0CmH9gMDAeh&tG0v+SoxDk8mWwYwsWfRY)1~&~q7%!KMtfLu!qV5WT9c*o{90HsAA| zA|Y0JG1-B9)F;t#6jX}W-bP#_oox6g;1rQ-*Wfv$`a^EzDM<78cLCKUp;2{(s;H#G zd_E||n`%`_v|zFrYv3^p!M9NL!xzC#o>9k3l-f}`UVQ+*Y?A`TiznuB+Uba{0;T2N zmxtp}u9Y)A)V-s*E9qY-jx``s( z$08uvQk^fWlA8KkS)zj;4|*ztILF6;Q|QNVq{N?uO<$Xw|5@-{qjFB8x53}6PL@yj zlcPrl4{aM7QY{trOX>3$s1{-e5T8~t&ipf^)=@ham|Is`<&5== z^uG`Jy&qy=8}ly4t-uTg>||k(@e#%`#v_d1Wc(K6bBw1L-(q~1@jXHm|9i&Egdrh5 zWdAiC|BO)qw>jVr<17dI@V=10fDnm_7{i1}6l4E7#xBO4goxkEIK=uv=3|V94ctE^ z%5cE<8DHRlml%Ich`3kS{|@6t#`hWj#dw1d|L)vkuHi>S!>dtBh!?P$5F4w{kb&2% xiG?=82)}OlMAC~+I~k^j42T+phIg%$^(N-c%#+M_FsGjhicd2?!F-bW{{eh&s}leK delta 4072 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 I?@<1K0H5M54FCWD literal 26228 zcmd^ndw5mVo%Y`6Y{DTII9$Yt)E*HP6_TKoiGVaDArL{p5EUvl*8_=$BqS$X6!aLe zM#|9O(CP?n(Naq-RYYv9prWOgwy20sKSzBm<1j6QOdH#1t)P7GyVh^*vrfqI()s+O z&$pjvpZE8!-(_9)+H0@1c6M%=I7nROd?WS1nTr}isO;g>3Xy0T9l zZ)S>kI^Fp7x%_V(v)_BaHKSm#Rf{<(e04f~10@+HA1v7wKfYr2(c6N-cj86CcONf$ zqDNc!?X)D>PPa^=)wEsjF+V^K?Sa5M@xs8nj~5QAyKBdY?qh``x|##)cRbONUUb)v zyLQ-D;N$WPcJHa-HA&>`Jl(moJ!O4Z&U3mC6`j*n5Ztt5S4Xfb9Nf6WxhQa8H6)!9 z@lzs5Nv@}N`3RJcr3;~dbgKRlkDomG$$7?+XS2?sJ3d$PgrxH9cKj3vDW5LS_+zUR z^~CkaE;;$vk4~Zw-@0psdr`(q$x%MIb3}K%Y*=O1p=D#?`m^{?e{aD5%D+JQ7j_pE7Iwwen38ywewK2WI1b|M`IK=~`*+8SoQtv#B;T98 zw-jsITS-%uQ(xbL;Ae|}Y7KOJc|In_6xA0#uB40<5BzLJdeNu5zGv3Gj{Z0x*n2-T z&*v;Pvl&*x7W;YdgA z!%A+d8&)~!kg^SGTbH&6XzL0+UAI)%o^6l1qc8nSk6A#X9cAvihZkbp=ta9Wb>7mM2dMIphw}|bq6555;+&1f_ydF7^ zvF>ACw)1;foGTW`lkT2fR@ru`vLVGP+i~0#rfk|)myNb=(AZ*Jg`Fu|&oRb~QF^5{ zT<&&rZ|J_w`~KAS?OBJBQisnz0+>2{(g={M4$0%B8L>!spB1H$LfS z#s8}@j^!BEqxYUJS6sWM6F4v%BYF0r0X;0UEK4&gYwJMJJv6(^37-0VWg8^w zVCF2mkIv}1iacdy&)KM+W0^V7nd%`f0US>b-ir)^C*8>ioE_e`P#m=%znTlf-@AqJDv~B#5qrRvtS1> z8|PNxdw?Tx9u|HAn1^!|HbW-?=K!YzHv!9m`+=3ff`H>R0CxhH1H(bbVQ0ju$LRz% z12+Np0hw3CgDr45a1ZbRa6fQVAIEtW7zZ8(z6$ID=A}6f%TfmnA zzaCk1;+HFO{P17mPkU>i01l+Wr>wta{{40SD}o-O#B4$u7M)phK@4jM|2xo&y+yl{{ji#%#=%RVv5)IZjw;n zJc8GEDH8i!f}gYv`0;}0@PeY<`CEoO-M()_3^>8fAi)d12@-Pe!>^lzyl~CkuW05WKK%nF>L} zW}NJUZn}FtHPkGMPLszHWtPZeFZ0-= z@}S$Vak8VjKlWYsB=Yzn>+!t1A4UbxZ=&IG-|%^pM+x(IUh>F%4UAnZ>m)Dqi%fRQ z*>~LuPPY^`x>a6FiuRg`HVal;aO!Apm}vdoqm2Fsbr*58$|POqNBe`0 z*3|DhWu{qU)-5c|f9u#w(c%xYeHyN#NVtE@RNHsV~# zG!`YSE^Wv)<^$cES=}M7%dwN==1!W9L83MtVoWn{gyM0WgH(eJRq@$k1Kk%`yol@4 zokQ+1hG_OfMEnp3p$H>ghZtdnn1)n$wCmEHqxDGgjrh@}7;QozxA)jM`L0Vd4(JPL z`kZf?Z<&@+Rph!f-*sumCx?gA zo#va)w@f1}Ypv_jj1QMdG;Q%sYkkuJ?xie1lfG;;U5GPA^ZR`BCd>SNcFP;JIUiS> zac-me0pI*a-+Z7OVwrDuU7Ed#^Ds@1`=+;Brf2hNcDn8%n4N`zb~w;I4?nskIxSN^ z2{3@T5tuE+Sx(a{ebbGW=^mE%0oUcD^C6sTX}Z!keZVrkm{A{bT|Qm;WZg^CANZz^ zSf(#9>TcJi86UnUXnN2$-EEojapUeoKZn^m5jQa1x9bl`I(KttvZ*pGz$AeI05l7DmNev_^;JU@{kTI(Ekh&4Rrmu8&bZKCO;zUg#h8h)K^IbBK?3;&3v zGPDIv!U>^UjB)&`F}<($y>BqyXqsQLX_jhpnsUCnlIFMj=1YC^f$pm`Zx6UM1-1p%O!c$-O)&6yF6rJv9tHlQ$Ewc-nT4b8+ z(U6&rG?o44v7b6>JzQ#A-VVS?qF7{Nw z-H8g)lxvp#H2;}z{*-S%(0z=3`Ne=svxjhcuyX(6o4#mF^(8Qr!+bl-^_DId7esI3 zoJ8-*=n1D)*HJkWg$S%~I<2}P!5RlWz&sE8Z8E?Ovdn+dp}3~vk}1YeUq`6$8N8AI zB<78Skd8@-DVGlRXVJ!-ptz5?)=$_kua7M8Inf(X4gWND4b%BviM#f|$ zp@$E3g8e6COw1@93@1s)$k^vg4pY)RH`qTTg9a{W-%+q0juM4(+%IQp$MZ88wjk~9 z!c3a<>*EIupf9KAI0?hj!M>^EWY{4r4TEH6pwxrVBw6E0ZbgXabYzO$7KIdol zh!&P2^(h_9A`P@n{Q@!DL6Vyo4jzDJVk->M#i7Y*h!sL}h{@1|$CopC>D7U&s>oTO!sI9bbK zA{UqN^YbA8iqXs^mm@ z$RE^th1<035%(xLkq7y+Ds7d*y;}B&&uKYKJgnqI9^}8*dWA={>=92WIgtnXM_RAY zK@Vh|6>2#g0CMSTw=37Q7izsiuD9t&DFp*1I+mF0V>lK!3*&|-9s>K4imXVwf)FPs5IQ` zKrUTbPU3l54imXvwf)F%)Ov+0wd@hOC}%$-a`9^Wkss80g|BGYBmP#)VIo(uwjcS0 zDs7d*(OUM1Ia&@AxvaJQ$lJAE;c6{=#II>NOynBZ_9K5y>lMDCWsmr#mcv9Yc5OfM zi&fexh2ymB5yxveOymOD_Twt}daYO3pkmme4imX- zw(~m#{+8A&JgjAp_!+^i05fJOyq*v_T$R=daYN;B`EtD zu~ExmB3IY8AD7WPv|iy(EqlbDXgN&e8rt?FAEeT7-vYUwWPZe=B>Sa+t{Fx9!&j{%5UM*sW!c_@0)-M6RlBKk^AG z4bNTRBrSWy$yyE*xt_ND$lJAE;c6{=#II>NOyt7a_9K5v>lN=7quIh)9JIsE+bnoH^jv|iy>EqlZVwVX}l zQrPw*pPJZE3o(v8lDD zJ~!GBt%Zqw{YKd0VEWQLfRr@~bH<;tjzbu&Eo{OJYLh3>1FM<|n8L_tY!Ssdm*9S8ewuKRc>n08g(d+4{0T0^57uS)N&9gyqy3ZgOBYSvJ^7(v`sIj*QmCKM|3Rtd>)*hL z!OV)#@8jVw!G5v%A($bh%}QP zgD0i2cAqg9`gHz1KCE`Ssyu(szASXvWF+isn;g1pa%eRgZ|VB8aTTx4-F0>#4L9G^ zITgi)SCv#uEh}@X%cF~%o${tdiyETE<+G<%l+AOB8lqJ#Q|A;nwN*Dn3)>bh)G0F@+S(Qea$)(D!kJT@*1D#aScGrimz6~qU0v1C7Io&*l6KM7R;RW8#%OFs zbJUsISliqL!wMB}ZmcTS*6LK4LKT;m(XVJ$xx%S)%9o3YidJ0RfD(-@YHDLnvkDuU zYHny%8O=zRqPb5h(+fvt7>-IP>}qJnD#0cFKK{^ zqVlqe@_E!rB~=lm>dRQHC|f|4wV|nTQAGW)4Vr7&3RITNDsz^Vv)&-ZQ;LhrD3s3i zt0yY7x2js6YFCv}x!=aUx5C1NY1wkLczrEHn?S|&ElyiwYyG0eXl-h1b>)f_wi|eaeZm7zg+q5v2>r>U@mt1U` zTwSKJ&vVT@@*cjLZ3_oQv(=imRh8mg-6%%g{M=3+n!u6cde8 z#?I8xAU(=ztvsEdN|AQA`ddP)dZQlzrBhWg-E8(% zkP2OtirHWgc)_u(E$QIzx1_!*tHAv@WZ!nP=rA zjk?}^<{{noF|nF^q?=eBNRQy`E!Nf)K6{WpGKJ6K6h7S2ys(FlDFe4H*^qV_jE-BA zGgIie{g~53$EhR_ZZUF;cuN1!>VV&}n93`yqqY`5PR}jF1=|0Pz&c!+Y+f1NwhY0o z!Jc`WGIRT{r_SWdExvg=Zm;FyR$gy<6PsIhTA%1IM#pWrR61_GrP6VGEtQU2XsLAE zCQGH`R@it|&r{3E?XLV3I&Nw4l|gTPf!kK8bljRMN#V!sr&Ky_F;%AU<2F(%9k+^R zrSRi+P|xe14O<@E@|h0ot$y6rNu}e~&7>55+@49L;}%RR9k*E;6ERf}H|6A3%7zp= zZkH4%bZX2pe%umCrQ^1TzUNNu6WrQJRd;S*q|$MVB31pk4UtO6t%gdB5po?Oyt_>u zxV^9^QNN^i;g&%v9k&Hi)tyWKR5~v2|PD-w-u5O7gH4Ia0+pwyos&P>iQ5j0xW4RtR)+mURQ`59~aTHU-oW`bDGzW9G zF|Dzxnj3UUs$#L0`s%h=a*Ty7Rg3Wu|Fp*!VTjA_q=^ID$lhx3B>hYvZXN&d=Hg{D z*y%XwPdoB+g=5%O$8>CM*avNST!fSMpJbN@8~W(&5cGS*>o5fArhMw}ps<78jx-(z zhTt^@98G@4ZX$GcJu*=b{(Ug(!8S1Um<8GRLUgtcb)0)~kC?;gE=PhLZ_CxF7w$pE zWBp7#zTP!H5S_x2j?-i%7_qL0-6LqwZHQ+MW4Ek_-B&RQix?wI*9zG#-?nNztC7a? zF{~*c?@fkdjv($R z`X`Pw6+hx9==dCS^x-OfzM&{D{mU)RK0D9i)Hhh1djH~!|LPw44vW)&i^b``)#B9e zwm9{BEKdC)i&KBt;?%!yaq3T4occ+AhtTyeusHSGElz*V#r2`vXRqHcv_I#}wthG} zl{&OOVsXYF=XY>ve~VMU+~UkXZgJ`#w>b5jf9XS)ugl`pa}H+fN2ez^^_++4L;L4p zo@6-noNpP<{9_iUo^vjJX#dA8PCe&cww`}mXE;U9y$o0Nw>U-4zij<(i&Nwr%+{Z< zxDx&6h%Vnai&M|JnC;)mfmI#)`fxsGILlYgA9ZLw=VXRc9Kr!b9a_(Mnc>vWvpDnT z+)N+3e48vzJ?Ce(KAVG|I&^%_(F`{dF{qvtiIkw@UucyWbo>h=T(y?(5L8bXpCX=L z5V0Sm#*0KMN9e>6^mh_;TF~(esuF_EV29Hcj-e5pgCGq9nuBr2;yfEC$7|{@1)78U zIXIaX!AU*Gs`)sLeI?{27GDJUPMi^(v~LFf5T~(U0r?r6BXLrH8}Pqy8vQ>*{t)Md zIH~_v;03PUKOp};_?6%@MgK7H+u%9Ee+GOWJSO~?z$qAC4F5Oq$G{he{wQ!D#uwxN zKJ6`@hFD9$=ZXDb@LyRx0)95eAEW1YSSu`^5B`$HOTjO|W5w9>9dzv3xn;Pg;Be_}?tfPx-!t z+o)0OuL1u)_y*y%;FsdIDi*#3e3ixdx!yD2=6Zhv{7bm)OnElb-r|pd{{q~U?^$pc z&3>6h>&$6Peaanz1ZADFUb47E@ zSnk@UR_AexS?wvq%pl)LaAVlKi_ij6y!UEw6a2cU&kz^5#AgRDt~6 ze(_PSg%YpH%v+-5cW4$%dPiaW%nJ)uA8v5-6`5)TLzKpT6_I%5#US$jXST{t`NDJgvE(&H6@ykzlT^*PVsUQVyVjfR6?K&b=kUku;Qg%~3-%&BxD2XNfR ziVq<|pDjEhI7)Cd5&Asg9J?8xV+_*^gma8y`b3a=C1AiP;P z$3o__T=+`iap9|lcL-lAyi@oF;r9sNBz&{*EyA}7-zI#!@SVaR7rtBg9^re1?-RaX z_yOUs2!B=h8^R9>KP>!+@MFTegm(*nU-${(7`|0|dPKBONO-33uyB54Mt!#M;ld-r zM+)bA4qiY0IX3O{gpU)>xq!Ov!V82K3!g50rf|L+p*{ahoAEeTAYUN7Qh2TKI^hk% zn}x@OFBiU2cwG2u;T^))3hxxYLHIqwIp<(`HVfY(e5>$n!nX_GDg1HayM^x&zE}7@ z;roRj5dMmAOlzFL486}2n2mV~Iq)>WGl*!PF9@DZoTcZEw96H{ae~tYuMp&(7VRno z8w8gK-Yj^#;95cM4bks@LEZ=C4+%ad_>3U?Im^j@PGmn1%*3B0i=J~*`oAmszX@_) zOgj(lL45`h{sRO#H>Lgyq8}reFZxM>1w`0Q6TSL00CCi(0Kl(^zDo4$SImd~ipYLN zf6h%=jx~bc6#c&na$Zh5_7B=|Zc2ZCGfsR|^iPVO^LE<3D*87B4-paP52F90r2kp) zJ<)R`ivIlt)&GD1zknR)7{Reb#G6QjeuiL~=&u(13K4dkbJDIwuwC$O+E=M8r{_Dj>g+Qe~V<%_;l@Jg|}N^m|Ab~U2sxB86BcfE|KK9c};h}~VH z|DNE(V)v-vPl<^4jOY&vs!u2oM}0B@d`s+(iT*>uJ{Y)}Z$H5-BI2D+M7c%@s?RN8 zr#`Cy=8IjS=;sPvON72cu!e|ui$#C4;MYXIMsOVwcK3+>hk}oY{xQLy5n=ap(Z3@2 zhUgCos?RE5_earxDA*s*M%HT>5#>~$Spe0i6|f&I`pX2Tie0JT6-3xwBYO3@1>!9e zev8=MCU^%C_UlEzS&-{`mg7kx@_$C~7ev^~Ueo;^TWrC%mze4azBJ8deeS=_3 z^xSV|+?7PwsZTKw@0((`Mes2}?vK#^8Npu=;rF8G-xU0l;9rTXkKjon?E7Kggyqf_ zyg-oqE405<@G>Ior-^=^V6Euu1RIF3TPpfH1ivBre-XT!2)p}4zg_TY!54_g|DfRO zl73Y99|iv+=^plTXde>HBBEZyg+~O>m2~c>Q(qwI#e&m`C|8;2s|1?`Zy_R|+XOo# z{chnK1vg9jqk_96{b|9U6OqsJqJKm1ZNU$S$mb)$U?w=q%kQn3K2-2bNzV~fpMXF= zS@ea(nOHB1{;PuZMA$7BTtb}bI5!cI&sxEIh_KrvxS2Q;pBxZjw@dKnMA-dO@HfPn zj`MFs*c}#pSCIQ>wC^L>j|lr*BJ9;?AHbQSpCicshCsXP#BQFX`pXjUVIWSC_V_{_s!0cm|_3(&G-G6{pZY_ z`J?dp*31gbVk3|v&w)Ev?c`JW zFA*GfA04|{Wo*(YUI2(3rgHZTm8km>m3KIwTsDfgpWwUFG3d<$qEWZjSVp*4=*G;U zgnJ+6vFJ5;da56S8c{V6j_yhz`Kk!2%Em+W6pSfmG4a=pliXQ79xt;<`K)2b;+-dq zlO>(iy7+20`IM=|DtrSKO8b%4tu)oG)a+K8>Q-7ve8#9l-9pQf+=lpw7kh!KN<9OJ zj+YG)l~qGQUosL51lhM1N5|e$gejW^M;&v52hye-Ff7mM{jA*%~e}^B(|V-=rge~Pi>7|fe!VB z*crXzJ*fZkCiEVEJbo%Iay`25(@*(F`nerkOE`Rxhn4=)@1Kr`8t@#F_QKVNxeJTJ zeArE}_34k{tiA^=9HH+n2;rQ*G5te4*O}g+ej5?V(``qXF$KQ9n`nfOAS)u^7f3(BC9- z+0#(b0lP9|MHiB}^2?a7D`uXIx zbRJEAh@zX|>(yVt_kBv_to}K9(&c(a^)JbsK9TBGp8g;;sN(v&)L=F(yb3a~?#Sq# z^q>yX8P%hk>7m8zAWy=2(J#Nda4=(UNPy%IY~VHUr(t3KBOClDH}Ge5A-GYugI)TQ zU{}X{!dU1Xh)Qf0IZW&qX%TbXcazv6@+SGEBIk(%xQT!cUK$oJ4vuWrB1#yJ6x@j- zms>0l5xm{{hr8I3aVy+x@m7oXTD;$4)#5`Ik6Yxm#Rm8ah}xpLp}}9X{B0r{de`Fn z!~|~Lk8Qx$*1?O8ffr4H$dA_ltHpmT1~>)$!!1Ov)M9~{5V_j=Z?Jfq#RC>A#M@E8 hyh?l%+*}q~v&bXn;3!^Vx!EdvG#SS&qn{g3{x71?x%L16 literal 4340 zcma)9TWlQF89ps{OHO=2hDm`gV(v?j#6Ydg43h;VGUu9@?UHtHk^AH7rPbZW?q%cl zOUB1H`g3>x^VwY^H;}tref!2As)wM_>X+XdfvyOnBxPVpJnwC`WP9>2=|hIQKUoohS(_=R9X0;PaS(is#HZ46KC z-*|jL8*NF-|6p3vh_W*SXA^z3tdYVj-d9AoORMUNiS zS@{j>qnG)N#FB(~Y|6Lh5s!{S?}#km8Po3Isb#e~fTH@Y#kKojYBMrIFGq8duFvr3 z{4uo|Qs}R5cAfyMHuI*m>YW#4jEws0H4)byp?yITk%S|z&^3!%KG6lA$nl9T_(avN zUo-1lK9MK7e+JWtb-YHemM{U4GvASh&<<%2C;PgMXg-Z7b zBYCF#@$R`k)Cv69tkK5=Jsk&-NhOvR6A3@_Yl*o&GM($VHkH7#rnS#U-kM5isMQ&5 zvFlwzbe-B`b_Zs3u5Ti77F3CL+;?CE=&dYQBu0EaLgdWrVw0*A+T26BxFT`f*W<)9 zzTQu~D)r5NfE3z4L}5MRtG*s5{>az+iCi4C*Q$5FwDAzFF0{6+^kNNl@iDWs-DD3I zMqUuy4;iQKWs2^`knPy!P|dQNTSM!1(=3*(A!}@WY^Yvtdov}=&ZN`-BR^BKO65$m z;bttmTx(WLk=d}lOl7-qG2=RyY^PDSGG@&zd#+Ban9J~J2863s@b z(6DOhGW*`}DmYo`Dlf6JQwsc z=@HRp*i(CRs=2mix_Rr8DK_V9&ve~p-772>8y7_r^y7t4bLDE$6{VT_WToQD=;#Q- zb1RF5>yE81jFjOTzt-xA7XGX9GGQ*AQYk05Ln z=Q;bLxJWm)H@spA=(#>tmFAkYG`i`DbOnne(xpa2q$igb)9|qd zqH7K+NxfJqx#o+?syXFwV$m(y>n2!9<>%u(nkpL|5$UqCv0-8v(zfH7Y3$6QhF2_K z^m|hDJl85Uy}cZ3ZgGRx@c$`aK^~5pz~wB3b9pP!3F?O7i>EW}KOh9}w|h}opLubV zhXdOHQsNATM46Am$NVqL%OZz$t9C9f2X~e>O9{CXDyl{Mq@0-w79jM}M4Cp46Kvb*>Tj>lvj|t*C zR*8yj!l87=K1E)NN+2rMfF17Ndk2NUPxg=JO!bfN8C3_WIE+Ae?Np5KsW9J%AmcbW zUVhamzPF&W4%d%ze^iJSMFN{D%ew)pygC+P7(OK`?>BHzSMsjfuz^Fx{sbFSQ4i;h zDg&tU{ua_1z6Czcy%LUt@>i7bct65;*;kJDFp3)QA?Ru^LltLn0r3s2M72v)ds)V? z2w6C|r^!h^G$Gpz^JOu)e}`X*;#0Q5us0rwj zW@kPYH6#XZ5$3n0L-O%X@x|v;7G4Hz6`CP;Qrl&SuC^iLdwXZdFZp(gv9EPQ&SW^= zD>FF1zHkNGV(fX-us>YYwiu#MdN>OlQ!nP{!FE`-mfmO2z}+5!1ol#3{}*F3Vxa&4 diff --git a/Soft/Suwmiarka/spi.c b/Soft/Suwmiarka/spi.c index 6e4acd3..7177ca2 100644 --- a/Soft/Suwmiarka/spi.c +++ b/Soft/Suwmiarka/spi.c @@ -1,13 +1,17 @@ -#include "pio.h" -#include "error.h" +#include "spi.h" #include "hardware.h" #include "stm32f10x.h" #include -uint8_t InBuffer[SPI_BSIZE]; - +//------------------------zmienne prywatne-------------------------/ +uint8_t InBuffer[SPI_BSIZE],*dptr; +uint8_t SPI_State,Counter; +uint32_t timestamp; +//------------------------zmienne zewnętrzne-------------------------// +extern __IO uint32_t Tick; +//-----------------------------Funkcje------------------------------// int8_t SPI_Initialize(void) { @@ -17,6 +21,7 @@ int8_t SPI_Initialize(void) /* Zegar GPIOA,SPI1 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE); + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //MOSI,SCK,CS - wyjście PER GPIO_Conf.GPIO_Pin=MOSI1|SCK1; GPIO_Conf.GPIO_Mode=GPIO_Mode_AF_PP; @@ -28,28 +33,28 @@ int8_t SPI_Initialize(void) GPIO_Conf.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_Conf); + SPI_Cmd(SPI1, DISABLE); //Konfuiguracja portu SPI_Conf.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_Conf.SPI_Mode = SPI_Mode_Slave; SPI_Conf.SPI_DataSize = SPI_DataSize_8b; - SPI_Conf.SPI_CPOL = SPI_CPOL_Low; //mode 01 - SPI_Conf.SPI_CPHA = SPI_CPHA_2Edge; //mode 01 - SPI_Conf.SPI_NSS = SPI_NSS_Hard ; - SPI_Conf.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; + SPI_Conf.SPI_CPOL = 1; //mode 01 + SPI_Conf.SPI_CPHA = 1; //mode 01 + SPI_Conf.SPI_NSS = SPI_NSS_Soft ; SPI_Conf.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Conf.SPI_CRCPolynomial = 0; - SPI_Init(port, &SPI_Conf); + SPI_Init(SPI1, &SPI_Conf); - //CS wyłączony - SPI_SSOutputCmd(port,DISABLE); + // sprzętowy CS wyłączony, programowo ustawiony stan niski + SPI_SSOutputCmd(SPI1,DISABLE); + SPI_NSSInternalSoftwareConfig(SPI1,SPI_NSSInternalSoft_Reset); //bez CRC - SPI_CalculateCRC(port,DISABLE); + SPI_CalculateCRC(SPI1,DISABLE); - //skonfiguruj DMA - //odbiór przez DMA - kanał 4 - DMA_Cmd(DMA1_Channel4, DISABLE); - DMA_DeInit(DMA1_Channel4); + //odbiór przez DMA - kanał 2 + DMA_Cmd(DMA1_Channel2, DISABLE); + DMA_DeInit(DMA1_Channel2); DMA_Conf.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_Conf.DMA_M2M = DMA_M2M_Disable; DMA_Conf.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; @@ -57,20 +62,82 @@ int8_t SPI_Initialize(void) DMA_Conf.DMA_MemoryBaseAddr = (uint32_t)InBuffer; DMA_Conf.DMA_BufferSize = SPI_BSIZE; DMA_Conf.DMA_Mode=DMA_Mode_Circular; - DMA_Conf.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR); + DMA_Conf.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR); DMA_Conf.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_Conf.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_Conf.DMA_Priority = DMA_Priority_VeryHigh; - DMA_Init(DMA1_Channel4,&DMA_Conf); - DMA_Cmd(DMA1_Channel4, ENABLE); + DMA_Init(DMA1_Channel2,&DMA_Conf); + DMA_Cmd(DMA1_Channel2, ENABLE); + + //inicjalizuj wskaźniki + dptr=InBuffer; //włącz DMA - SPI_I2S_DMACmd(port,SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx,ENABLE); + SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Rx,ENABLE); //Włącz SPI - SPI_Cmd(port, ENABLE); + SPI_Cmd(SPI1, ENABLE); } +int8_t SPI_GetState(void) +{ + return SPI_State; +} -int8_t SPI_State(void); -int8_t SPI_Poll(uint8_t *measure,uint8_t length); +uint16_t SPI_Poll(uint8_t *measure,uint16_t length) +{ + uint16_t count,start,end,remaining,i; + + //oblicz ile jest danych w buforze + start = dptr-InBuffer; + end = SPI_BSIZE - (DMA1_Channel2->CNDTR); + if(end>=start) + remaining=end-start; + else + remaining=(SPI_BSIZE-(start-end)); + + //oblicz ile danych zwrócić + if(remaining1000) + { + SPI_State &= ~SPI_CONNECTED; + } + + return 0; + +} diff --git a/Soft/Suwmiarka/spi.h b/Soft/Suwmiarka/spi.h index fef3ab0..45d47bc 100644 --- a/Soft/Suwmiarka/spi.h +++ b/Soft/Suwmiarka/spi.h @@ -1,12 +1,22 @@ +#ifndef __SPI_H +#define __SPI_H + +#include //bufor SPI -#define SPI_BSIZE 32 -//zwracane wartości -#define SPI_FRAME_READY 1 -#define SPI_CONNECTED 1 +#define SPI_BSIZE 128 +//długość pakietu z suwmiarki +#define SPI_FRAME_SIZE 3 +//bity w SPI_State +#define SPI_CONNECTED 0x01 +//wartości zwracane przez SPI_Poll() +#define SPI_NO_FRAME 0x00 +#define SPI_FRAME_READY 0x01 int8_t SPI_Initialize(void); int8_t SPI_GetState(void); -int8_t SPI_Poll(uint8_t *measure,uint8_t length); +uint16_t SPI_Poll(uint8_t *measure,uint16_t length); + +#endif diff --git a/Soft/Suwmiarka/stm32_it.c b/Soft/Suwmiarka/stm32_it.c index c1bd3f5..6a8e986 100644 --- a/Soft/Suwmiarka/stm32_it.c +++ b/Soft/Suwmiarka/stm32_it.c @@ -191,40 +191,6 @@ void USB_LP_CAN1_RX0_IRQHandler(void) } - - -/******************************************************************************* -* Function Name : EXTI_IRQHandler -* Description : This function handles External lines interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS) -void EXTI0_IRQHandler(void) -#elif defined (STM32F37X) -void EXTI2_TS_IRQHandler(void) -#else -void EXTI9_5_IRQHandler(void) -#endif -{ - -} -#if !defined(STM32L1XX_MD) && !defined(STM32L1XX_HD) && !defined(STM32L1XX_MD_PLUS)&& ! defined (STM32F37X) && ! defined (STM32F30X) -/******************************************************************************* -* Function Name : EXTI15_10_IRQHandler -* Description : This function handles External lines 15 to 10 interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void EXTI15_10_IRQHandler(void) -{ - -} - -#endif /*STM32L1XX_HD*/ - /******************************************************************************* * Function Name : USB_FS_WKUP_IRQHandler * Description : This function handles USB WakeUp interrupt request. diff --git a/Soft/Suwmiarka/stm32_it.h b/Soft/Suwmiarka/stm32_it.h index d76f53c..3aecfdc 100644 --- a/Soft/Suwmiarka/stm32_it.h +++ b/Soft/Suwmiarka/stm32_it.h @@ -16,8 +16,8 @@ * * 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, + * 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. @@ -49,7 +49,6 @@ void PendSV_Handler(void); void SysTick_Handler(void); void USB_LP_CAN1_RX0_IRQHandler(void); void DMA1_Channel1_IRQHandler(void); -void EXTI9_5_IRQHandler(void); void EXTI15_10_IRQHandler(void); #endif /* __STM32_IT_H */ diff --git a/Soft/Suwmiarka_CrossWorks/STM32Template.hzp b/Soft/Suwmiarka_CrossWorks/STM32Template.hzp new file mode 100644 index 0000000..6dfad22 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/STM32Template.hzp @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Soft/Suwmiarka_CrossWorks/STM32Template.hzs b/Soft/Suwmiarka_CrossWorks/STM32Template.hzs new file mode 100644 index 0000000..e2d0ce1 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/STM32Template.hzs @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32Template.elf b/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32Template.elf new file mode 100755 index 0000000000000000000000000000000000000000..3524a6d8c65828e4b284524ba8a5e998ab1740c3 GIT binary patch literal 298627 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 THg#b7I(#;l7Y7ZJ3giC+GzZn3 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32Template.ld b/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32Template.ld new file mode 100644 index 0000000..ce19085 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32Template.ld @@ -0,0 +1,276 @@ +MEMORY +{ + UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0 + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x00010000 + RAM (wx) : ORIGIN = 0x20000000, LENGTH = 0x00005000 + APB1 (wx) : ORIGIN = 0x40000000, LENGTH = 0x00010000 + APB2 (wx) : ORIGIN = 0x40010000, LENGTH = 0x00018000 + AHB (wx) : ORIGIN = 0x40020000, LENGTH = 0x00003400 + PPB (wx) : ORIGIN = 0xe0000000, LENGTH = 0x00100000 + USB_CAN_RAM (wx) : ORIGIN = 0x40006000, LENGTH = 0x00000200 + CM3_System_Control_Space (wx) : ORIGIN = 0xe000e000, LENGTH = 0x00001000 +} + + +SECTIONS +{ + __FLASH_segment_start__ = 0x08000000; + __FLASH_segment_end__ = 0x08010000; + __RAM_segment_start__ = 0x20000000; + __RAM_segment_end__ = 0x20005000; + __APB1_segment_start__ = 0x40000000; + __APB1_segment_end__ = 0x40010000; + __APB2_segment_start__ = 0x40010000; + __APB2_segment_end__ = 0x40028000; + __AHB_segment_start__ = 0x40020000; + __AHB_segment_end__ = 0x40023400; + __PPB_segment_start__ = 0xe0000000; + __PPB_segment_end__ = 0xe0100000; + __USB_CAN_RAM_segment_start__ = 0x40006000; + __USB_CAN_RAM_segment_end__ = 0x40006200; + __CM3_System_Control_Space_segment_start__ = 0xe000e000; + __CM3_System_Control_Space_segment_end__ = 0xe000f000; + + __STACKSIZE__ = 128; + __STACKSIZE_PROCESS__ = 0; + __STACKSIZE_IRQ__ = 0; + __STACKSIZE_FIQ__ = 0; + __STACKSIZE_SVC__ = 0; + __STACKSIZE_ABT__ = 0; + __STACKSIZE_UND__ = 0; + __HEAPSIZE__ = 16384; + + __vectors_ram_load_start__ = ALIGN(__RAM_segment_start__ , 256); + .vectors_ram ALIGN(__RAM_segment_start__ , 256) (NOLOAD) : AT(ALIGN(__RAM_segment_start__ , 256)) + { + __vectors_ram_start__ = .; + *(.vectors_ram .vectors_ram.*) + } + __vectors_ram_end__ = __vectors_ram_start__ + SIZEOF(.vectors_ram); + + __vectors_ram_load_end__ = __vectors_ram_end__; + + . = ASSERT(__vectors_ram_end__ >= __RAM_segment_start__ && __vectors_ram_end__ <= __RAM_segment_end__ , "error: .vectors_ram is too large to fit in RAM memory segment"); + + __vectors_load_start__ = ALIGN(__FLASH_segment_start__ , 256); + .vectors ALIGN(__FLASH_segment_start__ , 256) : AT(ALIGN(__FLASH_segment_start__ , 256)) + { + __vectors_start__ = .; + *(.vectors .vectors.*) + } + __vectors_end__ = __vectors_start__ + SIZEOF(.vectors); + + __vectors_load_end__ = __vectors_end__; + + . = ASSERT(__vectors_end__ >= __FLASH_segment_start__ && __vectors_end__ <= __FLASH_segment_end__ , "error: .vectors is too large to fit in FLASH memory segment"); + + __init_load_start__ = ALIGN(__vectors_end__ , 4); + .init ALIGN(__vectors_end__ , 4) : AT(ALIGN(__vectors_end__ , 4)) + { + __init_start__ = .; + *(.init .init.*) + } + __init_end__ = __init_start__ + SIZEOF(.init); + + __init_load_end__ = __init_end__; + + . = ASSERT(__init_end__ >= __FLASH_segment_start__ && __init_end__ <= __FLASH_segment_end__ , "error: .init is too large to fit in FLASH memory segment"); + + __text_load_start__ = ALIGN(__init_end__ , 4); + .text ALIGN(__init_end__ , 4) : AT(ALIGN(__init_end__ , 4)) + { + __text_start__ = .; + *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table) + } + __text_end__ = __text_start__ + SIZEOF(.text); + + __text_load_end__ = __text_end__; + + . = ASSERT(__text_end__ >= __FLASH_segment_start__ && __text_end__ <= __FLASH_segment_end__ , "error: .text is too large to fit in FLASH memory segment"); + + __dtors_load_start__ = ALIGN(__text_end__ , 4); + .dtors ALIGN(__text_end__ , 4) : AT(ALIGN(__text_end__ , 4)) + { + __dtors_start__ = .; + KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) + } + __dtors_end__ = __dtors_start__ + SIZEOF(.dtors); + + __dtors_load_end__ = __dtors_end__; + + . = ASSERT(__dtors_end__ >= __FLASH_segment_start__ && __dtors_end__ <= __FLASH_segment_end__ , "error: .dtors is too large to fit in FLASH memory segment"); + + __ctors_load_start__ = ALIGN(__dtors_end__ , 4); + .ctors ALIGN(__dtors_end__ , 4) : AT(ALIGN(__dtors_end__ , 4)) + { + __ctors_start__ = .; + KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) + } + __ctors_end__ = __ctors_start__ + SIZEOF(.ctors); + + __ctors_load_end__ = __ctors_end__; + + . = ASSERT(__ctors_end__ >= __FLASH_segment_start__ && __ctors_end__ <= __FLASH_segment_end__ , "error: .ctors is too large to fit in FLASH memory segment"); + + __rodata_load_start__ = ALIGN(__ctors_end__ , 4); + .rodata ALIGN(__ctors_end__ , 4) : AT(ALIGN(__ctors_end__ , 4)) + { + __rodata_start__ = .; + *(.rodata .rodata.* .gnu.linkonce.r.*) + } + __rodata_end__ = __rodata_start__ + SIZEOF(.rodata); + + __rodata_load_end__ = __rodata_end__; + + . = ASSERT(__rodata_end__ >= __FLASH_segment_start__ && __rodata_end__ <= __FLASH_segment_end__ , "error: .rodata is too large to fit in FLASH memory segment"); + + __data_load_start__ = ALIGN(__rodata_end__ , 4); + .data ALIGN(__vectors_ram_end__ , 4) : AT(ALIGN(__rodata_end__ , 4)) + { + __data_start__ = .; + *(.data .data.* .gnu.linkonce.d.*) + } + __data_end__ = __data_start__ + SIZEOF(.data); + + __data_load_end__ = __data_load_start__ + SIZEOF(.data); + + . = ASSERT(__data_load_end__ >= __FLASH_segment_start__ && __data_load_end__ <= __FLASH_segment_end__ , "error: .data is too large to fit in FLASH memory segment"); + + .data_run ALIGN(__vectors_ram_end__ , 4) (NOLOAD) : + { + __data_run_start__ = .; + . = MAX(__data_run_start__ + SIZEOF(.data), .); + } + __data_run_end__ = __data_run_start__ + SIZEOF(.data_run); + + __data_run_load_end__ = __data_run_end__; + + . = ASSERT(__data_run_end__ >= __RAM_segment_start__ && __data_run_end__ <= __RAM_segment_end__ , "error: .data_run is too large to fit in RAM memory segment"); + + __bss_load_start__ = ALIGN(__data_run_end__ , 4); + .bss ALIGN(__data_run_end__ , 4) (NOLOAD) : AT(ALIGN(__data_run_end__ , 4)) + { + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) + } + __bss_end__ = __bss_start__ + SIZEOF(.bss); + + __bss_load_end__ = __bss_end__; + + . = ASSERT(__bss_end__ >= __RAM_segment_start__ && __bss_end__ <= __RAM_segment_end__ , "error: .bss is too large to fit in RAM memory segment"); + + __non_init_load_start__ = ALIGN(__bss_end__ , 4); + .non_init ALIGN(__bss_end__ , 4) (NOLOAD) : AT(ALIGN(__bss_end__ , 4)) + { + __non_init_start__ = .; + *(.non_init .non_init.*) + } + __non_init_end__ = __non_init_start__ + SIZEOF(.non_init); + + __non_init_load_end__ = __non_init_end__; + + . = ASSERT(__non_init_end__ >= __RAM_segment_start__ && __non_init_end__ <= __RAM_segment_end__ , "error: .non_init is too large to fit in RAM memory segment"); + + __heap_load_start__ = ALIGN(__non_init_end__ , 4); + .heap ALIGN(__non_init_end__ , 4) (NOLOAD) : AT(ALIGN(__non_init_end__ , 4)) + { + __heap_start__ = .; + *(.heap .heap.*) + . = ALIGN(MAX(__heap_start__ + __HEAPSIZE__ , .), 4); + } + __heap_end__ = __heap_start__ + SIZEOF(.heap); + + __heap_load_end__ = __heap_end__; + + . = ASSERT(__heap_end__ >= __RAM_segment_start__ && __heap_end__ <= __RAM_segment_end__ , "error: .heap is too large to fit in RAM memory segment"); + + __stack_load_start__ = ALIGN(__heap_end__ , 4); + .stack ALIGN(__heap_end__ , 4) (NOLOAD) : AT(ALIGN(__heap_end__ , 4)) + { + __stack_start__ = .; + *(.stack .stack.*) + . = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4); + } + __stack_end__ = __stack_start__ + SIZEOF(.stack); + + __stack_load_end__ = __stack_end__; + + . = ASSERT(__stack_end__ >= __RAM_segment_start__ && __stack_end__ <= __RAM_segment_end__ , "error: .stack is too large to fit in RAM memory segment"); + + __stack_process_load_start__ = ALIGN(__stack_end__ , 4); + .stack_process ALIGN(__stack_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_end__ , 4)) + { + __stack_process_start__ = .; + *(.stack_process .stack_process.*) + . = ALIGN(MAX(__stack_process_start__ + __STACKSIZE_PROCESS__ , .), 4); + } + __stack_process_end__ = __stack_process_start__ + SIZEOF(.stack_process); + + __stack_process_load_end__ = __stack_process_end__; + + . = ASSERT(__stack_process_end__ >= __RAM_segment_start__ && __stack_process_end__ <= __RAM_segment_end__ , "error: .stack_process is too large to fit in RAM memory segment"); + + __fast_load_start__ = ALIGN(__data_load_start__ + SIZEOF(.data) , 4); + .fast ALIGN(__stack_process_end__ , 4) : AT(ALIGN(__data_load_start__ + SIZEOF(.data) , 4)) + { + __fast_start__ = .; + *(.fast .fast.*) + } + __fast_end__ = __fast_start__ + SIZEOF(.fast); + + __fast_load_end__ = __fast_load_start__ + SIZEOF(.fast); + + . = ASSERT(__fast_load_end__ >= __FLASH_segment_start__ && __fast_load_end__ <= __FLASH_segment_end__ , "error: .fast is too large to fit in FLASH memory segment"); + + .fast_run ALIGN(__stack_process_end__ , 4) (NOLOAD) : + { + __fast_run_start__ = .; + . = MAX(__fast_run_start__ + SIZEOF(.fast), .); + } + __fast_run_end__ = __fast_run_start__ + SIZEOF(.fast_run); + + __fast_run_load_end__ = __fast_run_end__; + + . = ASSERT(__fast_run_end__ >= __RAM_segment_start__ && __fast_run_end__ <= __RAM_segment_end__ , "error: .fast_run is too large to fit in RAM memory segment"); + + __tbss_load_start__ = ALIGN(__fast_run_end__ , 4); + .tbss ALIGN(__fast_run_end__ , 4) (NOLOAD) : AT(ALIGN(__fast_run_end__ , 4)) + { + __tbss_start__ = .; + *(.tbss .tbss.*) + } + __tbss_end__ = __tbss_start__ + SIZEOF(.tbss); + + __tbss_load_end__ = __tbss_end__; + + . = ASSERT(__tbss_end__ >= __RAM_segment_start__ && __tbss_end__ <= __RAM_segment_end__ , "error: .tbss is too large to fit in RAM memory segment"); + + __tdata_load_start__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4); + .tdata ALIGN(__tbss_end__ , 4) : AT(ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4)) + { + __tdata_start__ = .; + *(.tdata .tdata.*) + } + __tdata_end__ = __tdata_start__ + SIZEOF(.tdata); + + __tdata_load_end__ = __tdata_load_start__ + SIZEOF(.tdata); + + __FLASH_segment_used_end__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4) + SIZEOF(.tdata); + + . = ASSERT(__tdata_load_end__ >= __FLASH_segment_start__ && __tdata_load_end__ <= __FLASH_segment_end__ , "error: .tdata is too large to fit in FLASH memory segment"); + + .tdata_run ALIGN(__tbss_end__ , 4) (NOLOAD) : + { + __tdata_run_start__ = .; + . = MAX(__tdata_run_start__ + SIZEOF(.tdata), .); + } + __tdata_run_end__ = __tdata_run_start__ + SIZEOF(.tdata_run); + + __tdata_run_load_end__ = __tdata_run_end__; + + __RAM_segment_used_end__ = ALIGN(__tbss_end__ , 4) + SIZEOF(.tdata_run); + + . = ASSERT(__tdata_run_end__ >= __RAM_segment_start__ && __tdata_run_end__ <= __RAM_segment_end__ , "error: .tdata_run is too large to fit in RAM memory segment"); + +} + diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32Template.map b/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32Template.map new file mode 100644 index 0000000..992e27b --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32Template.map @@ -0,0 +1,3619 @@ +Archive member included because of file (symbol) + +/usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + THUMB Debug/main.o (__floatsidf) +/usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + THUMB Debug/main.o (sprintf) +/usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) (memcpy) +/usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + (__vfprintf_double_long_long) +/usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + (__vfscanf_int) +/usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) (__umoddi3) +/usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + (__do_debug_operation_mempoll) +/usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) (__errno) +/usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) (frexp) +/usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) + /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) (fabs) + +Discarded input sections + + .text 0x00000000 0x0 THUMB Debug/caliper.o + .data 0x00000000 0x0 THUMB Debug/caliper.o + .bss 0x00000000 0x0 THUMB Debug/caliper.o + .data.EXTI_Regs + 0x00000000 0x4 THUMB Debug/caliper.o + .text 0x00000000 0x0 THUMB Debug/hw_config.o + .data 0x00000000 0x0 THUMB Debug/hw_config.o + .bss 0x00000000 0x0 THUMB Debug/hw_config.o + .bss.HSEStartUpStatus + 0x00000000 0x4 THUMB Debug/hw_config.o + .bss.ADC_ConvertedValueX + 0x00000000 0x4 THUMB Debug/hw_config.o + .bss.ADC_ConvertedValueX_1 + 0x00000000 0x4 THUMB Debug/hw_config.o + .bss.ADC1ConvertedValue + 0x00000000 0x2 THUMB Debug/hw_config.o + .bss.ADC1ConvertedVoltage + 0x00000000 0x2 THUMB Debug/hw_config.o + .bss.calibration_value + 0x00000000 0x2 THUMB Debug/hw_config.o + .text.Enter_LowPowerMode + 0x00000000 0x18 THUMB Debug/hw_config.o + .text 0x00000000 0x0 THUMB Debug/key.o + .data 0x00000000 0x0 THUMB Debug/key.o + .bss 0x00000000 0x0 THUMB Debug/key.o + .text.Key_Get 0x00000000 0x2c THUMB Debug/key.o + .text.Key_ClearEvent + 0x00000000 0x18 THUMB Debug/key.o + .text 0x00000000 0x0 THUMB Debug/stm32_it.o + .data 0x00000000 0x0 THUMB Debug/stm32_it.o + .bss 0x00000000 0x0 THUMB Debug/stm32_it.o + .bss.Send_Buffer + 0x00000000 0x4 THUMB Debug/stm32_it.o + .text 0x00000000 0x0 THUMB Debug/misc.o + .data 0x00000000 0x0 THUMB Debug/misc.o + .bss 0x00000000 0x0 THUMB Debug/misc.o + .text.NVIC_SetVectorTable + 0x00000000 0x2c THUMB Debug/misc.o + .text.NVIC_SystemLPConfig + 0x00000000 0x54 THUMB Debug/misc.o + .text.SysTick_CLKSourceConfig + 0x00000000 0x4c THUMB Debug/misc.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_adc.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_adc.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_adc.o + .text.ADC_DeInit + 0x00000000 0x88 THUMB Debug/stm32f10x_adc.o + .text.ADC_Init + 0x00000000 0xb0 THUMB Debug/stm32f10x_adc.o + .text.ADC_StructInit + 0x00000000 0x44 THUMB Debug/stm32f10x_adc.o + .text.ADC_Cmd 0x00000000 0x34 THUMB Debug/stm32f10x_adc.o + .text.ADC_DMACmd + 0x00000000 0x34 THUMB Debug/stm32f10x_adc.o + .text.ADC_ITConfig + 0x00000000 0x48 THUMB Debug/stm32f10x_adc.o + .text.ADC_ResetCalibration + 0x00000000 0x20 THUMB Debug/stm32f10x_adc.o + .text.ADC_GetResetCalibrationStatus + 0x00000000 0x38 THUMB Debug/stm32f10x_adc.o + .text.ADC_StartCalibration + 0x00000000 0x20 THUMB Debug/stm32f10x_adc.o + .text.ADC_GetCalibrationStatus + 0x00000000 0x38 THUMB Debug/stm32f10x_adc.o + .text.ADC_SoftwareStartConvCmd + 0x00000000 0x34 THUMB Debug/stm32f10x_adc.o + .text.ADC_GetSoftwareStartConvStatus + 0x00000000 0x38 THUMB Debug/stm32f10x_adc.o + .text.ADC_DiscModeChannelCountConfig + 0x00000000 0x4c THUMB Debug/stm32f10x_adc.o + .text.ADC_DiscModeCmd + 0x00000000 0x34 THUMB Debug/stm32f10x_adc.o + .text.ADC_RegularChannelConfig + 0x00000000 0x1bc THUMB Debug/stm32f10x_adc.o + .text.ADC_ExternalTrigConvCmd + 0x00000000 0x34 THUMB Debug/stm32f10x_adc.o + .text.ADC_GetConversionValue + 0x00000000 0x1c THUMB Debug/stm32f10x_adc.o + .text.ADC_GetDualModeConversionValue + 0x00000000 0x18 THUMB Debug/stm32f10x_adc.o + .text.ADC_AutoInjectedConvCmd + 0x00000000 0x34 THUMB Debug/stm32f10x_adc.o + .text.ADC_InjectedDiscModeCmd + 0x00000000 0x34 THUMB Debug/stm32f10x_adc.o + .text.ADC_ExternalTrigInjectedConvConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_adc.o + .text.ADC_ExternalTrigInjectedConvCmd + 0x00000000 0x34 THUMB Debug/stm32f10x_adc.o + .text.ADC_SoftwareStartInjectedConvCmd + 0x00000000 0x34 THUMB Debug/stm32f10x_adc.o + .text.ADC_GetSoftwareStartInjectedConvCmdStatus + 0x00000000 0x38 THUMB Debug/stm32f10x_adc.o + .text.ADC_InjectedChannelConfig + 0x00000000 0x144 THUMB Debug/stm32f10x_adc.o + .text.ADC_InjectedSequencerLengthConfig + 0x00000000 0x4c THUMB Debug/stm32f10x_adc.o + .text.ADC_SetInjectedOffset + 0x00000000 0x34 THUMB Debug/stm32f10x_adc.o + .text.ADC_GetInjectedConversionValue + 0x00000000 0x34 THUMB Debug/stm32f10x_adc.o + .text.ADC_AnalogWatchdogCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_adc.o + .text.ADC_AnalogWatchdogThresholdsConfig + 0x00000000 0x28 THUMB Debug/stm32f10x_adc.o + .text.ADC_AnalogWatchdogSingleChannelConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_adc.o + .text.ADC_TempSensorVrefintCmd + 0x00000000 0x4c THUMB Debug/stm32f10x_adc.o + .text.ADC_GetFlagStatus + 0x00000000 0x3c THUMB Debug/stm32f10x_adc.o + .text.ADC_ClearFlag + 0x00000000 0x20 THUMB Debug/stm32f10x_adc.o + .text.ADC_GetITStatus + 0x00000000 0x64 THUMB Debug/stm32f10x_adc.o + .text.ADC_ClearITPendingBit + 0x00000000 0x30 THUMB Debug/stm32f10x_adc.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_bkp.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_bkp.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_bkp.o + .text.BKP_DeInit + 0x00000000 0x18 THUMB Debug/stm32f10x_bkp.o + .text.BKP_TamperPinLevelConfig + 0x00000000 0x20 THUMB Debug/stm32f10x_bkp.o + .text.BKP_TamperPinCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_bkp.o + .text.BKP_ITConfig + 0x00000000 0x20 THUMB Debug/stm32f10x_bkp.o + .text.BKP_RTCOutputConfig + 0x00000000 0x44 THUMB Debug/stm32f10x_bkp.o + .text.BKP_SetRTCCalibrationValue + 0x00000000 0x44 THUMB Debug/stm32f10x_bkp.o + .text.BKP_WriteBackupRegister + 0x00000000 0x38 THUMB Debug/stm32f10x_bkp.o + .text.BKP_ReadBackupRegister + 0x00000000 0x34 THUMB Debug/stm32f10x_bkp.o + .text.BKP_GetFlagStatus + 0x00000000 0x18 THUMB Debug/stm32f10x_bkp.o + .text.BKP_ClearFlag + 0x00000000 0x28 THUMB Debug/stm32f10x_bkp.o + .text.BKP_GetITStatus + 0x00000000 0x18 THUMB Debug/stm32f10x_bkp.o + .text.BKP_ClearITPendingBit + 0x00000000 0x28 THUMB Debug/stm32f10x_bkp.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_can.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_can.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_can.o + .text.CAN_DeInit + 0x00000000 0x50 THUMB Debug/stm32f10x_can.o + .text.CAN_Init + 0x00000000 0x1c0 THUMB Debug/stm32f10x_can.o + .text.CAN_FilterInit + 0x00000000 0x20c THUMB Debug/stm32f10x_can.o + .text.CAN_StructInit + 0x00000000 0x6c THUMB Debug/stm32f10x_can.o + .text.CAN_SlaveStartBank + 0x00000000 0x8c THUMB Debug/stm32f10x_can.o + .text.CAN_ITConfig + 0x00000000 0x3c THUMB Debug/stm32f10x_can.o + .text.CAN_Transmit + 0x00000000 0x1dc THUMB Debug/stm32f10x_can.o + .text.CAN_TransmitStatus + 0x00000000 0x124 THUMB Debug/stm32f10x_can.o + .text.CAN_CancelTransmit + 0x00000000 0x50 THUMB Debug/stm32f10x_can.o + .text.CAN_FIFORelease + 0x00000000 0x38 THUMB Debug/stm32f10x_can.o + .text.CAN_MessagePending + 0x00000000 0x50 THUMB Debug/stm32f10x_can.o + .text.CAN_Receive + 0x00000000 0x190 THUMB Debug/stm32f10x_can.o + .text.CAN_DBGFreeze + 0x00000000 0x34 THUMB Debug/stm32f10x_can.o + .text.CAN_Sleep + 0x00000000 0x40 THUMB Debug/stm32f10x_can.o + .text.CAN_WakeUp + 0x00000000 0x5c THUMB Debug/stm32f10x_can.o + .text.CAN_GetFlagStatus + 0x00000000 0xf8 THUMB Debug/stm32f10x_can.o + .text.CAN_ClearFlag + 0x00000000 0x7c THUMB Debug/stm32f10x_can.o + .text.CAN_GetITStatus + 0x00000000 0x1d0 THUMB Debug/stm32f10x_can.o + .text.CAN_ClearITPendingBit + 0x00000000 0xfc THUMB Debug/stm32f10x_can.o + .text.CheckITStatus + 0x00000000 0x38 THUMB Debug/stm32f10x_can.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_cec.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_cec.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_cec.o + .text.CEC_DeInit + 0x00000000 0x20 THUMB Debug/stm32f10x_cec.o + .text.CEC_Init + 0x00000000 0x4c THUMB Debug/stm32f10x_cec.o + .text.CEC_Cmd 0x00000000 0x3c THUMB Debug/stm32f10x_cec.o + .text.CEC_ITConfig + 0x00000000 0x20 THUMB Debug/stm32f10x_cec.o + .text.CEC_OwnAddressConfig + 0x00000000 0x20 THUMB Debug/stm32f10x_cec.o + .text.CEC_SetPrescaler + 0x00000000 0x20 THUMB Debug/stm32f10x_cec.o + .text.CEC_SendDataByte + 0x00000000 0x20 THUMB Debug/stm32f10x_cec.o + .text.CEC_ReceiveDataByte + 0x00000000 0x18 THUMB Debug/stm32f10x_cec.o + .text.CEC_StartOfMessage + 0x00000000 0x18 THUMB Debug/stm32f10x_cec.o + .text.CEC_EndOfMessageCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_cec.o + .text.CEC_GetFlagStatus + 0x00000000 0x7c THUMB Debug/stm32f10x_cec.o + .text.CEC_ClearFlag + 0x00000000 0x4c THUMB Debug/stm32f10x_cec.o + .text.CEC_GetITStatus + 0x00000000 0x5c THUMB Debug/stm32f10x_cec.o + .text.CEC_ClearITPendingBit + 0x00000000 0x50 THUMB Debug/stm32f10x_cec.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_crc.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_crc.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_crc.o + .text.CRC_ResetDR + 0x00000000 0x18 THUMB Debug/stm32f10x_crc.o + .text.CRC_CalcCRC + 0x00000000 0x2c THUMB Debug/stm32f10x_crc.o + .text.CRC_CalcBlockCRC + 0x00000000 0x54 THUMB Debug/stm32f10x_crc.o + .text.CRC_GetCRC + 0x00000000 0x18 THUMB Debug/stm32f10x_crc.o + .text.CRC_SetIDRegister + 0x00000000 0x20 THUMB Debug/stm32f10x_crc.o + .text.CRC_GetIDRegister + 0x00000000 0x18 THUMB Debug/stm32f10x_crc.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_dac.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_dac.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_dac.o + .text.DAC_DeInit + 0x00000000 0x20 THUMB Debug/stm32f10x_dac.o + .text.DAC_Init + 0x00000000 0x74 THUMB Debug/stm32f10x_dac.o + .text.DAC_StructInit + 0x00000000 0x34 THUMB Debug/stm32f10x_dac.o + .text.DAC_Cmd 0x00000000 0x60 THUMB Debug/stm32f10x_dac.o + .text.DAC_DMACmd + 0x00000000 0x60 THUMB Debug/stm32f10x_dac.o + .text.DAC_SoftwareTriggerCmd + 0x00000000 0x68 THUMB Debug/stm32f10x_dac.o + .text.DAC_DualSoftwareTriggerCmd + 0x00000000 0x4c THUMB Debug/stm32f10x_dac.o + .text.DAC_WaveGenerationCmd + 0x00000000 0x60 THUMB Debug/stm32f10x_dac.o + .text.DAC_SetChannel1Data + 0x00000000 0x38 THUMB Debug/stm32f10x_dac.o + .text.DAC_SetChannel2Data + 0x00000000 0x38 THUMB Debug/stm32f10x_dac.o + .text.DAC_SetDualChannelData + 0x00000000 0x64 THUMB Debug/stm32f10x_dac.o + .text.DAC_GetDataOutputValue + 0x00000000 0x3c THUMB Debug/stm32f10x_dac.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_dbgmcu.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_dbgmcu.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_dbgmcu.o + .text.DBGMCU_GetREVID + 0x00000000 0x1c THUMB Debug/stm32f10x_dbgmcu.o + .text.DBGMCU_GetDEVID + 0x00000000 0x20 THUMB Debug/stm32f10x_dbgmcu.o + .text.DBGMCU_Config + 0x00000000 0x50 THUMB Debug/stm32f10x_dbgmcu.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_dma.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_dma.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_dma.o + .text.DMA_DeInit + 0x00000000 0x220 THUMB Debug/stm32f10x_dma.o + .text.DMA_Init + 0x00000000 0x80 THUMB Debug/stm32f10x_dma.o + .text.DMA_StructInit + 0x00000000 0x6c THUMB Debug/stm32f10x_dma.o + .text.DMA_Cmd 0x00000000 0x38 THUMB Debug/stm32f10x_dma.o + .text.DMA_ITConfig + 0x00000000 0x3c THUMB Debug/stm32f10x_dma.o + .text.DMA_SetCurrDataCounter + 0x00000000 0x1c THUMB Debug/stm32f10x_dma.o + .text.DMA_GetCurrDataCounter + 0x00000000 0x1c THUMB Debug/stm32f10x_dma.o + .text.DMA_GetFlagStatus + 0x00000000 0x60 THUMB Debug/stm32f10x_dma.o + .text.DMA_ClearFlag + 0x00000000 0x38 THUMB Debug/stm32f10x_dma.o + .text.DMA_GetITStatus + 0x00000000 0x60 THUMB Debug/stm32f10x_dma.o + .text.DMA_ClearITPendingBit + 0x00000000 0x38 THUMB Debug/stm32f10x_dma.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_exti.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_exti.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_exti.o + .text.EXTI_DeInit + 0x00000000 0x54 THUMB Debug/stm32f10x_exti.o + .text.EXTI_StructInit + 0x00000000 0x34 THUMB Debug/stm32f10x_exti.o + .text.EXTI_GenerateSWInterrupt + 0x00000000 0x2c THUMB Debug/stm32f10x_exti.o + .text.EXTI_GetFlagStatus + 0x00000000 0x3c THUMB Debug/stm32f10x_exti.o + .text.EXTI_ClearFlag + 0x00000000 0x20 THUMB Debug/stm32f10x_exti.o + .text.EXTI_GetITStatus + 0x00000000 0x58 THUMB Debug/stm32f10x_exti.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_flash.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_flash.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_flash.o + .text.FLASH_SetLatency + 0x00000000 0x40 THUMB Debug/stm32f10x_flash.o + .text.FLASH_HalfCycleAccessCmd + 0x00000000 0x44 THUMB Debug/stm32f10x_flash.o + .text.FLASH_PrefetchBufferCmd + 0x00000000 0x44 THUMB Debug/stm32f10x_flash.o + .text.FLASH_Unlock + 0x00000000 0x30 THUMB Debug/stm32f10x_flash.o + .text.FLASH_UnlockBank1 + 0x00000000 0x30 THUMB Debug/stm32f10x_flash.o + .text.FLASH_Lock + 0x00000000 0x24 THUMB Debug/stm32f10x_flash.o + .text.FLASH_LockBank1 + 0x00000000 0x24 THUMB Debug/stm32f10x_flash.o + .text.FLASH_ErasePage + 0x00000000 0x90 THUMB Debug/stm32f10x_flash.o + .text.FLASH_EraseAllPages + 0x00000000 0x80 THUMB Debug/stm32f10x_flash.o + .text.FLASH_EraseAllBank1Pages + 0x00000000 0x80 THUMB Debug/stm32f10x_flash.o + .text.FLASH_EraseOptionBytes + 0x00000000 0x134 THUMB Debug/stm32f10x_flash.o + .text.FLASH_ProgramWord + 0x00000000 0xbc THUMB Debug/stm32f10x_flash.o + .text.FLASH_ProgramHalfWord + 0x00000000 0x74 THUMB Debug/stm32f10x_flash.o + .text.FLASH_ProgramOptionByteData + 0x00000000 0xa0 THUMB Debug/stm32f10x_flash.o + .text.FLASH_EnableWriteProtection + 0x00000000 0x15c THUMB Debug/stm32f10x_flash.o + .text.FLASH_ReadOutProtection + 0x00000000 0x138 THUMB Debug/stm32f10x_flash.o + .text.FLASH_UserOptionByteConfig + 0x00000000 0xbc THUMB Debug/stm32f10x_flash.o + .text.FLASH_GetUserOptionByte + 0x00000000 0x1c THUMB Debug/stm32f10x_flash.o + .text.FLASH_GetWriteProtectionOptionByte + 0x00000000 0x18 THUMB Debug/stm32f10x_flash.o + .text.FLASH_GetReadOutProtectionStatus + 0x00000000 0x3c THUMB Debug/stm32f10x_flash.o + .text.FLASH_GetPrefetchBufferStatus + 0x00000000 0x3c THUMB Debug/stm32f10x_flash.o + .text.FLASH_ITConfig + 0x00000000 0x50 THUMB Debug/stm32f10x_flash.o + .text.FLASH_GetFlagStatus + 0x00000000 0x68 THUMB Debug/stm32f10x_flash.o + .text.FLASH_ClearFlag + 0x00000000 0x20 THUMB Debug/stm32f10x_flash.o + .text.FLASH_GetStatus + 0x00000000 0x70 THUMB Debug/stm32f10x_flash.o + .text.FLASH_GetBank1Status + 0x00000000 0x70 THUMB Debug/stm32f10x_flash.o + .text.FLASH_WaitForLastOperation + 0x00000000 0x4c THUMB Debug/stm32f10x_flash.o + .text.FLASH_WaitForLastBank1Operation + 0x00000000 0x4c THUMB Debug/stm32f10x_flash.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_fsmc.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_fsmc.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_NORSRAMDeInit + 0x00000000 0x5c THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_NANDDeInit + 0x00000000 0x8c THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_PCCARDDeInit + 0x00000000 0x50 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_NORSRAMInit + 0x00000000 0x150 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_NANDInit + 0x00000000 0x100 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_PCCARDInit + 0x00000000 0xd4 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_NORSRAMStructInit + 0x00000000 0x108 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_NANDStructInit + 0x00000000 0x9c THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_PCCARDStructInit + 0x00000000 0xa4 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_NORSRAMCmd + 0x00000000 0x54 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_NANDCmd + 0x00000000 0x98 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_PCCARDCmd + 0x00000000 0x50 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_NANDECCCmd + 0x00000000 0x98 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_GetECC + 0x00000000 0x3c THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_ITConfig + 0x00000000 0xe0 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_GetFlagStatus + 0x00000000 0x74 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_ClearFlag + 0x00000000 0x7c THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_GetITStatus + 0x00000000 0x94 THUMB Debug/stm32f10x_fsmc.o + .text.FSMC_ClearITPendingBit + 0x00000000 0x88 THUMB Debug/stm32f10x_fsmc.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_gpio.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_gpio.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_gpio.o + .text.GPIO_DeInit + 0x00000000 0x128 THUMB Debug/stm32f10x_gpio.o + .text.GPIO_AFIODeInit + 0x00000000 0x20 THUMB Debug/stm32f10x_gpio.o + .text.GPIO_StructInit + 0x00000000 0x2c THUMB Debug/stm32f10x_gpio.o + .text.GPIO_ReadInputDataBit + 0x00000000 0x3c THUMB Debug/stm32f10x_gpio.o + .text.GPIO_ReadInputData + 0x00000000 0x1c THUMB Debug/stm32f10x_gpio.o + .text.GPIO_ReadOutputDataBit + 0x00000000 0x3c THUMB Debug/stm32f10x_gpio.o + .text.GPIO_ReadOutputData + 0x00000000 0x1c THUMB Debug/stm32f10x_gpio.o + .text.GPIO_WriteBit + 0x00000000 0x2c THUMB Debug/stm32f10x_gpio.o + .text.GPIO_Write + 0x00000000 0x1c THUMB Debug/stm32f10x_gpio.o + .text.GPIO_PinLockConfig + 0x00000000 0x44 THUMB Debug/stm32f10x_gpio.o + .text.GPIO_EventOutputConfig + 0x00000000 0x54 THUMB Debug/stm32f10x_gpio.o + .text.GPIO_EventOutputCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_gpio.o + .text.GPIO_PinRemapConfig + 0x00000000 0x11c THUMB Debug/stm32f10x_gpio.o + .text.GPIO_ETH_MediaInterfaceConfig + 0x00000000 0x20 THUMB Debug/stm32f10x_gpio.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_i2c.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_i2c.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_i2c.o + .text.I2C_DeInit + 0x00000000 0x50 THUMB Debug/stm32f10x_i2c.o + .text.I2C_Init + 0x00000000 0x1ac THUMB Debug/stm32f10x_i2c.o + .text.I2C_StructInit + 0x00000000 0x44 THUMB Debug/stm32f10x_i2c.o + .text.I2C_Cmd 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_DMACmd + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_DMALastTransferCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_GenerateSTART + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_GenerateSTOP + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_AcknowledgeConfig + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_OwnAddress2Config + 0x00000000 0x44 THUMB Debug/stm32f10x_i2c.o + .text.I2C_DualAddressCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_GeneralCallCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_ITConfig + 0x00000000 0x48 THUMB Debug/stm32f10x_i2c.o + .text.I2C_SendData + 0x00000000 0x20 THUMB Debug/stm32f10x_i2c.o + .text.I2C_ReceiveData + 0x00000000 0x1c THUMB Debug/stm32f10x_i2c.o + .text.I2C_Send7bitAddress + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_ReadRegister + 0x00000000 0x30 THUMB Debug/stm32f10x_i2c.o + .text.I2C_SoftwareResetCmd + 0x00000000 0x44 THUMB Debug/stm32f10x_i2c.o + .text.I2C_SMBusAlertConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_i2c.o + .text.I2C_TransmitPEC + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_PECPositionConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_i2c.o + .text.I2C_CalculatePEC + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_GetPEC + 0x00000000 0x24 THUMB Debug/stm32f10x_i2c.o + .text.I2C_ARPCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_StretchClockCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_i2c.o + .text.I2C_FastModeDutyCycleConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_i2c.o + .text.I2C_CheckEvent + 0x00000000 0x70 THUMB Debug/stm32f10x_i2c.o + .text.I2C_GetLastEvent + 0x00000000 0x4c THUMB Debug/stm32f10x_i2c.o + .text.I2C_GetFlagStatus + 0x00000000 0x78 THUMB Debug/stm32f10x_i2c.o + .text.I2C_ClearFlag + 0x00000000 0x30 THUMB Debug/stm32f10x_i2c.o + .text.I2C_GetITStatus + 0x00000000 0x64 THUMB Debug/stm32f10x_i2c.o + .text.I2C_ClearITPendingBit + 0x00000000 0x30 THUMB Debug/stm32f10x_i2c.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_iwdg.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_iwdg.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_iwdg.o + .text.IWDG_WriteAccessCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_iwdg.o + .text.IWDG_SetPrescaler + 0x00000000 0x20 THUMB Debug/stm32f10x_iwdg.o + .text.IWDG_SetReload + 0x00000000 0x20 THUMB Debug/stm32f10x_iwdg.o + .text.IWDG_ReloadCounter + 0x00000000 0x18 THUMB Debug/stm32f10x_iwdg.o + .text.IWDG_Enable + 0x00000000 0x18 THUMB Debug/stm32f10x_iwdg.o + .text.IWDG_GetFlagStatus + 0x00000000 0x40 THUMB Debug/stm32f10x_iwdg.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_pwr.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_pwr.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_pwr.o + .text.PWR_DeInit + 0x00000000 0x20 THUMB Debug/stm32f10x_pwr.o + .text.PWR_BackupAccessCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_pwr.o + .text.PWR_PVDCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_pwr.o + .text.PWR_PVDLevelConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_pwr.o + .text.PWR_WakeUpPinCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_pwr.o + .text.PWR_EnterSTOPMode + 0x00000000 0x80 THUMB Debug/stm32f10x_pwr.o + .text.PWR_EnterSTANDBYMode + 0x00000000 0x54 THUMB Debug/stm32f10x_pwr.o + .text.PWR_GetFlagStatus + 0x00000000 0x3c THUMB Debug/stm32f10x_pwr.o + .text.PWR_ClearFlag + 0x00000000 0x30 THUMB Debug/stm32f10x_pwr.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_rcc.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_rcc.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_rcc.o + .data.APBAHBPrescTable + 0x00000000 0x10 THUMB Debug/stm32f10x_rcc.o + .data.ADCPrescTable + 0x00000000 0x4 THUMB Debug/stm32f10x_rcc.o + .text.RCC_DeInit + 0x00000000 0x9c THUMB Debug/stm32f10x_rcc.o + .text.RCC_HSEConfig + 0x00000000 0x88 THUMB Debug/stm32f10x_rcc.o + .text.RCC_WaitForHSEStartUp + 0x00000000 0x64 THUMB Debug/stm32f10x_rcc.o + .text.RCC_AdjustHSICalibrationValue + 0x00000000 0x48 THUMB Debug/stm32f10x_rcc.o + .text.RCC_HSICmd + 0x00000000 0x20 THUMB Debug/stm32f10x_rcc.o + .text.RCC_PLLConfig + 0x00000000 0x48 THUMB Debug/stm32f10x_rcc.o + .text.RCC_PLLCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_rcc.o + .text.RCC_SYSCLKConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_rcc.o + .text.RCC_GetSYSCLKSource + 0x00000000 0x20 THUMB Debug/stm32f10x_rcc.o + .text.RCC_HCLKConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_rcc.o + .text.RCC_PCLK1Config + 0x00000000 0x40 THUMB Debug/stm32f10x_rcc.o + .text.RCC_PCLK2Config + 0x00000000 0x44 THUMB Debug/stm32f10x_rcc.o + .text.RCC_ITConfig + 0x00000000 0x5c THUMB Debug/stm32f10x_rcc.o + .text.RCC_ADCCLKConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_rcc.o + .text.RCC_LSEConfig + 0x00000000 0x60 THUMB Debug/stm32f10x_rcc.o + .text.RCC_LSICmd + 0x00000000 0x20 THUMB Debug/stm32f10x_rcc.o + .text.RCC_RTCCLKConfig + 0x00000000 0x2c THUMB Debug/stm32f10x_rcc.o + .text.RCC_RTCCLKCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_rcc.o + .text.RCC_GetClocksFreq + 0x00000000 0x1d4 THUMB Debug/stm32f10x_rcc.o + .text.RCC_AHBPeriphClockCmd + 0x00000000 0x50 THUMB Debug/stm32f10x_rcc.o + .text.RCC_APB2PeriphResetCmd + 0x00000000 0x50 THUMB Debug/stm32f10x_rcc.o + .text.RCC_APB1PeriphResetCmd + 0x00000000 0x50 THUMB Debug/stm32f10x_rcc.o + .text.RCC_BackupResetCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_rcc.o + .text.RCC_ClockSecuritySystemCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_rcc.o + .text.RCC_MCOConfig + 0x00000000 0x20 THUMB Debug/stm32f10x_rcc.o + .text.RCC_GetFlagStatus + 0x00000000 0x90 THUMB Debug/stm32f10x_rcc.o + .text.RCC_ClearFlag + 0x00000000 0x24 THUMB Debug/stm32f10x_rcc.o + .text.RCC_GetITStatus + 0x00000000 0x40 THUMB Debug/stm32f10x_rcc.o + .text.RCC_ClearITPendingBit + 0x00000000 0x20 THUMB Debug/stm32f10x_rcc.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_rtc.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_rtc.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_rtc.o + .text.RTC_ITConfig + 0x00000000 0x5c THUMB Debug/stm32f10x_rtc.o + .text.RTC_EnterConfigMode + 0x00000000 0x28 THUMB Debug/stm32f10x_rtc.o + .text.RTC_ExitConfigMode + 0x00000000 0x28 THUMB Debug/stm32f10x_rtc.o + .text.RTC_GetCounter + 0x00000000 0x38 THUMB Debug/stm32f10x_rtc.o + .text.RTC_SetCounter + 0x00000000 0x38 THUMB Debug/stm32f10x_rtc.o + .text.RTC_SetPrescaler + 0x00000000 0x3c THUMB Debug/stm32f10x_rtc.o + .text.RTC_SetAlarm + 0x00000000 0x38 THUMB Debug/stm32f10x_rtc.o + .text.RTC_GetDivider + 0x00000000 0x44 THUMB Debug/stm32f10x_rtc.o + .text.RTC_WaitForLastTask + 0x00000000 0x20 THUMB Debug/stm32f10x_rtc.o + .text.RTC_WaitForSynchro + 0x00000000 0x3c THUMB Debug/stm32f10x_rtc.o + .text.RTC_GetFlagStatus + 0x00000000 0x44 THUMB Debug/stm32f10x_rtc.o + .text.RTC_ClearFlag + 0x00000000 0x38 THUMB Debug/stm32f10x_rtc.o + .text.RTC_GetITStatus + 0x00000000 0x5c THUMB Debug/stm32f10x_rtc.o + .text.RTC_ClearITPendingBit + 0x00000000 0x38 THUMB Debug/stm32f10x_rtc.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_sdio.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_sdio.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_DeInit + 0x00000000 0x8c THUMB Debug/stm32f10x_sdio.o + .text.SDIO_Init + 0x00000000 0x68 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_StructInit + 0x00000000 0x44 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_ClockCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_SetPowerState + 0x00000000 0x44 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_GetPowerState + 0x00000000 0x1c THUMB Debug/stm32f10x_sdio.o + .text.SDIO_ITConfig + 0x00000000 0x50 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_DMACmd + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_SendCommand + 0x00000000 0x68 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_CmdStructInit + 0x00000000 0x3c THUMB Debug/stm32f10x_sdio.o + .text.SDIO_GetCommandResponse + 0x00000000 0x18 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_GetResponse + 0x00000000 0x2c THUMB Debug/stm32f10x_sdio.o + .text.SDIO_DataConfig + 0x00000000 0x70 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_DataStructInit + 0x00000000 0x44 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_GetDataCounter + 0x00000000 0x18 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_ReadData + 0x00000000 0x18 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_WriteData + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_GetFIFOCount + 0x00000000 0x18 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_StartSDIOReadWait + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_StopSDIOReadWait + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_SetSDIOReadWaitMode + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_SetSDIOOperation + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_SendSDIOSuspendCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_CommandCompletionCmd + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_CEATAITCmd + 0x00000000 0x2c THUMB Debug/stm32f10x_sdio.o + .text.SDIO_SendCEATACmd + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_GetFlagStatus + 0x00000000 0x3c THUMB Debug/stm32f10x_sdio.o + .text.SDIO_ClearFlag + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text.SDIO_GetITStatus + 0x00000000 0x3c THUMB Debug/stm32f10x_sdio.o + .text.SDIO_ClearITPendingBit + 0x00000000 0x20 THUMB Debug/stm32f10x_sdio.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_spi.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_spi.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_spi.o + .text.SPI_I2S_DeInit + 0x00000000 0x88 THUMB Debug/stm32f10x_spi.o + .text.SPI_Init + 0x00000000 0x88 THUMB Debug/stm32f10x_spi.o + .text.I2S_Init + 0x00000000 0x198 THUMB Debug/stm32f10x_spi.o + .text.SPI_StructInit + 0x00000000 0x5c THUMB Debug/stm32f10x_spi.o + .text.I2S_StructInit + 0x00000000 0x44 THUMB Debug/stm32f10x_spi.o + .text.SPI_Cmd 0x00000000 0x3c THUMB Debug/stm32f10x_spi.o + .text.I2S_Cmd 0x00000000 0x3c THUMB Debug/stm32f10x_spi.o + .text.SPI_I2S_ITConfig + 0x00000000 0x68 THUMB Debug/stm32f10x_spi.o + .text.SPI_I2S_DMACmd + 0x00000000 0x48 THUMB Debug/stm32f10x_spi.o + .text.SPI_I2S_SendData + 0x00000000 0x1c THUMB Debug/stm32f10x_spi.o + .text.SPI_I2S_ReceiveData + 0x00000000 0x1c THUMB Debug/stm32f10x_spi.o + .text.SPI_NSSInternalSoftwareConfig + 0x00000000 0x44 THUMB Debug/stm32f10x_spi.o + .text.SPI_SSOutputCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_spi.o + .text.SPI_DataSizeConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_spi.o + .text.SPI_TransmitCRC + 0x00000000 0x24 THUMB Debug/stm32f10x_spi.o + .text.SPI_CalculateCRC + 0x00000000 0x3c THUMB Debug/stm32f10x_spi.o + .text.SPI_GetCRC + 0x00000000 0x34 THUMB Debug/stm32f10x_spi.o + .text.SPI_GetCRCPolynomial + 0x00000000 0x1c THUMB Debug/stm32f10x_spi.o + .text.SPI_BiDirectionalLineConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_spi.o + .text.SPI_I2S_GetFlagStatus + 0x00000000 0x40 THUMB Debug/stm32f10x_spi.o + .text.SPI_I2S_ClearFlag + 0x00000000 0x24 THUMB Debug/stm32f10x_spi.o + .text.SPI_I2S_GetITStatus + 0x00000000 0x88 THUMB Debug/stm32f10x_spi.o + .text.SPI_I2S_ClearITPendingBit + 0x00000000 0x38 THUMB Debug/stm32f10x_spi.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_tim.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_tim.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_tim.o + .text.TIM_DeInit + 0x00000000 0x2b0 THUMB Debug/stm32f10x_tim.o + .text.TIM_TimeBaseInit + 0x00000000 0x11c THUMB Debug/stm32f10x_tim.o + .text.TIM_OC1Init + 0x00000000 0x128 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC2Init + 0x00000000 0x128 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC3Init + 0x00000000 0x120 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC4Init + 0x00000000 0xe0 THUMB Debug/stm32f10x_tim.o + .text.TIM_ICInit + 0x00000000 0xb8 THUMB Debug/stm32f10x_tim.o + .text.TIM_PWMIConfig + 0x00000000 0xcc THUMB Debug/stm32f10x_tim.o + .text.TIM_BDTRConfig + 0x00000000 0x50 THUMB Debug/stm32f10x_tim.o + .text.TIM_TimeBaseStructInit + 0x00000000 0x3c THUMB Debug/stm32f10x_tim.o + .text.TIM_OCStructInit + 0x00000000 0x54 THUMB Debug/stm32f10x_tim.o + .text.TIM_ICStructInit + 0x00000000 0x3c THUMB Debug/stm32f10x_tim.o + .text.TIM_BDTRStructInit + 0x00000000 0x4c THUMB Debug/stm32f10x_tim.o + .text.TIM_Cmd 0x00000000 0x3c THUMB Debug/stm32f10x_tim.o + .text.TIM_CtrlPWMOutputs + 0x00000000 0x4c THUMB Debug/stm32f10x_tim.o + .text.TIM_ITConfig + 0x00000000 0x48 THUMB Debug/stm32f10x_tim.o + .text.TIM_GenerateEvent + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_DMAConfig + 0x00000000 0x28 THUMB Debug/stm32f10x_tim.o + .text.TIM_DMACmd + 0x00000000 0x48 THUMB Debug/stm32f10x_tim.o + .text.TIM_InternalClockConfig + 0x00000000 0x24 THUMB Debug/stm32f10x_tim.o + .text.TIM_ITRxExternalClockConfig + 0x00000000 0x30 THUMB Debug/stm32f10x_tim.o + .text.TIM_TIxExternalClockConfig + 0x00000000 0x58 THUMB Debug/stm32f10x_tim.o + .text.TIM_ETRClockMode1Config + 0x00000000 0x54 THUMB Debug/stm32f10x_tim.o + .text.TIM_ETRClockMode2Config + 0x00000000 0x34 THUMB Debug/stm32f10x_tim.o + .text.TIM_ETRConfig + 0x00000000 0x4c THUMB Debug/stm32f10x_tim.o + .text.TIM_PrescalerConfig + 0x00000000 0x28 THUMB Debug/stm32f10x_tim.o + .text.TIM_CounterModeConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_SelectInputTrigger + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_EncoderInterfaceConfig + 0x00000000 0x94 THUMB Debug/stm32f10x_tim.o + .text.TIM_ForcedOC1Config + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_ForcedOC2Config + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_ForcedOC3Config + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_ForcedOC4Config + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_ARRPreloadConfig + 0x00000000 0x3c THUMB Debug/stm32f10x_tim.o + .text.TIM_SelectCOM + 0x00000000 0x3c THUMB Debug/stm32f10x_tim.o + .text.TIM_SelectCCDMA + 0x00000000 0x3c THUMB Debug/stm32f10x_tim.o + .text.TIM_CCPreloadControl + 0x00000000 0x3c THUMB Debug/stm32f10x_tim.o + .text.TIM_OC1PreloadConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC2PreloadConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC3PreloadConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC4PreloadConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC1FastConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC2FastConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC3FastConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC4FastConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_ClearOC1Ref + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_ClearOC2Ref + 0x00000000 0x44 THUMB Debug/stm32f10x_tim.o + .text.TIM_ClearOC3Ref + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_ClearOC4Ref + 0x00000000 0x44 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC1PolarityConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC1NPolarityConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC2PolarityConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC2NPolarityConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC3PolarityConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC3NPolarityConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_OC4PolarityConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_CCxCmd + 0x00000000 0x5c THUMB Debug/stm32f10x_tim.o + .text.TIM_CCxNCmd + 0x00000000 0x5c THUMB Debug/stm32f10x_tim.o + .text.TIM_SelectOCxM + 0x00000000 0xbc THUMB Debug/stm32f10x_tim.o + .text.TIM_UpdateDisableConfig + 0x00000000 0x3c THUMB Debug/stm32f10x_tim.o + .text.TIM_UpdateRequestConfig + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_SelectHallSensor + 0x00000000 0x3c THUMB Debug/stm32f10x_tim.o + .text.TIM_SelectOnePulseMode + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_SelectOutputTrigger + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_SelectSlaveMode + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_SelectMasterSlaveMode + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_SetCounter + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_SetAutoreload + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_SetCompare1 + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_SetCompare2 + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_SetCompare3 + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_SetCompare4 + 0x00000000 0x20 THUMB Debug/stm32f10x_tim.o + .text.TIM_SetIC1Prescaler + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_SetIC2Prescaler + 0x00000000 0x3c THUMB Debug/stm32f10x_tim.o + .text.TIM_SetIC3Prescaler + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_SetIC4Prescaler + 0x00000000 0x3c THUMB Debug/stm32f10x_tim.o + .text.TIM_SetClockDivision + 0x00000000 0x38 THUMB Debug/stm32f10x_tim.o + .text.TIM_GetCapture1 + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_GetCapture2 + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_GetCapture3 + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_GetCapture4 + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_GetCounter + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_GetPrescaler + 0x00000000 0x1c THUMB Debug/stm32f10x_tim.o + .text.TIM_GetFlagStatus + 0x00000000 0x40 THUMB Debug/stm32f10x_tim.o + .text.TIM_ClearFlag + 0x00000000 0x24 THUMB Debug/stm32f10x_tim.o + .text.TIM_GetITStatus + 0x00000000 0x60 THUMB Debug/stm32f10x_tim.o + .text.TIM_ClearITPendingBit + 0x00000000 0x24 THUMB Debug/stm32f10x_tim.o + .text.TI1_Config + 0x00000000 0xe4 THUMB Debug/stm32f10x_tim.o + .text.TI2_Config + 0x00000000 0x104 THUMB Debug/stm32f10x_tim.o + .text.TI3_Config + 0x00000000 0xf4 THUMB Debug/stm32f10x_tim.o + .text.TI4_Config + 0x00000000 0x10c THUMB Debug/stm32f10x_tim.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_usart.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_usart.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_usart.o + .text.USART_DeInit + 0x00000000 0xd8 THUMB Debug/stm32f10x_usart.o + .text.USART_Init + 0x00000000 0x1ac THUMB Debug/stm32f10x_usart.o + .text.USART_StructInit + 0x00000000 0x44 THUMB Debug/stm32f10x_usart.o + .text.USART_ClockInit + 0x00000000 0x58 THUMB Debug/stm32f10x_usart.o + .text.USART_ClockStructInit + 0x00000000 0x34 THUMB Debug/stm32f10x_usart.o + .text.USART_Cmd + 0x00000000 0x3c THUMB Debug/stm32f10x_usart.o + .text.USART_ITConfig + 0x00000000 0xa0 THUMB Debug/stm32f10x_usart.o + .text.USART_DMACmd + 0x00000000 0x48 THUMB Debug/stm32f10x_usart.o + .text.USART_SetAddress + 0x00000000 0x38 THUMB Debug/stm32f10x_usart.o + .text.USART_WakeUpConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_usart.o + .text.USART_ReceiverWakeUpCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_usart.o + .text.USART_LINBreakDetectLengthConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_usart.o + .text.USART_LINCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_usart.o + .text.USART_SendData + 0x00000000 0x28 THUMB Debug/stm32f10x_usart.o + .text.USART_ReceiveData + 0x00000000 0x24 THUMB Debug/stm32f10x_usart.o + .text.USART_SendBreak + 0x00000000 0x24 THUMB Debug/stm32f10x_usart.o + .text.USART_SetGuardTime + 0x00000000 0x3c THUMB Debug/stm32f10x_usart.o + .text.USART_SetPrescaler + 0x00000000 0x38 THUMB Debug/stm32f10x_usart.o + .text.USART_SmartCardCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_usart.o + .text.USART_SmartCardNACKCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_usart.o + .text.USART_HalfDuplexCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_usart.o + .text.USART_OverSampling8Cmd + 0x00000000 0x44 THUMB Debug/stm32f10x_usart.o + .text.USART_OneBitMethodCmd + 0x00000000 0x3c THUMB Debug/stm32f10x_usart.o + .text.USART_IrDAConfig + 0x00000000 0x38 THUMB Debug/stm32f10x_usart.o + .text.USART_IrDACmd + 0x00000000 0x3c THUMB Debug/stm32f10x_usart.o + .text.USART_GetFlagStatus + 0x00000000 0x40 THUMB Debug/stm32f10x_usart.o + .text.USART_ClearFlag + 0x00000000 0x24 THUMB Debug/stm32f10x_usart.o + .text.USART_GetITStatus + 0x00000000 0xc4 THUMB Debug/stm32f10x_usart.o + .text.USART_ClearITPendingBit + 0x00000000 0x44 THUMB Debug/stm32f10x_usart.o + .text 0x00000000 0x0 THUMB Debug/stm32f10x_wwdg.o + .data 0x00000000 0x0 THUMB Debug/stm32f10x_wwdg.o + .bss 0x00000000 0x0 THUMB Debug/stm32f10x_wwdg.o + .text.WWDG_DeInit + 0x00000000 0x20 THUMB Debug/stm32f10x_wwdg.o + .text.WWDG_SetPrescaler + 0x00000000 0x3c THUMB Debug/stm32f10x_wwdg.o + .text.WWDG_SetWindowValue + 0x00000000 0x44 THUMB Debug/stm32f10x_wwdg.o + .text.WWDG_EnableIT + 0x00000000 0x18 THUMB Debug/stm32f10x_wwdg.o + .text.WWDG_SetCounter + 0x00000000 0x24 THUMB Debug/stm32f10x_wwdg.o + .text.WWDG_Enable + 0x00000000 0x28 THUMB Debug/stm32f10x_wwdg.o + .text.WWDG_GetFlagStatus + 0x00000000 0x18 THUMB Debug/stm32f10x_wwdg.o + .text.WWDG_ClearFlag + 0x00000000 0x18 THUMB Debug/stm32f10x_wwdg.o + .text 0x00000000 0x0 THUMB Debug/usb_core.o + .data 0x00000000 0x0 THUMB Debug/usb_core.o + .bss 0x00000000 0x0 THUMB Debug/usb_core.o + .text 0x00000000 0x0 THUMB Debug/usb_desc.o + .data 0x00000000 0x0 THUMB Debug/usb_desc.o + .bss 0x00000000 0x0 THUMB Debug/usb_desc.o + .text 0x00000000 0x0 THUMB Debug/usb_endp.o + .data 0x00000000 0x0 THUMB Debug/usb_endp.o + .bss 0x00000000 0x0 THUMB Debug/usb_endp.o + .text 0x00000000 0x0 THUMB Debug/usb_init.o + .data 0x00000000 0x0 THUMB Debug/usb_init.o + .bss 0x00000000 0x0 THUMB Debug/usb_init.o + .bss.SaveState + 0x00000000 0x2 THUMB Debug/usb_init.o + .text 0x00000000 0x0 THUMB Debug/usb_int.o + .data 0x00000000 0x0 THUMB Debug/usb_int.o + .bss 0x00000000 0x0 THUMB Debug/usb_int.o + .text.CTR_HP 0x00000000 0x144 THUMB Debug/usb_int.o + .text 0x00000000 0x0 THUMB Debug/usb_istr.o + .data 0x00000000 0x0 THUMB Debug/usb_istr.o + .bss 0x00000000 0x0 THUMB Debug/usb_istr.o + .text 0x00000000 0x0 THUMB Debug/usb_mem.o + .data 0x00000000 0x0 THUMB Debug/usb_mem.o + .bss 0x00000000 0x0 THUMB Debug/usb_mem.o + .text 0x00000000 0x0 THUMB Debug/usb_prop.o + .data 0x00000000 0x0 THUMB Debug/usb_prop.o + .bss 0x00000000 0x0 THUMB Debug/usb_prop.o + .bss.EXTI_Enable + 0x00000000 0x1 THUMB Debug/usb_prop.o + .text 0x00000000 0x0 THUMB Debug/usb_pwr.o + .data 0x00000000 0x0 THUMB Debug/usb_pwr.o + .bss 0x00000000 0x0 THUMB Debug/usb_pwr.o + .text.PowerOff + 0x00000000 0x40 THUMB Debug/usb_pwr.o + .text 0x00000000 0x0 THUMB Debug/usb_regs.o + .data 0x00000000 0x0 THUMB Debug/usb_regs.o + .bss 0x00000000 0x0 THUMB Debug/usb_regs.o + .text.SetCNTR 0x00000000 0x20 THUMB Debug/usb_regs.o + .text.GetCNTR 0x00000000 0x18 THUMB Debug/usb_regs.o + .text.SetISTR 0x00000000 0x20 THUMB Debug/usb_regs.o + .text.GetISTR 0x00000000 0x18 THUMB Debug/usb_regs.o + .text.GetFNR 0x00000000 0x18 THUMB Debug/usb_regs.o + .text.SetDADDR + 0x00000000 0x20 THUMB Debug/usb_regs.o + .text.GetDADDR + 0x00000000 0x18 THUMB Debug/usb_regs.o + .text.GetBTABLE + 0x00000000 0x18 THUMB Debug/usb_regs.o + .text.SetENDPOINT + 0x00000000 0x2c THUMB Debug/usb_regs.o + .text.GetENDPOINT + 0x00000000 0x28 THUMB Debug/usb_regs.o + .text.GetEPType + 0x00000000 0x30 THUMB Debug/usb_regs.o + .text.SetDouBleBuffEPStall + 0x00000000 0x5c THUMB Debug/usb_regs.o + .text.GetEPTxStatus + 0x00000000 0x30 THUMB Debug/usb_regs.o + .text.GetEPRxStatus + 0x00000000 0x30 THUMB Debug/usb_regs.o + .text.SetEP_KIND + 0x00000000 0x58 THUMB Debug/usb_regs.o + .text.ClearEP_KIND + 0x00000000 0x58 THUMB Debug/usb_regs.o + .text.Set_Status_Out + 0x00000000 0x58 THUMB Debug/usb_regs.o + .text.SetEPDoubleBuff + 0x00000000 0x58 THUMB Debug/usb_regs.o + .text.ClearEPDoubleBuff + 0x00000000 0x58 THUMB Debug/usb_regs.o + .text.GetTxStallStatus + 0x00000000 0x38 THUMB Debug/usb_regs.o + .text.GetRxStallStatus + 0x00000000 0x38 THUMB Debug/usb_regs.o + .text.ClearEP_CTR_RX + 0x00000000 0x40 THUMB Debug/usb_regs.o + .text.ClearEP_CTR_TX + 0x00000000 0x40 THUMB Debug/usb_regs.o + .text.ToggleDTOG_RX + 0x00000000 0x48 THUMB Debug/usb_regs.o + .text.ToggleDTOG_TX + 0x00000000 0x48 THUMB Debug/usb_regs.o + .text.SetEPAddress + 0x00000000 0x50 THUMB Debug/usb_regs.o + .text.GetEPAddress + 0x00000000 0x30 THUMB Debug/usb_regs.o + .text.SetEPCountRxReg + 0x00000000 0x70 THUMB Debug/usb_regs.o + .text.GetEPTxCount + 0x00000000 0x48 THUMB Debug/usb_regs.o + .text.SetEPDblBuffAddr + 0x00000000 0x80 THUMB Debug/usb_regs.o + .text.SetEPDblBuf0Addr + 0x00000000 0x48 THUMB Debug/usb_regs.o + .text.SetEPDblBuf1Addr + 0x00000000 0x4c THUMB Debug/usb_regs.o + .text.GetEPDblBuf0Addr + 0x00000000 0x3c THUMB Debug/usb_regs.o + .text.GetEPDblBuf1Addr + 0x00000000 0x40 THUMB Debug/usb_regs.o + .text.SetEPDblBuffCount + 0x00000000 0x188 THUMB Debug/usb_regs.o + .text.SetEPDblBuf0Count + 0x00000000 0xd4 THUMB Debug/usb_regs.o + .text.SetEPDblBuf1Count + 0x00000000 0xd4 THUMB Debug/usb_regs.o + .text.GetEPDblBuf0Count + 0x00000000 0x48 THUMB Debug/usb_regs.o + .text.GetEPDblBuf1Count + 0x00000000 0x48 THUMB Debug/usb_regs.o + .text.GetEPDblBufDir + 0x00000000 0x8c THUMB Debug/usb_regs.o + .text.FreeUserBuffer + 0x00000000 0x8c THUMB Debug/usb_regs.o + .text.ToWord 0x00000000 0x30 THUMB Debug/usb_regs.o + .text 0x00000000 0x0 THUMB Debug/usb_sil.o + .data 0x00000000 0x0 THUMB Debug/usb_sil.o + .bss 0x00000000 0x0 THUMB Debug/usb_sil.o + .text 0x00000000 0x0 THUMB Debug/main.o + .data 0x00000000 0x0 THUMB Debug/main.o + .bss 0x00000000 0x0 THUMB Debug/main.o + .bss.measure 0x00000000 0x20 THUMB Debug/main.o + .bss.ByteCntr 0x00000000 0x1 THUMB Debug/main.o + .bss.DebugStruct + 0x00000000 0x1400 THUMB Debug/main.o + .text 0x00000000 0x0 THUMB Debug/thumb_crt0.o + .data 0x00000000 0x0 THUMB Debug/thumb_crt0.o + .bss 0x00000000 0x0 THUMB Debug/thumb_crt0.o + .stack 0x00000000 0x0 THUMB Debug/thumb_crt0.o + .stack_process + 0x00000000 0x0 THUMB Debug/thumb_crt0.o + .heap 0x00000000 0x0 THUMB Debug/thumb_crt0.o + .text 0x00000000 0x0 THUMB Debug/STM32_Startup.o + .data 0x00000000 0x0 THUMB Debug/STM32_Startup.o + .bss 0x00000000 0x0 THUMB Debug/STM32_Startup.o + .text 0x00000000 0x0 THUMB Debug/system_stm32f10x.o + .data 0x00000000 0x0 THUMB Debug/system_stm32f10x.o + .bss 0x00000000 0x0 THUMB Debug/system_stm32f10x.o + .data.AHBPrescTable + 0x00000000 0x10 THUMB Debug/system_stm32f10x.o + .text.SystemCoreClockUpdate + 0x00000000 0x148 THUMB Debug/system_stm32f10x.o + .text.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .data.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .bss.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__int32_to_float32 + 0x00000000 0x30 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__uint32_to_float32 + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__uint32_to_float64 + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__int64_to_float32 + 0x00000000 0x94 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__uint64_to_float32 + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_to_int32 + 0x00000000 0x40 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_to_int64 + 0x00000000 0x7c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_to_uint32 + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_to_uint64 + 0x00000000 0x48 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float64_to_int32 + 0x00000000 0x50 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float64_to_int64 + 0x00000000 0x80 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float64_to_uint32 + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_add + 0x00000000 0x138 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_mul + 0x00000000 0xd4 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_div + 0x00000000 0x1e0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_cmp + 0x00000000 0x44 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__aeabi_fcmpeq + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__aeabi_fcmplt + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__aeabi_fcmple + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__aeabi_fcmpge + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__aeabi_fcmpgt + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__aeabi_dcmpeq + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__aeabi_dcmplt + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__aeabi_dcmple + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__aeabi_dcmpge + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__aeabi_dcmpgt + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_signbit + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float64_signbit + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_isinf + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_isnan + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_isfinite + 0x00000000 0xc /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float64_isfinite + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_isnormal + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float64_isnormal + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float32_classify + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text.libc.__float64_classify + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .rodata.libc.__float32_infinity + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .rodata.libc.__float32_nan + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .rodata.libc.__float64_nan + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .text 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .data 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .bss 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.twodigit + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.month_name + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.checked_day_name + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.put_ch + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.put_str + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.put_nstr + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.put_digit + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.put_twodigit + 0x00000000 0x34 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.put_twodigits_leading_blank + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.put_twodigit2 + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.put_formatted + 0x00000000 0x3ec /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.__stdin_ungetc + 0x00000000 0xc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.__xlltoa + 0x00000000 0x80 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.__xltoa + 0x00000000 0x58 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.__xtoa + 0x00000000 0x58 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.asctime_r + 0x00000000 0xfc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.asctime + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.atexit + 0x00000000 0x34 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc._execute_at_exit_fns + 0x00000000 0x38 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.bsearch + 0x00000000 0x64 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.ctl_is_exact_power_of_two + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.ctl_round_power_of_two + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.ctl_count_leading_zeroes + 0x00000000 0x40 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.ctl_ilogb + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.buddy_alloc + 0x00000000 0x108 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.buddy_free + 0x00000000 0xf0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.buddy_heap_init + 0x00000000 0xc0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.isalpha + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.isxdigit + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.__strtoull + 0x00000000 0x140 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.__strtoul + 0x00000000 0xec /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.ispunct + 0x00000000 0x38 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.isalnum + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.isprint + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.isgraph + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.iscntrl + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.tolower + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.toupper + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.isblank + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.div + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.itoa + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.labs + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.ldiv + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.linked_heap_init + 0x00000000 0x64 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.linked_heap_alloc + 0x00000000 0xb4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.linked_heap_free + 0x00000000 0xd4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.linked_heap_realloc + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.llabs + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.lldiv + 0x00000000 0x60 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.lltoa + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.localeconv + 0x00000000 0xc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.setlocale + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.ltoa + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.malloc + 0x00000000 0x90 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.calloc + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.free + 0x00000000 0xa8 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.realloc + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.memccpy + 0x00000000 0x3c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.mempcpy + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.memchr + 0x00000000 0x34 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.memcmp + 0x00000000 0x54 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.memmove + 0x00000000 0x34 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.qsort + 0x00000000 0x260 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.rand + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.snprintf + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.srand + 0x00000000 0xc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.sscanf + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strcasecmp + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strcasestr + 0x00000000 0x64 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strcat + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strchr + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strcspn + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strdup + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strftime + 0x00000000 0x34 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strncasecmp + 0x00000000 0x5c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strncasestr + 0x00000000 0x58 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strncat + 0x00000000 0x38 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strlcat + 0x00000000 0x6c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strnchr + 0x00000000 0x34 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strncmp + 0x00000000 0x60 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strncpy + 0x00000000 0x3c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strlcpy + 0x00000000 0x44 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strnlen + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strndup + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strnstr + 0x00000000 0x60 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strpbrk + 0x00000000 0x38 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strrchr + 0x00000000 0x38 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strsep + 0x00000000 0x58 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strspn + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strstr + 0x00000000 0x50 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strtod + 0x00000000 0x1bc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strtof + 0x00000000 0x19c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strtok + 0x00000000 0x98 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strtok_r + 0x00000000 0x84 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strtol + 0x00000000 0x8c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.atol + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.atoi + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.atof + 0x00000000 0x14c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strtoll + 0x00000000 0xa4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.atoll + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strtoul + 0x00000000 0xa0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.strtoull + 0x00000000 0xb4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.localtime_r + 0x00000000 0x190 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.difftime + 0x00000000 0xc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.checktm + 0x00000000 0x244 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.mktime + 0x00000000 0x1c0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.ctime + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.ctime_r + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.gmtime + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.gmtime_r + 0x00000000 0xc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.localtime + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.gettimeofday + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.settimeofday + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.ulltoa + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.ultoa + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.utoa + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.vsnprintf + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.vsprintf + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.vsscanf + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcscat + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcschr + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcscmp + 0x00000000 0x38 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcscpy + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcscspn + 0x00000000 0x30 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcslen + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcsdup + 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcsncat + 0x00000000 0x3c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcsnchr + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcsncmp + 0x00000000 0x54 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcsncpy + 0x00000000 0x3c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcsnlen + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcsnstr + 0x00000000 0x5c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcspbrk + 0x00000000 0x38 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcsrchr + 0x00000000 0x34 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcssep + 0x00000000 0x58 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcsspn + 0x00000000 0x30 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcsstr + 0x00000000 0x50 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcstok + 0x00000000 0x98 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wcstok_r + 0x00000000 0x84 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wmemcpy + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wmemccpy + 0x00000000 0x34 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wmempcpy + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wmemmove + 0x00000000 0x38 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wmemcmp + 0x00000000 0x40 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wmemchr + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc.wmemset + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .data.libc.heap + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .bss.libc.__crt_get_time_of_day + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .rodata.libc.year_lengths + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .rodata.libc.mon_name + 0x00000000 0x30 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .bss.libc.last.2692 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .bss.libc.__atexitfns + 0x00000000 0x80 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .rodata.libc.invalid + 0x00000000 0xc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .rodata.libc.str1.4 + 0x00000000 0x140 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .data.libc.__RAL_rand_next + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .rodata.libc.__RAL_mon_lengths + 0x00000000 0x60 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .bss.libc.last.3164 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .rodata.libc.day_name + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .rodata.libc.month_names + 0x00000000 0x34 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .bss.libc.asctime_buf + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .rodata.libc.__ctype + 0x00000000 0x104 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .bss.libc.__crt_set_time_of_day + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .bss.libc.atexitfn_count + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .data.libc.__ungot + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .data.libc._lconv + 0x00000000 0x38 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .bss.libc._tm 0x00000000 0x24 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .rodata.libc.day_names + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .text.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .data.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .bss.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .text.libc.longjmp + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .text.libc.memcpy + 0x00000000 0x3c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .text.libc.memcpy_fast + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .text.libc.memcpy_small + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .text.libc.memset + 0x00000000 0x60 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .text.libc.__aeabi_memset + 0x00000000 0x64 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .text.libc.setjmp + 0x00000000 0xc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .text.libc.strcpy + 0x00000000 0x44 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .text.libc.strcmp + 0x00000000 0x50 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .text 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .data 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .bss 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .text.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .text 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .data 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .bss 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .text.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .text.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .data.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .bss.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_r4 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_r1 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_r2 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_r3 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_r0 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_r5 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_sp + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_r7 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_r8 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_r9 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_sl + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_r6 + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_lr + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_ip + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc._call_via_fp + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__int64_asr + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__int64_div + 0x00000000 0x44 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__int64_lsl + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__int64_lsr + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__int64_mod + 0x00000000 0x48 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__aeabi_ldivmod + 0x00000000 0x58 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__int64_cmp + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__int64_ucmp + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.muldi3 + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__int32_umod + 0x00000000 0xc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__int32_div + 0x00000000 0x310 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .rodata.libc.__aeabi_idiv + 0x00000000 0xa /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .rodata.libc.__aeabi_uidiv + 0x00000000 0x46 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__int32_mod + 0x00000000 0xc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__aeabi_uidivmod + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__aeabi_idivmod + 0x00000000 0x4c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.ctl_count_leading_zeros_32 + 0x00000000 0x40 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.ctl_count_leading_zeros_16 + 0x00000000 0x34 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__gnu_thumb1_case_shi + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__gnu_thumb1_case_si + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__gnu_thumb1_case_sqi + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__gnu_thumb1_case_uhi + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text.libc.__gnu_thumb1_case_uqi + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .text 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .data 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .bss 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio + 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.__do_nvdebug_operation + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_abort + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fopen + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fgets + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fputc + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fputs + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fread + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fwrite + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fseek + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_ftell + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_gets + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fflush + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fclose + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fgetc + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_getchar + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_putchar + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_puts + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_rewind + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_clearerr + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_feof + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_ferror + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_getch + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_time + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_vprintf + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_vfprintf + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_ungetc + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fgetpos + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_fsetpos + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_freopen + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_perror + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_remove + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_rename + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_tmpfile + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_tmpnam + 0x00000000 0x28 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_getenv + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_system + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_vfscanf + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_vscanf + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_exit + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_enabled + 0x00000000 0xc /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_kbhit + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_ioctl + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_runtime_error + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_break + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_getargs + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_geti + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_getu + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_getl + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_getul + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_getf + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_getd + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_getll + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_getull + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_filesize + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_accept + 0x00000000 0x30 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_bind + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_listen + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_shutdown + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_socket + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_htons + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_htonl + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_loadsymbols + 0x00000000 0x18 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text.libdebugio.debug_unloadsymbols + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .bss.libdebugio.getenv_buffer + 0x00000000 0x400 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .bss.libdebugio.__dbgEnabled + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .bss.libdebugio.tmpnam_buffer + 0x00000000 0x100 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .text 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .data 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .bss 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .text.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .text.libc.__heap_lock + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .text.libc.__heap_unlock + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .text.libc.__printf_lock + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .text.libc.__printf_unlock + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .text.libc.__scanf_lock + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .text.libc.__scanf_unlock + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .text 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .data 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .bss 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.logf.part.4 + 0x00000000 0x14c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.sqrtf.part.6 + 0x00000000 0x84 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.exp.part.2 + 0x00000000 0x19c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.sqrt.part.5 + 0x00000000 0x208 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.log.part.3 + 0x00000000 0x2b4 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.__asinacos + 0x00000000 0x2d0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.__asinacosf + 0x00000000 0x218 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.__poly1_eval + 0x00000000 0x94 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.__poly1_evalf + 0x00000000 0x88 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.__poly_eval + 0x00000000 0x8c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.__poly_evalf + 0x00000000 0x7c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.__sincos + 0x00000000 0x208 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.__sincosf + 0x00000000 0x140 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.acos + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.acosf + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.acosh + 0x00000000 0x230 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.acoshf + 0x00000000 0x1a8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.asin + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.asinf + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.asinh + 0x00000000 0x21c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.asinhf + 0x00000000 0x190 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.atan + 0x00000000 0x220 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.atan2 + 0x00000000 0x128 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.atanf + 0x00000000 0x188 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.atan2f + 0x00000000 0xd0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.atanh + 0x00000000 0x170 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.atanhf + 0x00000000 0xe8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.ceil + 0x00000000 0xb0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.cos + 0x00000000 0x1a0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.cosf + 0x00000000 0x50 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.cosh + 0x00000000 0x1cc /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.coshf + 0x00000000 0x308 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.exp + 0x00000000 0x80 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.expf + 0x00000000 0x140 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.fmax + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.fmaxf + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.fmin + 0x00000000 0x1c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.fminf + 0x00000000 0x14 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.hypot + 0x00000000 0x21c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.hypotf + 0x00000000 0x198 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.log10 + 0x00000000 0x80 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.log10f + 0x00000000 0x6c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.log + 0x00000000 0x58 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.logf + 0x00000000 0x4c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.modf + 0x00000000 0xac /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.modff + 0x00000000 0x50 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.pow + 0x00000000 0x1d0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.powf + 0x00000000 0x240 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.scalbn + 0x00000000 0x64 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.scalbnf + 0x00000000 0x4 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.sin + 0x00000000 0x18c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.sinf + 0x00000000 0x34 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.sinh + 0x00000000 0x254 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.sinhf + 0x00000000 0x1e8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.tan + 0x00000000 0x248 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.tanf + 0x00000000 0x174 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.tanh + 0x00000000 0x244 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.tanhf + 0x00000000 0x28c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.sqrt + 0x00000000 0x48 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.sqrtf + 0x00000000 0x3c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.cbrtf + 0x00000000 0x108 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.cbrt + 0x00000000 0x2a0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.floor + 0x00000000 0xa8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.fmodf + 0x00000000 0xec /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc.fmod + 0x00000000 0x178 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .rodata.libc.__asinacosf_a + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .rodata.libc.__asinacosf_b + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .rodata.libc.atanf_a + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .rodata.libc.__asinacos_a + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .rodata.libc.__asinacos_b + 0x00000000 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .rodata.libc.atan_a + 0x00000000 0x20 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .text.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) + .data.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) + .bss.libc 0x00000000 0x0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) + .text.libc.fabs + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) + .text.libc.fabsf + 0x00000000 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) + .text.libc.ceilf + 0x00000000 0x60 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) + .text.libc.floorf + 0x00000000 0x5c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) + .text.libc.ldexpf + 0x00000000 0x38 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) + .text.libc.frexpf + 0x00000000 0x2c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) + +Memory Configuration + +Name Origin Length Attributes +UNPLACED_SECTIONS 0xffffffff 0x00000000 xw +FLASH 0x08000000 0x00010000 xr +RAM 0x20000000 0x00005000 xw +APB1 0x40000000 0x00010000 xw +APB2 0x40010000 0x00018000 xw +AHB 0x40020000 0x00003400 xw +PPB 0xe0000000 0x00100000 xw +USB_CAN_RAM 0x40006000 0x00000200 xw +CM3_System_Control_Space 0xe000e000 0x00001000 xw +*default* 0x00000000 0xffffffff + +Linker script and memory map + + 0x080065cc __do_debug_operation = __do_debug_operation_mempoll + 0x08004fa0 __vfprintf = __vfprintf_double_long_long + 0x08006198 __vfscanf = __vfscanf_int + 0x08000000 __FLASH_segment_start__ = 0x8000000 + 0x08010000 __FLASH_segment_end__ = 0x8010000 + 0x20000000 __RAM_segment_start__ = 0x20000000 + 0x20005000 __RAM_segment_end__ = 0x20005000 + 0x40000000 __APB1_segment_start__ = 0x40000000 + 0x40010000 __APB1_segment_end__ = 0x40010000 + 0x40010000 __APB2_segment_start__ = 0x40010000 + 0x40028000 __APB2_segment_end__ = 0x40028000 + 0x40020000 __AHB_segment_start__ = 0x40020000 + 0x40023400 __AHB_segment_end__ = 0x40023400 + 0xe0000000 __PPB_segment_start__ = 0xe0000000 + 0xe0100000 __PPB_segment_end__ = 0xe0100000 + 0x40006000 __USB_CAN_RAM_segment_start__ = 0x40006000 + 0x40006200 __USB_CAN_RAM_segment_end__ = 0x40006200 + 0xe000e000 __CM3_System_Control_Space_segment_start__ = 0xe000e000 + 0xe000f000 __CM3_System_Control_Space_segment_end__ = 0xe000f000 + 0x00000080 __STACKSIZE__ = 0x80 + 0x00000000 __STACKSIZE_PROCESS__ = 0x0 + 0x00000000 __STACKSIZE_IRQ__ = 0x0 + 0x00000000 __STACKSIZE_FIQ__ = 0x0 + 0x00000000 __STACKSIZE_SVC__ = 0x0 + 0x00000000 __STACKSIZE_ABT__ = 0x0 + 0x00000000 __STACKSIZE_UND__ = 0x0 + 0x00004000 __HEAPSIZE__ = 0x4000 + 0x20000000 __vectors_ram_load_start__ = ALIGN (__RAM_segment_start__, 0x100) + +.vectors_ram 0x20000000 0x0 + 0x20000000 __vectors_ram_start__ = . + *(.vectors_ram .vectors_ram.*) + 0x20000000 __vectors_ram_end__ = (__vectors_ram_start__ + SIZEOF (.vectors_ram)) + 0x20000000 __vectors_ram_load_end__ = __vectors_ram_end__ + 0x00000001 . = ASSERT (((__vectors_ram_end__ >= __RAM_segment_start__) && (__vectors_ram_end__ <= __RAM_segment_end__)), error: .vectors_ram is too large to fit in RAM memory segment) + 0x08000000 __vectors_load_start__ = ALIGN (__FLASH_segment_start__, 0x100) + +.vectors 0x08000000 0xec + 0x08000000 __vectors_start__ = . + *(.vectors .vectors.*) + .vectors 0x08000000 0xec THUMB Debug/STM32_Startup.o + 0x08000000 _vectors + 0x080000ec __vectors_end__ = (__vectors_start__ + SIZEOF (.vectors)) + 0x080000ec __vectors_load_end__ = __vectors_end__ + 0x00000001 . = ASSERT (((__vectors_end__ >= __FLASH_segment_start__) && (__vectors_end__ <= __FLASH_segment_end__)), error: .vectors is too large to fit in FLASH memory segment) + 0x080000ec __init_load_start__ = ALIGN (__vectors_end__, 0x4) + +.init 0x080000ec 0x1ac + 0x080000ec __init_start__ = . + *(.init .init.*) + .init 0x080000ec 0x124 THUMB Debug/thumb_crt0.o + 0x080000ec _start + 0x0800017c exit + 0x080001a0 __putchar + 0x080001a0 __getchar + .init 0x08000210 0x88 THUMB Debug/STM32_Startup.o + 0x08000222 WWDG_IRQHandler + 0x08000224 PVD_IRQHandler + 0x08000226 TAMPER_IRQHandler + 0x08000228 RTC_IRQHandler + 0x0800022a FLASH_IRQHandler + 0x0800022c RCC_IRQHandler + 0x0800022e EXTI0_IRQHandler + 0x08000230 EXTI1_IRQHandler + 0x08000232 EXTI2_IRQHandler + 0x08000234 EXTI3_IRQHandler + 0x08000236 EXTI4_IRQHandler + 0x08000238 DMA1_Channel1_IRQHandler + 0x0800023a DMA1_Channel2_IRQHandler + 0x0800023c DMA1_Channel3_IRQHandler + 0x0800023e DMA1_Channel4_IRQHandler + 0x08000240 DMA1_Channel5_IRQHandler + 0x08000242 DMA1_Channel6_IRQHandler + 0x08000244 DMA1_Channel7_IRQHandler + 0x08000246 ADC1_2_IRQHandler + 0x08000248 USB_HP_CAN1_TX_IRQHandler + 0x0800024c CAN1_RX1_IRQHandler + 0x0800024e CAN1_SCE_IRQHandler + 0x08000252 TIM1_BRK_IRQHandler + 0x08000254 TIM1_UP_IRQHandler + 0x08000256 TIM1_TRG_COM_IRQHandler + 0x08000258 TIM1_CC_IRQHandler + 0x0800025a TIM2_IRQHandler + 0x0800025c TIM3_IRQHandler + 0x0800025e TIM4_IRQHandler + 0x08000260 I2C1_EV_IRQHandler + 0x08000262 I2C1_ER_IRQHandler + 0x08000264 I2C2_EV_IRQHandler + 0x08000266 I2C2_ER_IRQHandler + 0x08000268 SPI1_IRQHandler + 0x0800026a SPI2_IRQHandler + 0x0800026c USART1_IRQHandler + 0x0800026e USART2_IRQHandler + 0x08000270 USART3_IRQHandler + 0x08000272 EXTI15_10_IRQHandler + 0x08000274 RTCAlarm_IRQHandler + 0x08000278 reset_handler + 0x08000298 __init_end__ = (__init_start__ + SIZEOF (.init)) + 0x08000298 __init_load_end__ = __init_end__ + 0x00000001 . = ASSERT (((__init_end__ >= __FLASH_segment_start__) && (__init_end__ <= __FLASH_segment_end__)), error: .init is too large to fit in FLASH memory segment) + 0x08000298 __text_load_start__ = ALIGN (__init_end__, 0x4) + +.text 0x08000298 0x642c + 0x08000298 __text_start__ = . + *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table) + .glue_7 0x00000000 0x0 linker stubs + .glue_7t 0x00000000 0x0 linker stubs + .text.Caliper_Initialize + 0x08000298 0xdc THUMB Debug/caliper.o + 0x08000298 Caliper_Initialize + .text.Caliper_GetAbsVal + 0x08000374 0x18 THUMB Debug/caliper.o + 0x08000374 Caliper_GetAbsVal + .text.Caliper_GetRelVal + 0x0800038c 0x18 THUMB Debug/caliper.o + 0x0800038c Caliper_GetRelVal + .text.Caliper_GetState + 0x080003a4 0x40 THUMB Debug/caliper.o + 0x080003a4 Caliper_GetState + .text.Caliper_ISRWait + 0x080003e4 0x74 THUMB Debug/caliper.o + 0x080003e4 Caliper_ISRWait + .text.EXTI9_5_IRQHandler + 0x08000458 0x278 THUMB Debug/caliper.o + 0x08000458 EXTI9_5_IRQHandler + .text.Set_System + 0x080006d0 0xc THUMB Debug/hw_config.o + 0x080006d0 Set_System + .text.Set_USBClock + 0x080006dc 0x1c THUMB Debug/hw_config.o + 0x080006dc Set_USBClock + .text.Leave_LowPowerMode + 0x080006f8 0x44 THUMB Debug/hw_config.o + 0x080006f8 Leave_LowPowerMode + .text.USB_Interrupts_Config + 0x0800073c 0x50 THUMB Debug/hw_config.o + 0x0800073c USB_Interrupts_Config + .text.USB_Cable_Config + 0x0800078c 0x38 THUMB Debug/hw_config.o + 0x0800078c USB_Cable_Config + .text.EXTI_Configuration + 0x080007c4 0x38 THUMB Debug/hw_config.o + 0x080007c4 EXTI_Configuration + .text.Get_SerialNum + 0x080007fc 0x60 THUMB Debug/hw_config.o + 0x080007fc Get_SerialNum + .text.IntToUnicode + 0x0800085c 0x94 THUMB Debug/hw_config.o + .text.Key_Initialize + 0x080008f0 0x58 THUMB Debug/key.o + 0x080008f0 Key_Initialize + .text.Key_Poll + 0x08000948 0x138 THUMB Debug/key.o + 0x08000948 Key_Poll + .text.NMI_Handler + 0x08000a80 0xc THUMB Debug/stm32_it.o + 0x08000a80 NMI_Handler + .text.HardFault_Handler + 0x08000a8c 0x8 THUMB Debug/stm32_it.o + 0x08000a8c HardFault_Handler + .text.MemManage_Handler + 0x08000a94 0x8 THUMB Debug/stm32_it.o + 0x08000a94 MemManage_Handler + .text.BusFault_Handler + 0x08000a9c 0x8 THUMB Debug/stm32_it.o + 0x08000a9c BusFault_Handler + .text.UsageFault_Handler + 0x08000aa4 0x8 THUMB Debug/stm32_it.o + 0x08000aa4 UsageFault_Handler + .text.SVC_Handler + 0x08000aac 0xc THUMB Debug/stm32_it.o + 0x08000aac SVC_Handler + .text.DebugMon_Handler + 0x08000ab8 0xc THUMB Debug/stm32_it.o + 0x08000ab8 DebugMon_Handler + .text.PendSV_Handler + 0x08000ac4 0xc THUMB Debug/stm32_it.o + 0x08000ac4 PendSV_Handler + .text.SysTick_Handler + 0x08000ad0 0x24 THUMB Debug/stm32_it.o + 0x08000ad0 SysTick_Handler + .text.USB_LP_CAN1_RX0_IRQHandler + 0x08000af4 0xc THUMB Debug/stm32_it.o + 0x08000af4 USB_LP_CAN1_RX0_IRQHandler + .text.USBWakeUp_IRQHandler + 0x08000b00 0x10 THUMB Debug/stm32_it.o + 0x08000b00 USBWakeUp_IRQHandler + .text.NVIC_PriorityGroupConfig + 0x08000b10 0x28 THUMB Debug/misc.o + 0x08000b10 NVIC_PriorityGroupConfig + .text.NVIC_Init + 0x08000b38 0xe8 THUMB Debug/misc.o + 0x08000b38 NVIC_Init + .text.EXTI_Init + 0x08000c20 0x138 THUMB Debug/stm32f10x_exti.o + 0x08000c20 EXTI_Init + .text.EXTI_ClearITPendingBit + 0x08000d58 0x20 THUMB Debug/stm32f10x_exti.o + 0x08000d58 EXTI_ClearITPendingBit + .text.GPIO_Init + 0x08000d78 0x1b0 THUMB Debug/stm32f10x_gpio.o + 0x08000d78 GPIO_Init + .text.GPIO_SetBits + 0x08000f28 0x1c THUMB Debug/stm32f10x_gpio.o + 0x08000f28 GPIO_SetBits + .text.GPIO_ResetBits + 0x08000f44 0x1c THUMB Debug/stm32f10x_gpio.o + 0x08000f44 GPIO_ResetBits + .text.GPIO_EXTILineConfig + 0x08000f60 0xb0 THUMB Debug/stm32f10x_gpio.o + 0x08000f60 GPIO_EXTILineConfig + .text.RCC_USBCLKConfig + 0x08001010 0x20 THUMB Debug/stm32f10x_rcc.o + 0x08001010 RCC_USBCLKConfig + .text.RCC_APB2PeriphClockCmd + 0x08001030 0x50 THUMB Debug/stm32f10x_rcc.o + 0x08001030 RCC_APB2PeriphClockCmd + .text.RCC_APB1PeriphClockCmd + 0x08001080 0x50 THUMB Debug/stm32f10x_rcc.o + 0x08001080 RCC_APB1PeriphClockCmd + .text.Standard_GetConfiguration + 0x080010d0 0x4c THUMB Debug/usb_core.o + 0x080010d0 Standard_GetConfiguration + .text.Standard_SetConfiguration + 0x0800111c 0x74 THUMB Debug/usb_core.o + 0x0800111c Standard_SetConfiguration + .text.Standard_GetInterface + 0x08001190 0x4c THUMB Debug/usb_core.o + 0x08001190 Standard_GetInterface + .text.Standard_SetInterface + 0x080011dc 0xcc THUMB Debug/usb_core.o + 0x080011dc Standard_SetInterface + .text.Standard_GetStatus + 0x080012a8 0x1bc THUMB Debug/usb_core.o + 0x080012a8 Standard_GetStatus + .text.Standard_ClearFeature + 0x08001464 0x234 THUMB Debug/usb_core.o + 0x08001464 Standard_ClearFeature + .text.Standard_SetEndPointFeature + 0x08001698 0x148 THUMB Debug/usb_core.o + 0x08001698 Standard_SetEndPointFeature + .text.Standard_SetDeviceFeature + 0x080017e0 0x38 THUMB Debug/usb_core.o + 0x080017e0 Standard_SetDeviceFeature + .text.Standard_GetDescriptorData + 0x08001818 0x54 THUMB Debug/usb_core.o + 0x08001818 Standard_GetDescriptorData + .text.DataStageOut + 0x0800186c 0x140 THUMB Debug/usb_core.o + .text.DataStageIn + 0x080019ac 0x154 THUMB Debug/usb_core.o + .text.NoData_Setup0 + 0x08001b00 0x208 THUMB Debug/usb_core.o + .text.Data_Setup0 + 0x08001d08 0x480 THUMB Debug/usb_core.o + .text.Setup0_Process + 0x08002188 0x120 THUMB Debug/usb_core.o + 0x08002188 Setup0_Process + .text.In0_Process + 0x080022a8 0xbc THUMB Debug/usb_core.o + 0x080022a8 In0_Process + .text.Out0_Process + 0x08002364 0x8c THUMB Debug/usb_core.o + 0x08002364 Out0_Process + .text.Post0_Process + 0x080023f0 0x60 THUMB Debug/usb_core.o + 0x080023f0 Post0_Process + .text.SetDeviceAddress + 0x08002450 0x88 THUMB Debug/usb_core.o + 0x08002450 SetDeviceAddress + .text.NOP_Process + 0x080024d8 0xc THUMB Debug/usb_core.o + 0x080024d8 NOP_Process + .text.EP1_OUT_Callback + 0x080024e4 0x74 THUMB Debug/usb_endp.o + 0x080024e4 EP1_OUT_Callback + .text.EP1_IN_Callback + 0x08002558 0x18 THUMB Debug/usb_endp.o + 0x08002558 EP1_IN_Callback + .text.USB_Init + 0x08002570 0x5c THUMB Debug/usb_init.o + 0x08002570 USB_Init + .text.CTR_LP 0x080025cc 0x428 THUMB Debug/usb_int.o + 0x080025cc CTR_LP + .text.USB_Istr + 0x080029f4 0x350 THUMB Debug/usb_istr.o + 0x080029f4 USB_Istr + .text.UserToPMABufferCopy + 0x08002d44 0x88 THUMB Debug/usb_mem.o + 0x08002d44 UserToPMABufferCopy + .text.PMAToUserBufferCopy + 0x08002dcc 0x6c THUMB Debug/usb_mem.o + 0x08002dcc PMAToUserBufferCopy + .text.CustomHID_init + 0x08002e38 0x30 THUMB Debug/usb_prop.o + 0x08002e38 CustomHID_init + .text.CustomHID_Reset + 0x08002e68 0x104 THUMB Debug/usb_prop.o + 0x08002e68 CustomHID_Reset + .text.CustomHID_SetConfiguration + 0x08002f6c 0x28 THUMB Debug/usb_prop.o + 0x08002f6c CustomHID_SetConfiguration + .text.CustomHID_SetDeviceAddress + 0x08002f94 0x18 THUMB Debug/usb_prop.o + 0x08002f94 CustomHID_SetDeviceAddress + .text.CustomHID_Status_In + 0x08002fac 0x58 THUMB Debug/usb_prop.o + 0x08002fac CustomHID_Status_In + .text.CustomHID_Status_Out + 0x08003004 0xc THUMB Debug/usb_prop.o + 0x08003004 CustomHID_Status_Out + .text.CustomHID_Data_Setup + 0x08003010 0x104 THUMB Debug/usb_prop.o + 0x08003010 CustomHID_Data_Setup + .text.CustomHID_SetReport_Feature + 0x08003114 0x3c THUMB Debug/usb_prop.o + 0x08003114 CustomHID_SetReport_Feature + .text.CustomHID_NoData_Setup + 0x08003150 0x3c THUMB Debug/usb_prop.o + 0x08003150 CustomHID_NoData_Setup + .text.CustomHID_GetDeviceDescriptor + 0x0800318c 0x28 THUMB Debug/usb_prop.o + 0x0800318c CustomHID_GetDeviceDescriptor + .text.CustomHID_GetConfigDescriptor + 0x080031b4 0x28 THUMB Debug/usb_prop.o + 0x080031b4 CustomHID_GetConfigDescriptor + .text.CustomHID_GetStringDescriptor + 0x080031dc 0x4c THUMB Debug/usb_prop.o + 0x080031dc CustomHID_GetStringDescriptor + .text.CustomHID_GetReportDescriptor + 0x08003228 0x28 THUMB Debug/usb_prop.o + 0x08003228 CustomHID_GetReportDescriptor + .text.CustomHID_GetHIDDescriptor + 0x08003250 0x28 THUMB Debug/usb_prop.o + 0x08003250 CustomHID_GetHIDDescriptor + .text.CustomHID_Get_Interface_Setting + 0x08003278 0x38 THUMB Debug/usb_prop.o + 0x08003278 CustomHID_Get_Interface_Setting + .text.CustomHID_SetProtocol + 0x080032b0 0x30 THUMB Debug/usb_prop.o + 0x080032b0 CustomHID_SetProtocol + .text.CustomHID_GetProtocolValue + 0x080032e0 0x3c THUMB Debug/usb_prop.o + 0x080032e0 CustomHID_GetProtocolValue + .text.PowerOn 0x0800331c 0x80 THUMB Debug/usb_pwr.o + 0x0800331c PowerOn + .text.Suspend 0x0800339c 0x200 THUMB Debug/usb_pwr.o + 0x0800339c Suspend + .text.Resume_Init + 0x0800359c 0x40 THUMB Debug/usb_pwr.o + 0x0800359c Resume_Init + .text.Resume 0x080035dc 0x1c0 THUMB Debug/usb_pwr.o + 0x080035dc Resume + .text.SetBTABLE + 0x0800379c 0x28 THUMB Debug/usb_regs.o + 0x0800379c SetBTABLE + .text.SetEPType + 0x080037c4 0x4c THUMB Debug/usb_regs.o + 0x080037c4 SetEPType + .text.SetEPTxStatus + 0x08003810 0x74 THUMB Debug/usb_regs.o + 0x08003810 SetEPTxStatus + .text.SetEPRxStatus + 0x08003884 0x74 THUMB Debug/usb_regs.o + 0x08003884 SetEPRxStatus + .text.SetEPTxValid + 0x080038f8 0x58 THUMB Debug/usb_regs.o + 0x080038f8 SetEPTxValid + .text.SetEPRxValid + 0x08003950 0x58 THUMB Debug/usb_regs.o + 0x08003950 SetEPRxValid + .text.Clear_Status_Out + 0x080039a8 0x58 THUMB Debug/usb_regs.o + 0x080039a8 Clear_Status_Out + .text.ClearDTOG_RX + 0x08003a00 0x60 THUMB Debug/usb_regs.o + 0x08003a00 ClearDTOG_RX + .text.ClearDTOG_TX + 0x08003a60 0x60 THUMB Debug/usb_regs.o + 0x08003a60 ClearDTOG_TX + .text.SetEPTxAddr + 0x08003ac0 0x48 THUMB Debug/usb_regs.o + 0x08003ac0 SetEPTxAddr + .text.SetEPRxAddr + 0x08003b08 0x4c THUMB Debug/usb_regs.o + 0x08003b08 SetEPRxAddr + .text.GetEPTxAddr + 0x08003b54 0x3c THUMB Debug/usb_regs.o + 0x08003b54 GetEPTxAddr + .text.GetEPRxAddr + 0x08003b90 0x40 THUMB Debug/usb_regs.o + 0x08003b90 GetEPRxAddr + .text.SetEPTxCount + 0x08003bd0 0x40 THUMB Debug/usb_regs.o + 0x08003bd0 SetEPTxCount + .text.SetEPRxCount + 0x08003c10 0x98 THUMB Debug/usb_regs.o + 0x08003c10 SetEPRxCount + .text.GetEPRxCount + 0x08003ca8 0x48 THUMB Debug/usb_regs.o + 0x08003ca8 GetEPRxCount + .text.ByteSwap + 0x08003cf0 0x34 THUMB Debug/usb_regs.o + 0x08003cf0 ByteSwap + .text.USB_SIL_Init + 0x08003d24 0x40 THUMB Debug/usb_sil.o + 0x08003d24 USB_SIL_Init + .text.USB_SIL_Write + 0x08003d64 0x4c THUMB Debug/usb_sil.o + 0x08003d64 USB_SIL_Write + .text.USB_SIL_Read + 0x08003db0 0x4c THUMB Debug/usb_sil.o + 0x08003db0 USB_SIL_Read + .text.NVIC_SetPriority + 0x08003dfc 0x58 THUMB Debug/main.o + .text.SysTick_Config + 0x08003e54 0x64 THUMB Debug/main.o + .text.Wait 0x08003eb8 0x34 THUMB Debug/main.o + 0x08003eb8 Wait + .text.USB_AsciiToHid + 0x08003eec 0xa4 THUMB Debug/main.o + 0x08003eec USB_AsciiToHid + .text.USB_SendText + 0x08003f90 0xa0 THUMB Debug/main.o + 0x08003f90 USB_SendText + .text.main 0x08004030 0x278 THUMB Debug/main.o + 0x08004030 main + .text.SystemInit + 0x080042a8 0xa8 THUMB Debug/system_stm32f10x.o + 0x080042a8 SystemInit + .text.SetSysClock + 0x08004350 0xc THUMB Debug/system_stm32f10x.o + .text.SetSysClockTo72 + 0x0800435c 0x1ac THUMB Debug/system_stm32f10x.o + .text.libc.__int32_to_float64 + 0x08004508 0x30 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x08004508 __floatsidf + 0x08004508 __aeabi_i2d + 0x08004508 __int32_to_float64 + .text.libc.__int64_to_float64 + 0x08004538 0xa0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x08004538 __floatdidf + 0x08004538 __int64_to_float64 + 0x08004538 __aeabi_l2d + 0x0800455a __RAL_aeabi_l2d_common + .text.libc.__uint64_to_float64 + 0x080045d8 0x14 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x080045d8 __uint64_to_float64 + 0x080045d8 __aeabi_ul2d + 0x080045d8 __floatundidf + .text.libc.__float64_to_uint64 + 0x080045ec 0x48 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x080045ec __aeabi_d2ulz + 0x080045ec __fixunsdfdi + 0x080045ec __float64_to_uint64 + .text.libc.__float32_to_float64 + 0x08004634 0x38 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x08004634 __extendsfdf2 + 0x08004634 __float32_to_float64 + 0x08004634 __aeabi_f2d + .text.libc.__float64_to_float32 + 0x0800466c 0x70 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x0800466c __aeabi_d2f + 0x0800466c __truncdfsf2 + 0x0800466c __float64_to_float32 + .text.libc.__float64_add + 0x080046dc 0x294 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x080046dc __aeabi_drsub + 0x080046e4 __float64_sub + 0x080046e4 __aeabi_dsub + 0x080046e4 __subdf3 + 0x080046e8 __adddf3 + 0x080046e8 __float64_add + 0x080046e8 __aeabi_dadd + .text.libc.__float64_mul + 0x08004970 0x16c /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x08004970 __aeabi_dmul + 0x08004970 __float64_mul + 0x08004970 __muldf3 + .text.libc.__float64_div + 0x08004adc 0x214 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x08004adc __aeabi_ddiv + 0x08004adc __divdf3 + 0x08004adc __float64_div + .text.libc.__float64_cmp + 0x08004cf0 0x64 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x08004cf0 __cmpdf2 + 0x08004cf0 __eqdf2 + 0x08004cf0 __gtdf2 + 0x08004cf0 __ltdf2 + 0x08004cf0 __ledf2 + 0x08004cf0 __nedf2 + 0x08004cf0 __gedf2 + .text.libc.__float64_isinf + 0x08004d54 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x08004d54 __float64_isinf + .text.libc.__float64_isnan + 0x08004d64 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x08004d64 __float64_isnan + .text.libc.__getc + 0x08004d74 0x28 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004d74 __getc + .text.libc.__RAL_pow10 + 0x08004d9c 0x74 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004d9c __RAL_pow10 + .text.libc.__putc + 0x08004e10 0x38 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004e10 __putc + .text.libc.__print_padding + 0x08004e48 0x24 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004e48 __print_padding + .text.libc.__pre_padding + 0x08004e6c 0x1c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004e6c __pre_padding + .text.libc.abs + 0x08004e88 0x8 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004e88 abs + .text.libc.isupper + 0x08004e90 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004e90 isupper + .text.libc.islower + 0x08004ea0 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004ea0 islower + .text.libc.isdigit + 0x08004eb0 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004eb0 isdigit + .text.libc.__digit + 0x08004ec0 0x3c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004ec0 __digit + .text.libc.isspace + 0x08004efc 0x18 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004efc isspace + .text.libc.sprintf + 0x08004f14 0x2c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08004f14 sprintf + .text.libc.strlen + 0x08004f40 0x60 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + 0x08004f40 strlen + .text.libc.__vfprintf_double_long_long + 0x08004fa0 0x1088 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + 0x08004fa0 __vfprintf_double_long_long + .text.libc.__ungetc + 0x08006028 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .text.libc.rd_int + 0x08006048 0x150 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .text.libc.__vfscanf_int + 0x08006198 0x3c8 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + 0x08006198 __vfscanf_int + .text.libc.__int64_umod + 0x08006560 0xc /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + 0x08006560 __int64_umod + 0x08006560 __umoddi3 + .text.libc.__int64_udivmod + 0x0800656c 0x60 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + 0x0800656c __int64_udivmod + 0x0800656c __aeabi_uldivmod + 0x0800656c __int64_udiv + 0x0800656c __udivdi3 + .text.libdebugio.__do_debug_operation_mempoll + 0x080065cc 0x38 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + 0x080065cc __do_debug_operation_mempoll + .text.libc.__errno + 0x08006604 0xc /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + 0x08006604 __errno + .text.libc.__debug_io_lock + 0x08006610 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + 0x08006610 __debug_io_lock + .text.libc.__debug_io_unlock + 0x08006614 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + 0x08006614 __debug_io_unlock + .text.libc.frexp + 0x08006618 0x48 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + 0x08006618 frexp + .text.libc.ldexp + 0x08006660 0x64 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + 0x08006660 ldexp + 0x080066c4 __text_end__ = (__text_start__ + SIZEOF (.text)) + 0x080066c4 __text_load_end__ = __text_end__ + +.vfp11_veneer 0x00000000 0x0 + .vfp11_veneer 0x00000000 0x0 linker stubs + +.v4_bx 0x00000000 0x0 + .v4_bx 0x00000000 0x0 linker stubs + 0x00000001 . = ASSERT (((__text_end__ >= __FLASH_segment_start__) && (__text_end__ <= __FLASH_segment_end__)), error: .text is too large to fit in FLASH memory segment) + 0x080066c4 __dtors_load_start__ = ALIGN (__text_end__, 0x4) + +.dtors 0x080066c4 0x0 + 0x080066c4 __dtors_start__ = . + *(SORT(.dtors.*)) + *(.dtors) + 0x080066c4 __dtors_end__ = (__dtors_start__ + SIZEOF (.dtors)) + 0x080066c4 __dtors_load_end__ = __dtors_end__ + 0x00000001 . = ASSERT (((__dtors_end__ >= __FLASH_segment_start__) && (__dtors_end__ <= __FLASH_segment_end__)), error: .dtors is too large to fit in FLASH memory segment) + 0x080066c4 __ctors_load_start__ = ALIGN (__dtors_end__, 0x4) + +.ctors 0x080066c4 0x0 + 0x080066c4 __ctors_start__ = . + *(SORT(.ctors.*)) + *(.ctors) + 0x080066c4 __ctors_end__ = (__ctors_start__ + SIZEOF (.ctors)) + 0x080066c4 __ctors_load_end__ = __ctors_end__ + 0x00000001 . = ASSERT (((__ctors_end__ >= __FLASH_segment_start__) && (__ctors_end__ <= __FLASH_segment_end__)), error: .ctors is too large to fit in FLASH memory segment) + 0x080066c4 __rodata_load_start__ = ALIGN (__ctors_end__, 0x4) + +.rodata 0x080066c4 0x220 + 0x080066c4 __rodata_start__ = . + *(.rodata .rodata.* .gnu.linkonce.r.*) + .rodata.CustomHID_DeviceDescriptor + 0x080066c4 0x14 THUMB Debug/usb_desc.o + 0x080066c4 CustomHID_DeviceDescriptor + .rodata.CustomHID_ConfigDescriptor + 0x080066d8 0x2c THUMB Debug/usb_desc.o + 0x080066d8 CustomHID_ConfigDescriptor + .rodata.CustomHID_ReportDescriptor + 0x08006704 0x40 THUMB Debug/usb_desc.o + 0x08006704 CustomHID_ReportDescriptor + .rodata.CustomHID_StringLangID + 0x08006744 0x4 THUMB Debug/usb_desc.o + 0x08006744 CustomHID_StringLangID + .rodata.CustomHID_StringVendor + 0x08006748 0x28 THUMB Debug/usb_desc.o + 0x08006748 CustomHID_StringVendor + .rodata.CustomHID_StringProduct + 0x08006770 0x20 THUMB Debug/usb_desc.o + 0x08006770 CustomHID_StringProduct + .rodata 0x08006790 0x10 THUMB Debug/main.o + .rodata.libc.__float64_infinity + 0x080067a0 0x8 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + 0x080067a0 __float64_infinity + .rodata.libc.__hex_lc + 0x080067a8 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x080067a8 __hex_lc + .rodata.libc.power + 0x080067b8 0x48 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .rodata.libc.__hex_uc + 0x08006800 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x08006800 __hex_uc + .rodata.libc.str1.4 + 0x08006810 0x34 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .rodata.libc.ipow10 + 0x08006844 0xa0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + 0x080068e4 __rodata_end__ = (__rodata_start__ + SIZEOF (.rodata)) + 0x080068e4 __rodata_load_end__ = __rodata_end__ + 0x00000001 . = ASSERT (((__rodata_end__ >= __FLASH_segment_start__) && (__rodata_end__ <= __FLASH_segment_end__)), error: .rodata is too large to fit in FLASH memory segment) + 0x080068e4 __data_load_start__ = ALIGN (__rodata_end__, 0x4) + +.data 0x20000000 0xf4 load address 0x080068e4 + 0x20000000 __data_start__ = . + *(.data .data.* .gnu.linkonce.d.*) + .data.CustomHID_StringSerial + 0x20000000 0x1c THUMB Debug/usb_desc.o + 0x20000000 CustomHID_StringSerial + .data.pEpInt_IN + 0x2000001c 0x1c THUMB Debug/usb_istr.o + 0x2000001c pEpInt_IN + .data.pEpInt_OUT + 0x20000038 0x1c THUMB Debug/usb_istr.o + 0x20000038 pEpInt_OUT + .data.Device_Table + 0x20000054 0x4 THUMB Debug/usb_prop.o + 0x20000054 Device_Table + .data.Device_Property + 0x20000058 0x30 THUMB Debug/usb_prop.o + 0x20000058 Device_Property + .data.User_Standard_Requests + 0x20000088 0x24 THUMB Debug/usb_prop.o + 0x20000088 User_Standard_Requests + .data.Device_Descriptor + 0x200000ac 0x8 THUMB Debug/usb_prop.o + 0x200000ac Device_Descriptor + .data.Config_Descriptor + 0x200000b4 0x8 THUMB Debug/usb_prop.o + 0x200000b4 Config_Descriptor + .data.CustomHID_Report_Descriptor + 0x200000bc 0x8 THUMB Debug/usb_prop.o + 0x200000bc CustomHID_Report_Descriptor + .data.CustomHID_Hid_Descriptor + 0x200000c4 0x8 THUMB Debug/usb_prop.o + 0x200000c4 CustomHID_Hid_Descriptor + .data.String_Descriptor + 0x200000cc 0x20 THUMB Debug/usb_prop.o + 0x200000cc String_Descriptor + .data.PrevXferComplete + 0x200000ec 0x1 THUMB Debug/main.o + 0x200000ec PrevXferComplete + *fill* 0x200000ed 0x3 00 + .data.SystemCoreClock + 0x200000f0 0x4 THUMB Debug/system_stm32f10x.o + 0x200000f0 SystemCoreClock + 0x200000f4 __data_end__ = (__data_start__ + SIZEOF (.data)) + 0x080069d8 __data_load_end__ = (__data_load_start__ + SIZEOF (.data)) + 0x00000001 . = ASSERT (((__data_load_end__ >= __FLASH_segment_start__) && (__data_load_end__ <= __FLASH_segment_end__)), error: .data is too large to fit in FLASH memory segment) + +.data_run 0x20000000 0xf4 load address 0x080068e4 + 0x20000000 __data_run_start__ = . + 0x200000f4 . = MAX ((__data_run_start__ + SIZEOF (.data)), .) + *fill* 0x20000000 0xf4 00 + 0x200000f4 __data_run_end__ = (__data_run_start__ + SIZEOF (.data_run)) + 0x200000f4 __data_run_load_end__ = __data_run_end__ + 0x00000001 . = ASSERT (((__data_run_end__ >= __RAM_segment_start__) && (__data_run_end__ <= __RAM_segment_end__)), error: .data_run is too large to fit in RAM memory segment) + 0x200000f4 __bss_load_start__ = ALIGN (__data_run_end__, 0x4) + +.bss 0x200000f4 0xc8 + 0x200000f4 __bss_start__ = . + *(.bss .bss.* .gnu.linkonce.b.*) + .bss.Caliper_Timestamp + 0x200000f4 0x4 THUMB Debug/caliper.o + 0x200000f4 Caliper_Timestamp + .bss.Caliper_AbsValue + 0x200000f8 0x4 THUMB Debug/caliper.o + 0x200000f8 Caliper_AbsValue + .bss.Caliper_RelValue + 0x200000fc 0x4 THUMB Debug/caliper.o + 0x200000fc Caliper_RelValue + .bss.Caliper_State + 0x20000100 0x1 THUMB Debug/caliper.o + 0x20000100 Caliper_State + .bss.Caliper_ISR_State + 0x20000101 0x1 THUMB Debug/caliper.o + 0x20000101 Caliper_ISR_State + .bss.key 0x20000102 0x1 THUMB Debug/key.o + 0x20000102 key + .bss.new_key 0x20000103 0x1 THUMB Debug/key.o + 0x20000103 new_key + .bss.key_code_tmp.2559 + 0x20000104 0x1 THUMB Debug/key.o + .bss.key_code_old.2560 + 0x20000105 0x1 THUMB Debug/key.o + *fill* 0x20000106 0x2 00 + .bss.timestamp.2561 + 0x20000108 0x4 THUMB Debug/key.o + .bss.StatusInfo + 0x2000010c 0x4 THUMB Debug/usb_core.o + 0x2000010c StatusInfo + .bss.Data_Mul_MaxPacketSize + 0x20000110 0x4 THUMB Debug/usb_core.o + 0x20000110 Data_Mul_MaxPacketSize + .bss.Receive_Buffer + 0x20000114 0x4 THUMB Debug/usb_endp.o + 0x20000114 Receive_Buffer + .bss.EPindex 0x20000118 0x1 THUMB Debug/usb_init.o + 0x20000118 EPindex + *fill* 0x20000119 0x3 00 + .bss.pInformation + 0x2000011c 0x4 THUMB Debug/usb_init.o + 0x2000011c pInformation + .bss.pProperty + 0x20000120 0x4 THUMB Debug/usb_init.o + 0x20000120 pProperty + .bss.wInterrupt_Mask + 0x20000124 0x2 THUMB Debug/usb_init.o + 0x20000124 wInterrupt_Mask + *fill* 0x20000126 0x2 00 + .bss.Device_Info + 0x20000128 0x24 THUMB Debug/usb_init.o + 0x20000128 Device_Info + .bss.pUser_Standard_Requests + 0x2000014c 0x4 THUMB Debug/usb_init.o + 0x2000014c pUser_Standard_Requests + .bss.SaveRState + 0x20000150 0x2 THUMB Debug/usb_int.o + 0x20000150 SaveRState + .bss.SaveTState + 0x20000152 0x2 THUMB Debug/usb_int.o + 0x20000152 SaveTState + .bss.wIstr 0x20000154 0x2 THUMB Debug/usb_istr.o + 0x20000154 wIstr + .bss.bIntPackSOF + 0x20000156 0x1 THUMB Debug/usb_istr.o + 0x20000156 bIntPackSOF + *fill* 0x20000157 0x1 00 + .bss.esof_counter + 0x20000158 0x4 THUMB Debug/usb_istr.o + 0x20000158 esof_counter + .bss.wCNTR 0x2000015c 0x4 THUMB Debug/usb_istr.o + 0x2000015c wCNTR + .bss.ProtocolValue + 0x20000160 0x4 THUMB Debug/usb_prop.o + 0x20000160 ProtocolValue + .bss.Request 0x20000164 0x1 THUMB Debug/usb_prop.o + 0x20000164 Request + *fill* 0x20000165 0x3 00 + .bss.Report_Buf + 0x20000168 0x4 THUMB Debug/usb_prop.o + 0x20000168 Report_Buf + .bss.bDeviceState + 0x2000016c 0x4 THUMB Debug/usb_pwr.o + 0x2000016c bDeviceState + .bss.fSuspendEnabled + 0x20000170 0x4 THUMB Debug/usb_pwr.o + 0x20000170 fSuspendEnabled + .bss.EP 0x20000174 0x20 THUMB Debug/usb_pwr.o + 0x20000174 EP + .bss.ResumeS 0x20000194 0x8 THUMB Debug/usb_pwr.o + 0x20000194 ResumeS + .bss.remotewakeupon + 0x2000019c 0x4 THUMB Debug/usb_pwr.o + 0x2000019c remotewakeupon + .bss.KeyRep 0x200001a0 0x8 THUMB Debug/main.o + 0x200001a0 KeyRep + .bss.Tick 0x200001a8 0x4 THUMB Debug/main.o + 0x200001a8 Tick + .bss.libc.__format_extender + 0x200001ac 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x200001ac __format_extender + .bss.libdebugio.dbgCommWord + 0x200001b0 0x4 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + 0x200001b0 dbgCommWord + .bss.libdebugio.dbgCntrlWord_mempoll + 0x200001b4 0x4 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + 0x200001b4 dbgCntrlWord_mempoll + .bss.libc.errno + 0x200001b8 0x4 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + *(COMMON) + 0x200001bc __bss_end__ = (__bss_start__ + SIZEOF (.bss)) + 0x200001bc __bss_load_end__ = __bss_end__ + 0x00000001 . = ASSERT (((__bss_end__ >= __RAM_segment_start__) && (__bss_end__ <= __RAM_segment_end__)), error: .bss is too large to fit in RAM memory segment) + 0x200001bc __non_init_load_start__ = ALIGN (__bss_end__, 0x4) + +.non_init 0x200001bc 0x0 + 0x200001bc __non_init_start__ = . + *(.non_init .non_init.*) + 0x200001bc __non_init_end__ = (__non_init_start__ + SIZEOF (.non_init)) + 0x200001bc __non_init_load_end__ = __non_init_end__ + 0x00000001 . = ASSERT (((__non_init_end__ >= __RAM_segment_start__) && (__non_init_end__ <= __RAM_segment_end__)), error: .non_init is too large to fit in RAM memory segment) + 0x200001bc __heap_load_start__ = ALIGN (__non_init_end__, 0x4) + +.heap 0x200001bc 0x4000 + 0x200001bc __heap_start__ = . + *(.heap .heap.*) + 0x200041bc . = ALIGN (MAX ((__heap_start__ + __HEAPSIZE__), .), 0x4) + *fill* 0x200001bc 0x4000 00 + 0x200041bc __heap_end__ = (__heap_start__ + SIZEOF (.heap)) + 0x200041bc __heap_load_end__ = __heap_end__ + 0x00000001 . = ASSERT (((__heap_end__ >= __RAM_segment_start__) && (__heap_end__ <= __RAM_segment_end__)), error: .heap is too large to fit in RAM memory segment) + 0x200041bc __stack_load_start__ = ALIGN (__heap_end__, 0x4) + +.stack 0x200041bc 0x80 + 0x200041bc __stack_start__ = . + *(.stack .stack.*) + 0x2000423c . = ALIGN (MAX ((__stack_start__ + __STACKSIZE__), .), 0x4) + *fill* 0x200041bc 0x80 00 + 0x2000423c __stack_end__ = (__stack_start__ + SIZEOF (.stack)) + 0x2000423c __stack_load_end__ = __stack_end__ + 0x00000001 . = ASSERT (((__stack_end__ >= __RAM_segment_start__) && (__stack_end__ <= __RAM_segment_end__)), error: .stack is too large to fit in RAM memory segment) + 0x2000423c __stack_process_load_start__ = ALIGN (__stack_end__, 0x4) + +.stack_process 0x2000423c 0x0 + 0x2000423c __stack_process_start__ = . + *(.stack_process .stack_process.*) + 0x2000423c . = ALIGN (MAX ((__stack_process_start__ + __STACKSIZE_PROCESS__), .), 0x4) + 0x2000423c __stack_process_end__ = (__stack_process_start__ + SIZEOF (.stack_process)) + 0x2000423c __stack_process_load_end__ = __stack_process_end__ + 0x00000001 . = ASSERT (((__stack_process_end__ >= __RAM_segment_start__) && (__stack_process_end__ <= __RAM_segment_end__)), error: .stack_process is too large to fit in RAM memory segment) + 0x080069d8 __fast_load_start__ = ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + +.fast 0x2000423c 0x0 load address 0x080069d8 + 0x2000423c __fast_start__ = . + *(.fast .fast.*) + 0x2000423c __fast_end__ = (__fast_start__ + SIZEOF (.fast)) + 0x080069d8 __fast_load_end__ = (__fast_load_start__ + SIZEOF (.fast)) + 0x00000001 . = ASSERT (((__fast_load_end__ >= __FLASH_segment_start__) && (__fast_load_end__ <= __FLASH_segment_end__)), error: .fast is too large to fit in FLASH memory segment) + +.fast_run 0x2000423c 0x0 + 0x2000423c __fast_run_start__ = . + 0x2000423c . = MAX ((__fast_run_start__ + SIZEOF (.fast)), .) + 0x2000423c __fast_run_end__ = (__fast_run_start__ + SIZEOF (.fast_run)) + 0x2000423c __fast_run_load_end__ = __fast_run_end__ + 0x00000001 . = ASSERT (((__fast_run_end__ >= __RAM_segment_start__) && (__fast_run_end__ <= __RAM_segment_end__)), error: .fast_run is too large to fit in RAM memory segment) + 0x2000423c __tbss_load_start__ = ALIGN (__fast_run_end__, 0x4) + +.tbss 0x2000423c 0x0 + 0x2000423c __tbss_start__ = . + *(.tbss .tbss.*) + 0x2000423c __tbss_end__ = (__tbss_start__ + SIZEOF (.tbss)) + 0x2000423c __tbss_load_end__ = __tbss_end__ + 0x00000001 . = ASSERT (((__tbss_end__ >= __RAM_segment_start__) && (__tbss_end__ <= __RAM_segment_end__)), error: .tbss is too large to fit in RAM memory segment) + 0x080069d8 __tdata_load_start__ = ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) + +.tdata 0x2000423c 0x0 load address 0x080069d8 + 0x2000423c __tdata_start__ = . + *(.tdata .tdata.*) + 0x2000423c __tdata_end__ = (__tdata_start__ + SIZEOF (.tdata)) + 0x080069d8 __tdata_load_end__ = (__tdata_load_start__ + SIZEOF (.tdata)) + 0x080069d8 __FLASH_segment_used_end__ = (ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) + SIZEOF (.tdata)) + 0x00000001 . = ASSERT (((__tdata_load_end__ >= __FLASH_segment_start__) && (__tdata_load_end__ <= __FLASH_segment_end__)), error: .tdata is too large to fit in FLASH memory segment) + +.tdata_run 0x2000423c 0x0 + 0x2000423c __tdata_run_start__ = . + 0x2000423c . = MAX ((__tdata_run_start__ + SIZEOF (.tdata)), .) + 0x2000423c __tdata_run_end__ = (__tdata_run_start__ + SIZEOF (.tdata_run)) + 0x2000423c __tdata_run_load_end__ = __tdata_run_end__ + 0x2000423c __RAM_segment_used_end__ = (ALIGN (__tbss_end__, 0x4) + SIZEOF (.tdata_run)) + 0x00000001 . = ASSERT (((__tdata_run_end__ >= __RAM_segment_start__) && (__tdata_run_end__ <= __RAM_segment_end__)), error: .tdata_run is too large to fit in RAM memory segment) +START GROUP +LOAD THUMB Debug/caliper.o +LOAD THUMB Debug/hw_config.o +LOAD THUMB Debug/key.o +LOAD THUMB Debug/stm32_it.o +LOAD THUMB Debug/misc.o +LOAD THUMB Debug/stm32f10x_adc.o +LOAD THUMB Debug/stm32f10x_bkp.o +LOAD THUMB Debug/stm32f10x_can.o +LOAD THUMB Debug/stm32f10x_cec.o +LOAD THUMB Debug/stm32f10x_crc.o +LOAD THUMB Debug/stm32f10x_dac.o +LOAD THUMB Debug/stm32f10x_dbgmcu.o +LOAD THUMB Debug/stm32f10x_dma.o +LOAD THUMB Debug/stm32f10x_exti.o +LOAD THUMB Debug/stm32f10x_flash.o +LOAD THUMB Debug/stm32f10x_fsmc.o +LOAD THUMB Debug/stm32f10x_gpio.o +LOAD THUMB Debug/stm32f10x_i2c.o +LOAD THUMB Debug/stm32f10x_iwdg.o +LOAD THUMB Debug/stm32f10x_pwr.o +LOAD THUMB Debug/stm32f10x_rcc.o +LOAD THUMB Debug/stm32f10x_rtc.o +LOAD THUMB Debug/stm32f10x_sdio.o +LOAD THUMB Debug/stm32f10x_spi.o +LOAD THUMB Debug/stm32f10x_tim.o +LOAD THUMB Debug/stm32f10x_usart.o +LOAD THUMB Debug/stm32f10x_wwdg.o +LOAD THUMB Debug/usb_core.o +LOAD THUMB Debug/usb_desc.o +LOAD THUMB Debug/usb_endp.o +LOAD THUMB Debug/usb_init.o +LOAD THUMB Debug/usb_int.o +LOAD THUMB Debug/usb_istr.o +LOAD THUMB Debug/usb_mem.o +LOAD THUMB Debug/usb_prop.o +LOAD THUMB Debug/usb_pwr.o +LOAD THUMB Debug/usb_regs.o +LOAD THUMB Debug/usb_sil.o +LOAD THUMB Debug/main.o +LOAD THUMB Debug/thumb_crt0.o +LOAD THUMB Debug/STM32_Startup.o +LOAD THUMB Debug/system_stm32f10x.o +LOAD /usr/share/crossworks_for_arm_2.3/lib/libcm_v7m_t_le.a +LOAD /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a +LOAD /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a +LOAD /usr/share/crossworks_for_arm_2.3/lib/libcpp_v7m_t_le.a +LOAD /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a +LOAD /usr/share/crossworks_for_arm_2.3/lib/libc_targetio_impl_v7m_t_le.a +LOAD /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a +END GROUP +OUTPUT(THUMB Debug/STM32Template.elf elf32-littlearm) + +.debug_frame 0x00000000 0x90ec + .debug_frame 0x00000000 0xf0 THUMB Debug/caliper.o + .debug_frame 0x000000f0 0x17c THUMB Debug/hw_config.o + .debug_frame 0x0000026c 0x9c THUMB Debug/key.o + .debug_frame 0x00000308 0x178 THUMB Debug/stm32_it.o + .debug_frame 0x00000480 0xd8 THUMB Debug/misc.o + .debug_frame 0x00000558 0x5ac THUMB Debug/stm32f10x_adc.o + .debug_frame 0x00000b04 0x1cc THUMB Debug/stm32f10x_bkp.o + .debug_frame 0x00000cd0 0x33c THUMB Debug/stm32f10x_can.o + .debug_frame 0x0000100c 0x22c THUMB Debug/stm32f10x_cec.o + .debug_frame 0x00001238 0xe8 THUMB Debug/stm32f10x_crc.o + .debug_frame 0x00001320 0x1ec THUMB Debug/stm32f10x_dac.o + .debug_frame 0x0000150c 0x78 THUMB Debug/stm32f10x_dbgmcu.o + .debug_frame 0x00001584 0x1c8 THUMB Debug/stm32f10x_dma.o + .debug_frame 0x0000174c 0x148 THUMB Debug/stm32f10x_exti.o + .debug_frame 0x00001894 0x470 THUMB Debug/stm32f10x_flash.o + .debug_frame 0x00001d04 0x300 THUMB Debug/stm32f10x_fsmc.o + .debug_frame 0x00002004 0x2e4 THUMB Debug/stm32f10x_gpio.o + .debug_frame 0x000022e8 0x518 THUMB Debug/stm32f10x_i2c.o + .debug_frame 0x00002800 0xf0 THUMB Debug/stm32f10x_iwdg.o + .debug_frame 0x000028f0 0x16c THUMB Debug/stm32f10x_pwr.o + .debug_frame 0x00002a5c 0x4fc THUMB Debug/stm32f10x_rcc.o + .debug_frame 0x00002f58 0x22c THUMB Debug/stm32f10x_rtc.o + .debug_frame 0x00003184 0x490 THUMB Debug/stm32f10x_sdio.o + .debug_frame 0x00003614 0x3b0 THUMB Debug/stm32f10x_spi.o + .debug_frame 0x000039c4 0xe64 THUMB Debug/stm32f10x_tim.o + .debug_frame 0x00004828 0x4a0 THUMB Debug/stm32f10x_usart.o + .debug_frame 0x00004cc8 0x134 THUMB Debug/stm32f10x_wwdg.o + .debug_frame 0x00004dfc 0x328 THUMB Debug/usb_core.o + .debug_frame 0x00005124 0x5c THUMB Debug/usb_endp.o + .debug_frame 0x00005180 0x34 THUMB Debug/usb_init.o + .debug_frame 0x000051b4 0x68 THUMB Debug/usb_int.o + .debug_frame 0x0000521c 0x3c THUMB Debug/usb_istr.o + .debug_frame 0x00005258 0x60 THUMB Debug/usb_mem.o + .debug_frame 0x000052b8 0x2b4 THUMB Debug/usb_prop.o + .debug_frame 0x0000556c 0xe0 THUMB Debug/usb_pwr.o + .debug_frame 0x0000564c 0x934 THUMB Debug/usb_regs.o + .debug_frame 0x00005f80 0x88 THUMB Debug/usb_sil.o + .debug_frame 0x00006008 0x10c THUMB Debug/main.o + .debug_frame 0x00006114 0xa8 THUMB Debug/system_stm32f10x.o + .debug_frame 0x000061bc 0x600 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .debug_frame 0x000067bc 0x128c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .debug_frame 0x00007a48 0x120 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .debug_frame 0x00007b68 0x40 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .debug_frame 0x00007ba8 0x88 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .debug_frame 0x00007c30 0x260 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .debug_frame 0x00007e90 0x78c /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .debug_frame 0x0000861c 0xa0 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .debug_frame 0x000086bc 0x970 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .debug_frame 0x0000902c 0xc0 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) + +.debug_info 0x00000000 0x124f1 + .debug_info 0x00000000 0x6a1 THUMB Debug/caliper.o + .debug_info 0x000006a1 0x777 THUMB Debug/hw_config.o + .debug_info 0x00000e18 0x2ed THUMB Debug/key.o + .debug_info 0x00001105 0x1cd THUMB Debug/stm32_it.o + .debug_info 0x000012d2 0x586 THUMB Debug/misc.o + .debug_info 0x00001858 0xc0b THUMB Debug/stm32f10x_adc.o + .debug_info 0x00002463 0x876 THUMB Debug/stm32f10x_bkp.o + .debug_info 0x00002cd9 0xb09 THUMB Debug/stm32f10x_can.o + .debug_info 0x000037e2 0x439 THUMB Debug/stm32f10x_cec.o + .debug_info 0x00003c1b 0x1fd THUMB Debug/stm32f10x_crc.o + .debug_info 0x00003e18 0x4d5 THUMB Debug/stm32f10x_dac.o + .debug_info 0x000042ed 0x157 THUMB Debug/stm32f10x_dbgmcu.o + .debug_info 0x00004444 0x49f THUMB Debug/stm32f10x_dma.o + .debug_info 0x000048e3 0x35e THUMB Debug/stm32f10x_exti.o + .debug_info 0x00004c41 0x815 THUMB Debug/stm32f10x_flash.o + .debug_info 0x00005456 0x996 THUMB Debug/stm32f10x_fsmc.o + .debug_info 0x00005dec 0x720 THUMB Debug/stm32f10x_gpio.o + .debug_info 0x0000650c 0xb58 THUMB Debug/stm32f10x_i2c.o + .debug_info 0x00007064 0x1fd THUMB Debug/stm32f10x_iwdg.o + .debug_info 0x00007261 0x4aa THUMB Debug/stm32f10x_pwr.o + .debug_info 0x0000770b 0x8fe THUMB Debug/stm32f10x_rcc.o + .debug_info 0x00008009 0x467 THUMB Debug/stm32f10x_rtc.o + .debug_info 0x00008470 0x88c THUMB Debug/stm32f10x_sdio.o + .debug_info 0x00008cfc 0x96e THUMB Debug/stm32f10x_spi.o + .debug_info 0x0000966a 0x1e15 THUMB Debug/stm32f10x_tim.o + .debug_info 0x0000b47f 0xa69 THUMB Debug/stm32f10x_usart.o + .debug_info 0x0000bee8 0x232 THUMB Debug/stm32f10x_wwdg.o + .debug_info 0x0000c11a 0xc5a THUMB Debug/usb_core.o + .debug_info 0x0000cd74 0x1a1 THUMB Debug/usb_desc.o + .debug_info 0x0000cf15 0x140 THUMB Debug/usb_endp.o + .debug_info 0x0000d055 0x4db THUMB Debug/usb_init.o + .debug_info 0x0000d530 0x228 THUMB Debug/usb_int.o + .debug_info 0x0000d758 0x3aa THUMB Debug/usb_istr.o + .debug_info 0x0000db02 0x1ad THUMB Debug/usb_mem.o + .debug_info 0x0000dcaf 0xb15 THUMB Debug/usb_prop.o + .debug_info 0x0000e7c4 0x572 THUMB Debug/usb_pwr.o + .debug_info 0x0000ed36 0xd66 THUMB Debug/usb_regs.o + .debug_info 0x0000fa9c 0x174 THUMB Debug/usb_sil.o + .debug_info 0x0000fc10 0xa1c THUMB Debug/main.o + .debug_info 0x0001062c 0xa0 THUMB Debug/thumb_crt0.o + .debug_info 0x000106cc 0xcc THUMB Debug/STM32_Startup.o + .debug_info 0x00010798 0x4d1 THUMB Debug/system_stm32f10x.o + .debug_info 0x00010c69 0xc63 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .debug_info 0x000118cc 0x36 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .debug_info 0x00011902 0x65 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .debug_info 0x00011967 0x51f /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .debug_info 0x00011e86 0xcd /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .debug_info 0x00011f53 0x59e /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + +.debug_abbrev 0x00000000 0x350c + .debug_abbrev 0x00000000 0x178 THUMB Debug/caliper.o + .debug_abbrev 0x00000178 0x1dd THUMB Debug/hw_config.o + .debug_abbrev 0x00000355 0x16a THUMB Debug/key.o + .debug_abbrev 0x000004bf 0x8d THUMB Debug/stm32_it.o + .debug_abbrev 0x0000054c 0x11b THUMB Debug/misc.o + .debug_abbrev 0x00000667 0x169 THUMB Debug/stm32f10x_adc.o + .debug_abbrev 0x000007d0 0x14b THUMB Debug/stm32f10x_bkp.o + .debug_abbrev 0x0000091b 0x1a1 THUMB Debug/stm32f10x_can.o + .debug_abbrev 0x00000abc 0x17e THUMB Debug/stm32f10x_cec.o + .debug_abbrev 0x00000c3a 0xff THUMB Debug/stm32f10x_crc.o + .debug_abbrev 0x00000d39 0x15e THUMB Debug/stm32f10x_dac.o + .debug_abbrev 0x00000e97 0xcf THUMB Debug/stm32f10x_dbgmcu.o + .debug_abbrev 0x00000f66 0x143 THUMB Debug/stm32f10x_dma.o + .debug_abbrev 0x000010a9 0x13f THUMB Debug/stm32f10x_exti.o + .debug_abbrev 0x000011e8 0x166 THUMB Debug/stm32f10x_flash.o + .debug_abbrev 0x0000134e 0x15b THUMB Debug/stm32f10x_fsmc.o + .debug_abbrev 0x000014a9 0x199 THUMB Debug/stm32f10x_gpio.o + .debug_abbrev 0x00001642 0x152 THUMB Debug/stm32f10x_i2c.o + .debug_abbrev 0x00001794 0xef THUMB Debug/stm32f10x_iwdg.o + .debug_abbrev 0x00001883 0x16a THUMB Debug/stm32f10x_pwr.o + .debug_abbrev 0x000019ed 0x186 THUMB Debug/stm32f10x_rcc.o + .debug_abbrev 0x00001b73 0x15b THUMB Debug/stm32f10x_rtc.o + .debug_abbrev 0x00001cce 0x197 THUMB Debug/stm32f10x_sdio.o + .debug_abbrev 0x00001e65 0x152 THUMB Debug/stm32f10x_spi.o + .debug_abbrev 0x00001fb7 0x167 THUMB Debug/stm32f10x_tim.o + .debug_abbrev 0x0000211e 0x150 THUMB Debug/stm32f10x_usart.o + .debug_abbrev 0x0000226e 0xed THUMB Debug/stm32f10x_wwdg.o + .debug_abbrev 0x0000235b 0x24f THUMB Debug/usb_core.o + .debug_abbrev 0x000025aa 0x7d THUMB Debug/usb_desc.o + .debug_abbrev 0x00002627 0xc9 THUMB Debug/usb_endp.o + .debug_abbrev 0x000026f0 0x112 THUMB Debug/usb_init.o + .debug_abbrev 0x00002802 0xc2 THUMB Debug/usb_int.o + .debug_abbrev 0x000028c4 0x10a THUMB Debug/usb_istr.o + .debug_abbrev 0x000029ce 0x91 THUMB Debug/usb_mem.o + .debug_abbrev 0x00002a5f 0x1aa THUMB Debug/usb_prop.o + .debug_abbrev 0x00002c09 0x1df THUMB Debug/usb_pwr.o + .debug_abbrev 0x00002de8 0x13b THUMB Debug/usb_regs.o + .debug_abbrev 0x00002f23 0xac THUMB Debug/usb_sil.o + .debug_abbrev 0x00002fcf 0x1f2 THUMB Debug/main.o + .debug_abbrev 0x000031c1 0x14 THUMB Debug/thumb_crt0.o + .debug_abbrev 0x000031d5 0x14 THUMB Debug/STM32_Startup.o + .debug_abbrev 0x000031e9 0x148 THUMB Debug/system_stm32f10x.o + .debug_abbrev 0x00003331 0xa0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .debug_abbrev 0x000033d1 0x25 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .debug_abbrev 0x000033f6 0x43 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .debug_abbrev 0x00003439 0x38 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .debug_abbrev 0x00003471 0x25 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .debug_abbrev 0x00003496 0x76 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + +.debug_loc 0x00000000 0xa41d + .debug_loc 0x00000000 0x12c THUMB Debug/caliper.o + .debug_loc 0x0000012c 0x1d4 THUMB Debug/hw_config.o + .debug_loc 0x00000300 0xbc THUMB Debug/key.o + .debug_loc 0x000003bc 0x1e4 THUMB Debug/stm32_it.o + .debug_loc 0x000005a0 0x118 THUMB Debug/misc.o + .debug_loc 0x000006b8 0x7d4 THUMB Debug/stm32f10x_adc.o + .debug_loc 0x00000e8c 0x264 THUMB Debug/stm32f10x_bkp.o + .debug_loc 0x000010f0 0x460 THUMB Debug/stm32f10x_can.o + .debug_loc 0x00001550 0x2ec THUMB Debug/stm32f10x_cec.o + .debug_loc 0x0000183c 0x12c THUMB Debug/stm32f10x_crc.o + .debug_loc 0x00001968 0x294 THUMB Debug/stm32f10x_dac.o + .debug_loc 0x00001bfc 0x90 THUMB Debug/stm32f10x_dbgmcu.o + .debug_loc 0x00001c8c 0x268 THUMB Debug/stm32f10x_dma.o + .debug_loc 0x00001ef4 0x1b4 THUMB Debug/stm32f10x_exti.o + .debug_loc 0x000020a8 0x5d8 THUMB Debug/stm32f10x_flash.o + .debug_loc 0x00002680 0x41c THUMB Debug/stm32f10x_fsmc.o + .debug_loc 0x00002a9c 0x3e4 THUMB Debug/stm32f10x_gpio.o + .debug_loc 0x00002e80 0x700 THUMB Debug/stm32f10x_i2c.o + .debug_loc 0x00003580 0x138 THUMB Debug/stm32f10x_iwdg.o + .debug_loc 0x000036b8 0x1e0 THUMB Debug/stm32f10x_pwr.o + .debug_loc 0x00003898 0x6dc THUMB Debug/stm32f10x_rcc.o + .debug_loc 0x00003f74 0x2e0 THUMB Debug/stm32f10x_rtc.o + .debug_loc 0x00004254 0x648 THUMB Debug/stm32f10x_sdio.o + .debug_loc 0x0000489c 0x508 THUMB Debug/stm32f10x_spi.o + .debug_loc 0x00004da4 0x13e8 THUMB Debug/stm32f10x_tim.o + .debug_loc 0x0000618c 0x658 THUMB Debug/stm32f10x_usart.o + .debug_loc 0x000067e4 0x190 THUMB Debug/stm32f10x_wwdg.o + .debug_loc 0x00006974 0x3f8 THUMB Debug/usb_core.o + .debug_loc 0x00006d6c 0x64 THUMB Debug/usb_endp.o + .debug_loc 0x00006dd0 0x2c THUMB Debug/usb_init.o + .debug_loc 0x00006dfc 0x70 THUMB Debug/usb_int.o + .debug_loc 0x00006e6c 0x38 THUMB Debug/usb_istr.o + .debug_loc 0x00006ea4 0x70 THUMB Debug/usb_mem.o + .debug_loc 0x00006f14 0x37c THUMB Debug/usb_prop.o + .debug_loc 0x00007290 0x10c THUMB Debug/usb_pwr.o + .debug_loc 0x0000739c 0xcac THUMB Debug/usb_regs.o + .debug_loc 0x00008048 0x9c THUMB Debug/usb_sil.o + .debug_loc 0x000080e4 0x152 THUMB Debug/main.o + .debug_loc 0x00008236 0xc8 THUMB Debug/system_stm32f10x.o + .debug_loc 0x000082fe 0x1059 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .debug_loc 0x00009357 0x2d /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .debug_loc 0x00009384 0x6c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .debug_loc 0x000093f0 0x7f4 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .debug_loc 0x00009be4 0x839 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + +.debug_aranges 0x00000000 0x2130 + .debug_aranges + 0x00000000 0x48 THUMB Debug/caliper.o + .debug_aranges + 0x00000048 0x60 THUMB Debug/hw_config.o + .debug_aranges + 0x000000a8 0x38 THUMB Debug/key.o + .debug_aranges + 0x000000e0 0x70 THUMB Debug/stm32_it.o + .debug_aranges + 0x00000150 0x40 THUMB Debug/misc.o + .debug_aranges + 0x00000190 0x138 THUMB Debug/stm32f10x_adc.o + .debug_aranges + 0x000002c8 0x78 THUMB Debug/stm32f10x_bkp.o + .debug_aranges + 0x00000340 0xb8 THUMB Debug/stm32f10x_can.o + .debug_aranges + 0x000003f8 0x88 THUMB Debug/stm32f10x_cec.o + .debug_aranges + 0x00000480 0x48 THUMB Debug/stm32f10x_crc.o + .debug_aranges + 0x000004c8 0x78 THUMB Debug/stm32f10x_dac.o + .debug_aranges + 0x00000540 0x30 THUMB Debug/stm32f10x_dbgmcu.o + .debug_aranges + 0x00000570 0x70 THUMB Debug/stm32f10x_dma.o + .debug_aranges + 0x000005e0 0x58 THUMB Debug/stm32f10x_exti.o + .debug_aranges + 0x00000638 0xf8 THUMB Debug/stm32f10x_flash.o + .debug_aranges + 0x00000730 0xb0 THUMB Debug/stm32f10x_fsmc.o + .debug_aranges + 0x000007e0 0xa8 THUMB Debug/stm32f10x_gpio.o + .debug_aranges + 0x00000888 0x118 THUMB Debug/stm32f10x_i2c.o + .debug_aranges + 0x000009a0 0x48 THUMB Debug/stm32f10x_iwdg.o + .debug_aranges + 0x000009e8 0x60 THUMB Debug/stm32f10x_pwr.o + .debug_aranges + 0x00000a48 0x118 THUMB Debug/stm32f10x_rcc.o + .debug_aranges + 0x00000b60 0x88 THUMB Debug/stm32f10x_rtc.o + .debug_aranges + 0x00000be8 0x108 THUMB Debug/stm32f10x_sdio.o + .debug_aranges + 0x00000cf0 0xd0 THUMB Debug/stm32f10x_spi.o + .debug_aranges + 0x00000dc0 0x2f0 THUMB Debug/stm32f10x_tim.o + .debug_aranges + 0x000010b0 0x100 THUMB Debug/stm32f10x_usart.o + .debug_aranges + 0x000011b0 0x58 THUMB Debug/stm32f10x_wwdg.o + .debug_aranges + 0x00001208 0xb0 THUMB Debug/usb_core.o + .debug_aranges + 0x000012b8 0x28 THUMB Debug/usb_endp.o + .debug_aranges + 0x000012e0 0x20 THUMB Debug/usb_init.o + .debug_aranges + 0x00001300 0x28 THUMB Debug/usb_int.o + .debug_aranges + 0x00001328 0x20 THUMB Debug/usb_istr.o + .debug_aranges + 0x00001348 0x28 THUMB Debug/usb_mem.o + .debug_aranges + 0x00001370 0xa0 THUMB Debug/usb_prop.o + .debug_aranges + 0x00001410 0x40 THUMB Debug/usb_pwr.o + .debug_aranges + 0x00001450 0x1f0 THUMB Debug/usb_regs.o + .debug_aranges + 0x00001640 0x30 THUMB Debug/usb_sil.o + .debug_aranges + 0x00001670 0x48 THUMB Debug/main.o + .debug_aranges + 0x000016b8 0x20 THUMB Debug/thumb_crt0.o + .debug_aranges + 0x000016d8 0x20 THUMB Debug/STM32_Startup.o + .debug_aranges + 0x000016f8 0x38 THUMB Debug/system_stm32f10x.o + .debug_aranges + 0x00001730 0x508 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .debug_aranges + 0x00001c38 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .debug_aranges + 0x00001c58 0x30 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .debug_aranges + 0x00001c88 0x218 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .debug_aranges + 0x00001ea0 0x60 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .debug_aranges + 0x00001f00 0x230 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + +.debug_ranges 0x00000000 0x1e20 + .debug_ranges 0x00000000 0x38 THUMB Debug/caliper.o + .debug_ranges 0x00000038 0x50 THUMB Debug/hw_config.o + .debug_ranges 0x00000088 0x28 THUMB Debug/key.o + .debug_ranges 0x000000b0 0x60 THUMB Debug/stm32_it.o + .debug_ranges 0x00000110 0x30 THUMB Debug/misc.o + .debug_ranges 0x00000140 0x128 THUMB Debug/stm32f10x_adc.o + .debug_ranges 0x00000268 0x68 THUMB Debug/stm32f10x_bkp.o + .debug_ranges 0x000002d0 0xa8 THUMB Debug/stm32f10x_can.o + .debug_ranges 0x00000378 0x78 THUMB Debug/stm32f10x_cec.o + .debug_ranges 0x000003f0 0x38 THUMB Debug/stm32f10x_crc.o + .debug_ranges 0x00000428 0x68 THUMB Debug/stm32f10x_dac.o + .debug_ranges 0x00000490 0x20 THUMB Debug/stm32f10x_dbgmcu.o + .debug_ranges 0x000004b0 0x60 THUMB Debug/stm32f10x_dma.o + .debug_ranges 0x00000510 0x48 THUMB Debug/stm32f10x_exti.o + .debug_ranges 0x00000558 0xe8 THUMB Debug/stm32f10x_flash.o + .debug_ranges 0x00000640 0xa0 THUMB Debug/stm32f10x_fsmc.o + .debug_ranges 0x000006e0 0x98 THUMB Debug/stm32f10x_gpio.o + .debug_ranges 0x00000778 0x108 THUMB Debug/stm32f10x_i2c.o + .debug_ranges 0x00000880 0x38 THUMB Debug/stm32f10x_iwdg.o + .debug_ranges 0x000008b8 0x50 THUMB Debug/stm32f10x_pwr.o + .debug_ranges 0x00000908 0x108 THUMB Debug/stm32f10x_rcc.o + .debug_ranges 0x00000a10 0x78 THUMB Debug/stm32f10x_rtc.o + .debug_ranges 0x00000a88 0xf8 THUMB Debug/stm32f10x_sdio.o + .debug_ranges 0x00000b80 0xc0 THUMB Debug/stm32f10x_spi.o + .debug_ranges 0x00000c40 0x2e0 THUMB Debug/stm32f10x_tim.o + .debug_ranges 0x00000f20 0xf0 THUMB Debug/stm32f10x_usart.o + .debug_ranges 0x00001010 0x48 THUMB Debug/stm32f10x_wwdg.o + .debug_ranges 0x00001058 0xa0 THUMB Debug/usb_core.o + .debug_ranges 0x000010f8 0x18 THUMB Debug/usb_endp.o + .debug_ranges 0x00001110 0x10 THUMB Debug/usb_init.o + .debug_ranges 0x00001120 0x18 THUMB Debug/usb_int.o + .debug_ranges 0x00001138 0x10 THUMB Debug/usb_istr.o + .debug_ranges 0x00001148 0x18 THUMB Debug/usb_mem.o + .debug_ranges 0x00001160 0x90 THUMB Debug/usb_prop.o + .debug_ranges 0x000011f0 0x30 THUMB Debug/usb_pwr.o + .debug_ranges 0x00001220 0x1e0 THUMB Debug/usb_regs.o + .debug_ranges 0x00001400 0x20 THUMB Debug/usb_sil.o + .debug_ranges 0x00001420 0x38 THUMB Debug/main.o + .debug_ranges 0x00001458 0x28 THUMB Debug/system_stm32f10x.o + .debug_ranges 0x00001480 0x4f8 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .debug_ranges 0x00001978 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .debug_ranges 0x00001988 0x20 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .debug_ranges 0x000019a8 0x208 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .debug_ranges 0x00001bb0 0x50 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .debug_ranges 0x00001c00 0x220 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + +.debug_line 0x00000000 0x80d4 + .debug_line 0x00000000 0x24c THUMB Debug/caliper.o + .debug_line 0x0000024c 0x23a THUMB Debug/hw_config.o + .debug_line 0x00000486 0x196 THUMB Debug/key.o + .debug_line 0x0000061c 0x1e0 THUMB Debug/stm32_it.o + .debug_line 0x000007fc 0x194 THUMB Debug/misc.o + .debug_line 0x00000990 0x473 THUMB Debug/stm32f10x_adc.o + .debug_line 0x00000e03 0x20e THUMB Debug/stm32f10x_bkp.o + .debug_line 0x00001011 0x3f9 THUMB Debug/stm32f10x_can.o + .debug_line 0x0000140a 0x263 THUMB Debug/stm32f10x_cec.o + .debug_line 0x0000166d 0x1a7 THUMB Debug/stm32f10x_crc.o + .debug_line 0x00001814 0x23f THUMB Debug/stm32f10x_dac.o + .debug_line 0x00001a53 0x162 THUMB Debug/stm32f10x_dbgmcu.o + .debug_line 0x00001bb5 0x253 THUMB Debug/stm32f10x_dma.o + .debug_line 0x00001e08 0x1f4 THUMB Debug/stm32f10x_exti.o + .debug_line 0x00001ffc 0x429 THUMB Debug/stm32f10x_flash.o + .debug_line 0x00002425 0x3a5 THUMB Debug/stm32f10x_fsmc.o + .debug_line 0x000027ca 0x2ff THUMB Debug/stm32f10x_gpio.o + .debug_line 0x00002ac9 0x413 THUMB Debug/stm32f10x_i2c.o + .debug_line 0x00002edc 0x198 THUMB Debug/stm32f10x_iwdg.o + .debug_line 0x00003074 0x204 THUMB Debug/stm32f10x_pwr.o + .debug_line 0x00003278 0x40d THUMB Debug/stm32f10x_rcc.o + .debug_line 0x00003685 0x255 THUMB Debug/stm32f10x_rtc.o + .debug_line 0x000038da 0x39b THUMB Debug/stm32f10x_sdio.o + .debug_line 0x00003c75 0x372 THUMB Debug/stm32f10x_spi.o + .debug_line 0x00003fe7 0x9e5 THUMB Debug/stm32f10x_tim.o + .debug_line 0x000049cc 0x3eb THUMB Debug/stm32f10x_usart.o + .debug_line 0x00004db7 0x1bf THUMB Debug/stm32f10x_wwdg.o + .debug_line 0x00004f76 0x490 THUMB Debug/usb_core.o + .debug_line 0x00005406 0x113 THUMB Debug/usb_desc.o + .debug_line 0x00005519 0x153 THUMB Debug/usb_endp.o + .debug_line 0x0000566c 0x145 THUMB Debug/usb_init.o + .debug_line 0x000057b1 0x235 THUMB Debug/usb_int.o + .debug_line 0x000059e6 0x1cc THUMB Debug/usb_istr.o + .debug_line 0x00005bb2 0x17d THUMB Debug/usb_mem.o + .debug_line 0x00005d2f 0x2fc THUMB Debug/usb_prop.o + .debug_line 0x0000602b 0x24e THUMB Debug/usb_pwr.o + .debug_line 0x00006279 0x6cb THUMB Debug/usb_regs.o + .debug_line 0x00006944 0x15d THUMB Debug/usb_sil.o + .debug_line 0x00006aa1 0x2d5 THUMB Debug/main.o + .debug_line 0x00006d76 0xc1 THUMB Debug/thumb_crt0.o + .debug_line 0x00006e37 0xed THUMB Debug/STM32_Startup.o + .debug_line 0x00006f24 0x239 THUMB Debug/system_stm32f10x.o + .debug_line 0x0000715d 0x5b0 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .debug_line 0x0000770d 0x72 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .debug_line 0x0000777f 0x71 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .debug_line 0x000077f0 0x54a /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .debug_line 0x00007d3a 0x71 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .debug_line 0x00007dab 0x329 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + +.debug_str 0x00000000 0x7668 + .debug_str 0x00000000 0x797 THUMB Debug/caliper.o + 0x7e0 (size before relaxing) + .debug_str 0x00000797 0x338 THUMB Debug/hw_config.o + 0x89e (size before relaxing) + .debug_str 0x00000acf 0x99 THUMB Debug/key.o + 0x2cd (size before relaxing) + .debug_str 0x00000b68 0x119 THUMB Debug/stm32_it.o + 0x204 (size before relaxing) + .debug_str 0x00000c81 0x1d7 THUMB Debug/misc.o + 0x36f (size before relaxing) + .debug_str 0x00000e58 0x551 THUMB Debug/stm32f10x_adc.o + 0x6a1 (size before relaxing) + .debug_str 0x000013a9 0x3db THUMB Debug/stm32f10x_bkp.o + 0x55b (size before relaxing) + .debug_str 0x00001784 0x496 THUMB Debug/stm32f10x_can.o + 0x628 (size before relaxing) + .debug_str 0x00001c1a 0x1c3 THUMB Debug/stm32f10x_cec.o + 0x31c (size before relaxing) + .debug_str 0x00001ddd 0xd3 THUMB Debug/stm32f10x_crc.o + 0x1e1 (size before relaxing) + .debug_str 0x00001eb0 0x229 THUMB Debug/stm32f10x_dac.o + 0x355 (size before relaxing) + .debug_str 0x000020d9 0xa7 THUMB Debug/stm32f10x_dbgmcu.o + 0x1ad (size before relaxing) + .debug_str 0x00002180 0x224 THUMB Debug/stm32f10x_dma.o + 0x35e (size before relaxing) + .debug_str 0x000023a4 0xec THUMB Debug/stm32f10x_exti.o + 0x304 (size before relaxing) + .debug_str 0x00002490 0x436 THUMB Debug/stm32f10x_flash.o + 0x58e (size before relaxing) + .debug_str 0x000028c6 0x5e4 THUMB Debug/stm32f10x_fsmc.o + 0x72a (size before relaxing) + .debug_str 0x00002eaa 0x270 THUMB Debug/stm32f10x_gpio.o + 0x4bf (size before relaxing) + .debug_str 0x0000311a 0x40d THUMB Debug/stm32f10x_i2c.o + 0x5e4 (size before relaxing) + .debug_str 0x00003527 0xf1 THUMB Debug/stm32f10x_iwdg.o + 0x202 (size before relaxing) + .debug_str 0x00003618 0x131 THUMB Debug/stm32f10x_pwr.o + 0x2c8 (size before relaxing) + .debug_str 0x00003749 0x3e1 THUMB Debug/stm32f10x_rcc.o + 0x5c0 (size before relaxing) + .debug_str 0x00003b2a 0x1a9 THUMB Debug/stm32f10x_rtc.o + 0x348 (size before relaxing) + .debug_str 0x00003cd3 0x48f THUMB Debug/stm32f10x_sdio.o + 0x5e1 (size before relaxing) + .debug_str 0x00004162 0x37a THUMB Debug/stm32f10x_spi.o + 0x5a3 (size before relaxing) + .debug_str 0x000044dc 0xb0b THUMB Debug/stm32f10x_tim.o + 0xd83 (size before relaxing) + .debug_str 0x00004fe7 0x439 THUMB Debug/stm32f10x_usart.o + 0x636 (size before relaxing) + .debug_str 0x00005420 0xed THUMB Debug/stm32f10x_wwdg.o + 0x20e (size before relaxing) + .debug_str 0x0000550d 0x6d5 THUMB Debug/usb_core.o + 0x9ff (size before relaxing) + .debug_str 0x00005be2 0xe4 THUMB Debug/usb_desc.o + 0x1d8 (size before relaxing) + .debug_str 0x00005cc6 0x98 THUMB Debug/usb_endp.o + 0x191 (size before relaxing) + .debug_str 0x00005d5e 0x78 THUMB Debug/usb_init.o + 0x4de (size before relaxing) + .debug_str 0x00005dd6 0x7c THUMB Debug/usb_int.o + 0x192 (size before relaxing) + .debug_str 0x00005e52 0xfa THUMB Debug/usb_istr.o + 0x354 (size before relaxing) + .debug_str 0x00005f4c 0xa4 THUMB Debug/usb_mem.o + 0x193 (size before relaxing) + .debug_str 0x00005ff0 0x2d1 THUMB Debug/usb_prop.o + 0xa2b (size before relaxing) + .debug_str 0x000062c1 0xb1 THUMB Debug/usb_pwr.o + 0x385 (size before relaxing) + .debug_str 0x00006372 0x410 THUMB Debug/usb_regs.o + 0x51b (size before relaxing) + .debug_str 0x00006782 0x97 THUMB Debug/usb_sil.o + 0x1a1 (size before relaxing) + .debug_str 0x00006819 0x155 THUMB Debug/main.o + 0x7b1 (size before relaxing) + .debug_str 0x0000696e 0x92 THUMB Debug/system_stm32f10x.o + 0x296 (size before relaxing) + .debug_str 0x00006a00 0x57c /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + 0x652 (size before relaxing) + .debug_str 0x00006f7c 0x6e /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + 0xb7 (size before relaxing) + .debug_str 0x00006fea 0x79 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + 0xc2 (size before relaxing) + .debug_str 0x00007063 0x3b0 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + 0x3f9 (size before relaxing) + .debug_str 0x00007413 0xcf /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + 0x118 (size before relaxing) + .debug_str 0x000074e2 0x186 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + 0x20f (size before relaxing) + +.comment 0x00000000 0x4e + .comment 0x00000000 0x4e THUMB Debug/caliper.o + 0x4f (size before relaxing) + .comment 0x00000000 0x4f THUMB Debug/hw_config.o + .comment 0x00000000 0x4f THUMB Debug/key.o + .comment 0x00000000 0x4f THUMB Debug/stm32_it.o + .comment 0x00000000 0x4f THUMB Debug/misc.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_adc.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_bkp.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_can.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_cec.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_crc.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_dac.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_dbgmcu.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_dma.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_exti.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_flash.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_fsmc.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_gpio.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_i2c.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_iwdg.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_pwr.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_rcc.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_rtc.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_sdio.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_spi.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_tim.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_usart.o + .comment 0x00000000 0x4f THUMB Debug/stm32f10x_wwdg.o + .comment 0x00000000 0x4f THUMB Debug/usb_core.o + .comment 0x00000000 0x4f THUMB Debug/usb_desc.o + .comment 0x00000000 0x4f THUMB Debug/usb_endp.o + .comment 0x00000000 0x4f THUMB Debug/usb_init.o + .comment 0x00000000 0x4f THUMB Debug/usb_int.o + .comment 0x00000000 0x4f THUMB Debug/usb_istr.o + .comment 0x00000000 0x4f THUMB Debug/usb_mem.o + .comment 0x00000000 0x4f THUMB Debug/usb_prop.o + .comment 0x00000000 0x4f THUMB Debug/usb_pwr.o + .comment 0x00000000 0x4f THUMB Debug/usb_regs.o + .comment 0x00000000 0x4f THUMB Debug/usb_sil.o + .comment 0x00000000 0x4f THUMB Debug/main.o + .comment 0x00000000 0x4f THUMB Debug/system_stm32f10x.o + .comment 0x00000000 0x4f /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .comment 0x00000000 0x4f /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .comment 0x00000000 0x4f /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .comment 0x00000000 0x4f /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .comment 0x00000000 0x4f /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .comment 0x00000000 0x4f /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + +.ARM.attributes + 0x00000000 0x10 + .ARM.attributes + 0x00000000 0x10 THUMB Debug/caliper.o + .ARM.attributes + 0x00000010 0x10 THUMB Debug/hw_config.o + .ARM.attributes + 0x00000020 0x10 THUMB Debug/key.o + .ARM.attributes + 0x00000030 0x10 THUMB Debug/stm32_it.o + .ARM.attributes + 0x00000040 0x10 THUMB Debug/misc.o + .ARM.attributes + 0x00000050 0x10 THUMB Debug/stm32f10x_adc.o + .ARM.attributes + 0x00000060 0x10 THUMB Debug/stm32f10x_bkp.o + .ARM.attributes + 0x00000070 0x10 THUMB Debug/stm32f10x_can.o + .ARM.attributes + 0x00000080 0x10 THUMB Debug/stm32f10x_cec.o + .ARM.attributes + 0x00000090 0x10 THUMB Debug/stm32f10x_crc.o + .ARM.attributes + 0x000000a0 0x10 THUMB Debug/stm32f10x_dac.o + .ARM.attributes + 0x000000b0 0x10 THUMB Debug/stm32f10x_dbgmcu.o + .ARM.attributes + 0x000000c0 0x10 THUMB Debug/stm32f10x_dma.o + .ARM.attributes + 0x000000d0 0x10 THUMB Debug/stm32f10x_exti.o + .ARM.attributes + 0x000000e0 0x10 THUMB Debug/stm32f10x_flash.o + .ARM.attributes + 0x000000f0 0x10 THUMB Debug/stm32f10x_fsmc.o + .ARM.attributes + 0x00000100 0x10 THUMB Debug/stm32f10x_gpio.o + .ARM.attributes + 0x00000110 0x10 THUMB Debug/stm32f10x_i2c.o + .ARM.attributes + 0x00000120 0x10 THUMB Debug/stm32f10x_iwdg.o + .ARM.attributes + 0x00000130 0x10 THUMB Debug/stm32f10x_pwr.o + .ARM.attributes + 0x00000140 0x10 THUMB Debug/stm32f10x_rcc.o + .ARM.attributes + 0x00000150 0x10 THUMB Debug/stm32f10x_rtc.o + .ARM.attributes + 0x00000160 0x10 THUMB Debug/stm32f10x_sdio.o + .ARM.attributes + 0x00000170 0x10 THUMB Debug/stm32f10x_spi.o + .ARM.attributes + 0x00000180 0x10 THUMB Debug/stm32f10x_tim.o + .ARM.attributes + 0x00000190 0x10 THUMB Debug/stm32f10x_usart.o + .ARM.attributes + 0x000001a0 0x10 THUMB Debug/stm32f10x_wwdg.o + .ARM.attributes + 0x000001b0 0x10 THUMB Debug/usb_core.o + .ARM.attributes + 0x000001c0 0x10 THUMB Debug/usb_desc.o + .ARM.attributes + 0x000001d0 0x10 THUMB Debug/usb_endp.o + .ARM.attributes + 0x000001e0 0x10 THUMB Debug/usb_init.o + .ARM.attributes + 0x000001f0 0x10 THUMB Debug/usb_int.o + .ARM.attributes + 0x00000200 0x10 THUMB Debug/usb_istr.o + .ARM.attributes + 0x00000210 0x10 THUMB Debug/usb_mem.o + .ARM.attributes + 0x00000220 0x10 THUMB Debug/usb_prop.o + .ARM.attributes + 0x00000230 0x10 THUMB Debug/usb_pwr.o + .ARM.attributes + 0x00000240 0x10 THUMB Debug/usb_regs.o + .ARM.attributes + 0x00000250 0x10 THUMB Debug/usb_sil.o + .ARM.attributes + 0x00000260 0x10 THUMB Debug/main.o + .ARM.attributes + 0x00000270 0x10 THUMB Debug/thumb_crt0.o + .ARM.attributes + 0x00000280 0x10 THUMB Debug/STM32_Startup.o + .ARM.attributes + 0x00000290 0x10 THUMB Debug/system_stm32f10x.o + .ARM.attributes + 0x000002a0 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm_asm.o) + .ARM.attributes + 0x000002b0 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2.o) + .ARM.attributes + 0x000002c0 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc2_asm.o) + .ARM.attributes + 0x000002d0 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfprintf_double_long_long.o) + .ARM.attributes + 0x000002e0 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(__vfscanf_int.o) + .ARM.attributes + 0x000002f0 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_v7m_t_le.a(libc_asm.o) + .ARM.attributes + 0x00000300 0x10 /usr/share/crossworks_for_arm_2.3/lib/libdebugio_v7m_t_le.a(libdebugio.o) + .ARM.attributes + 0x00000310 0x10 /usr/share/crossworks_for_arm_2.3/lib/libc_user_libc_v7m_t_le.a(user_libc.o) + .ARM.attributes + 0x00000320 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2.o) + .ARM.attributes + 0x00000330 0x10 /usr/share/crossworks_for_arm_2.3/lib/libm_v7m_t_le.a(libm2_asm.o) diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32_Startup.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32_Startup.d new file mode 100644 index 0000000..7f3f3e4 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32_Startup.d @@ -0,0 +1,3 @@ +THUMB\ Debug/STM32_Startup.o: \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/STM32_Startup.s \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/STM32F10X_MD.vec diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32_Startup.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/STM32_Startup.o new file mode 100644 index 0000000000000000000000000000000000000000..d3d6d37c6edd363f05abf97cd1fa43aa2865d3ab GIT binary patch literal 4612 zcmds)TWB0r7{|ZaO>644Y3u#ANn5SA-E5j#tJS*Q&5d^3ba&IFSQ#hTX}V@Fab{9m ztyMvxf`Si%3JN}`6cO~n2L(YzA1w4iu!w>WB7#+{PlBMO_5YvC=9`qF58{Jonf;&N z_nrC9bzN6+Y!Ix!QlQl6GA^Q`aggnb{yEda88@}3<)m_@VrJHwnz5#B zH{)5(wC%Z>a;3PoPsA6q468Rcn|4`^ZyL<@PMF0)dY?TNteQm$G(wWk7)CeJ>h7NI zjzse3Ln+cfOC3h?O#|hVz3EjwEBh1Yp=+PBn+z-+?X`Ir^so0c=&$N%rqT2=)dTKK z#%Vp$Y`Iglj9s^xL-Gh=1Stv%j6n)5>|L)*quxpJy6-Iq;g#dyN# zlBJ8gjAcf$^Xkskoy$3yNY~&AyXZ5&*u{2Ay9XMcH7RM=a{}EP)0XEswaGcGgP>T|o}8P;l4#nRYt20^MD%^uE|-irJZ zWj}@A+PiRe!N%>659_-d58sL6r2u-4SdM7}9v$y(1WLiiczidCmq#9bn1%T12;%A8 zm31+VuF2~*@NgLS>fP$ApRdTEd9okl)-2U&Ro3-1^+VTycHU>)zc>c<7} zMe(>2qIVeLA#`d5GhvE+PlKa8U58OF#Y~vkR;DNM=z4!cy&MkNKdfwTWSk>?R)8Iap5<1s$#)bTz;C)d*%Cf)YPwosF?9x|S;nXGFds|pY- zi4_vBXR%)*TDO;g*zbewilfyS7?N^<@4v9^=ZMXxq+B!)$R%SVOkX_OVAnaVN8s775Lf!eZC2Nz2ZB; z-HNw>S1R5OUahzR=AOpH_=mtZ1?cmO;Ao8L=iYRi@*f3f6n_uSD*h9^R`Cif$#sfv z1Fu)S3A{n^F7RE7Juvq|Cbs7=cvFBrzXHxFeg~Xa{3)1gf{E{c1s)2}=U>4iiVZBD zEsDFqMaA9V?TWMD9f}KJ?u|^WZyY=ppwAD2xh9$De+;}UK%buj->3Lh@coM40h@|H z0b7c{1WzeG0k##N0#7UMQdJ>2nF$~0wLal{-Biws*%bb6ZWOI1u7hpM<~cWBWXy#-ZYuB0x62oJ zfhe|`ZNn()E$?h&`G8xgp*2w(#>Wdo=16Hr#G^Y48Y{Wt=s-zZN|n6E!L7OSur`$P zG5^3sWu#a8X~-@#^er^3U1;dnhC(ryHS-whrd^N4(vDb6?TE$Jj&s(r?p&4MelEv) z?Z_4KSu@t0vGQhfc+|}2wq?!Agf2_Z*3eU$h>e_Ix-=2%ux~5p2XqLI@CGy1=E_Jh zYi=%W(Zzh**yvfNN@>W|1iR?d|wv0?HpXP1e!*k73I%xrATvD$NW%W3FFVv5GC8GCG28%?v6E1Ir7 z-LRWp_*=(s&9fUL{3F0U!100&C4qyI+erckDDPhhT#9&iNZ`Qa-jl#Zj(52P4$Ld4 zmxXl;=n9W@yBMEiUV^i^*WJJDh|vFH6=1Z?H1Wh?Gbr^ zx>BS{T_v)YiUYGwy&8lEc_&KTEb;^u2j){$H1;qR2j;WXH12*> z9GEXq(TSI+I51zK;@|FTR2-PEQ~O1ZP;p?sO}!oe4X8LU-=m`Q?^AJLen`Dj@8qYF^|AYC+@#6$fS=dOi-ygXF=m ne@jL7fv+1D|6Y_>6#U0X;KFnv%i#+}g!UDo^2V50GH?G25(M>N literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/caliper.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/caliper.d new file mode 100644 index 0000000..3271173 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/caliper.d @@ -0,0 +1,21 @@ +THUMB\ Debug/caliper.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/caliper.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/caliper.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/systick.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hardware.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/caliper.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/caliper.o new file mode 100644 index 0000000000000000000000000000000000000000..a1e6217bbc03d2181dc6213ce3493f4064f85a26 GIT binary patch literal 12464 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 Q_Z1@AKSV_PH;K^yKiZ%(3;+NC literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/hw_config.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/hw_config.d new file mode 100644 index 0000000..924e618 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/hw_config.d @@ -0,0 +1,32 @@ +THUMB\ Debug/hw_config.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_desc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_pwr.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/hw_config.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/hw_config.o new file mode 100644 index 0000000000000000000000000000000000000000..537cdfc4c7b1b9bffc3cc0b7a5dc883e05c6f343 GIT binary patch literal 13632 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 H5&HfY)qGT- literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/key.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/key.d new file mode 100644 index 0000000..14f4ddf --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/key.d @@ -0,0 +1,21 @@ +THUMB\ Debug/key.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/key.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/key.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/systick.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hardware.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/key.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/key.o new file mode 100644 index 0000000000000000000000000000000000000000..ca1f2883c434cc4243496f1dab826bca5eccbfc1 GIT binary patch literal 7400 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 Nr|%uIzm*XB{{u;?S}Onm literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/misc.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/misc.d new file mode 100644 index 0000000..38c6f2a --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/misc.d @@ -0,0 +1,18 @@ +THUMB\ Debug/misc.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/misc.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/misc.o new file mode 100644 index 0000000000000000000000000000000000000000..d3c675919c3323e490f54cee768afabbc2e514ee GIT binary patch literal 7548 zcmb_gdvH|M89(RVy?L-n$P0`Zbs>PU>MnVRyo4m11QrsK?nZ1y-E1~D>`Hbw?!zQL z3P`nTohlt>bm$+_cATnH#?~^e9n`iyYCBSEZAYB8Q_<<5rJWL#jto@o?>qOqyEg%g zPJ1SMf9LnT&N<)t&b>ExTUSrFlrkc?Nzo{zO@L2V;Zh_-tCBT}dU3wkzJJFL#FNVg z`%WbMuf8wz6|s(~=Y~2?cozI|u=u#E_}T95&y1}VKij_ltCroA&`%Hc;d%hq+4^mR zD`T5u;I`70fCkB^0GO}Q5uw%j0Hf=IC%fAO%DPimF z`^i@CUOu?;=9S1nSw08IMF+B}RmE3K&hpQTlw&qlew~`sQB9lGHZM|$NO`vQV`a>B zS=sM4zF(=+t^hTPSB>3qY4Zl%htJe3P#Wi+m0_PhL6bt>UQt#q7OH)>E{g#!4VMbn z*QC`cQBYny&F;vVcC}}-yZlVMva{I*Kcn6HGwt&8yVDSYrj8XzAGTcn+F9jF0Rvfd z2gI6YL?O{{go9SO8ePq0d_t1%P`|35uCk2>3$q+ej`btD12LEdNSUB(NfUnn0?e6Oo0&@c2w@<~fw zWc-HIi{*aBr;3eVlKUm{B}-o~if@E~mQq4XFBYY=L?xsZDB*dQP-zMmW%Gz_bCoFW zfaRFlLtC^M+h5SLGuVGqQ{z8$PxXp|83 zGi@~X(%d?kUT%yL?P9vbc!rF-nYJ3IXjW^PE;Fve2>LpvtBU%&F^z!iR^zr6brN0A z3tU&!-U+&aX^-(J4b&qCm2tl@LbO-js_39qWEK6SZ+YSbg8YO;gm)fv<12fm+Peb z2yFH%U}AP3x>C630HAmmP+4L$t#=7gm4mC%LUo5>t3DvM%wn?YE@G=Jrd7>_jnPI? zQA{Kn-A%{va~p`eh~~A2Bh^$>TxMB# zEhoNDdC|S~G5p%e>v0-mpIY{=iJE62miyGQcahfy;?^$wd`4ZoQ&P2IVzHl|@+hLg99=h6rABg8Z=ndwoapSW@E85 zhq)}rgw~X;qK7UuYzuyOD8%+s-$jTtQNM(6vFeYP0P^h|ezoLx1V2rT*XErR|F7ef zksp;6{OlszHb4NIA@8s&f*t%(}Vks6Ijjbb?4=dphf z1+IyU=qgWFl%s|vl{|jZmq=!P!;_h8%l8 zC^eET(6B$9%4DuhrMG5;FPBOCGO6<;ftjb zrf(!ZF=3{C-gIhw)SL`QGMQ8~9?6=S@Mt^{&zi%&LU0elc-n)#zOhJjYh;U=@ns|F zEoL_3^Y?}Vp>T_Zz5tIP67fvb8>N+HvcvIY)*HjZMKqN*!_hjNXD}RlVfJ5Il_YA7yYqFGHH(b6T>1jnHh*j zw}$;a8$zjEI%*cYLfLdKnmyCPpGuCzw}?zEmCkyQ1#?LC1Gv1y<$C_1{^gO*k)y5W>dX5w3t=CCJ3@G(}*&<^#4&s?Xz*8h?tR~xR7`j3*pU7CbF2MHb0RCe!;x%6c!x3>;U$6hQ)lW>)1AR-KH~&CEN9e%r8(oy!MX6_*m#G{q1=}6 zNIH@*g+mZej-)VIrHl*>;rKYUqp7HqMsUV(Q+A5Zl#Irc7{Q8&ln8G$l}MO4VP2eB zZzP*d$A@yb{Zke{Te|>e^!%bnIW_A$j@73t>8Q=ekNUXhtM+Mjmq1I;=5yK6BYEby zjViKru^;B@r4k~0e%GV_-dXH6L*|Uv31UC?$=r^Yn_)Kwy8$xbX4^dg?u_>$NRMp< zwC#S#cDAY#Pd)ml+-|nrJ_t%}A@KG(A?Q27JeHFkl^~R`)BB!Tt7le+PHQ`$N4DOCY0omH63t(cobFKrG%yJhHQ!t@{`P zXFS)1g*;b7XUD6Z5w8kK+ieGdo!zZO#~E(`@fxA0`O&+w9nZt@>^VJJCPd0U1RRfI zUN*z77K`kI+-_t;zgAq}K4#0Ku)|-zkqtHa{OTA+WMD+KZ#TP3i1Ns{I{ed0pEl|I z(^_a96ra}Wj8}rXx*0ON+3{>{qf_n@$LVWWzUldFS|WYgOlUmkh{Rp$EaU^I*%g>B zj2U{z0fCv0y9L#Lq1ks2OQPdT)O3Au!4y3m+Ufe~Oh=aJj1~67Ss~<4+CszEj{-qY zS0|+)(jAdVstc;rLeo{HIXQiCC^TK1S0L!=qE3xKdqV%(R3m?MUnYJ;aYHmQr+Z{I z^3}zh{za-re!k3{{#B}`Z19WK!mL<0Y`yE8?bSd%iPfW4^=3R|E!p(ftxtQfVq7|3 z8eR@if&%aPLj9`;-bNf-Hq81MA-3Rt<_{8L3-&XAnh;w+RiGiYIGRF3%ING6;z$c^ zj`fVwklIF;`xsjp+ZnqVLyXrkh8ag0=`l?4Z)Lof@nOdAG5&<{WyV8{?=pVKSd0y% zc;_)LW$b2rh4C=sF~*M>%W(rB{{Z8c7`HIq!bo4Y$Zj{|cNyPe{3qi_jAb~!WPcaq z9>&KRUuHbSc%1P=#*Z1RaTB6A9!4+YD#i_r*D~Hnh`JbJ93jNVlN9T>G2TsxdbyAB z8-%cXi1m*${)q7xjE5NiLWuf$hw%s@{ExBzBgS&fh2~#Ni2AEztS5y1BG$Js`We>~ zqCPh=1_@!mne{g@PB5Yz)VeXOLRHVu(fx?>VV@T~N)=zosOlQ}WyFyWb)JBo%-1pY zGY&9b&p609Mu>c58Ebs4T;xw! literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/pio.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/pio.d new file mode 100644 index 0000000..0fbc0b6 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/pio.d @@ -0,0 +1,17 @@ +THUMB\ Debug/pio.o: \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/pio.c \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/pio.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_conf.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_dma.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_spi.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_tim.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_usart.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/pwm.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/pwm.d new file mode 100644 index 0000000..1ce4ab4 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/pwm.d @@ -0,0 +1,20 @@ +THUMB\ Debug/pwm.o: \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/pwm.c \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/pio.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/pwm.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_conf.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_dma.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_spi.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_tim.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_usart.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/misc.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/error.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/hardware.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/serial.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/serial.d new file mode 100644 index 0000000..2cef093 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/serial.d @@ -0,0 +1,22 @@ +THUMB\ Debug/serial.o: \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/serial.c \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/serial.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_conf.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_dma.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_spi.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_tim.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_usart.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/misc.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/hardware.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/pio.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/error.h \ + /usr/share/crossworks_for_arm_2.3/include/stdlib.h \ + /usr/share/crossworks_for_arm_2.3/include/__crossworks.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/spi.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/spi.d new file mode 100644 index 0000000..de012b9 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/spi.d @@ -0,0 +1,19 @@ +THUMB\ Debug/spi.o: \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/spi.c \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/pio.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/error.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/hardware.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_conf.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_dma.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_spi.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_tim.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_usart.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32_it.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32_it.d new file mode 100644 index 0000000..ed7f0db --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32_it.d @@ -0,0 +1,33 @@ +THUMB\ Debug/stm32_it.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32_it.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32_it.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_istr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_pwr.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32_it.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32_it.o new file mode 100644 index 0000000000000000000000000000000000000000..17fe0cc19905e9f0e5b4d962186883a00a0091e1 GIT binary patch literal 7740 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_bkp.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_bkp.d new file mode 100644 index 0000000..5381a0f --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_bkp.d @@ -0,0 +1,19 @@ +THUMB\ Debug/stm32f10x_bkp.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_bkp.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_bkp.o new file mode 100644 index 0000000000000000000000000000000000000000..5823df6c5956bc52fea8575592a56a046ac15cac GIT binary patch literal 11992 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dac.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dac.d new file mode 100644 index 0000000..e26e57e --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dac.d @@ -0,0 +1,19 @@ +THUMB\ Debug/stm32f10x_dac.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dac.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dac.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dac.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dac.o new file mode 100644 index 0000000000000000000000000000000000000000..712bb8f17cf3e4ff71a717844580056811c09c48 GIT binary patch literal 10760 zcmcgx4Qy1`mA>!2F&@T)@gLv--428(jshP4Eo(3V8yf?S!LAJj^5+@b&z@QA8EfVl zOi4FxlPIKVvPCrMs%fP}O;>G2L^n&MG^86;MQXcBwuzelCfZHA)ruu-m!xT6AzSwQ z?mKVh&DdEIrRtU5eD9p|-E+^q_uTvLdvn*8o^Hc1;!294>XhLLz@8=enWt2X*43$1 zYK5A4TAk=Uuljn=8^)Cjf4t(}D}6unJ@x#|$$P$|PE5zv#bB{6>)%tc-gnM)zVNoP zmL)F74ky~*{bRZHZeGOFP>VkLuso64jljzG%lHMhdP(WD&P4380oX78ER)#L1|&;`-hy z=0x4NaF)MH%=dJ{8m2F3=JKN$VZ)j<= zD|y*;8IfJqkwvgtE+^I}8Ci|5Pt2oMy^apYyjq8u(`S#FZl6|Lhp|$YB_4gMwmYAJ z>iIC%?G+S58F!Y47pRC{$L`Nx00Jg{%7YIX_nG>3L8-zT&zDS&6S&WC$u%C)&uf~^ z3(m!h&E|za3NP^i{e5CKZ_fDcn9Zx0E56o0F>h$LzuLLlT|b+b8^2cqN^v?dtHu%h z8b9*yEr zh_#_FlKhT{%R?tg{)32-&|Zq~inuCN#<~|otP8awe(R!$t3xM9{vQz=ROx+`|JQsP zmC7mtjsF5M+yf!d%n?Di!p%?x*1A$4{GYU~ccoxB2n=F#yAt{3BgYn!f^^hu7Y3^3qw z<5AXsSo`I&9>JBOU+w8(*V8n3H*qqLYhDbTui|8OOf`qj}Uptv?QgM z;RXgbRHypeuDAyj^XO!aGcl=*J;wc7WIU{Er1E~wfxie#-1UzghsJTj&m2HFy zi*2#8%GZ~*m2I!aV);u&C(vms7olDaAXlzZFUWe_Yd&OqVb+Ve^}Oytq8}ZPM(LA3&W}`& z+YjRWFzxC7eZsBxVaAi$uDBPWy$V3CT%~`y9`}zwQ@vWoIpnrin+sCQSDy#&6#ntl z#|rI)Gv^lXp~u`}VXm;m^lu(HH!K`$7LFYY$AZN}#>&FB{pHWmP8%lAR1MhkOyhF- z0&IDDZ|43Qok%&+kwe-2(M#89O>m?Lle>N7I?XcxGa-slGXyObw4ujo2!hNKe?&(d6{B zor%_G(g(-wLxb^bHa(n-J9c((JUNkc?2%~Rc?51E9sN6^lkwsG@i99ab>f*Z+sQ^d zcMNPF7;JVix?NgOS!bfTX|%CndT=B@TtCbY3t49*nR4nA7=gSQqBi;2S~Z-`*n`6p z%^=_bime^Bu<8F=84Zas6Yn&Jr+P;j`%;N->|3*9P2+(vv&3h5*f4hV^z__Zpge9E zw`~e839c;Ao|#j7w@GeuaAN`YQPbG5>80libl)|N{hKZXYYLP&`;s>mD1SGX z@&U`ZJGF5-SxkP?GH&kJckfN+Jant8qjRv!-kwT2s%u++Yk!xbW~=RV#hrNXlruTy zd@4RZWotEQ15RdY7-X;pY^O63Po?bfCbG3|S0*_&W@mErU56&^E_+nrJd&};8U>qF z_f%@wNv2cr@c{=3qPFhb9qEj;)UT~?iZnGeHZ?Xhu8q`XkgxHqeM96{CW<{VWRHy4 zBWqd)*RC1L#8bnGNX9;p%)(Ekaa~hO>tEf@UNkoKGzvB;bH ze-LrTQ)Au++0PKIh=&#wOMTl=-n9c_1d^bq%w%r0W4w(r_8 z*gw5_YIGC>{*f1Zw0M2#PR;Jw6uQ?c16nu?of9KE=&l_d-Yrt3Ybri2-PKu=cdN$< zgOSfZJ#DQr9<0c%=^(ZrNh|GE_r6g^mOggc2i+uMXpL(b8^#L0@aqn3K2sZY3?%BT z(7||dxaltAsS|vT*0&FIZ0^~jx_bN30B2G<&7n|Rc50*A+S$22Qiq(r;ZKp$9SgBd z#qIb|QW+)Ovg)&kCY<;X(8;)%@a`OY+EMi*%$53~Y*y7{3Dr|s&tPSx=M{SB^P(@^ z@=EqFFUjQQ6?05c-uOOqm?zB6puDYk*5V0};emJ@bi8M+20qBXBY9_gB-)<6_3Zk z_WQdHLd+upJ>ES1=Rw~J zrA~vi5?3WI@|XwlB7ZMp%loP41a{B$?M417;AjSI(;wbWbN(iZ{5_6W+&ercK7aho z=ToaI_*nNPjI~!h+hN@J`|-u=lsXR{+g*&y>&HVy{*K`T!?foN==uA6k-wQbH?Qcg z*5~i>B7bFgD){ry^Y^tPe`nzDH2l!tQlGznEb^CyzfI_eS3H0GD(UaV0E z^7{L{_~X97@)Ra@H|E1D^vCO;i+H7rl3+~Z`|9_%A;MQHD5dyrJ(WhkKA_&Z;x}5kC|s>o z5DDA!w@5jl`<3_MTL4g6*zMWxeBmo|zF4ZX$c{f^e8s{_E36;%S?Pa%k=>sGw1UiAI}?cXQ_zdU+K&_ zGOLg;T#sI1-0N`B&W{{b$d}C`^J7O9^5c^t$Fv+&`wHaw`kBD`++(UR--pG{k0Di< z-$z8gL(5@xTx33TsxW`23*>V3s>nmyzEHg>GC!JBaiojiKUO(vmAp{6FR1;Ucth*k z+}LMll9P#kJB#;EIeojY5IEubPO$#dx&M`9jzc|<#_#jC0n_X=s(v}hz5TlH6otC{ z8}S^kK%~xb7R47~j713hEBAdObI|;lE8~Sg$!LJE^ zUGUq2FA3`LK>N%|#&Jn-KKlW=R`7bkwSrp&_4t4{EOJKhbApcu>Tv?^DUnYL{#fue z!QT)|l==_Bv&0oRXAn{U0ul3nSrC87YkLq6INBEr^6W`j{|gJ;CUP$k`7$85hqway zBzB%fS??ebd30FtE+TkG#Quoj-wQrTM4tVF;L}9#|4HmG3i8h(`u{Bvd3Z+f91;9K zh&^DryhVZ^BO-}b2wq17zh3N{1h*2Azc&l^62aRm_A$W&g7*pjEfINsOz_J@)O$?q zCj@^i_;VuG!E1v5Mg;$i*e?h!!Q-3#{WuZp*_(l zqeRsIirBv^_ya+tvCboi8o9qPulRf*a-SjMD5P;U5qZ@h*edAlH(erc6YLY*B{)Jv zUh$bhoD_5f?-ZO7)cX~9dcOjGm3rjcV}jolJT9pBG1#9G`Ly5*g0B+2eGd4B$iEdl zCwN})qTqXiVFUG%j}?M?-9uh3@+v{SPeR`ya*JRW5&5}IQ173R_5J|lyCv;0!Gz$r zpx#%Jw=dbo!^+pcFLSLBF3?gh;iCWL_cFh^d~_? zTrBh-5DXI0PFPU4kM?RP18a$Bce!AMi1t?r>bMZcYRb$jBI0Qg)NvxN4U~cHM8wx6 zsN+VQJ(Phue#EzbTSP=VYl!gwe{ydSj{pDw literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dbgmcu.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dbgmcu.d new file mode 100644 index 0000000..5d4d728 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dbgmcu.d @@ -0,0 +1,19 @@ +THUMB\ Debug/stm32f10x_dbgmcu.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dbgmcu.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_dbgmcu.o new file mode 100644 index 0000000000000000000000000000000000000000..d0581a862210227f4a7693757ff36a05b27ee8e5 GIT binary patch literal 4336 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_flash.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_flash.d new file mode 100644 index 0000000..f76a2a2 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_flash.d @@ -0,0 +1,19 @@ +THUMB\ Debug/stm32f10x_flash.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_flash.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_flash.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_flash.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_flash.o new file mode 100644 index 0000000000000000000000000000000000000000..04037ece466e2846632366e600b41cf0370211cc GIT binary patch literal 22020 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_fsmc.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_fsmc.d new file mode 100644 index 0000000..75c07c9 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_fsmc.d @@ -0,0 +1,19 @@ +THUMB\ Debug/stm32f10x_fsmc.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_fsmc.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_fsmc.o new file mode 100644 index 0000000000000000000000000000000000000000..3bf9d8b67de3215c81855935be4670b4afaa7b58 GIT binary patch literal 18436 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_i2c.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_i2c.d new file mode 100644 index 0000000..091de84 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_i2c.d @@ -0,0 +1,19 @@ +THUMB\ Debug/stm32f10x_i2c.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_i2c.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_i2c.o new file mode 100644 index 0000000000000000000000000000000000000000..e9dbaa0e6241ae39182e38abd47bd973f16c9661 GIT binary patch literal 23372 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 D*4c%$ literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_iwdg.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_iwdg.d new file mode 100644 index 0000000..d99d842 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_iwdg.d @@ -0,0 +1,19 @@ +THUMB\ Debug/stm32f10x_iwdg.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_iwdg.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_iwdg.o new file mode 100644 index 0000000000000000000000000000000000000000..1028051ac1b0daf475bccb5cc4891513959b1e98 GIT binary patch literal 5928 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

=}v&vl?XCh_PE|{ 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rcc.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rcc.d new file mode 100644 index 0000000..8797be8 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rcc.d @@ -0,0 +1,18 @@ +THUMB\ Debug/stm32f10x_rcc.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rcc.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rcc.o new file mode 100644 index 0000000000000000000000000000000000000000..5a10f21b3409dd35c81899918898d95f7e3a2546 GIT binary patch literal 22756 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rtc.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rtc.d new file mode 100644 index 0000000..104f4be --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rtc.d @@ -0,0 +1,19 @@ +THUMB\ Debug/stm32f10x_rtc.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rtc.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_rtc.o new file mode 100644 index 0000000000000000000000000000000000000000..29be10af98d4311c9a5f2ac385076df9f0a465e5 GIT binary patch literal 11204 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 E2RI++(f|Me literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_sdio.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_sdio.d new file mode 100644 index 0000000..668b1e3 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_sdio.d @@ -0,0 +1,19 @@ +THUMB\ Debug/stm32f10x_sdio.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_sdio.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_sdio.o new file mode 100644 index 0000000000000000000000000000000000000000..4886698ae5d1a38a41990fe979a409074fbd5ef1 GIT binary patch literal 20248 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_spi.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_spi.d new file mode 100644 index 0000000..08d32ca --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_spi.d @@ -0,0 +1,18 @@ +THUMB\ Debug/stm32f10x_spi.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_spi.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_spi.o new file mode 100644 index 0000000000000000000000000000000000000000..0e0d2e837b0a5a681a05d5ab2de866f6c737da3b GIT binary patch literal 18652 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 MmXm0QpG5ut2i-680ssI2 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_tim.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_tim.d new file mode 100644 index 0000000..4b10a93 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_tim.d @@ -0,0 +1,18 @@ +THUMB\ Debug/stm32f10x_tim.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_tim.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_tim.o new file mode 100644 index 0000000000000000000000000000000000000000..114e982d9bba0b010b5cb4f98cb8d7d31bc63a1e GIT binary patch literal 62504 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_usart.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_usart.d new file mode 100644 index 0000000..9936f7d --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_usart.d @@ -0,0 +1,18 @@ +THUMB\ Debug/stm32f10x_usart.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_usart.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/stm32f10x_usart.o new file mode 100644 index 0000000000000000000000000000000000000000..85aa21bb7582f236385e6d33405cb217e9254ce9 GIT binary patch literal 22140 zcmd^`eRx#mng5?NXYxW4LP!E4UZ zPSTF|#_kGjcb~^@pd@L>dt-O8w%h5kQyx3s8@obnHzanstY3jAKinI;tdqg414{=E zsJ|O{@@}-Nuj%q8=_{D{rbI9zn>2GNBNra)m?i}H-B_YyDYx+TN?828ZJ(?N_;avFvTW0)@yBRo7p1ovCsxv< zTeD8iamH$&nS+&>TNCRiH-RH6@Zf;q>%z%fDdz=l(1ad2=+WNay$s{MZ<}Ylhnvip z4mUj$UGvTvyQpdyxlYD--8g8*YnSj1aM#{vqD7(Mrs1d=>#UP`teNEN)(v%?39bL#I>&^GCgpnUopHl#|&~;=sN;;rmom?$Rroh6gxn`@?*% z)bFSDY#t5|NAVhbV=qVWjlKQ2w@0SIrZR?A5eR%_zk9l=KW5DizBC-OPv+Uf;oM{W zv4F@0knLmC6yuI{%set2dnPtM`cX6|G`T4YIwN(R2n2GfkaBXWTR--*Q$N$bVa)Rf z_YUhGMIYXgbIeKUI$_(p_7+t^i}cifHGP!3w6fcb)r^sGwzJlzAiv5!cw%jF^nde>YnrZ1 z`i4#oIIY4w(77d3(w12{h_%LgpX!@E%GXW#1mBz^W)60p2!*;%G=$7N9K(8} zrxBM!SfP^osdYc4TC{(%-N}?u<(s)^dM7CLW^Z}szo)m-%|-f#oY|f%GnwKk)5KPm zsrS()%!xr=Qq?Z(O7;;%9ecPbaLj0jqnv%-80yZgfyzO~1U<8S^Y|+|W;$h@IHXMEkItN3mxkjxs);#tb#>tPGoWGTO48lRSGxYCrXF)scIvDWiXD|6NWA zm0K(C^7ccrukvs%{O?bB~Ff|*Y4WUb_MC|Dn{F7r?Xo)+Rkl_x7?x8b|vZZTRPe+jjh+^Sk&g>&L#-{gwaQ$M?dsv^(4Oo^3y$ZGL}fyPDDMO*;?Hw%kAT z_%0eD0>}q5%G!+^>vOi2Qr-eq=0?PyKp^Aa z0egNB_XTWCAeiwiQ!b=-d>vD)?0b=oeLJ!V6gD#@khLBT_Bh@bCA3%8om6LM{5Acu zvjUKU*Fh7Ui?@v4^7+dCwZ(+Yp#8q}ByO_)5_zcXh9zt95qQiua1X^_0%M+J19>kUX$S!MWe4C_lWVDX{#B9d~Z+TRcU6O_3P^~(PH;9W=y%uspXXAKYOIs|3} za%-UcfhdD{Kcw;>M46deT@UR)iZ(m%6>1NQHYYb!U#{$b5^Y}IT0wE56hDEo(^ zEy(*X9rI9l8+hLxu$Vl1w7oePsB}U50A3??$%Z-$$ z>~B+CSq6u(*%@Cv%5t8h{aRz8^4~+9Gp;jIAb%3exxq-m{5b1ylaVr&{c|dtzK%S` zSy$rSVvUu0m2bFmQB=Xd;>{Z1ZD2=2jn@-noK+9C^|-d?uFI&m%e8*oSl1Txqbk

GLSnG`?gX<*J^)|QM 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/system_stm32f10x.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/system_stm32f10x.d new file mode 100644 index 0000000..3f3320a --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/system_stm32f10x.d @@ -0,0 +1,18 @@ +THUMB\ Debug/system_stm32f10x.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/system_stm32f10x.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/system_stm32f10x.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/system_stm32f10x.o new file mode 100644 index 0000000000000000000000000000000000000000..c3431bc561bfd18d3a995427158d1c0600395ec2 GIT binary patch literal 7824 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/systick.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/systick.d new file mode 100644 index 0000000..9d2e2f5 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/systick.d @@ -0,0 +1,18 @@ +THUMB\ Debug/systick.o: \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/systick.c \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/systick.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_conf.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_dma.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_spi.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_tim.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/stm32f10x_usart.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/misc.h \ + /mnt/dysk/roznosci/praca/Galwes/Templates/Low/STM32Template---/pio.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/tc.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/tc.d new file mode 100644 index 0000000..67f0085 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/tc.d @@ -0,0 +1,13 @@ +THUMB\ Debug/tc.o: Z:/roznosci/praca/Galwes/STM32Template/tc.c \ + Z:/roznosci/praca/Galwes/STM32Template/tc.h \ + E:/CrossWorks\ for\ ARM\ 2.0/include/stdint.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x.h \ + C:/Documents\ and\ Settings/Ja/Ustawienia\ lokalne/Dane\ aplikacji/Rowley\ Associates\ Limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/core_cm3.h \ + C:/Documents\ and\ Settings/Ja/Ustawienia\ lokalne/Dane\ aplikacji/Rowley\ Associates\ Limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/core_cmInstr.h \ + C:/Documents\ and\ Settings/Ja/Ustawienia\ lokalne/Dane\ aplikacji/Rowley\ Associates\ Limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/core_cmFunc.h \ + C:/Documents\ and\ Settings/Ja/Ustawienia\ lokalne/Dane\ aplikacji/Rowley\ Associates\ Limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x_conf.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x_gpio.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x_rcc.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x_tim.h \ + Z:/roznosci/praca/Galwes/STM32Template/misc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/tc.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/tc.o new file mode 100644 index 0000000000000000000000000000000000000000..21ac1c632b56f4e5a8d2d62b08f884ef75e1e5bf GIT binary patch literal 8364 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/thumb_crt0.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/thumb_crt0.d new file mode 100644 index 0000000..f2e3d28 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/thumb_crt0.d @@ -0,0 +1,2 @@ +THUMB\ Debug/thumb_crt0.o: \ + /usr/share/crossworks_for_arm_2.3/source/thumb_crt0.s diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/thumb_crt0.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/thumb_crt0.o new file mode 100644 index 0000000000000000000000000000000000000000..23dd0be040844f8d16bca449ac5e9558328361d4 GIT binary patch literal 3344 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 C%;1Co literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_desc.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_desc.d new file mode 100644 index 0000000..fadee71 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_desc.d @@ -0,0 +1,31 @@ +THUMB\ Debug/usb_desc.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_desc.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_desc.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_desc.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_desc.o new file mode 100644 index 0000000000000000000000000000000000000000..c9c0238cda64ffb04f94ca79a33ca11b30047ffd GIT binary patch literal 3820 zcmb_fU2GIp6h3!nr@Pxip%h3!kik%B5oVw*h?W1ApG_zd%1@%fb$0i*owU0{=0}PN zQG&)NP#^lHQC@uX!5H<0#5eWXnCOe)fy5W0F}|sZerNXH&TLlMTrYLpY6|q<>nuQJbhkjZ|1L9_GQN+cY#-bSu zv$#PFneVd2c-L6$ii==KaA`>1q%SFNl=9n+ljP9?ev$&(L1E%wXJHvr6w@_ofbD`g zhcY4`wU%r|`vsb$5gP93{65yj3nj{nw^0{I6D2KjqN~iDoXH_D-eS(`F|_CM=I;RG z0SeJ~hApD_kRez2j3HmR%}_K^0tz1h@(v2~AP-pR@=+I}UF$jqp!&Dq#+MB%ln)aint%ETc&7kgH zrfn938J>xHGV3AD8=&q1)Q#=pT!yz>^Q7i&q3)H;v&BM&cTw|hYu*OxW}~rB+(>x{ ztr+O-?=gDT?0S(@8MJw1nE0ChbXy<)5aoV> zmcmvLoF1a0qM+N66}fJNbbHdZJKL4*v)828=c-$qb7y4eL~bx6qtF?joGMRMMq22U^$d+>9^LcsI526Y554@|9ACU83 zeMR7x97_C%o1r(;ly!?8O5JNShqLg)YBQy-kNeGOZzkhojFAphB3k0tu+Ocbd5+d# z|FrybfnSenong5on{}+cd||S3e&KjLJuL%LPA5aBzO=$PB?Hf$&xCP8zT(wn#zo9N zG7J|_oxNy{Tch@Vd)OM@vv+v!p1u36!2sLuhH}Vyk+VoPsVV6d{nbef@DRRMYL_LjV-e4 zvKr4+yymoz#l8$w-&k z&+;PZM>Pqkd5frLd7oz5n67zj&+@*2KF9>G-j-Nt1w@ zw-$EhY1stjZpNUi_|Bq|CIKI=L;)M_HNusajK}+6!KV8_rF#hY4X!BBZT2$W7#!`_ zjo|9)nBwhG{U_o0_qtK>SUs_fH-H4=z0|@Se$Jx6R9Ce<0*}8JwJ?XJ56@EUP=5ow zmvkd^U1iicg(~ghV8Fn+wE+*unaAhYWyjlv_}zm|iylww8ngC1{rZ=-Ga5@?w5&#( zC)}Q$k@Y;`gCrw53v_>TS$p#4T;dxzwe9`&Dc1c9%i8(FJ{1EewY@)QOezMV)ZU)W zIQGALSv!9trD7zRnAJH+Q!$9YD^oFuFNsu)woKsp`j!}LKX1 zi(XbbN4Ad&_^+TP+Y`M=ca&}=dWk+#`o=`ZdNN-Z+v@*z1E;rB$JLWIbzC`VQ`=Ru z+^nvcC|tm9npnPA+^2;(-zds-o%bLJmXcw8Z$ zWwu{Zctv4d;he%);Vp%C6@JW!$-h?mcZ>-7FG~ND5tq|?95|k58zWwrhn0SY5l&Al QJz{*4=#J9gW86aYH!0pq^Z)<= literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_endp.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_endp.d new file mode 100644 index 0000000..7c55e38 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_endp.d @@ -0,0 +1,31 @@ +THUMB\ Debug/usb_endp.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_endp.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_istr.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_endp.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_endp.o new file mode 100644 index 0000000000000000000000000000000000000000..ecdc39c258d34173f80a682c4f2aa14e3dc9c265 GIT binary patch literal 4384 zcmb_fUu+yl8K2ob|4Hs_;uu0`UFl3+#ii}8eKy9lQR2jLf~zDpzC=VMWxIE`wpYHp zwRZQC3!)+*)Ch!-S|r395<&D$MUUH*>ca z7kGeA+WCF|=9`)Co0*&Y?8^DGQc7QFl44p&BLI&MqZt%pUg@UAg!q8C^^?#2K)kYc zPl}~K3;7zpy}$i)54;WDzS?iVfzlhRwaalNg542Co&Ybuu7v)^l7mO+XAL|F zuouW5IsqRmH}FS*{dw|Z>ulxlmk8F-C?PkrNEjYK3mDn~qoy+Z?0$0)!#?EL9~agy2d^KgT!xL8#$9CP`wAPnSWK2M#5FgOi|i4iQ-ktYis-(!U_c~~wD(mp)j z4PYG<;(#L_^uj{5&%o;V$-;4Lmb{d!~Y+BPRD}A$M%AM7(p`w;}gsuF?=m;t& z!SgIjx6w@9+RbFgjiXODqof+TK|QFZanuZ}Zn<@%5&H3t@0O#@v?qGYag-#Vh~k|@ zxUD31lWji^+$yy!7=;M-Z)~;swpx zu2bdelC%~!Q)ipWOVY+%X>)d_?QQLb5p=Luqd4%YjX6kaiw>wH+ahU)9r!YGSgD!R%lY9RjSdZL`&6n59Q z9tYR2U>VC%W49ipfm+VS3Kz6`>4LY>)~nR(S2H;u)Vy+v!s_fWDfs3}nDe=dmy65A zd1t{X6-zU-rP-O;h2nIKo#!XPUI&+2$L{s7H20uz^>?s1hmOv^diR^Ml~o3Y;rL`D%dHzN$HjDDqp%w(P5wDz481^n~*?5P>di&tL zu$g#ofoGo?e546%x|d84$YlBbMWgZi9yazGbcT%IJ5XRsyGH*G{IHZRnb4R{_pH%a zz~(F%BV@x8JI@n(3DL$Q=S?Vi{+UOvgYmgmjN7FvC@L=QE}3{;g=Vt)oVc$Zy~YQ> z#fDXA_sxXkWk;l(6Mb(mHM?F28z&muJwpS^|9n@|vG>lQ`gQ19ZJgl#{yfn=vXKRj z-^+J)2XKBoVLh@19=RE^)k)|n>`WwTZM74#cJ8De+2Tk~0B4K$KOi6NMqo|Hke^8) zv&^UEVdSR-G{kkBGy;(F1$^{p?GGa#{10bHtvmC?n5v1XeUGJmKarQqr@iv(d2b`| zYoZ*aE9)C=zAakGzSq*erwShW7~I8Vc!$gYc~%eN&@vO$^ZZiJbx~f>GHY(3eCrx7 zX}qFw6L=7tocr5-r1Kjv17yZ6lntR&|0OM-A)>rEZulRFvqXF!bKF666&C(}Fy9t} z@J^%M)i|&5l*Y3f%Njqa(bu@GG1B;=#xHC9s>W|<{5BEm{jSFE6EQj7x17f>HU5T( zb^K1_?}_mHgSP)&;~+Kx`;BXy)aVeAoH;GSU5(2;a(tB+AomJolg9}yPia*7fqjuO s=5t)5$@9mwtm+55s-MX}4ryO}=t&&U%ww1`^lCo94{^S*pCLm27v#G*Z2$lO literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_init.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_init.d new file mode 100644 index 0000000..285bb56 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_init.d @@ -0,0 +1,30 @@ +THUMB\ Debug/usb_init.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_init.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_init.o new file mode 100644 index 0000000000000000000000000000000000000000..c665efa9305709c3c15bdabacf4920a0448760cd GIT binary patch literal 6920 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_int.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_int.d new file mode 100644 index 0000000..6ec82cc --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_int.d @@ -0,0 +1,30 @@ +THUMB\ Debug/usb_int.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_int.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_int.o new file mode 100644 index 0000000000000000000000000000000000000000..fcea031c1af701f5c47e250da9ea9458688c50aa GIT binary patch literal 7024 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_istr.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_istr.d new file mode 100644 index 0000000..edef6cd --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_istr.d @@ -0,0 +1,33 @@ +THUMB\ Debug/usb_istr.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_istr.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_prop.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_istr.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_istr.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_istr.o new file mode 100644 index 0000000000000000000000000000000000000000..06f879be8a3151e4dc75eaae91af864a37a9845b GIT binary patch literal 7684 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 D6|>ir literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_mem.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_mem.d new file mode 100644 index 0000000..1d89091 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_mem.d @@ -0,0 +1,30 @@ +THUMB\ Debug/usb_mem.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_mem.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_mem.o new file mode 100644 index 0000000000000000000000000000000000000000..8c76c6cf490a1feaaf12476128462fc97a94c899 GIT binary patch literal 4208 zcmb_fU2Ggz6~42xe~ukDj@wd_RN53*aa1znznC-|(zr{V+O3l)PFf@iyR*Av?~vUc zGc#M;xCK`gCGY@>BJqF(2qYw^#7|3+5H3$tASzxE;sJzEC4?$PJP;v-&`N~wyK}F1 zHce3_IP%=@{M~cTJ@?Mt@n;`BJ37nOe(`diaor|XG_e*c@?%|h;H^V_el zo!x%zrFW^LTj{T(=yV%f&fRYny@SlvKrR)#h}dbfSKF4%wS~IHLvJJ3eJa-w)_)6R z2;;fop}k^E_9Gsy0@5iA!|Bf(F*7D%Z?4a;`A)w>+V8t)Izu3mu?XHcE`|OfWn}*a zO)8bSA1-E*bM~F4CY|{+z>qjX0)rFA(w>jDXyA zKzbTOCjA)3tZ^8lF@ZEfaFL_~ka91BF($r*F?Fq;8-dE0cv?!8-0RX7OV8xn!kF@; zWi9UsV>;$H1~QzZq~^e2LTU_@D9tcY>RN^{67 zsWCA)cp56qx>uOPCkKmz3!`Y~aY4x31v8nfWjrzzn~w~Q82gPgSp(`^W_M0%j}ZA8 zVdmoy6bB%xh!poIF|#oG$k3@FR7m3KNr~qrrei)$L~+!Q5xI#ev7S7<(*M8AJH&Zx zIOZJ!NMZnWT9u}EK`oZiVZ#YryGHFgwdEB*C_6!` zJY`MWUc1)p)LmgW{FZC4cpDpTU|WH|-gGz1P8j+%&xzcy-1J&reBYfVEk z*{+Q2r#WG~=)H(HGj*E7hdDgKLF(inMRRizS|hudH3v?mGH9R<@TTaC@GDL}t9<9A zXVY)57UY0pMA-0ysL*ML-fG*e7pS@%y1^y?!qVKMos|_gDEVuf;(y*2?27J$%-xr< zS5lvPt$H~OP=x59tjXDOB-YP8x`~~UiW87`-D}uyshysJdUtgTmzK&GH{x{&wM6L} zxvjNH!Es8g$4i~7*8|lKb^*#uK3kFK0`xNeT7CT~rzy^!yId$0W~^CjsxUP%IW;*k zIa?SHa9*9zJzDq}4~pBWy7jtSKQ>dIJys2zcCAqe+-JSe^V@~Vho@#veCXpsoGq13 z7RC|p=>H?!++8?Oj_Xu$7r7geuOI>YbXV*G7goB32=+ zn%`=<*f9(Jwwx#mylRJs;e5)e+Liq zYPt&HdkKYRKLv+myluo|ZpLFA9q$G3dJb4|9F4q2Mv=B%hpc&;egVHVWyb4oWY*)?%9v^KB#2gG5fK;#7E3nB*yA@{6M(V?*is?KU3I9?k&DP#3?18 zA>w?n8!7BR{_vlRkhKu+r;L~6FcF7=?<@7TLf*ZU=M?geq`a)~qY7PxpH#T6@G}ZO zr|>HZzeYrz-&FW*B3}OQD?9IA=6O@$-xU5^;Sd^0`vVG(60y!>3MYw(cT(9OSNN2| z=M-L3_zi^!FYDszV|}t;K)xrGb$|JZPI*kB>>K10lu?K5Kky?;eq7-Ng_jgQqp+e- e?h`K6zI=#7Vm@70o-*{ZKHxp9A9lGu$o~QK`dtYC literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_prop.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_prop.d new file mode 100644 index 0000000..626b701 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_prop.d @@ -0,0 +1,33 @@ +THUMB\ Debug/usb_prop.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_prop.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_prop.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_desc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_pwr.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_prop.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_prop.o new file mode 100644 index 0000000000000000000000000000000000000000..dc82461a4c0580a65ad830eb8484a1d53b293cb5 GIT binary patch literal 22140 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 X31s}13Ed#{ zMxj}c@($AbmFgx9+$Hkeq#++7{R#8sya9+1Y5P#s@_R@lnD>$fK1BLfr5+{?e3Wz> zeqcx%_#@J=`}d@QuL^xq=nA3d2+e*o9+!}oxcK{51AghG>2LjR?$6Kzo&zlXr0_8r zG#_aB1>@9@x~vc6Ss+)xPwE40{h5&0?-4%G@+0J;3`R z?@*(xtMkl#LelHVUuedM^ls9NaNkPwCy7hUI8c6+H0H;%M9|L>FIMW5&~Ffz!XL-T z`3ug_rD#uRJ`)Mm<9CWe4-l8*K9taR6IYraSknG+()eohhREL};;Yb{5D@aYM0^$6 zD0DLsUxoN7eAdeIF!(@(Muj$;XPY5R{#xO~Wi4MN2-BKw z5$qD&A(#}rK@dw@>oY&Fo!bQO7yOTcj|%d;3iZAx_=4a|f+qxD6a0h}{f+KS^zgrMH1o>Tp^pN09f`Lhu;zV&o;kXNfVTo+m=@ABf0* zzYu(l7*p!kM96<9Sd4^DdNvXH@m#?wBJ^uSewkn+5lJW}*h++6r^tH+Q$*y`jNm>Z z^d?1qMDWW*`j2))fB=kK4X-$!IV7aSr&Z%pI|1^-fz|9OJ>{;Pt2Lxldh5Wk(zajXF;2#8wqegFz;3C2Gf>#Uf z5KIcD1@92NSMYBIze&6X`=!u7Anw9>Na$Y@JJ2to-xB;la25^}^nZ!qWrCXpcM9$i z%m_{rajv*c=sStquzrMoh}ed_F7!8uIA?uF=;w&LmHMI3zaaJ~^}5h+68n^TTj)O# z_uxKd84&(f5c{#Yp)hYC4QVVFnnXnpPj-Yfj0f)5KmB6y65{B~UMIl&hNe=7Kj;7P$#g6|NK z_uducV>HtGTmdW>xuL@8nD-lrn7>xr`<%1^8gX!H%i3#j1v*p zNh0EQh=_iEfe3$C{Q0MZH2l$d2&nypUvtO@YJcJ10@A>0BK)iotR=!*7TiKaf3^yC5Yex0LET^UZx?CcZX){GCpbVve}@D|iRgD$P{#xP z-%lDiNkkkD3hsA6V_fbeqW|9{F2ebUi2lAxM1TL4i2g-5uh75CiRe!o5&h{Uq90>K f_^;3N@K?`&`1>gN@Keuk_@~eB@aH$=!=L{RtWj0I literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_pwr.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_pwr.d new file mode 100644 index 0000000..a0464be --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_pwr.d @@ -0,0 +1,31 @@ +THUMB\ Debug/usb_pwr.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_pwr.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_pwr.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_pwr.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_pwr.o new file mode 100644 index 0000000000000000000000000000000000000000..fe5d11d87949972dd9d5eed60f2faeef278eb96c GIT binary patch literal 10148 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 literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_regs.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_regs.d new file mode 100644 index 0000000..1b626b0 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_regs.d @@ -0,0 +1,30 @@ +THUMB\ Debug/usb_regs.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_regs.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_regs.o new file mode 100644 index 0000000000000000000000000000000000000000..3fa195090db4a435954072a11512821144b4ae6d GIT binary patch literal 36480 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

w^~Y-0uFUIdHxIA7ZJ%_c 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 bL;qKi=zn`%iT>V58~yzxiGKbziT?c$6@-9S literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_sil.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_sil.d new file mode 100644 index 0000000..6ec740b --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_sil.d @@ -0,0 +1,30 @@ +THUMB\ Debug/usb_sil.o: \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.c \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_lib.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/hw_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/platform_config.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cm3.h \ + /usr/share/crossworks_for_arm_2.3/include/stdint.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmInstr.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/CMSIS_3/CMSIS/Include/core_cmFunc.h \ + /home/fixxer/.rowley_associates_limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/misc.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_type.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_conf.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_regs.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_def.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_core.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_init.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_sil.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_mem.h \ + /mnt/dysk/roznosci/electronic/Suwmiarka/Soft/Suwmiarka_CrossWorks/usb_int.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_sil.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/usb_sil.o new file mode 100644 index 0000000000000000000000000000000000000000..1177f97be4279ee8ab8ef207464ba9994f3c893c GIT binary patch literal 4868 zcmb_gTWlOx8UANx?Ok8u`jUpkP}o3FUDVF_M(WxnS;z636*jeOM`;wQ_3ZB0J9u|z znVF64sHK)dl^~(g0_sDlfC%*g2`L4I7t)}Li+Dgh^3Z35@<5SNR9Ybv!uOv!XLr^q z<$9z!-+w#bIp;r@ncZjS7qgnC*(8fbBcv$>nCe2+Ni->JBlG|b)82KuHvjJFxnKU7 zj3;iBKD?fR^agA1oIEwWH~(%%_+Zsx)d#N(uOrSloV}Udd%eD}_mfMn(KRExyFR@> zvh_FOV$+vrxV7sZf9$TOJ5_@i} z&+Nwe_Upsh8{nF1^4};Q&MK~6%<(RYM%vSTy$9$cV$M;O0VH%(eTmDO5Dp|qBA2Ka zoBq`E+GRZoJtza=`%hx)SOD${J!(%v)*cs1d!=igALlr|BMUH=S?)i97(LPP4#4;= z%LB_?YpLI{#pIa50$cQCA6x#&@=(ZiB6)=&)qxt2d>N3KK-H0$N8PEV&{`YSTqs;J zq9#geMFmdr*N;(8&k2~ocZiI>>7JRM+z{wKO$;6P!OcRaNhfwBZih69nyZYIxDPH0BkhCz=dhYO9pYO1Ti*dJsRo&^D9x(Y zLaVeJY+1f{vE~Iu*K#UOG4#EfTeMai+f~>0w`^9w1!Oe>-wMjM z?^s2)ZnHJN;rV&nuja?i3Cpb&D~*yvR@tjM)`q*YV{6qYLTZwlb&5!vg&qm%ieSXE42MhCk(8)rPbVOej-9ECwrhqP{;>v#VqpVg0SS) zLbJ@dEPB3^FIFd@86?8on#(>;1a*jP8>8A-J%J1<+pkEwaO)eE-Vw9CN!sSg z=WZPp#)?`Mgh%wT@cA?8 zx%8xY+#FAjkB*IxjgB2pkNDV~cHlgeKF{02sTQ14$tgWDnLqwW!MAJ0a@uz;xPj}{ z(qoT}Pfk7h6w$)m+;n;bd=LFU=w|Q3hOr&H;F2cpc{A9phIWC>AoL?FD=Bn#LNZH8 z5}Ab{AQQtk*=VXwA+mL^Iod1t+QqIB=8{urZ00w7yXr)=k-@EPc<50$?Lq;`h6nf4>>nR8hAr-@jeT2%PLEN&|V^9K#Ryw}2s`Mv_aQP_BVc)2$DE<=vrGI6%`coU4oA37!3XcMT#R@t`A*{Tiu?h2AF{6U&vzH=yq-MnQHg3jc-`23S|Xnb z)|Vx&NmT1qW*zHRml#TXTH>C>D-ypZQLHoW)3))UpS1J?+UApD9eyz{plFAF#r^_* Rg7biR@!t>}_c=z`{{i^lkemPj literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/vfd.d b/Soft/Suwmiarka_CrossWorks/THUMB Debug/vfd.d new file mode 100644 index 0000000..21c3273 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/THUMB Debug/vfd.d @@ -0,0 +1,17 @@ +THUMB\ Debug/vfd.o: Z:/roznosci/praca/Galwes/STM32Template/vfd.c \ + Z:/roznosci/praca/Galwes/STM32Template/pio.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x.h \ + C:/Documents\ and\ Settings/Ja/Ustawienia\ lokalne/Dane\ aplikacji/Rowley\ Associates\ Limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/core_cm3.h \ + E:/CrossWorks\ for\ ARM\ 2.0/include/stdint.h \ + C:/Documents\ and\ Settings/Ja/Ustawienia\ lokalne/Dane\ aplikacji/Rowley\ Associates\ Limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/core_cmInstr.h \ + C:/Documents\ and\ Settings/Ja/Ustawienia\ lokalne/Dane\ aplikacji/Rowley\ Associates\ Limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/core_cmFunc.h \ + C:/Documents\ and\ Settings/Ja/Ustawienia\ lokalne/Dane\ aplikacji/Rowley\ Associates\ Limited/CrossWorks\ for\ ARM/packages/targets/STM32/include/system_stm32f10x.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x_conf.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x_dma.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x_gpio.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x_rcc.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x_spi.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x_tim.h \ + Z:/roznosci/praca/Galwes/STM32Template/stm32f10x_usart.h \ + Z:/roznosci/praca/Galwes/STM32Template/misc.h \ + Z:/roznosci/praca/Galwes/STM32Template/spi.h diff --git a/Soft/Suwmiarka_CrossWorks/THUMB Debug/vfd.o b/Soft/Suwmiarka_CrossWorks/THUMB Debug/vfd.o new file mode 100644 index 0000000000000000000000000000000000000000..102a516d4f5dfedf009b178922b9855f7d8c4b9e GIT binary patch literal 6464 zcmb7IZERcB8Gf(tP3+iCny;1u0o=8$*~;uRNuf&`NaB3d(8iII0D@8X#=c2R9oyJW zlN1Vp!YGVws(^tuZQ=*z2W(>>>QwO|(C8$Drfq2Z0b^{HwrSHqBCQy7LZf@$M?d!P67Iqy05o^y|V*YKVZP18)0rcpa-wgP;&p2(;r>Q=UPx{TULYtk-nXz}R{ zOb>)@u#T=Yz9GgW_&SWE(p0v^cDF z^`v_^B+|0eOXP*hbfWr%z{doB$x}+b1fpNgYY1xB_)CRs^*3qFT7NC4tm`gU=R#Ct zO_kaNmHP$LlCsvob#+42+(S8f#`D8)B*G#AjH*pHCv3D@3UnG%T42a*E}z{`~#<5bD-e2*!4jEjrYqJa9PSS4|ui@RqecU15+PVpJ zaaf!l?>2VcDNb)4S9g~<{oZ$&cSW2H-j`UtTfB|lf3tdzc$>W!G1C$8wtCOA_g?XC z@ZxnK{XX$-^!Bm(b@5*0?cm`1#oOj>;c*`o@1@?S*!zHZ1Kvy6`=EHgKt99hnS#mv z3^+CSd$_yY*K!Q$TLH$^JY|R){VqrS7G&hUnH}!8A-B7Ki2JML{ypri?ythp=zbda zHaEWp8!?j{8{Ln)-*4Rf1`vx9rmvOeo9ZV(V8pow*Jh)>j>D(9FV|)d>6fuH$xpID zTSl7Zhk#Iu6i*MdvCsV9`r z9?E13iBu?;Hxp)P)J!j0h0w(0-mcC`Yd)7Yixv&{gu?l3p>RVsf1nVU$>swCvAu!L zU`HsGNu(E&7KM94L)pZ_yp<^y0%j%|n6Qe)RA#miy4DO$6^iC!%F3k7KstNCOlPdn zkeRUpW-gsNU?y%&g<{#ow6z=RHhi5<6W#!obT$K+1{}PRk=is&*oCuk}Z+VTk*tv7c@0-HAurN z>(}~IvweMiM_dM`j>Oug%{~0=kE%@VT7O?(3XyXU<2E~|FFvRH&z3@nR!$uG2|XMB z0Q>4$qVpeqd_KDBq3Einm1JGNeSh@*l|t`Ibk)$G-`_jZ{{i)%I;+uzBOKvA<9EL} zvhw1}iF?4awBI++Uli#Yiu$ocJa-iiZc<5LT9rATWm=P3QN(spqg7mc)Cc3M=@ zu*>3A|0_Daeq<;f$)t)YGo3nQsXdTQ6ILcUxQqo!qX=Y6%t~j?B=MGm{VTq>Tv$}B zSClDvsHJA_s9ZHSF5{EhXT^<a^Sy)u}g$i%?lo?$AaW;0eYkeD;`q&nK0OVr4O0ZD(~m}CWK16tX&3r9hV7E zQy3YaqNG_g2~P?R`^j`TXE`$F&?4hQ<*2T*)LoW#RAS4vtIE<&gT2YI=b;od2U; zj95O>@K(pI^xLl_^PPR%HsNAfecpke7Pl2X&*zBaJ^&J~6~}lJE+^kn2OryQKK>#&`3Rj&!e%#)R#`DKN5bXM%glx|dMDk-&A7Me7&G!U!XMO*4@bOZ%`A$G~ z@;w2*R=B%T+$*}gx(;N&|Ez5r~@hgY%8_YPz`2O_8;EqulhWnPz@x zC9FGpWSyUSrRi$taO%ABD@{k$)t0I!20q^!Kd;P6)3LIu^VLuBa)3_ji2qHh%s;Q3 zO4HR-aO(W#R+_HfJg3exUTHeNRF0+-|Laj{I$c~|`*E0?=)0Tb9jNSWL_66IEDGKM456PDUOQ@G3^|_6iOPs`ndqK6A03*F57*g8KwBjHn|oxGZ>B zP`&T)KOp)s!AAwvdc@5}JQ7u>8bA6ANE`tFo69(X7>bJHDd2IbJjAQ{1FC#DG3Bbh F{{dM{kgos$ literal 0 HcmV?d00001 diff --git a/Soft/Suwmiarka_CrossWorks/caliper.c b/Soft/Suwmiarka_CrossWorks/caliper.c new file mode 100644 index 0000000..f765d8b --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/caliper.c @@ -0,0 +1,225 @@ + +#include "caliper.h" +#include "systick.h" +#include "hardware.h" +#include "stm32f10x.h" +#include +//------------------------zmienne prywatne-------------------------// +uint32_t Caliper_Timestamp; +int32_t Caliper_AbsValue,Caliper_RelValue; +uint8_t Caliper_State,Caliper_ISR_State; +EXTI_TypeDef *EXTI_Regs=(EXTI_TypeDef*)EXTI_BASE; +//------------------------zmienne zewnÄ™trzne-------------------------// +extern __IO uint32_t Tick; + +//-----------------------------Funkcje------------------------------// +void Caliper_Initialize(void) +{ + + GPIO_InitTypeDef GPIO_Conf; + EXTI_InitTypeDef EXTI_Conf; + NVIC_InitTypeDef NVIC_Conf; + + //wÅ‚Ä…cz zegar GPIOA,EXTI + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); + + //CLK,DATA - wejÅ›cie + GPIO_Conf.GPIO_Pin=CLK|DATA; + GPIO_Conf.GPIO_Mode=GPIO_Mode_IN_FLOATING; + GPIO_Conf.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOA,&GPIO_Conf); + + + //przerwanie na narastajÄ…cym zboczu CLK + GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,5); + EXTI_ClearITPendingBit(CLK); + EXTI_Conf.EXTI_Line = CLK; + EXTI_Conf.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_Conf.EXTI_Trigger = EXTI_Trigger_Falling; + EXTI_Conf.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_Conf); + NVIC_Conf.NVIC_IRQChannel = EXTI9_5_IRQn; + NVIC_Conf.NVIC_IRQChannelPreemptionPriority = 10; //priorytet 10 , wyżej niż USB (tam jest 11 i 12) + NVIC_Conf.NVIC_IRQChannelSubPriority = 0; + NVIC_Conf.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_Conf); + + + + // Inicjalizuj zmienne + Caliper_State=0; + Caliper_ISR_State=0; + Caliper_AbsValue=0; + Caliper_RelValue=0; + Caliper_Timestamp=0; +} + +uint32_t Caliper_GetAbsVal (void) +{ + return Caliper_AbsValue; +} + +uint32_t Caliper_GetRelVal (void) +{ + return Caliper_RelValue; +} + +uint8_t Caliper_GetState (void) +{ + //jezeli suwmiarka nie nadawaÅ‚a przez 500ms - jest odÅ‚Ä…czona + if(Tick-Caliper_Timestamp>CALIPER_MEAS_TIMEOUT) + Caliper_State &= !CALIPER_CONNECTED; + //zwróć stan suwmiarki + return Caliper_State; +} + +int8_t Caliper_ISRWait(uint32_t Pin,uint8_t Value) +{ + uint32_t tmp,timestamp; + + timestamp=Tick; + + while(1) + { + tmp=PIO_Read(GPIOA)&Pin; + + if(tmp && Value) + return NO_ERROR; + + if ( !tmp && !Value) + return NO_ERROR; + + if(Tick-timestamp>CALIPER_ISR_TIMEOUT) + return TIMEOUT; + } + +} + +void EXTI9_5_IRQHandler(void) +{ + uint8_t BitCntr,Caliper_ISRState,i; + int32_t Caliper_AbsValueTmp,Caliper_RelValueTmp; + Caliper_ISRState=CALIPER_START; + Caliper_AbsValueTmp=0; + Caliper_RelValueTmp=0; + + while(1) + { + switch(Caliper_ISRState) + { + + //bit startu + case CALIPER_START: + //czekaj na narastajÄ…ce zbocze CLK + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + + //przejdź do odczytu bezwzglÄ™dnego poÅ‚ożenia swumiarki + BitCntr=0; + Caliper_ISRState=CALIPER_ABS_DATA; + break; + + //bezwzglÄ™dne poÅ‚ożenie swumiarki + case CALIPER_ABS_DATA: + //czekaj na narastajÄ…ce zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + //zapisz kolejny bit + for(i=0;i<5;i++); + if(PIO_Read(GPIOA)&DATA) + Caliper_AbsValueTmp |= (1<=23) + Caliper_ISRState=CALIPER_MIDDLE; + break; + + //bit Å›rodkowy + case CALIPER_MIDDLE: + //czekaj na narastajÄ…ce zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + //przejdź do odczytu wzglÄ™dnego poÅ‚ożenia swumiarki + BitCntr=0; + Caliper_ISRState=CALIPER_REL_DATA; + break; + + case CALIPER_REL_DATA: + //czekaj na narastajÄ…ce zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + //zapisz kolejny bit + for(i=0;i<5;i++); + if(PIO_Read(GPIOA)&DATA) + Caliper_RelValueTmp |= (1<=23) + Caliper_ISRState=CALIPER_END; + break; + + case CALIPER_END: + //czekaj na opadajÄ…ce zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + + //dane odebrane + //konwertuj na liczby ze znakiem (uzupeÅ‚nij najstarsze bity znakiem) i zapisz + Caliper_AbsValue=(Caliper_AbsValueTmp<<9)>>9; + Caliper_RelValue=(Caliper_RelValueTmp<<9)>>9; + //oznacz żę suwmiarka jets podÅ‚Ä…czona, zapisz moment odebrania danych + Caliper_Timestamp=Tick; + Caliper_State |= CALIPER_CONNECTED; + //wyczyść flagÄ™ przerwania i koÅ„cz + EXTI_ClearITPendingBit(CLK); + return; + + case CALIPER_TIMEOUT: + //wyczyść flagÄ™ przerwania i koÅ„cz + EXTI_ClearITPendingBit(CLK); + return; + + default: + break; + + } + } + +} diff --git a/Soft/Suwmiarka_CrossWorks/caliper.c.bak b/Soft/Suwmiarka_CrossWorks/caliper.c.bak new file mode 100644 index 0000000..62f3f34 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/caliper.c.bak @@ -0,0 +1,231 @@ + +#include "caliper.h" +#include "systick.h" +#include "hardware.h" +#include "stm32f10x.h" +#include +//------------------------zmienne prywatne-------------------------// +uint32_t Caliper_Timestamp; +int32_t Caliper_AbsValue,Caliper_RelValue; +uint8_t Caliper_State,Caliper_ISR_State; +EXTI_TypeDef *EXTI_Regs=(EXTI_TypeDef*)EXTI_BASE; +//------------------------zmienne zewnÄ™trzne-------------------------// +extern __IO uint32_t Tick; + +//-----------------------------Funkcje------------------------------// +void Caliper_Initialize(void) +{ + + GPIO_InitTypeDef GPIO_Conf; + EXTI_InitTypeDef EXTI_Conf; + NVIC_InitTypeDef NVIC_Conf; + + //wÅ‚Ä…cz zegar GPIOA,EXTI + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); + + //CLK,DATA - wejÅ›cie + GPIO_Conf.GPIO_Pin=CLK|DATA; + GPIO_Conf.GPIO_Mode=GPIO_Mode_IN_FLOATING; + GPIO_Conf.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOA,&GPIO_Conf); + + + //przerwanie na narastajÄ…cym zboczu CLK + GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,5); + EXTI_ClearITPendingBit(CLK); + EXTI_Conf.EXTI_Line = CLK; + EXTI_Conf.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_Conf.EXTI_Trigger = EXTI_Trigger_Falling; + EXTI_Conf.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_Conf); + NVIC_Conf.NVIC_IRQChannel = EXTI9_5_IRQn; + NVIC_Conf.NVIC_IRQChannelPreemptionPriority = 10; //priorytet 10 , wyżej niż USB (tam jest 11 i 12) + NVIC_Conf.NVIC_IRQChannelSubPriority = 0; + NVIC_Conf.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_Conf); + + + + // Inicjalizuj zmienne + Caliper_State=0; + Caliper_ISR_State=0; + Caliper_AbsValue=0; + Caliper_RelValue=0; + Caliper_Timestamp=0; +} + +uint32_t Caliper_GetAbsVal (void) +{ + return Caliper_AbsValue; +} + +uint32_t Caliper_GetRelVal (void) +{ + return Caliper_RelValue; +} + +uint8_t Caliper_GetState (void) +{ + //jezeli suwmiarka nie nadawaÅ‚a przez 500ms - jest odÅ‚Ä…czona + if(Tick-Caliper_Timestamp>CALIPER_MEAS_TIMEOUT) + Caliper_State &= !CALIPER_CONNECTED; + //zwróć stan suwmiarki + return Caliper_State; +} + +int8_t Caliper_ISRWait(uint32_t Pin,uint8_t Value) +{ + uint32_t tmp,timestamp; + + timestamp=Tick; + + while(1) + { + tmp=PIO_Read(GPIOA)&Pin; + + if(tmp && Value) + return NO_ERROR; + + if ( !tmp && !Value) + return NO_ERROR; + + if(Tick-timestamp>CALIPER_ISR_TIMEOUT) + return TIMEOUT; + } + +} + +void EXTI9_5_IRQHandler(void) +{ + uint8_t BitCntr,Caliper_ISRState,i; + int32_t Caliper_AbsValueTmp,Caliper_RelValueTmp; + GPIO_SetBits(GPIOA,LED2); + Caliper_ISRState=CALIPER_START; + Caliper_AbsValueTmp=0; + Caliper_RelValueTmp=0; + + while(1) + { + switch(Caliper_ISRState) + { + + //bit startu + case CALIPER_START: + //czekaj na narastajÄ…ce zbocze CLK + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + + GPIO_ResetBits(GPIOA,LED2); + //przejdź do odczytu bezwzglÄ™dnego poÅ‚ożenia swumiarki + BitCntr=0; + Caliper_ISRState=CALIPER_ABS_DATA; + break; + + //bezwzglÄ™dne poÅ‚ożenie swumiarki + case CALIPER_ABS_DATA: + //czekaj na narastajÄ…ce zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + //zapisz kolejny bit + for(i=0;i<5;i++); + GPIO_SetBits(GPIOA,LED2); + if(PIO_Read(GPIOA)&DATA) + Caliper_AbsValueTmp |= (1<=23) + Caliper_ISRState=CALIPER_MIDDLE; + break; + + //bit Å›rodkowy + case CALIPER_MIDDLE: + //czekaj na narastajÄ…ce zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + //przejdź do odczytu wzglÄ™dnego poÅ‚ożenia swumiarki + BitCntr=0; + Caliper_ISRState=CALIPER_REL_DATA; + break; + + case CALIPER_REL_DATA: + //czekaj na narastajÄ…ce zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + //zapisz kolejny bit + for(i=0;i<5;i++); + GPIO_SetBits(GPIOA,LED2); + if(PIO_Read(GPIOA)&DATA) + Caliper_RelValueTmp |= (1<=23) + Caliper_ISRState=CALIPER_END; + break; + + case CALIPER_END: + //czekaj na opadajÄ…ce zbocze CLK + if(Caliper_ISRWait(CLK,0)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + if(Caliper_ISRWait(CLK,1)==TIMEOUT) + { + Caliper_ISRState=CALIPER_TIMEOUT; + break; + } + + //dane odebrane + //konwertuj na liczby ze znakiem (uzupeÅ‚nij najstarsze bity znakiem) i zapisz + Caliper_AbsValue=(Caliper_AbsValueTmp<<9)>>9; + Caliper_RelValue=(Caliper_RelValueTmp<<9)>>9; + //oznacz żę suwmiarka jets podÅ‚Ä…czona, zapisz moment odebrania danych + Caliper_Timestamp=Tick; + Caliper_State |= CALIPER_CONNECTED; + //wyczyść flagÄ™ przerwania i koÅ„cz + EXTI_ClearITPendingBit(CLK); + return; + + case CALIPER_TIMEOUT: + //wyczyść flagÄ™ przerwania i koÅ„cz + EXTI_ClearITPendingBit(CLK); + return; + + default: + break; + + } + } + +} diff --git a/Soft/Suwmiarka_CrossWorks/caliper.h b/Soft/Suwmiarka_CrossWorks/caliper.h new file mode 100644 index 0000000..d41b201 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/caliper.h @@ -0,0 +1,37 @@ +/* nazwa pliku: suwmiarka.h + opis: Odczyt z suwmiarki - nagłówek +*/ + +#ifndef __SUWMIARKA_H +#define __SUWMIARKA_H + +#include + +//-----------------------------StaÅ‚e------------------------------// +//kody klawiszy +#define CALIPER_ISR_TIMEOUT 2 //2ms na wykonanie przerwania od suwmiarki +#define CALIPER_MEAS_TIMEOUT 500 //jezeli suwmiarka nie nadaje przez 500ms - jest odÅ‚Ä…czona + +//bity w Caliper_State +#define CALIPER_CONNECTED 0x01 + +//zwracane wartoĵści Caliper_ISRWait() +#define NO_ERROR 0 +#define TIMEOUT -1 + +//Caliper_ISRState - wartoÅ›ci +#define CALIPER_START 0 +#define CALIPER_ABS_DATA 1 +#define CALIPER_MIDDLE 2 +#define CALIPER_REL_DATA 3 +#define CALIPER_END 4 +#define CALIPER_TIMEOUT 5 + +//-----------------------------Funkcje------------------------------// +void Caliper_Initialize (void); +uint32_t Caliper_GetAbsVal (void); +uint32_t Caliper_GetRelVal (void); +uint8_t Caliper_GetState (void); + +#endif + diff --git a/Soft/Suwmiarka_CrossWorks/hardware.h b/Soft/Suwmiarka_CrossWorks/hardware.h new file mode 100644 index 0000000..391afaa --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/hardware.h @@ -0,0 +1,51 @@ +#ifndef __HARDWARE_H +#define __HARDWARE_H + +#include "stm32f10x.h" +#include + +//-----staÅ‚e--------// +//definicje linii - dopasuj do konkretnego projektu + //PORT A + #define KEY1 (1<<0) + #define KEY2 (1<<1) + #define LED1 (1<<2) + #define LED2 (1<<4) + #define CLK (1<<5) + #define DATA (1<<7) + + + //PORT B + + + //PORT C + +//używane peryferia - dopasuj do konkretnego projektu + //ADC +// #define USE_ADC + //I2C +// #define USE_I2C1 +// #define USE_I2C2 + //KEY + #define USE_KEY + //PWM +// #define USE_PWM + //RTG +// #define USE_RTG + //SPI +// #define USE_SPI1 +// #define USE_SPI2 + //USART +// #define USE_USART1 +// #define USE_USART2 +// #define USE_USART3 +// #define USE_UART4 +// #define USE_UART5 + +//-------makra-----------------// + +#define PIO_Set(port,pins) ((port)->BSRR=(pins)) +#define PIO_Reset(port,pins) ((port)->BRR=(pins)) +#define PIO_Read(port) ((port)->IDR) + +#endif diff --git a/Soft/Suwmiarka_CrossWorks/hardware.h~ b/Soft/Suwmiarka_CrossWorks/hardware.h~ new file mode 100644 index 0000000..b536019 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/hardware.h~ @@ -0,0 +1,46 @@ +#ifndef __PIO_H +#define __PIO_H + +#include "stm32f10x.h" +#include + +//-----sta³e--------// +//definicje linii - dopasuj do konkretnego projektu + //PORT A + #define TX2 (1<<2) + #define RX2 (1<<3) + #define CS1 (1<<4) + #define SCK1 (1<<5) + #define MISO1 (1<<6) + #define MOSI1 (1<<7) + #define TX1 (1<<9) + #define RX1 (1<<10) + #define RW1 (1<<11) + + + //PORT B + #define LED1 (1<<1) + #define VFD_BUSY (1<<8) + #define RW3 (1<<9) + #define TX3 (1<<10) + #define RX3 (1<<11) + #define CS2 (1<<12) + #define SCK2 (1<<13) + #define MISO2 (1<<14) + #define MOSI2 (1<<15) + + //PORT C + #define PWM1 (1<<6) + #define PWM2 (1<<7) + #define PWM3 (1<<8) + #define PWM4 (1<<9) +//-------makra-----------------// + +#define PIO_Set(port,pins) ((port)->BSRR=(pins)) +#define PIO_Reset(port,pins) ((port)->BRR=(pins)) +#define PIO_Read(port) ((port)->IDR) + +//----funkcje---// +void PIO_Initialize(void); + +#endif \ No newline at end of file diff --git a/Soft/Suwmiarka_CrossWorks/hw_config.c b/Soft/Suwmiarka_CrossWorks/hw_config.c new file mode 100644 index 0000000..35d210d --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/hw_config.c @@ -0,0 +1,268 @@ +/** + ****************************************************************************** + * @file hw_config.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Hardware Configuration & Setup + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "hw_config.h" +#include "usb_lib.h" +#include "usb_desc.h" +#include "usb_pwr.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +ErrorStatus HSEStartUpStatus; +uint32_t ADC_ConvertedValueX = 0; +uint32_t ADC_ConvertedValueX_1 = 0; +__IO uint16_t ADC1ConvertedValue = 0, ADC1ConvertedVoltage = 0, calibration_value = 0; + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len); +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : Set_System +* Description : Configures Main system clocks & power. +* Input : None. +* Return : None. +*******************************************************************************/ +void Set_System(void) +{ + /* Additional EXTI configuration (configure both edges) */ + EXTI_Configuration(); + +} + +/******************************************************************************* +* Function Name : Set_USBClock +* Description : Configures USB Clock input (48MHz). +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Set_USBClock(void) +{ +#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS) + /* Enable USB clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); + +#else + /* Select USBCLK source */ + RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); + + /* Enable the USB clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); +#endif /* STM32L1XX_MD */ +} + +/******************************************************************************* +* Function Name : Enter_LowPowerMode. +* Description : Power-off system clocks and power while entering suspend mode. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Enter_LowPowerMode(void) +{ + /* Set the device state to suspend */ + bDeviceState = SUSPENDED; +} + +/******************************************************************************* +* Function Name : Leave_LowPowerMode. +* Description : Restores system clocks and power while exiting suspend mode. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Leave_LowPowerMode(void) +{ + DEVICE_INFO *pInfo = &Device_Info; + + /* Set the device state to the correct state */ + if (pInfo->Current_Configuration != 0) + { + /* Device configured */ + bDeviceState = CONFIGURED; + } + else + { + bDeviceState = ATTACHED; + } + /*Enable SystemCoreClock*/ + SystemInit(); +#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS) + /* Enable The HSI (16Mhz) */ + RCC_HSICmd(ENABLE); +#endif +#if defined(STM32F30X) + ADC30x_Configuration(); +#endif +} + +/******************************************************************************* +* Function Name : USB_Interrupts_Config. +* Description : Configures the USB interrupts. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void USB_Interrupts_Config(void) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + /* 2 bit for pre-emption priority, 2 bits for subpriority */ + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); + + /* Enable the USB interrupt */ + NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 12; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + /* Enable the USB Wake-up interrupt */ + NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 11; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + + + +} + +/******************************************************************************* +* Function Name : USB_Cable_Config. +* Description : Software Connection/Disconnection of USB Cable. +* Input : NewState: new state. +* Output : None. +* Return : None +*******************************************************************************/ +void USB_Cable_Config (FunctionalState NewState) +{ +#if defined(STM32L1XX_MD) || defined (STM32L1XX_HD)|| (STM32L1XX_MD_PLUS) + if (NewState != DISABLE) + { + STM32L15_USB_CONNECT; + } + else + { + STM32L15_USB_DISCONNECT; + } + +#else /* USE_STM3210B_EVAL or USE_STM3210E_EVAL */ + if (NewState != DISABLE) + { + GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN); + } + else + { + GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN); + } +#endif /* STM32L1XX_MD */ +} + + +/******************************************************************************* +* Function Name : EXTI_Configuration. +* Description : Configure the EXTI lines for Key and Tamper push buttons. +* Input : None. +* Output : None. +* Return value : The direction value. +*******************************************************************************/ +void EXTI_Configuration(void) +{ + EXTI_InitTypeDef EXTI_InitStructure; + + + /* Configure the EXTI line 18 connected internally to the USB IP */ + EXTI_ClearITPendingBit(EXTI_Line18); + EXTI_InitStructure.EXTI_Line = EXTI_Line18; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); +} + +/******************************************************************************* +* Function Name : Get_SerialNum. +* Description : Create the serial number string descriptor. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Get_SerialNum(void) +{ + uint32_t Device_Serial0, Device_Serial1, Device_Serial2; + + Device_Serial0 = *(uint32_t*)ID1; + Device_Serial1 = *(uint32_t*)ID2; + Device_Serial2 = *(uint32_t*)ID3; + + Device_Serial0 += Device_Serial2; + + if (Device_Serial0 != 0) + { + IntToUnicode (Device_Serial0, &CustomHID_StringSerial[2] , 8); + IntToUnicode (Device_Serial1, &CustomHID_StringSerial[18], 4); + } +} + +/******************************************************************************* +* Function Name : HexToChar. +* Description : Convert Hex 32Bits value into char. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len) +{ + uint8_t idx = 0; + + for( idx = 0 ; idx < len ; idx ++) + { + if( ((value >> 28)) < 0xA ) + { + pbuf[ 2* idx] = (value >> 28) + '0'; + } + else + { + pbuf[2* idx] = (value >> 28) + 'A' - 10; + } + + value = value << 4; + + pbuf[ 2* idx + 1] = 0; + } +} + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/hw_config.c.bak b/Soft/Suwmiarka_CrossWorks/hw_config.c.bak new file mode 100644 index 0000000..fd2aa89 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/hw_config.c.bak @@ -0,0 +1,268 @@ +/** + ****************************************************************************** + * @file hw_config.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Hardware Configuration & Setup + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "hw_config.h" +#include "usb_lib.h" +#include "usb_desc.h" +#include "usb_pwr.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +ErrorStatus HSEStartUpStatus; +uint32_t ADC_ConvertedValueX = 0; +uint32_t ADC_ConvertedValueX_1 = 0; +__IO uint16_t ADC1ConvertedValue = 0, ADC1ConvertedVoltage = 0, calibration_value = 0; + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len); +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : Set_System +* Description : Configures Main system clocks & power. +* Input : None. +* Return : None. +*******************************************************************************/ +void Set_System(void) +{ + /* Additional EXTI configuration (configure both edges) */ + EXTI_Configuration(); + +} + +/******************************************************************************* +* Function Name : Set_USBClock +* Description : Configures USB Clock input (48MHz). +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Set_USBClock(void) +{ +#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS) + /* Enable USB clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); + +#else + /* Select USBCLK source */ + RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); + + /* Enable the USB clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); +#endif /* STM32L1XX_MD */ +} + +/******************************************************************************* +* Function Name : Enter_LowPowerMode. +* Description : Power-off system clocks and power while entering suspend mode. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Enter_LowPowerMode(void) +{ + /* Set the device state to suspend */ + bDeviceState = SUSPENDED; +} + +/******************************************************************************* +* Function Name : Leave_LowPowerMode. +* Description : Restores system clocks and power while exiting suspend mode. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Leave_LowPowerMode(void) +{ + DEVICE_INFO *pInfo = &Device_Info; + + /* Set the device state to the correct state */ + if (pInfo->Current_Configuration != 0) + { + /* Device configured */ + bDeviceState = CONFIGURED; + } + else + { + bDeviceState = ATTACHED; + } + /*Enable SystemCoreClock*/ + SystemInit(); +#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS) + /* Enable The HSI (16Mhz) */ + RCC_HSICmd(ENABLE); +#endif +#if defined(STM32F30X) + ADC30x_Configuration(); +#endif +} + +/******************************************************************************* +* Function Name : USB_Interrupts_Config. +* Description : Configures the USB interrupts. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void USB_Interrupts_Config(void) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + /* 2 bit for pre-emption priority, 2 bits for subpriority */ + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); + + /* Enable the USB interrupt */ + NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + /* Enable the USB Wake-up interrupt */ + NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + + + +} + +/******************************************************************************* +* Function Name : USB_Cable_Config. +* Description : Software Connection/Disconnection of USB Cable. +* Input : NewState: new state. +* Output : None. +* Return : None +*******************************************************************************/ +void USB_Cable_Config (FunctionalState NewState) +{ +#if defined(STM32L1XX_MD) || defined (STM32L1XX_HD)|| (STM32L1XX_MD_PLUS) + if (NewState != DISABLE) + { + STM32L15_USB_CONNECT; + } + else + { + STM32L15_USB_DISCONNECT; + } + +#else /* USE_STM3210B_EVAL or USE_STM3210E_EVAL */ + if (NewState != DISABLE) + { + GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN); + } + else + { + GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN); + } +#endif /* STM32L1XX_MD */ +} + + +/******************************************************************************* +* Function Name : EXTI_Configuration. +* Description : Configure the EXTI lines for Key and Tamper push buttons. +* Input : None. +* Output : None. +* Return value : The direction value. +*******************************************************************************/ +void EXTI_Configuration(void) +{ + EXTI_InitTypeDef EXTI_InitStructure; + + + /* Configure the EXTI line 18 connected internally to the USB IP */ + EXTI_ClearITPendingBit(EXTI_Line18); + EXTI_InitStructure.EXTI_Line = EXTI_Line18; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); +} + +/******************************************************************************* +* Function Name : Get_SerialNum. +* Description : Create the serial number string descriptor. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Get_SerialNum(void) +{ + uint32_t Device_Serial0, Device_Serial1, Device_Serial2; + + Device_Serial0 = *(uint32_t*)ID1; + Device_Serial1 = *(uint32_t*)ID2; + Device_Serial2 = *(uint32_t*)ID3; + + Device_Serial0 += Device_Serial2; + + if (Device_Serial0 != 0) + { + IntToUnicode (Device_Serial0, &CustomHID_StringSerial[2] , 8); + IntToUnicode (Device_Serial1, &CustomHID_StringSerial[18], 4); + } +} + +/******************************************************************************* +* Function Name : HexToChar. +* Description : Convert Hex 32Bits value into char. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len) +{ + uint8_t idx = 0; + + for( idx = 0 ; idx < len ; idx ++) + { + if( ((value >> 28)) < 0xA ) + { + pbuf[ 2* idx] = (value >> 28) + '0'; + } + else + { + pbuf[2* idx] = (value >> 28) + 'A' - 10; + } + + value = value << 4; + + pbuf[ 2* idx + 1] = 0; + } +} + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/hw_config.h b/Soft/Suwmiarka_CrossWorks/hw_config.h new file mode 100644 index 0000000..6aa9ccd --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/hw_config.h @@ -0,0 +1,58 @@ +/** + ****************************************************************************** + * @file hw_config.h + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Hardware Configuration & Setup + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 __HW_CONFIG_H +#define __HW_CONFIG_H + +/* Includes ------------------------------------------------------------------*/ +#include "platform_config.h" +#include "usb_type.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported define -----------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void Set_System(void); +void Set_USBClock(void); +void Enter_LowPowerMode(void); +void Leave_LowPowerMode(void); +void USB_Interrupts_Config(void); +void USB_Cable_Config (FunctionalState NewState); +void GPIO_Configuration(void); +void EXTI_Configuration(void); +void ADC_Configuration(void); +void ADC30x_Configuration(void); +void Get_SerialNum(void); +void TimingDelay_Decrement(void); +void Delay(__IO uint32_t nCount); + +#endif /*__HW_CONFIG_H*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/key.c b/Soft/Suwmiarka_CrossWorks/key.c new file mode 100644 index 0000000..855bd41 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/key.c @@ -0,0 +1,127 @@ +/* nazwa pliku: key.c + opis: Odczyt klawiszy +*/ + +#include "key.h" +#include "systick.h" +#include "hardware.h" +#include "stm32f10x.h" +#include + +//------------------------zmienne prywatne-------------------------// +uint8_t key,new_key; +//------------------------zmienne zewnętrzne-------------------------// +extern __IO uint32_t Tick; + +//-----------------------------Funkcje------------------------------// + +/* KEY_init + * \opis Konfiguracja początkowa klawiatury + */ +void Key_Initialize (void) +{ + GPIO_InitTypeDef GPIO_Conf; +#ifdef USE_KEY + //włącz zegar GPIOB,EXTI + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); + + //klawisze - wejście + GPIO_Conf.GPIO_Pin=KEY1|KEY2; + GPIO_Conf.GPIO_Mode=GPIO_Mode_IPU; + GPIO_Conf.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOA,&GPIO_Conf); + + //brak naciśniętych klawiszy + new_key=0; + key=0; +#else + return; +#endif +} + +/* KEY_Poll + * \opis funkcja sprawdza stan klawiszy + */ + +uint8_t Key_Poll (void) +{ + static uint8_t key_code_tmp,key_code_old; + static uint32_t timestamp; + +#ifdef USE_KEY + //sprawdzaj stan klawiatury dopiero po obsłużeniu poprzedniego klawisza + if(!new_key) + { + //1-skanuj klawiaturę + key_code_tmp=0; + if( !(PIO_Read(GPIOA)&KEY1) ) + key_code_tmp=1; + if( !(PIO_Read(GPIOA)&KEY2) ) + key_code_tmp=2; + + //2 - debounce + if(key_code_tmp != key_code_old) + { + timestamp=Tick; + } + + //zapisz ostatni kod klawisza + key_code_old=key_code_tmp; + + //klawisz "siedzi", i kod klawisza różni się od ostatniego + if( (Tick - timestamp >= DEBOUNCE_DELAY) && (key!=key_code_tmp) ) + { + //zapisz kod klawisza + key=key_code_tmp; + //użytkownik dostaje event tylko przy wciśnięciu klawisza, nie przy puszczeniu + if(key) + new_key=1; + } + + } + + + //zwróć kod klawisza + if(new_key) + { + new_key=0; + return key; + } + else + return 0; + +#else + return; +#endif +} + +/* KEY_get + * \opis Funkcja zwraca użytkownikowi kod naciśniętego klawisza, lub 0 gdy żaden nie został naciśnięty + \return - kod klawisza lub 0 + */ + +uint8_t Key_Get (void) +{ + if(new_key) + { + return key; + } + else + return 0; +} + +/* KEY_clear_event + * \opis Informacja zwrotna od użytkownika - kod klawisza został obsłużony + */ + +void Key_ClearEvent (void) +{ + new_key=0; +} + + + + + + + diff --git a/Soft/Suwmiarka_CrossWorks/key.h b/Soft/Suwmiarka_CrossWorks/key.h new file mode 100644 index 0000000..994fa5b --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/key.h @@ -0,0 +1,25 @@ +/* nazwa pliku: key.h + opis: Odczyt klawiszy - nagłówek +*/ + +#ifndef __KEY_H +#define __KEY_H + +#include + +//-----------------------------Stałe------------------------------// +//kody klawiszy +#define KEY_IDLE 0 +#define KEY_MEAS 1 +#define KEY_2 2 + +#define DEBOUNCE_DELAY 50 //50ms + + +//-----------------------------Funkcje------------------------------// +void Key_Initialize (void); +uint8_t Key_Poll (void); +uint8_t Key_Get (void); +void Key_ClearEvent (void); + +#endif diff --git a/Soft/Suwmiarka_CrossWorks/main.c b/Soft/Suwmiarka_CrossWorks/main.c new file mode 100644 index 0000000..b9abc9b --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/main.c @@ -0,0 +1,292 @@ +/** + ****************************************************************************** + * @file main.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Custom HID demo main file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "hw_config.h" +#include "usb_lib.h" +#include "usb_pwr.h" +#include "hardware.h" +#include "key.h" +#include "caliper.h" +#include "systick.h" +#include +#include +#include + +/* Private typedef -----------------------------------------------------------*/ +typedef struct +{ + uint8_t modifier; + uint8_t reserved; + uint8_t keycode[6]; +} keyboard_report_t; + +typedef struct +{ + uint8_t len; + uint32_t total; + uint8_t data[32]; +}debug_struct_t; +/* Private define ------------------------------------------------------------*/ +#define PA3 (1<<3) +#define PA4 (1<<4) +#define BUF_LEN 32 +/*przeliczenie wyniku z suwmiarki na mm +Jednostka danych to 1/1224.1 mm (wyznaczona doświadczalnie) +przeliczam na mm, z dokładnością do 0,01m: + +*/ +#define OFFSET 0 +#define SCALE_MUL 1000 +#define SCALE_DIV 16126 +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + keyboard_report_t KeyRep; //raport USB HID + uint8_t measure[BUF_LEN],ByteCntr; //dane z suwmiarki + debug_struct_t DebugStruct[128]; +/* Extern variables ----------------------------------------------------------*/ +__IO uint8_t PrevXferComplete = 1; +__IO uint32_t Tick; +extern __IO uint32_t bDeviceState; + +/* Private function prototypes ----11-------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ + +void Wait(uint32_t period) +{ + uint32_t k; + + k=Tick+period; + while(Tick<=k); +} + +/******************************************************************************* +* Function Name : USB_AaciiToHid. +* Description : Konwertuje kod klawisza ASCII na HID. +*******************************************************************************/ + +uint8_t USB_AsciiToHid(uint8_t key) +{ + + if (key >= 'A' && key <= 'Z') + { + return 4 + key - 'A'; + } + else if (key >= 'a' && key <= 'z') + { + return 4 + key - 'a'; + } + else if (key >= '0' && key <= '9') + { + if (key == '0') + { + return 0x27; + } + else + { + return 30 + key - '1'; + } + } + else if (key==10) + return 40; + else if (key==32) + return 44; + else if (key=='=') + return 46; + else if (key=='-') + return 45; + else if (key=='.') + return 55; + + return 0; // return nothing if not alpha-numeric +} + +/******************************************************************************* +* Function Name : USB_Send. +* Description : Wysyła wynik pomiaru po USB. +*******************************************************************************/ + +void USB_SendText(uint8_t *text,uint8_t length) +{ + uint32_t i,j,k; + for(i=0;i>16)&0xff,(AbsValue>>8)&0xff,(AbsValue)&0xff,(RelValue>>16)&0xff,(RelValue>>8)&0xff,(RelValue)&0xff); + + sprintf(TextBuf,"%.2f\n",ValueInMM); + k=strlen(TextBuf); + USB_SendText(TextBuf,k); + } + break; + + case KEY_2: + //brak funkcji, póki co + break; + + default: + break; + } + } + + //Stan diody USB + if (bDeviceState == CONFIGURED) + GPIO_SetBits(GPIOA,LED1); + else + GPIO_ResetBits(GPIOA,LED1); + + //czekaj do następnego taktu zegara + Wait(5); + } +} + +#ifdef USE_FULL_ASSERT +/******************************************************************************* +* Function Name : assert_failed +* Description : Reports the name of the source file and the source line number +* where the assert_param error has occurred. +* Input : - file: pointer to the source file name +* - line: assert_param error line source number +* Output : None +* Return : None +*******************************************************************************/ +void assert_failed(uint8_t* file, uint32_t line) +{ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + + /* Infinite loop */ + while(1) + { + } +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/main.c.bak b/Soft/Suwmiarka_CrossWorks/main.c.bak new file mode 100644 index 0000000..b9abc9b --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/main.c.bak @@ -0,0 +1,292 @@ +/** + ****************************************************************************** + * @file main.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Custom HID demo main file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "hw_config.h" +#include "usb_lib.h" +#include "usb_pwr.h" +#include "hardware.h" +#include "key.h" +#include "caliper.h" +#include "systick.h" +#include +#include +#include + +/* Private typedef -----------------------------------------------------------*/ +typedef struct +{ + uint8_t modifier; + uint8_t reserved; + uint8_t keycode[6]; +} keyboard_report_t; + +typedef struct +{ + uint8_t len; + uint32_t total; + uint8_t data[32]; +}debug_struct_t; +/* Private define ------------------------------------------------------------*/ +#define PA3 (1<<3) +#define PA4 (1<<4) +#define BUF_LEN 32 +/*przeliczenie wyniku z suwmiarki na mm +Jednostka danych to 1/1224.1 mm (wyznaczona doświadczalnie) +przeliczam na mm, z dokładnością do 0,01m: + +*/ +#define OFFSET 0 +#define SCALE_MUL 1000 +#define SCALE_DIV 16126 +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + keyboard_report_t KeyRep; //raport USB HID + uint8_t measure[BUF_LEN],ByteCntr; //dane z suwmiarki + debug_struct_t DebugStruct[128]; +/* Extern variables ----------------------------------------------------------*/ +__IO uint8_t PrevXferComplete = 1; +__IO uint32_t Tick; +extern __IO uint32_t bDeviceState; + +/* Private function prototypes ----11-------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ + +void Wait(uint32_t period) +{ + uint32_t k; + + k=Tick+period; + while(Tick<=k); +} + +/******************************************************************************* +* Function Name : USB_AaciiToHid. +* Description : Konwertuje kod klawisza ASCII na HID. +*******************************************************************************/ + +uint8_t USB_AsciiToHid(uint8_t key) +{ + + if (key >= 'A' && key <= 'Z') + { + return 4 + key - 'A'; + } + else if (key >= 'a' && key <= 'z') + { + return 4 + key - 'a'; + } + else if (key >= '0' && key <= '9') + { + if (key == '0') + { + return 0x27; + } + else + { + return 30 + key - '1'; + } + } + else if (key==10) + return 40; + else if (key==32) + return 44; + else if (key=='=') + return 46; + else if (key=='-') + return 45; + else if (key=='.') + return 55; + + return 0; // return nothing if not alpha-numeric +} + +/******************************************************************************* +* Function Name : USB_Send. +* Description : Wysyła wynik pomiaru po USB. +*******************************************************************************/ + +void USB_SendText(uint8_t *text,uint8_t length) +{ + uint32_t i,j,k; + for(i=0;i>16)&0xff,(AbsValue>>8)&0xff,(AbsValue)&0xff,(RelValue>>16)&0xff,(RelValue>>8)&0xff,(RelValue)&0xff); + + sprintf(TextBuf,"%.2f\n",ValueInMM); + k=strlen(TextBuf); + USB_SendText(TextBuf,k); + } + break; + + case KEY_2: + //brak funkcji, póki co + break; + + default: + break; + } + } + + //Stan diody USB + if (bDeviceState == CONFIGURED) + GPIO_SetBits(GPIOA,LED1); + else + GPIO_ResetBits(GPIOA,LED1); + + //czekaj do następnego taktu zegara + Wait(5); + } +} + +#ifdef USE_FULL_ASSERT +/******************************************************************************* +* Function Name : assert_failed +* Description : Reports the name of the source file and the source line number +* where the assert_param error has occurred. +* Input : - file: pointer to the source file name +* - line: assert_param error line source number +* Output : None +* Return : None +*******************************************************************************/ +void assert_failed(uint8_t* file, uint32_t line) +{ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + + /* Infinite loop */ + while(1) + { + } +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/misc.c b/Soft/Suwmiarka_CrossWorks/misc.c new file mode 100644 index 0000000..6b72c99 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/misc.c @@ -0,0 +1,223 @@ +/** + ****************************************************************************** + * @file misc.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the miscellaneous firmware functions (add-on + * to CMSIS functions). + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "misc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup MISC + * @brief MISC driver modules + * @{ + */ + +/** @defgroup MISC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_Defines + * @{ + */ + +#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) +/** + * @} + */ + +/** @defgroup MISC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Private_Functions + * @{ + */ + +/** + * @brief Configures the priority grouping: pre-emption priority and subpriority. + * @param NVIC_PriorityGroup: specifies the priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority + * 4 bits for subpriority + * @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority + * 3 bits for subpriority + * @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority + * 2 bits for subpriority + * @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority + * 1 bits for subpriority + * @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority + * 0 bits for subpriority + * @retval None + */ +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup)); + + /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */ + SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup; +} + +/** + * @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, tmppre = 0x00, tmpsub = 0x0F; + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd)); + assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority)); + assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority)); + + if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) + { + /* Compute the Corresponding IRQ Priority --------------------------------*/ + tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08; + tmppre = (0x4 - tmppriority); + tmpsub = tmpsub >> tmppriority; + + tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre; + tmppriority |= NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub; + tmppriority = tmppriority << 0x04; + + NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority; + + /* Enable the Selected IRQ Channels --------------------------------------*/ + NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = + (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); + } + else + { + /* Disable the Selected IRQ Channels -------------------------------------*/ + NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = + (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); + } +} + +/** + * @brief Sets the vector table location and Offset. + * @param NVIC_VectTab: specifies if the vector table is in RAM or FLASH memory. + * This parameter can be one of the following values: + * @arg NVIC_VectTab_RAM + * @arg NVIC_VectTab_FLASH + * @param Offset: Vector Table base offset field. This value must be a multiple of 0x100. + * @retval None + */ +void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) +{ + /* Check the parameters */ + assert_param(IS_NVIC_VECTTAB(NVIC_VectTab)); + assert_param(IS_NVIC_OFFSET(Offset)); + + SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80); +} + +/** + * @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 + * @arg NVIC_LP_SLEEPDEEP + * @arg NVIC_LP_SLEEPONEXIT + * @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 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/misc.h b/Soft/Suwmiarka_CrossWorks/misc.h new file mode 100644 index 0000000..7a93d5a --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/misc.h @@ -0,0 +1,219 @@ +/** + ****************************************************************************** + * @file misc.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the miscellaneous + * firmware library functions (add-on to CMSIS functions). + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MISC_H +#define __MISC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup MISC + * @{ + */ + +/** @defgroup 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 stm32f10x.h file) */ + + uint8_t NVIC_IRQChannelPreemptionPriority; /*!< Specifies the pre-emption priority for the IRQ channel + specified in NVIC_IRQChannel. This parameter can be a value + between 0 and 15 as described in the table @ref NVIC_Priority_Table */ + + uint8_t NVIC_IRQChannelSubPriority; /*!< Specifies the subpriority level for the IRQ channel specified + in NVIC_IRQChannel. This parameter can be a value + between 0 and 15 as described in the table @ref NVIC_Priority_Table */ + + 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; + +/** + * @} + */ + +/** @defgroup NVIC_Priority_Table + * @{ + */ + +/** +@code + The table below gives the allowed values of the pre-emption priority and subpriority according + to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function + ============================================================================================================================ + NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description + ============================================================================================================================ + NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority + | | | 4 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority + | | | 3 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority + | | | 2 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority + | | | 1 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for pre-emption priority + | | | 0 bits for subpriority + ============================================================================================================================ +@endcode +*/ + +/** + * @} + */ + +/** @defgroup MISC_Exported_Constants + * @{ + */ + +/** @defgroup Vector_Table_Base + * @{ + */ + +#define NVIC_VectTab_RAM ((uint32_t)0x20000000) +#define NVIC_VectTab_FLASH ((uint32_t)0x08000000) +#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_RAM) || \ + ((VECTTAB) == NVIC_VectTab_FLASH)) +/** + * @} + */ + +/** @defgroup 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 Preemption_Priority_Group + * @{ + */ + +#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority + 4 bits for subpriority */ +#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority + 3 bits for subpriority */ +#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority + 2 bits for subpriority */ +#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority + 1 bits for subpriority */ +#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority + 0 bits for subpriority */ + +#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \ + ((GROUP) == NVIC_PriorityGroup_1) || \ + ((GROUP) == NVIC_PriorityGroup_2) || \ + ((GROUP) == NVIC_PriorityGroup_3) || \ + ((GROUP) == NVIC_PriorityGroup_4)) + +#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) + +#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) + +#define IS_NVIC_OFFSET(OFFSET) ((OFFSET) < 0x000FFFFF) + +/** + * @} + */ + +/** @defgroup 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)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup MISC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup MISC_Exported_Functions + * @{ + */ + +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); +void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); +void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset); +void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState); +void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource); + +#ifdef __cplusplus +} +#endif + +#endif /* __MISC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/pio.c~ b/Soft/Suwmiarka_CrossWorks/pio.c~ new file mode 100644 index 0000000..fc0f0b9 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/pio.c~ @@ -0,0 +1,23 @@ +#include "pio.h" +#include "stm32f10x.h" +#include + +//-------makra-----------------// + +//----funkcje---// + +/*! \brief Inicjalizacja wejœæ/wyjœæ + Funkcja ustawia opowiednie linie jako wejœcie b¹dz wyjœcie. + +*/ +void Output_Initialize(void) +{ + //funkcja do zdefiniowania w konkretnym projekcie + //tu skonfiguruj wszytkie w³asne linie wejœcia-wyjœcia +} + +void Output_Update(uint8_t Output_State) +{ + //Aktualizacja wyjœæ +} + diff --git a/Soft/Suwmiarka_CrossWorks/platform_config.h b/Soft/Suwmiarka_CrossWorks/platform_config.h new file mode 100644 index 0000000..e9fd7fa --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/platform_config.h @@ -0,0 +1,203 @@ +/** + ****************************************************************************** + * @file platform_config.h + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Evaluation board specific configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 __PLATFORM_CONFIG_H +#define __PLATFORM_CONFIG_H + +/* Includes ------------------------------------------------------------------*/ + +#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS) + #include "stm32l1xx.h" + #if defined (USE_STM32L152_EVAL) + #include "stm32l152_eval.h" + #elif defined (USE_STM32L152D_EVAL) + #include "stm32l152d_eval.h" + #else + #error "Missing define: USE_STM32L152_EVAL or USE_STM32L152D_EVAL" + #endif /* USE_STM32L152_EVAL */ +#elif defined (STM32F10X_MD) || defined (STM32F10X_HD) || defined (STM32F10X_XL) + #include "stm32f10x.h" +#elif defined (USE_STM32373C_EVAL) + #include "stm32f37x.h" + #include "stm32373c_eval.h" +#elif defined (USE_STM32303C_EVAL) + #include "stm32f30x.h" + #include "stm32303c_eval.h" +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Uncomment the line corresponding to the STMicroelectronics evaluation board + used to run the example */ +#if !defined (USE_STM3210B_EVAL) && !defined (USE_STM3210E_EVAL) && !defined (USE_STM32L152_EVAL) && !defined (USE_STM32L152D_EVAL)&& !defined (USE_STM32373C_EVAL) && !defined (USE_STM32303C_EVAL) + //#define USE_STM3210B_EVAL + //#define USE_STM3210E_EVAL + //#define USE_STM32L152_EVAL +//#define USE_STM32L152D_EVAL +//#define USE_STM32373C_EVAL + #define USE_STM32303C_EVAL +#endif + +/*Unique Devices IDs register set*/ + +#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD) || defined(STM32L1XX_MD_PLUS) + +#define ID1 (0x1FF80050) +#define ID2 (0x1FF80054) +#define ID3 (0x1FF80064) + +#elif defined (STM32F37X) || defined(STM32F30X) + +#define ID1 (0x1FFFF7AC) +#define ID2 (0x1FFFF7B0) +#define ID3 (0x1FFFF7B4) + +#else /*STM32F1x*/ + +#define ID1 (0x1FFFF7E8) +#define ID2 (0x1FFFF7EC) +#define ID3 (0x1FFFF7F0) + +#endif + +/* Define the STM32F10x hardware depending on the used evaluation board */ +#ifdef USE_STM3210B_EVAL + #define USB_DISCONNECT GPIOD + #define USB_DISCONNECT_PIN GPIO_Pin_9 + #define RCC_APB2Periph_GPIO_DISCONNECT RCC_APB2Periph_GPIOD + #define ADC1_DR_Address ((uint32_t)0x4001244C) + +#elif defined (USE_STM3210E_EVAL) + #define USB_DISCONNECT GPIOB + #define USB_DISCONNECT_PIN GPIO_Pin_14 + #define RCC_APB2Periph_GPIO_DISCONNECT RCC_APB2Periph_GPIOB + #define ADC1_DR_Address ((uint32_t)0x4001244C) + +#elif defined (USE_STM32L152_EVAL) || defined (USE_STM32L152D_EVAL) + /* + For STM32L15xx devices it is possible to use the internal USB pullup + controlled by register SYSCFG_PMC (refer to RM0038 reference manual for + more details). + It is also possible to use external pullup (and disable the internal pullup) + by setting the define USB_USE_EXTERNAL_PULLUP in file platform_config.h + and configuring the right pin to be used for the external pull up configuration. + To have more details on how to use an external pull up, please refer to + STM3210E-EVAL evaluation board manuals. + */ + /* Uncomment the following define to use an external pull up instead of the + integrated STM32L15xx internal pull up. In this case make sure to set up + correctly the external required hardware and the GPIO defines below.*/ +/* #define USB_USE_EXTERNAL_PULLUP */ + + #if !defined(USB_USE_EXTERNAL_PULLUP) + #define STM32L15_USB_CONNECT SYSCFG_USBPuCmd(ENABLE) + #define STM32L15_USB_DISCONNECT SYSCFG_USBPuCmd(DISABLE) + #define RCC_AHBPeriph_GPIO_DISCONNECT 0 + + #elif defined(USB_USE_EXTERNAL_PULLUP) + /* PA0 is chosen just as illustrating example, you should modify the defines + below according to your hardware configuration. */ + #define USB_DISCONNECT GPIOA + #define USB_DISCONNECT_PIN GPIO_Pin_0 + #define RCC_AHBPeriph_GPIO_DISCONNECT RCC_AHBPeriph_GPIOA + #define STM32L15_USB_CONNECT GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN) + #define STM32L15_USB_DISCONNECT GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN) + #endif /* USB_USE_EXTERNAL_PULLUP */ + + #define ADC1_DR_Address ((uint32_t)0x40012458) + +#endif /* USE_STM3210B_EVAL */ + +#if defined (USE_STM32373C_EVAL) + #define USB_DISCONNECT GPIOC + #define USB_DISCONNECT_PIN GPIO_Pin_5 + #define RCC_AHBPeriph_GPIO_DISCONNECT RCC_AHBPeriph_GPIOC +#endif +#if defined (USE_STM32303C_EVAL) + #define USB_DISCONNECT GPIOB + #define USB_DISCONNECT_PIN GPIO_Pin_8 + #define RCC_AHBPeriph_GPIO_DISCONNECT RCC_AHBPeriph_GPIOB + +#define RCC_AHBPeriph_ALLGPIO (RCC_AHBPeriph_GPIOA \ + | RCC_AHBPeriph_GPIOB \ + | RCC_AHBPeriph_GPIOC \ + | RCC_AHBPeriph_GPIOD \ + | RCC_AHBPeriph_GPIOE \ + | RCC_AHBPeriph_GPIOF ) +#endif + +#if defined (USE_STM32L152_EVAL) + + #define RCC_AHBPeriph_GPIO_IOAIN RCC_AHBPeriph_GPIOB + #define GPIO_IOAIN GPIOB + #define GPIO_IOAIN_PIN GPIO_Pin_12 /* PB.12 */ + #define ADC_AIN_CHANNEL ADC_Channel_18 + +#elif defined (USE_STM32L152D_EVAL) + + #define RCC_AHBPeriph_GPIO_IOAIN RCC_AHBPeriph_GPIOF + #define GPIO_IOAIN GPIOF + #define GPIO_IOAIN_PIN GPIO_Pin_10 /* PF.10 */ + #define ADC_AIN_CHANNEL ADC_Channel_31 + +#elif defined (USE_STM32373C_EVAL) + + #define ADC1_DR_Address 0x4001244C + + #define RCC_AHBPeriph_GPIO_IOAIN RCC_AHBPeriph_GPIOB + #define GPIO_IOAIN GPIOB + #define GPIO_IOAIN_PIN GPIO_Pin_1 /* PB.1 */ + #define ADC_AIN_CHANNEL ADC_Channel_9 + #define GPIO_Mode_AIN GPIO_Mode_AN + +#elif defined (USE_STM32303C_EVAL) + + #define ADC1_DR_Address 0x5000030C + + #define RCC_AHBPeriph_GPIO_IOAIN RCC_AHBPeriph_GPIOC + #define GPIO_IOAIN GPIOC + #define GPIO_IOAIN_PIN GPIO_Pin_1 /* PC.1 */ + #define ADC_AIN_CHANNEL ADC_Channel_7 + #define GPIO_Mode_AIN GPIO_Mode_AN + +#else + #define RCC_APB2Periph_GPIO_IOAIN RCC_APB2Periph_GPIOC + #define GPIO_IOAIN GPIOC + #define GPIO_IOAIN_PIN GPIO_Pin_4 /* PC.04 */ + #define ADC_AIN_CHANNEL ADC_Channel_14 + +#endif /* USE_STM32L152_EVAL */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +#endif /* __PLATFORM_CONFIG_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Soft/Suwmiarka_CrossWorks/spi.c b/Soft/Suwmiarka_CrossWorks/spi.c new file mode 100644 index 0000000..7177ca2 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/spi.c @@ -0,0 +1,143 @@ + +#include "spi.h" +#include "hardware.h" +#include "stm32f10x.h" + +#include + +//------------------------zmienne prywatne-------------------------/ +uint8_t InBuffer[SPI_BSIZE],*dptr; +uint8_t SPI_State,Counter; +uint32_t timestamp; +//------------------------zmienne zewnętrzne-------------------------// +extern __IO uint32_t Tick; +//-----------------------------Funkcje------------------------------// +int8_t SPI_Initialize(void) +{ + + GPIO_InitTypeDef GPIO_Conf; + SPI_InitTypeDef SPI_Conf; + DMA_InitTypeDef DMA_Conf; + + /* Zegar GPIOA,SPI1 */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE); + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); + //MOSI,SCK,CS - wyjście PER + GPIO_Conf.GPIO_Pin=MOSI1|SCK1; + GPIO_Conf.GPIO_Mode=GPIO_Mode_AF_PP; + GPIO_Conf.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOA,&GPIO_Conf); + + //MISO - wejście + GPIO_Conf.GPIO_Pin=MISO1; + GPIO_Conf.GPIO_Mode=GPIO_Mode_IN_FLOATING; + GPIO_Init(GPIOA,&GPIO_Conf); + + SPI_Cmd(SPI1, DISABLE); + //Konfuiguracja portu + SPI_Conf.SPI_Direction = SPI_Direction_2Lines_FullDuplex; + SPI_Conf.SPI_Mode = SPI_Mode_Slave; + SPI_Conf.SPI_DataSize = SPI_DataSize_8b; + SPI_Conf.SPI_CPOL = 1; //mode 01 + SPI_Conf.SPI_CPHA = 1; //mode 01 + SPI_Conf.SPI_NSS = SPI_NSS_Soft ; + SPI_Conf.SPI_FirstBit = SPI_FirstBit_MSB; + SPI_Conf.SPI_CRCPolynomial = 0; + SPI_Init(SPI1, &SPI_Conf); + + // sprzętowy CS wyłączony, programowo ustawiony stan niski + SPI_SSOutputCmd(SPI1,DISABLE); + SPI_NSSInternalSoftwareConfig(SPI1,SPI_NSSInternalSoft_Reset); + + //bez CRC + SPI_CalculateCRC(SPI1,DISABLE); + + //odbiór przez DMA - kanał 2 + DMA_Cmd(DMA1_Channel2, DISABLE); + DMA_DeInit(DMA1_Channel2); + DMA_Conf.DMA_DIR = DMA_DIR_PeripheralSRC; + DMA_Conf.DMA_M2M = DMA_M2M_Disable; + DMA_Conf.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_Conf.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_Conf.DMA_MemoryBaseAddr = (uint32_t)InBuffer; + DMA_Conf.DMA_BufferSize = SPI_BSIZE; + DMA_Conf.DMA_Mode=DMA_Mode_Circular; + DMA_Conf.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR); + DMA_Conf.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_Conf.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_Conf.DMA_Priority = DMA_Priority_VeryHigh; + DMA_Init(DMA1_Channel2,&DMA_Conf); + DMA_Cmd(DMA1_Channel2, ENABLE); + + //inicjalizuj wskaźniki + dptr=InBuffer; + + //włącz DMA + SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Rx,ENABLE); + + //Włącz SPI + SPI_Cmd(SPI1, ENABLE); +} + +int8_t SPI_GetState(void) +{ + return SPI_State; +} + +uint16_t SPI_Poll(uint8_t *measure,uint16_t length) +{ + uint16_t count,start,end,remaining,i; + + //oblicz ile jest danych w buforze + start = dptr-InBuffer; + end = SPI_BSIZE - (DMA1_Channel2->CNDTR); + if(end>=start) + remaining=end-start; + else + remaining=(SPI_BSIZE-(start-end)); + + //oblicz ile danych zwrócić + if(remaining1000) + { + SPI_State &= ~SPI_CONNECTED; + } + + return 0; + +} diff --git a/Soft/Suwmiarka_CrossWorks/spi.h b/Soft/Suwmiarka_CrossWorks/spi.h new file mode 100644 index 0000000..45d47bc --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/spi.h @@ -0,0 +1,22 @@ +#ifndef __SPI_H +#define __SPI_H + +#include + +//bufor SPI +#define SPI_BSIZE 128 +//długość pakietu z suwmiarki +#define SPI_FRAME_SIZE 3 +//bity w SPI_State +#define SPI_CONNECTED 0x01 +//wartości zwracane przez SPI_Poll() +#define SPI_NO_FRAME 0x00 +#define SPI_FRAME_READY 0x01 + + + +int8_t SPI_Initialize(void); +int8_t SPI_GetState(void); +uint16_t SPI_Poll(uint8_t *measure,uint16_t length); + +#endif diff --git a/Soft/Suwmiarka_CrossWorks/stm32_it.c b/Soft/Suwmiarka_CrossWorks/stm32_it.c new file mode 100644 index 0000000..6a8e986 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32_it.c @@ -0,0 +1,228 @@ +/** + ****************************************************************************** + * @file stm32_it.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Main Interrupt Service Routines. + * This file provides template for all exceptions handler and peripherals + * interrupt service routine. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "stm32_it.h" +#include "usb_istr.h" +#include "usb_lib.h" +#include "usb_pwr.h" +#include "hw_config.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +__IO uint8_t Send_Buffer[2]; +extern __IO uint8_t PrevXferComplete; +extern uint32_t ADC_ConvertedValueX; +extern uint32_t ADC_ConvertedValueX_1; +extern __IO uint32_t Tick; + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************/ +/* Cortex-M Processor Exceptions Handlers */ +/******************************************************************************/ + +/******************************************************************************* +* Function Name : NMI_Handler +* Description : This function handles NMI exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void NMI_Handler(void) +{ +} + +/******************************************************************************* +* Function Name : HardFault_Handler +* Description : This function handles Hard Fault exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void HardFault_Handler(void) +{ + /* Go to infinite loop when Hard Fault exception occurs */ + while (1) + { + } +} + +/******************************************************************************* +* Function Name : MemManage_Handler +* Description : This function handles Memory Manage exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void MemManage_Handler(void) +{ + /* Go to infinite loop when Memory Manage exception occurs */ + while (1) + { + } +} + +/******************************************************************************* +* Function Name : BusFault_Handler +* Description : This function handles Bus Fault exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void BusFault_Handler(void) +{ + /* Go to infinite loop when Bus Fault exception occurs */ + while (1) + { + } +} + +/******************************************************************************* +* Function Name : UsageFault_Handler +* Description : This function handles Usage Fault exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void UsageFault_Handler(void) +{ + /* Go to infinite loop when Usage Fault exception occurs */ + while (1) + { + } +} + +/******************************************************************************* +* Function Name : SVC_Handler +* Description : This function handles SVCall exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void SVC_Handler(void) +{ +} + +/******************************************************************************* +* Function Name : DebugMon_Handler +* Description : This function handles Debug Monitor exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void DebugMon_Handler(void) +{ +} + +/******************************************************************************* +* Function Name : PendSV_Handler +* Description : This function handles PendSVC exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void PendSV_Handler(void) +{ +} + +/******************************************************************************* +* Function Name : SysTick_Handler +* Description : This function handles SysTick Handler. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void SysTick_Handler(void) +{ + Tick++; +} + +/******************************************************************************/ +/* STM32 Peripherals Interrupt Handlers */ +/******************************************************************************/ + +/******************************************************************************* +* Function Name : USB_IRQHandler +* Description : This function handles USB Low Priority interrupts +* requests. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS) || defined (STM32F37X) +void USB_LP_IRQHandler(void) +#else +void USB_LP_CAN1_RX0_IRQHandler(void) +#endif +{ + USB_Istr(); +} + + +/******************************************************************************* +* Function Name : USB_FS_WKUP_IRQHandler +* Description : This function handles USB WakeUp interrupt request. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ + +#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS) +void USB_FS_WKUP_IRQHandler(void) +#else +void USBWakeUp_IRQHandler(void) +#endif +{ + EXTI_ClearITPendingBit(EXTI_Line18); +} +/******************************************************************************/ +/* STM32 Peripherals Interrupt Handlers */ +/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ +/* available peripheral interrupt handler's name please refer to the startup */ +/* file (startup_stm32xxx.s). */ +/******************************************************************************/ + +/******************************************************************************* +* Function Name : PPP_IRQHandler +* Description : This function handles PPP interrupt request. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +/*void PPP_IRQHandler(void) +{ +}*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32_it.h b/Soft/Suwmiarka_CrossWorks/stm32_it.h new file mode 100644 index 0000000..3aecfdc --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32_it.h @@ -0,0 +1,56 @@ +/** + ****************************************************************************** + * @file stm32_it.h + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 __STM32_IT_H +#define __STM32_IT_H + +/* Includes ------------------------------------------------------------------*/ +#include "platform_config.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void USB_LP_CAN1_RX0_IRQHandler(void); +void DMA1_Channel1_IRQHandler(void); +void EXTI15_10_IRQHandler(void); + +#endif /* __STM32_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x.h b/Soft/Suwmiarka_CrossWorks/stm32f10x.h new file mode 100644 index 0000000..3ab6721 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x.h @@ -0,0 +1,8319 @@ +/** + ****************************************************************************** + * @file stm32f10x.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. + * This file contains all the peripheral register's definitions, bits + * definitions and memory mapping for STM32F10x Connectivity line, + * High density, High density value line, Medium density, + * Medium density Value line, Low density, Low density Value line + * and XL-density devices. + ****************************************************************************** + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f10x + * @{ + */ + +#ifndef __STM32F10x_H +#define __STM32F10x_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup Library_configuration_section + * @{ + */ + +/* Uncomment the line below according to the target STM32 device used in your + application + */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) + /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */ + /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */ + /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */ + /* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */ + /* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */ + /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */ + /* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */ + /* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */ +#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. + + - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers + where the Flash memory density ranges between 16 and 32 Kbytes. + - Low-density value line devices are STM32F100xx microcontrollers where the Flash + memory density ranges between 16 and 32 Kbytes. + - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers + where the Flash memory density ranges between 64 and 128 Kbytes. + - Medium-density value line devices are STM32F100xx microcontrollers where the + Flash memory density ranges between 64 and 128 Kbytes. + - High-density devices are STM32F101xx and STM32F103xx microcontrollers where + the Flash memory density ranges between 256 and 512 Kbytes. + - High-density value line devices are STM32F100xx microcontrollers where the + Flash memory density ranges between 256 and 512 Kbytes. + - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where + the Flash memory density ranges between 512 and 1024 Kbytes. + - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers. + */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) + #error "Please select first the target STM32F10x device used in your application (in stm32f10x.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 + +/** + * @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 + #ifdef STM32F10X_CL + #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ + #else + #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ + #endif /* STM32F10X_CL */ +#endif /* HSE_VALUE */ + + +/** + * @brief In the following line adjust the External High Speed oscillator (HSE) Startup + Timeout value + */ +#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ + +#define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/ + +/** + * @brief STM32F10x Standard Peripheral Library version number + */ +#define __STM32F10X_STDPERIPH_VERSION_MAIN (0x03) /*!< [31:16] STM32F10x Standard Peripheral Library main version */ +#define __STM32F10X_STDPERIPH_VERSION_SUB1 (0x04) /*!< [15:8] STM32F10x Standard Peripheral Library sub1 version */ +#define __STM32F10X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [7:0] STM32F10x Standard Peripheral Library sub2 version */ +#define __STM32F10X_STDPERIPH_VERSION ((__STM32F10X_STDPERIPH_VERSION_MAIN << 16)\ + | (__STM32F10X_STDPERIPH_VERSION_SUB1 << 8)\ + | __STM32F10X_STDPERIPH_VERSION_SUB2) + +/** + * @} + */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M3 Processor and Core Peripherals + */ +#ifdef STM32F10X_XL + #define __MPU_PRESENT 1 /*!< STM32 XL-density devices provide an MPU */ +#else + #define __MPU_PRESENT 0 /*!< Other STM32 devices does not provide an MPU */ +#endif /* STM32F10X_XL */ +#define __NVIC_PRIO_BITS 4 /*!< STM32 uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ + +/** + * @brief STM32F10x Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum IRQn +{ +/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/****** STM32 specific Interrupt Numbers *********************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMPER_IRQn = 2, /*!< Tamper Interrupt */ + RTC_IRQn = 3, /*!< RTC global Interrupt */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ + +#ifdef STM32F10X_LD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ +#endif /* STM32F10X_LD */ + +#ifdef STM32F10X_LD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55 /*!< TIM7 Interrupt */ +#endif /* STM32F10X_LD_VL */ + +#ifdef STM32F10X_MD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ +#endif /* STM32F10X_MD */ + +#ifdef STM32F10X_MD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55 /*!< TIM7 Interrupt */ +#endif /* STM32F10X_MD_VL */ + +#ifdef STM32F10X_HD + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ + TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */ + TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt */ + TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ +#endif /* STM32F10X_HD */ + +#ifdef STM32F10X_HD_VL + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ + TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ + TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ + TIM12_IRQn = 43, /*!< TIM12 global Interrupt */ + TIM13_IRQn = 44, /*!< TIM13 global Interrupt */ + TIM14_IRQn = 45, /*!< TIM14 global Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59, /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ + DMA2_Channel5_IRQn = 60 /*!< DMA2 Channel 5 global Interrupt (DMA2 Channel 5 is + mapped at postion 60 only if the MISC_REMAP bit in + the AFIO_MAPR2 register is set) */ +#endif /* STM32F10X_HD_VL */ + +#ifdef STM32F10X_XL + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break Interrupt and TIM9 global Interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global Interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global Interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global Interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ +#endif /* STM32F10X_XL */ + +#ifdef STM32F10X_CL + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS WakeUp from suspend through EXTI Line Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ + TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_IRQn = 59, /*!< DMA2 Channel 4 global Interrupt */ + DMA2_Channel5_IRQn = 60, /*!< DMA2 Channel 5 global Interrupt */ + ETH_IRQn = 61, /*!< Ethernet global Interrupt */ + ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67 /*!< USB OTG FS global Interrupt */ +#endif /* STM32F10X_CL */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm3.h" +#include "system_stm32f10x.h" +#include + +/** @addtogroup Exported_types + * @{ + */ + +/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +typedef const int32_t sc32; /*!< Read Only */ +typedef const int16_t sc16; /*!< Read Only */ +typedef const int8_t sc8; /*!< Read Only */ + +typedef __IO int32_t vs32; +typedef __IO int16_t vs16; +typedef __IO int8_t vs8; + +typedef __I int32_t vsc32; /*!< Read Only */ +typedef __I int16_t vsc16; /*!< Read Only */ +typedef __I int8_t vsc8; /*!< Read Only */ + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef const uint32_t uc32; /*!< Read Only */ +typedef const uint16_t uc16; /*!< Read Only */ +typedef const uint8_t uc8; /*!< Read Only */ + +typedef __IO uint32_t vu32; +typedef __IO uint16_t vu16; +typedef __IO uint8_t vu8; + +typedef __I uint32_t vuc32; /*!< Read Only */ +typedef __I uint16_t vuc16; /*!< Read Only */ +typedef __I uint8_t vuc8; /*!< Read Only */ + +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; + +/*!< STM32F10x Standard Peripheral Library old definitions (maintained for legacy purpose) */ +#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT +#define HSE_Value HSE_VALUE +#define HSI_Value HSI_VALUE +/** + * @} + */ + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; + __IO uint32_t CR1; + __IO uint32_t CR2; + __IO uint32_t SMPR1; + __IO uint32_t SMPR2; + __IO uint32_t JOFR1; + __IO uint32_t JOFR2; + __IO uint32_t JOFR3; + __IO uint32_t JOFR4; + __IO uint32_t HTR; + __IO uint32_t LTR; + __IO uint32_t SQR1; + __IO uint32_t SQR2; + __IO uint32_t SQR3; + __IO uint32_t JSQR; + __IO uint32_t JDR1; + __IO uint32_t JDR2; + __IO uint32_t JDR3; + __IO uint32_t JDR4; + __IO uint32_t DR; +} ADC_TypeDef; + +/** + * @brief Backup Registers + */ + +typedef struct +{ + uint32_t RESERVED0; + __IO uint16_t DR1; + uint16_t RESERVED1; + __IO uint16_t DR2; + uint16_t RESERVED2; + __IO uint16_t DR3; + uint16_t RESERVED3; + __IO uint16_t DR4; + uint16_t RESERVED4; + __IO uint16_t DR5; + uint16_t RESERVED5; + __IO uint16_t DR6; + uint16_t RESERVED6; + __IO uint16_t DR7; + uint16_t RESERVED7; + __IO uint16_t DR8; + uint16_t RESERVED8; + __IO uint16_t DR9; + uint16_t RESERVED9; + __IO uint16_t DR10; + uint16_t RESERVED10; + __IO uint16_t RTCCR; + uint16_t RESERVED11; + __IO uint16_t CR; + uint16_t RESERVED12; + __IO uint16_t CSR; + uint16_t RESERVED13[5]; + __IO uint16_t DR11; + uint16_t RESERVED14; + __IO uint16_t DR12; + uint16_t RESERVED15; + __IO uint16_t DR13; + uint16_t RESERVED16; + __IO uint16_t DR14; + uint16_t RESERVED17; + __IO uint16_t DR15; + uint16_t RESERVED18; + __IO uint16_t DR16; + uint16_t RESERVED19; + __IO uint16_t DR17; + uint16_t RESERVED20; + __IO uint16_t DR18; + uint16_t RESERVED21; + __IO uint16_t DR19; + uint16_t RESERVED22; + __IO uint16_t DR20; + uint16_t RESERVED23; + __IO uint16_t DR21; + uint16_t RESERVED24; + __IO uint16_t DR22; + uint16_t RESERVED25; + __IO uint16_t DR23; + uint16_t RESERVED26; + __IO uint16_t DR24; + uint16_t RESERVED27; + __IO uint16_t DR25; + uint16_t RESERVED28; + __IO uint16_t DR26; + uint16_t RESERVED29; + __IO uint16_t DR27; + uint16_t RESERVED30; + __IO uint16_t DR28; + uint16_t RESERVED31; + __IO uint16_t DR29; + uint16_t RESERVED32; + __IO uint16_t DR30; + uint16_t RESERVED33; + __IO uint16_t DR31; + uint16_t RESERVED34; + __IO uint16_t DR32; + uint16_t RESERVED35; + __IO uint16_t DR33; + uint16_t RESERVED36; + __IO uint16_t DR34; + uint16_t RESERVED37; + __IO uint16_t DR35; + uint16_t RESERVED38; + __IO uint16_t DR36; + uint16_t RESERVED39; + __IO uint16_t DR37; + uint16_t RESERVED40; + __IO uint16_t DR38; + uint16_t RESERVED41; + __IO uint16_t DR39; + uint16_t RESERVED42; + __IO uint16_t DR40; + uint16_t RESERVED43; + __IO uint16_t DR41; + uint16_t RESERVED44; + __IO uint16_t DR42; + uint16_t RESERVED45; +} BKP_TypeDef; + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; + __IO uint32_t TDTR; + __IO uint32_t TDLR; + __IO uint32_t TDHR; +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; + __IO uint32_t RDTR; + __IO uint32_t RDLR; + __IO uint32_t RDHR; +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; + __IO uint32_t FR2; +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; + __IO uint32_t MSR; + __IO uint32_t TSR; + __IO uint32_t RF0R; + __IO uint32_t RF1R; + __IO uint32_t IER; + __IO uint32_t ESR; + __IO uint32_t BTR; + uint32_t RESERVED0[88]; + CAN_TxMailBox_TypeDef sTxMailBox[3]; + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; + uint32_t RESERVED1[12]; + __IO uint32_t FMR; + __IO uint32_t FM1R; + uint32_t RESERVED2; + __IO uint32_t FS1R; + uint32_t RESERVED3; + __IO uint32_t FFA1R; + uint32_t RESERVED4; + __IO uint32_t FA1R; + uint32_t RESERVED5[8]; +#ifndef STM32F10X_CL + CAN_FilterRegister_TypeDef sFilterRegister[14]; +#else + CAN_FilterRegister_TypeDef sFilterRegister[28]; +#endif /* STM32F10X_CL */ +} CAN_TypeDef; + +/** + * @brief Consumer Electronics Control (CEC) + */ +typedef struct +{ + __IO uint32_t CFGR; + __IO uint32_t OAR; + __IO uint32_t PRES; + __IO uint32_t ESR; + __IO uint32_t CSR; + __IO uint32_t TXD; + __IO uint32_t RXD; +} CEC_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; + __IO uint8_t IDR; + uint8_t RESERVED0; + uint16_t RESERVED1; + __IO uint32_t CR; +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t SWTRIGR; + __IO uint32_t DHR12R1; + __IO uint32_t DHR12L1; + __IO uint32_t DHR8R1; + __IO uint32_t DHR12R2; + __IO uint32_t DHR12L2; + __IO uint32_t DHR8R2; + __IO uint32_t DHR12RD; + __IO uint32_t DHR12LD; + __IO uint32_t DHR8RD; + __IO uint32_t DOR1; + __IO uint32_t DOR2; +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + __IO uint32_t SR; +#endif +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; + __IO uint32_t CR; +}DBGMCU_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CCR; + __IO uint32_t CNDTR; + __IO uint32_t CPAR; + __IO uint32_t CMAR; +} DMA_Channel_TypeDef; + +typedef struct +{ + __IO uint32_t ISR; + __IO uint32_t IFCR; +} DMA_TypeDef; + +/** + * @brief Ethernet MAC + */ + +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; /* 8 */ + uint32_t RESERVED0[2]; + __IO uint32_t MACRWUFFR; /* 11 */ + __IO uint32_t MACPMTCSR; + uint32_t RESERVED1[2]; + __IO uint32_t MACSR; /* 15 */ + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; /* 24 */ + uint32_t RESERVED2[40]; + __IO uint32_t MMCCR; /* 65 */ + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; /* 69 */ + uint32_t RESERVED3[14]; + __IO uint32_t MMCTGFSCCR; /* 84 */ + __IO uint32_t MMCTGFMSCCR; + uint32_t RESERVED4[5]; + __IO uint32_t MMCTGFCR; + uint32_t RESERVED5[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + uint32_t RESERVED6[10]; + __IO uint32_t MMCRGUFCR; + uint32_t RESERVED7[334]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + uint32_t RESERVED8[567]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + uint32_t RESERVED9[9]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; +} ETH_TypeDef; + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; + __IO uint32_t EMR; + __IO uint32_t RTSR; + __IO uint32_t FTSR; + __IO uint32_t SWIER; + __IO uint32_t PR; +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; + __IO uint32_t KEYR; + __IO uint32_t OPTKEYR; + __IO uint32_t SR; + __IO uint32_t CR; + __IO uint32_t AR; + __IO uint32_t RESERVED; + __IO uint32_t OBR; + __IO uint32_t WRPR; +#ifdef STM32F10X_XL + uint32_t RESERVED1[8]; + __IO uint32_t KEYR2; + uint32_t RESERVED2; + __IO uint32_t SR2; + __IO uint32_t CR2; + __IO uint32_t AR2; +#endif /* STM32F10X_XL */ +} FLASH_TypeDef; + +/** + * @brief Option Bytes Registers + */ + +typedef struct +{ + __IO uint16_t RDP; + __IO uint16_t USER; + __IO uint16_t Data0; + __IO uint16_t Data1; + __IO uint16_t WRP0; + __IO uint16_t WRP1; + __IO uint16_t WRP2; + __IO uint16_t WRP3; +} OB_TypeDef; + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; + __IO uint32_t SR2; + __IO uint32_t PMEM2; + __IO uint32_t PATT2; + uint32_t RESERVED0; + __IO uint32_t ECCR2; +} FSMC_Bank2_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank3 + */ + +typedef struct +{ + __IO uint32_t PCR3; + __IO uint32_t SR3; + __IO uint32_t PMEM3; + __IO uint32_t PATT3; + uint32_t RESERVED0; + __IO uint32_t ECCR3; +} FSMC_Bank3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; + __IO uint32_t SR4; + __IO uint32_t PMEM4; + __IO uint32_t PATT4; + __IO uint32_t PIO4; +} FSMC_Bank4_TypeDef; + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t CRL; + __IO uint32_t CRH; + __IO uint32_t IDR; + __IO uint32_t ODR; + __IO uint32_t BSRR; + __IO uint32_t BRR; + __IO uint32_t LCKR; +} GPIO_TypeDef; + +/** + * @brief Alternate Function I/O + */ + +typedef struct +{ + __IO uint32_t EVCR; + __IO uint32_t MAPR; + __IO uint32_t EXTICR[4]; + uint32_t RESERVED0; + __IO uint32_t MAPR2; +} AFIO_TypeDef; +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t OAR1; + uint16_t RESERVED2; + __IO uint16_t OAR2; + uint16_t RESERVED3; + __IO uint16_t DR; + uint16_t RESERVED4; + __IO uint16_t SR1; + uint16_t RESERVED5; + __IO uint16_t SR2; + uint16_t RESERVED6; + __IO uint16_t CCR; + uint16_t RESERVED7; + __IO uint16_t TRISE; + uint16_t RESERVED8; +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; + __IO uint32_t PR; + __IO uint32_t RLR; + __IO uint32_t SR; +} IWDG_TypeDef; + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CSR; +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFGR; + __IO uint32_t CIR; + __IO uint32_t APB2RSTR; + __IO uint32_t APB1RSTR; + __IO uint32_t AHBENR; + __IO uint32_t APB2ENR; + __IO uint32_t APB1ENR; + __IO uint32_t BDCR; + __IO uint32_t CSR; + +#ifdef STM32F10X_CL + __IO uint32_t AHBRSTR; + __IO uint32_t CFGR2; +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + uint32_t RESERVED0; + __IO uint32_t CFGR2; +#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint16_t CRH; + uint16_t RESERVED0; + __IO uint16_t CRL; + uint16_t RESERVED1; + __IO uint16_t PRLH; + uint16_t RESERVED2; + __IO uint16_t PRLL; + uint16_t RESERVED3; + __IO uint16_t DIVH; + uint16_t RESERVED4; + __IO uint16_t DIVL; + uint16_t RESERVED5; + __IO uint16_t CNTH; + uint16_t RESERVED6; + __IO uint16_t CNTL; + uint16_t RESERVED7; + __IO uint16_t ALRH; + uint16_t RESERVED8; + __IO uint16_t ALRL; + uint16_t RESERVED9; +} RTC_TypeDef; + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; + __IO uint32_t CLKCR; + __IO uint32_t ARG; + __IO uint32_t CMD; + __I uint32_t RESPCMD; + __I uint32_t RESP1; + __I uint32_t RESP2; + __I uint32_t RESP3; + __I uint32_t RESP4; + __IO uint32_t DTIMER; + __IO uint32_t DLEN; + __IO uint32_t DCTRL; + __I uint32_t DCOUNT; + __I uint32_t STA; + __IO uint32_t ICR; + __IO uint32_t MASK; + uint32_t RESERVED0[2]; + __I uint32_t FIFOCNT; + uint32_t RESERVED1[13]; + __IO uint32_t FIFO; +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t SR; + uint16_t RESERVED2; + __IO uint16_t DR; + uint16_t RESERVED3; + __IO uint16_t CRCPR; + uint16_t RESERVED4; + __IO uint16_t RXCRCR; + uint16_t RESERVED5; + __IO uint16_t TXCRCR; + uint16_t RESERVED6; + __IO uint16_t I2SCFGR; + uint16_t RESERVED7; + __IO uint16_t I2SPR; + uint16_t RESERVED8; +} SPI_TypeDef; + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t SMCR; + uint16_t RESERVED2; + __IO uint16_t DIER; + uint16_t RESERVED3; + __IO uint16_t SR; + uint16_t RESERVED4; + __IO uint16_t EGR; + uint16_t RESERVED5; + __IO uint16_t CCMR1; + uint16_t RESERVED6; + __IO uint16_t CCMR2; + uint16_t RESERVED7; + __IO uint16_t CCER; + uint16_t RESERVED8; + __IO uint16_t CNT; + uint16_t RESERVED9; + __IO uint16_t PSC; + uint16_t RESERVED10; + __IO uint16_t ARR; + uint16_t RESERVED11; + __IO uint16_t RCR; + uint16_t RESERVED12; + __IO uint16_t CCR1; + uint16_t RESERVED13; + __IO uint16_t CCR2; + uint16_t RESERVED14; + __IO uint16_t CCR3; + uint16_t RESERVED15; + __IO uint16_t CCR4; + uint16_t RESERVED16; + __IO uint16_t BDTR; + uint16_t RESERVED17; + __IO uint16_t DCR; + uint16_t RESERVED18; + __IO uint16_t DMAR; + uint16_t RESERVED19; +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint16_t SR; + uint16_t RESERVED0; + __IO uint16_t DR; + uint16_t RESERVED1; + __IO uint16_t BRR; + uint16_t RESERVED2; + __IO uint16_t CR1; + uint16_t RESERVED3; + __IO uint16_t CR2; + uint16_t RESERVED4; + __IO uint16_t CR3; + uint16_t RESERVED5; + __IO uint16_t GTPR; + uint16_t RESERVED6; +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFR; + __IO uint32_t SR; +} WWDG_TypeDef; + +/** + * @} + */ + +/** @addtogroup Peripheral_memory_map + * @{ + */ + + +#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */ +#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */ +#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ + +#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */ +#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ + +#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) + +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) +#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) +#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) +#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) +#define BKP_BASE (APB1PERIPH_BASE + 0x6C00) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400) +#define CEC_BASE (APB1PERIPH_BASE + 0x7800) + +#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) +#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) +#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) +#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) +#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) +#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) +#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) +#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) +#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) +#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) +#define TIM8_BASE (APB2PERIPH_BASE + 0x3400) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800) +#define ADC3_BASE (APB2PERIPH_BASE + 0x3C00) +#define TIM15_BASE (APB2PERIPH_BASE + 0x4000) +#define TIM16_BASE (APB2PERIPH_BASE + 0x4400) +#define TIM17_BASE (APB2PERIPH_BASE + 0x4800) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4C00) +#define TIM10_BASE (APB2PERIPH_BASE + 0x5000) +#define TIM11_BASE (APB2PERIPH_BASE + 0x5400) + +#define SDIO_BASE (PERIPH_BASE + 0x18000) + +#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) +#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) +#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) +#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) +#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) +#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) +#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) +#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) +#define DMA2_BASE (AHBPERIPH_BASE + 0x0400) +#define DMA2_Channel1_BASE (AHBPERIPH_BASE + 0x0408) +#define DMA2_Channel2_BASE (AHBPERIPH_BASE + 0x041C) +#define DMA2_Channel3_BASE (AHBPERIPH_BASE + 0x0430) +#define DMA2_Channel4_BASE (AHBPERIPH_BASE + 0x0444) +#define DMA2_Channel5_BASE (AHBPERIPH_BASE + 0x0458) +#define RCC_BASE (AHBPERIPH_BASE + 0x1000) +#define CRC_BASE (AHBPERIPH_BASE + 0x3000) + +#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) /*!< Flash registers base address */ +#define OB_BASE ((uint32_t)0x1FFFF800) /*!< Flash Option Bytes base address */ + +#define ETH_BASE (AHBPERIPH_BASE + 0x8000) +#define ETH_MAC_BASE (ETH_BASE) +#define ETH_MMC_BASE (ETH_BASE + 0x0100) +#define ETH_PTP_BASE (ETH_BASE + 0x0700) +#define ETH_DMA_BASE (ETH_BASE + 0x1000) + +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) /*!< FSMC Bank1 registers base address */ +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) /*!< FSMC Bank1E registers base address */ +#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) /*!< FSMC Bank2 registers base address */ +#define FSMC_Bank3_R_BASE (FSMC_R_BASE + 0x0080) /*!< FSMC Bank3 registers base address */ +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) /*!< FSMC Bank4 registers base address */ + +#define DBGMCU_BASE ((uint32_t)0xE0042000) /*!< Debug MCU registers base address */ + +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ + +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define BKP ((BKP_TypeDef *) BKP_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) +#define CEC ((CEC_TypeDef *) CEC_BASE) +#define AFIO ((AFIO_TypeDef *) AFIO_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define TIM15 ((TIM_TypeDef *) TIM15_BASE) +#define TIM16 ((TIM_TypeDef *) TIM16_BASE) +#define TIM17 ((TIM_TypeDef *) TIM17_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) +#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE) +#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE) +#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE) +#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE) +#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE) +#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE) +#define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE) +#define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE) +#define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE) +#define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE) +#define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define OB ((OB_TypeDef *) OB_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE) +#define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* CRC calculation unit */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for CRC_DR register *********************/ +#define CRC_DR_DR ((uint32_t)0xFFFFFFFF) /*!< Data register bits */ + + +/******************* Bit definition for CRC_IDR register ********************/ +#define CRC_IDR_IDR ((uint8_t)0xFF) /*!< General-purpose 8-bit data register bits */ + + +/******************** Bit definition for CRC_CR register ********************/ +#define CRC_CR_RESET ((uint8_t)0x01) /*!< RESET bit */ + +/******************************************************************************/ +/* */ +/* Power Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for PWR_CR register ********************/ +#define PWR_CR_LPDS ((uint16_t)0x0001) /*!< Low-Power Deepsleep */ +#define PWR_CR_PDDS ((uint16_t)0x0002) /*!< Power Down Deepsleep */ +#define PWR_CR_CWUF ((uint16_t)0x0004) /*!< Clear Wakeup Flag */ +#define PWR_CR_CSBF ((uint16_t)0x0008) /*!< Clear Standby Flag */ +#define PWR_CR_PVDE ((uint16_t)0x0010) /*!< Power Voltage Detector Enable */ + +#define PWR_CR_PLS ((uint16_t)0x00E0) /*!< PLS[2:0] bits (PVD Level Selection) */ +#define PWR_CR_PLS_0 ((uint16_t)0x0020) /*!< Bit 0 */ +#define PWR_CR_PLS_1 ((uint16_t)0x0040) /*!< Bit 1 */ +#define PWR_CR_PLS_2 ((uint16_t)0x0080) /*!< Bit 2 */ + +/*!< PVD level configuration */ +#define PWR_CR_PLS_2V2 ((uint16_t)0x0000) /*!< PVD level 2.2V */ +#define PWR_CR_PLS_2V3 ((uint16_t)0x0020) /*!< PVD level 2.3V */ +#define PWR_CR_PLS_2V4 ((uint16_t)0x0040) /*!< PVD level 2.4V */ +#define PWR_CR_PLS_2V5 ((uint16_t)0x0060) /*!< PVD level 2.5V */ +#define PWR_CR_PLS_2V6 ((uint16_t)0x0080) /*!< PVD level 2.6V */ +#define PWR_CR_PLS_2V7 ((uint16_t)0x00A0) /*!< PVD level 2.7V */ +#define PWR_CR_PLS_2V8 ((uint16_t)0x00C0) /*!< PVD level 2.8V */ +#define PWR_CR_PLS_2V9 ((uint16_t)0x00E0) /*!< PVD level 2.9V */ + +#define PWR_CR_DBP ((uint16_t)0x0100) /*!< Disable Backup Domain write protection */ + + +/******************* Bit definition for PWR_CSR register ********************/ +#define PWR_CSR_WUF ((uint16_t)0x0001) /*!< Wakeup Flag */ +#define PWR_CSR_SBF ((uint16_t)0x0002) /*!< Standby Flag */ +#define PWR_CSR_PVDO ((uint16_t)0x0004) /*!< PVD Output */ +#define PWR_CSR_EWUP ((uint16_t)0x0100) /*!< Enable WKUP pin */ + +/******************************************************************************/ +/* */ +/* Backup registers */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for BKP_DR1 register ********************/ +#define BKP_DR1_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR2 register ********************/ +#define BKP_DR2_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR3 register ********************/ +#define BKP_DR3_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR4 register ********************/ +#define BKP_DR4_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR5 register ********************/ +#define BKP_DR5_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR6 register ********************/ +#define BKP_DR6_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR7 register ********************/ +#define BKP_DR7_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR8 register ********************/ +#define BKP_DR8_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR9 register ********************/ +#define BKP_DR9_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR10 register *******************/ +#define BKP_DR10_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR11 register *******************/ +#define BKP_DR11_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR12 register *******************/ +#define BKP_DR12_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR13 register *******************/ +#define BKP_DR13_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR14 register *******************/ +#define BKP_DR14_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR15 register *******************/ +#define BKP_DR15_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR16 register *******************/ +#define BKP_DR16_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR17 register *******************/ +#define BKP_DR17_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/****************** Bit definition for BKP_DR18 register ********************/ +#define BKP_DR18_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR19 register *******************/ +#define BKP_DR19_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR20 register *******************/ +#define BKP_DR20_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR21 register *******************/ +#define BKP_DR21_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR22 register *******************/ +#define BKP_DR22_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR23 register *******************/ +#define BKP_DR23_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR24 register *******************/ +#define BKP_DR24_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR25 register *******************/ +#define BKP_DR25_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR26 register *******************/ +#define BKP_DR26_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR27 register *******************/ +#define BKP_DR27_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR28 register *******************/ +#define BKP_DR28_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR29 register *******************/ +#define BKP_DR29_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR30 register *******************/ +#define BKP_DR30_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR31 register *******************/ +#define BKP_DR31_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR32 register *******************/ +#define BKP_DR32_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR33 register *******************/ +#define BKP_DR33_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR34 register *******************/ +#define BKP_DR34_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR35 register *******************/ +#define BKP_DR35_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR36 register *******************/ +#define BKP_DR36_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR37 register *******************/ +#define BKP_DR37_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR38 register *******************/ +#define BKP_DR38_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR39 register *******************/ +#define BKP_DR39_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR40 register *******************/ +#define BKP_DR40_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR41 register *******************/ +#define BKP_DR41_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/******************* Bit definition for BKP_DR42 register *******************/ +#define BKP_DR42_D ((uint16_t)0xFFFF) /*!< Backup data */ + +/****************** Bit definition for BKP_RTCCR register *******************/ +#define BKP_RTCCR_CAL ((uint16_t)0x007F) /*!< Calibration value */ +#define BKP_RTCCR_CCO ((uint16_t)0x0080) /*!< Calibration Clock Output */ +#define BKP_RTCCR_ASOE ((uint16_t)0x0100) /*!< Alarm or Second Output Enable */ +#define BKP_RTCCR_ASOS ((uint16_t)0x0200) /*!< Alarm or Second Output Selection */ + +/******************** Bit definition for BKP_CR register ********************/ +#define BKP_CR_TPE ((uint8_t)0x01) /*!< TAMPER pin enable */ +#define BKP_CR_TPAL ((uint8_t)0x02) /*!< TAMPER pin active level */ + +/******************* Bit definition for BKP_CSR register ********************/ +#define BKP_CSR_CTE ((uint16_t)0x0001) /*!< Clear Tamper event */ +#define BKP_CSR_CTI ((uint16_t)0x0002) /*!< Clear Tamper Interrupt */ +#define BKP_CSR_TPIE ((uint16_t)0x0004) /*!< TAMPER Pin interrupt enable */ +#define BKP_CSR_TEF ((uint16_t)0x0100) /*!< Tamper Event Flag */ +#define BKP_CSR_TIF ((uint16_t)0x0200) /*!< Tamper Interrupt Flag */ + +/******************************************************************************/ +/* */ +/* Reset and Clock Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for RCC_CR register ********************/ +#define RCC_CR_HSION ((uint32_t)0x00000001) /*!< Internal High Speed clock enable */ +#define RCC_CR_HSIRDY ((uint32_t)0x00000002) /*!< Internal High Speed clock ready flag */ +#define RCC_CR_HSITRIM ((uint32_t)0x000000F8) /*!< Internal High Speed clock trimming */ +#define RCC_CR_HSICAL ((uint32_t)0x0000FF00) /*!< Internal High Speed clock Calibration */ +#define RCC_CR_HSEON ((uint32_t)0x00010000) /*!< External High Speed clock enable */ +#define RCC_CR_HSERDY ((uint32_t)0x00020000) /*!< External High Speed clock ready flag */ +#define RCC_CR_HSEBYP ((uint32_t)0x00040000) /*!< External High Speed clock Bypass */ +#define RCC_CR_CSSON ((uint32_t)0x00080000) /*!< Clock Security System enable */ +#define RCC_CR_PLLON ((uint32_t)0x01000000) /*!< PLL enable */ +#define RCC_CR_PLLRDY ((uint32_t)0x02000000) /*!< PLL clock ready flag */ + +#ifdef STM32F10X_CL + #define RCC_CR_PLL2ON ((uint32_t)0x04000000) /*!< PLL2 enable */ + #define RCC_CR_PLL2RDY ((uint32_t)0x08000000) /*!< PLL2 clock ready flag */ + #define RCC_CR_PLL3ON ((uint32_t)0x10000000) /*!< PLL3 enable */ + #define RCC_CR_PLL3RDY ((uint32_t)0x20000000) /*!< PLL3 clock ready flag */ +#endif /* STM32F10X_CL */ + +/******************* Bit definition for RCC_CFGR register *******************/ +/*!< SW configuration */ +#define RCC_CFGR_SW ((uint32_t)0x00000003) /*!< SW[1:0] bits (System clock Switch) */ +#define RCC_CFGR_SW_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define RCC_CFGR_SW_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define RCC_CFGR_SW_HSI ((uint32_t)0x00000000) /*!< HSI selected as system clock */ +#define RCC_CFGR_SW_HSE ((uint32_t)0x00000001) /*!< HSE selected as system clock */ +#define RCC_CFGR_SW_PLL ((uint32_t)0x00000002) /*!< PLL selected as system clock */ + +/*!< SWS configuration */ +#define RCC_CFGR_SWS ((uint32_t)0x0000000C) /*!< SWS[1:0] bits (System Clock Switch Status) */ +#define RCC_CFGR_SWS_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define RCC_CFGR_SWS_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define RCC_CFGR_SWS_HSI ((uint32_t)0x00000000) /*!< HSI oscillator used as system clock */ +#define RCC_CFGR_SWS_HSE ((uint32_t)0x00000004) /*!< HSE oscillator used as system clock */ +#define RCC_CFGR_SWS_PLL ((uint32_t)0x00000008) /*!< PLL used as system clock */ + +/*!< HPRE configuration */ +#define RCC_CFGR_HPRE ((uint32_t)0x000000F0) /*!< HPRE[3:0] bits (AHB prescaler) */ +#define RCC_CFGR_HPRE_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define RCC_CFGR_HPRE_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define RCC_CFGR_HPRE_2 ((uint32_t)0x00000040) /*!< Bit 2 */ +#define RCC_CFGR_HPRE_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + +#define RCC_CFGR_HPRE_DIV1 ((uint32_t)0x00000000) /*!< SYSCLK not divided */ +#define RCC_CFGR_HPRE_DIV2 ((uint32_t)0x00000080) /*!< SYSCLK divided by 2 */ +#define RCC_CFGR_HPRE_DIV4 ((uint32_t)0x00000090) /*!< SYSCLK divided by 4 */ +#define RCC_CFGR_HPRE_DIV8 ((uint32_t)0x000000A0) /*!< SYSCLK divided by 8 */ +#define RCC_CFGR_HPRE_DIV16 ((uint32_t)0x000000B0) /*!< SYSCLK divided by 16 */ +#define RCC_CFGR_HPRE_DIV64 ((uint32_t)0x000000C0) /*!< SYSCLK divided by 64 */ +#define RCC_CFGR_HPRE_DIV128 ((uint32_t)0x000000D0) /*!< SYSCLK divided by 128 */ +#define RCC_CFGR_HPRE_DIV256 ((uint32_t)0x000000E0) /*!< SYSCLK divided by 256 */ +#define RCC_CFGR_HPRE_DIV512 ((uint32_t)0x000000F0) /*!< SYSCLK divided by 512 */ + +/*!< PPRE1 configuration */ +#define RCC_CFGR_PPRE1 ((uint32_t)0x00000700) /*!< PRE1[2:0] bits (APB1 prescaler) */ +#define RCC_CFGR_PPRE1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define RCC_CFGR_PPRE1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define RCC_CFGR_PPRE1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + +#define RCC_CFGR_PPRE1_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ +#define RCC_CFGR_PPRE1_DIV2 ((uint32_t)0x00000400) /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE1_DIV4 ((uint32_t)0x00000500) /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE1_DIV8 ((uint32_t)0x00000600) /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE1_DIV16 ((uint32_t)0x00000700) /*!< HCLK divided by 16 */ + +/*!< PPRE2 configuration */ +#define RCC_CFGR_PPRE2 ((uint32_t)0x00003800) /*!< PRE2[2:0] bits (APB2 prescaler) */ +#define RCC_CFGR_PPRE2_0 ((uint32_t)0x00000800) /*!< Bit 0 */ +#define RCC_CFGR_PPRE2_1 ((uint32_t)0x00001000) /*!< Bit 1 */ +#define RCC_CFGR_PPRE2_2 ((uint32_t)0x00002000) /*!< Bit 2 */ + +#define RCC_CFGR_PPRE2_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ +#define RCC_CFGR_PPRE2_DIV2 ((uint32_t)0x00002000) /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE2_DIV4 ((uint32_t)0x00002800) /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE2_DIV8 ((uint32_t)0x00003000) /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE2_DIV16 ((uint32_t)0x00003800) /*!< HCLK divided by 16 */ + +/*!< ADCPPRE configuration */ +#define RCC_CFGR_ADCPRE ((uint32_t)0x0000C000) /*!< ADCPRE[1:0] bits (ADC prescaler) */ +#define RCC_CFGR_ADCPRE_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define RCC_CFGR_ADCPRE_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define RCC_CFGR_ADCPRE_DIV2 ((uint32_t)0x00000000) /*!< PCLK2 divided by 2 */ +#define RCC_CFGR_ADCPRE_DIV4 ((uint32_t)0x00004000) /*!< PCLK2 divided by 4 */ +#define RCC_CFGR_ADCPRE_DIV6 ((uint32_t)0x00008000) /*!< PCLK2 divided by 6 */ +#define RCC_CFGR_ADCPRE_DIV8 ((uint32_t)0x0000C000) /*!< PCLK2 divided by 8 */ + +#define RCC_CFGR_PLLSRC ((uint32_t)0x00010000) /*!< PLL entry clock source */ + +#define RCC_CFGR_PLLXTPRE ((uint32_t)0x00020000) /*!< HSE divider for PLL entry */ + +/*!< PLLMUL configuration */ +#define RCC_CFGR_PLLMULL ((uint32_t)0x003C0000) /*!< PLLMUL[3:0] bits (PLL multiplication factor) */ +#define RCC_CFGR_PLLMULL_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define RCC_CFGR_PLLMULL_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define RCC_CFGR_PLLMULL_2 ((uint32_t)0x00100000) /*!< Bit 2 */ +#define RCC_CFGR_PLLMULL_3 ((uint32_t)0x00200000) /*!< Bit 3 */ + +#ifdef STM32F10X_CL + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock * 4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock * 5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock * 6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock * 7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock * 8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock * 9 */ + #define RCC_CFGR_PLLMULL6_5 ((uint32_t)0x00340000) /*!< PLL input clock * 6.5 */ + + #define RCC_CFGR_OTGFSPRE ((uint32_t)0x00400000) /*!< USB OTG FS prescaler */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x0F000000) /*!< MCO[3:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + #define RCC_CFGR_MCO_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLLCLK_Div2 ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ + #define RCC_CFGR_MCO_PLL2CLK ((uint32_t)0x08000000) /*!< PLL2 clock selected as MCO source*/ + #define RCC_CFGR_MCO_PLL3CLK_Div2 ((uint32_t)0x09000000) /*!< PLL3 clock divided by 2 selected as MCO source*/ + #define RCC_CFGR_MCO_Ext_HSE ((uint32_t)0x0A000000) /*!< XT1 external 3-25 MHz oscillator clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL3CLK ((uint32_t)0x0B000000) /*!< PLL3 clock selected as MCO source */ +#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ + #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ + #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ + #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ + #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ + #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ + #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ + #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ + #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ +#else + #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ + #define RCC_CFGR_PLLSRC_HSE ((uint32_t)0x00010000) /*!< HSE clock selected as PLL entry clock source */ + + #define RCC_CFGR_PLLXTPRE_HSE ((uint32_t)0x00000000) /*!< HSE clock not divided for PLL entry */ + #define RCC_CFGR_PLLXTPRE_HSE_Div2 ((uint32_t)0x00020000) /*!< HSE clock divided by 2 for PLL entry */ + + #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ + #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ + #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ + #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ + #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ + #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ + #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ + #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ + #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ + #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ + #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ + #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ + #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ + #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ + #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ + #define RCC_CFGR_USBPRE ((uint32_t)0x00400000) /*!< USB Device prescaler */ + +/*!< MCO configuration */ + #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ + #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ + #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + + #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ + #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ + #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ + #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ + #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ +#endif /* STM32F10X_CL */ + +/*!<****************** Bit definition for RCC_CIR register ********************/ +#define RCC_CIR_LSIRDYF ((uint32_t)0x00000001) /*!< LSI Ready Interrupt flag */ +#define RCC_CIR_LSERDYF ((uint32_t)0x00000002) /*!< LSE Ready Interrupt flag */ +#define RCC_CIR_HSIRDYF ((uint32_t)0x00000004) /*!< HSI Ready Interrupt flag */ +#define RCC_CIR_HSERDYF ((uint32_t)0x00000008) /*!< HSE Ready Interrupt flag */ +#define RCC_CIR_PLLRDYF ((uint32_t)0x00000010) /*!< PLL Ready Interrupt flag */ +#define RCC_CIR_CSSF ((uint32_t)0x00000080) /*!< Clock Security System Interrupt flag */ +#define RCC_CIR_LSIRDYIE ((uint32_t)0x00000100) /*!< LSI Ready Interrupt Enable */ +#define RCC_CIR_LSERDYIE ((uint32_t)0x00000200) /*!< LSE Ready Interrupt Enable */ +#define RCC_CIR_HSIRDYIE ((uint32_t)0x00000400) /*!< HSI Ready Interrupt Enable */ +#define RCC_CIR_HSERDYIE ((uint32_t)0x00000800) /*!< HSE Ready Interrupt Enable */ +#define RCC_CIR_PLLRDYIE ((uint32_t)0x00001000) /*!< PLL Ready Interrupt Enable */ +#define RCC_CIR_LSIRDYC ((uint32_t)0x00010000) /*!< LSI Ready Interrupt Clear */ +#define RCC_CIR_LSERDYC ((uint32_t)0x00020000) /*!< LSE Ready Interrupt Clear */ +#define RCC_CIR_HSIRDYC ((uint32_t)0x00040000) /*!< HSI Ready Interrupt Clear */ +#define RCC_CIR_HSERDYC ((uint32_t)0x00080000) /*!< HSE Ready Interrupt Clear */ +#define RCC_CIR_PLLRDYC ((uint32_t)0x00100000) /*!< PLL Ready Interrupt Clear */ +#define RCC_CIR_CSSC ((uint32_t)0x00800000) /*!< Clock Security System Interrupt Clear */ + +#ifdef STM32F10X_CL + #define RCC_CIR_PLL2RDYF ((uint32_t)0x00000020) /*!< PLL2 Ready Interrupt flag */ + #define RCC_CIR_PLL3RDYF ((uint32_t)0x00000040) /*!< PLL3 Ready Interrupt flag */ + #define RCC_CIR_PLL2RDYIE ((uint32_t)0x00002000) /*!< PLL2 Ready Interrupt Enable */ + #define RCC_CIR_PLL3RDYIE ((uint32_t)0x00004000) /*!< PLL3 Ready Interrupt Enable */ + #define RCC_CIR_PLL2RDYC ((uint32_t)0x00200000) /*!< PLL2 Ready Interrupt Clear */ + #define RCC_CIR_PLL3RDYC ((uint32_t)0x00400000) /*!< PLL3 Ready Interrupt Clear */ +#endif /* STM32F10X_CL */ + +/***************** Bit definition for RCC_APB2RSTR register *****************/ +#define RCC_APB2RSTR_AFIORST ((uint32_t)0x00000001) /*!< Alternate Function I/O reset */ +#define RCC_APB2RSTR_IOPARST ((uint32_t)0x00000004) /*!< I/O port A reset */ +#define RCC_APB2RSTR_IOPBRST ((uint32_t)0x00000008) /*!< I/O port B reset */ +#define RCC_APB2RSTR_IOPCRST ((uint32_t)0x00000010) /*!< I/O port C reset */ +#define RCC_APB2RSTR_IOPDRST ((uint32_t)0x00000020) /*!< I/O port D reset */ +#define RCC_APB2RSTR_ADC1RST ((uint32_t)0x00000200) /*!< ADC 1 interface reset */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB2RSTR_ADC2RST ((uint32_t)0x00000400) /*!< ADC 2 interface reset */ +#endif + +#define RCC_APB2RSTR_TIM1RST ((uint32_t)0x00000800) /*!< TIM1 Timer reset */ +#define RCC_APB2RSTR_SPI1RST ((uint32_t)0x00001000) /*!< SPI 1 reset */ +#define RCC_APB2RSTR_USART1RST ((uint32_t)0x00004000) /*!< USART1 reset */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +#define RCC_APB2RSTR_TIM15RST ((uint32_t)0x00010000) /*!< TIM15 Timer reset */ +#define RCC_APB2RSTR_TIM16RST ((uint32_t)0x00020000) /*!< TIM16 Timer reset */ +#define RCC_APB2RSTR_TIM17RST ((uint32_t)0x00040000) /*!< TIM17 Timer reset */ +#endif + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB2RSTR_IOPERST ((uint32_t)0x00000040) /*!< I/O port E reset */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_APB2RSTR_IOPFRST ((uint32_t)0x00000080) /*!< I/O port F reset */ + #define RCC_APB2RSTR_IOPGRST ((uint32_t)0x00000100) /*!< I/O port G reset */ + #define RCC_APB2RSTR_TIM8RST ((uint32_t)0x00002000) /*!< TIM8 Timer reset */ + #define RCC_APB2RSTR_ADC3RST ((uint32_t)0x00008000) /*!< ADC3 interface reset */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB2RSTR_IOPFRST ((uint32_t)0x00000080) /*!< I/O port F reset */ + #define RCC_APB2RSTR_IOPGRST ((uint32_t)0x00000100) /*!< I/O port G reset */ +#endif + +#ifdef STM32F10X_XL + #define RCC_APB2RSTR_TIM9RST ((uint32_t)0x00080000) /*!< TIM9 Timer reset */ + #define RCC_APB2RSTR_TIM10RST ((uint32_t)0x00100000) /*!< TIM10 Timer reset */ + #define RCC_APB2RSTR_TIM11RST ((uint32_t)0x00200000) /*!< TIM11 Timer reset */ +#endif /* STM32F10X_XL */ + +/***************** Bit definition for RCC_APB1RSTR register *****************/ +#define RCC_APB1RSTR_TIM2RST ((uint32_t)0x00000001) /*!< Timer 2 reset */ +#define RCC_APB1RSTR_TIM3RST ((uint32_t)0x00000002) /*!< Timer 3 reset */ +#define RCC_APB1RSTR_WWDGRST ((uint32_t)0x00000800) /*!< Window Watchdog reset */ +#define RCC_APB1RSTR_USART2RST ((uint32_t)0x00020000) /*!< USART 2 reset */ +#define RCC_APB1RSTR_I2C1RST ((uint32_t)0x00200000) /*!< I2C 1 reset */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB1RSTR_CAN1RST ((uint32_t)0x02000000) /*!< CAN1 reset */ +#endif + +#define RCC_APB1RSTR_BKPRST ((uint32_t)0x08000000) /*!< Backup interface reset */ +#define RCC_APB1RSTR_PWRRST ((uint32_t)0x10000000) /*!< Power interface reset */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB1RSTR_TIM4RST ((uint32_t)0x00000004) /*!< Timer 4 reset */ + #define RCC_APB1RSTR_SPI2RST ((uint32_t)0x00004000) /*!< SPI 2 reset */ + #define RCC_APB1RSTR_USART3RST ((uint32_t)0x00040000) /*!< RUSART 3 reset */ + #define RCC_APB1RSTR_I2C2RST ((uint32_t)0x00400000) /*!< I2C 2 reset */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) || defined (STM32F10X_XL) + #define RCC_APB1RSTR_USBRST ((uint32_t)0x00800000) /*!< USB Device reset */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_XL) + #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ + #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ + #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ + #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ + #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ + #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ + #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ +#endif + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ + #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ + #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ + #define RCC_APB1RSTR_CECRST ((uint32_t)0x40000000) /*!< CEC interface reset */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ + #define RCC_APB1RSTR_TIM12RST ((uint32_t)0x00000040) /*!< TIM12 Timer reset */ + #define RCC_APB1RSTR_TIM13RST ((uint32_t)0x00000080) /*!< TIM13 Timer reset */ + #define RCC_APB1RSTR_TIM14RST ((uint32_t)0x00000100) /*!< TIM14 Timer reset */ + #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ + #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ + #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ +#endif + +#ifdef STM32F10X_CL + #define RCC_APB1RSTR_CAN2RST ((uint32_t)0x04000000) /*!< CAN2 reset */ +#endif /* STM32F10X_CL */ + +#ifdef STM32F10X_XL + #define RCC_APB1RSTR_TIM12RST ((uint32_t)0x00000040) /*!< TIM12 Timer reset */ + #define RCC_APB1RSTR_TIM13RST ((uint32_t)0x00000080) /*!< TIM13 Timer reset */ + #define RCC_APB1RSTR_TIM14RST ((uint32_t)0x00000100) /*!< TIM14 Timer reset */ +#endif /* STM32F10X_XL */ + +/****************** Bit definition for RCC_AHBENR register ******************/ +#define RCC_AHBENR_DMA1EN ((uint16_t)0x0001) /*!< DMA1 clock enable */ +#define RCC_AHBENR_SRAMEN ((uint16_t)0x0004) /*!< SRAM interface clock enable */ +#define RCC_AHBENR_FLITFEN ((uint16_t)0x0010) /*!< FLITF clock enable */ +#define RCC_AHBENR_CRCEN ((uint16_t)0x0040) /*!< CRC clock enable */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_HD_VL) + #define RCC_AHBENR_DMA2EN ((uint16_t)0x0002) /*!< DMA2 clock enable */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ + #define RCC_AHBENR_SDIOEN ((uint16_t)0x0400) /*!< SDIO clock enable */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ +#endif + +#ifdef STM32F10X_CL + #define RCC_AHBENR_OTGFSEN ((uint32_t)0x00001000) /*!< USB OTG FS clock enable */ + #define RCC_AHBENR_ETHMACEN ((uint32_t)0x00004000) /*!< ETHERNET MAC clock enable */ + #define RCC_AHBENR_ETHMACTXEN ((uint32_t)0x00008000) /*!< ETHERNET MAC Tx clock enable */ + #define RCC_AHBENR_ETHMACRXEN ((uint32_t)0x00010000) /*!< ETHERNET MAC Rx clock enable */ +#endif /* STM32F10X_CL */ + +/****************** Bit definition for RCC_APB2ENR register *****************/ +#define RCC_APB2ENR_AFIOEN ((uint32_t)0x00000001) /*!< Alternate Function I/O clock enable */ +#define RCC_APB2ENR_IOPAEN ((uint32_t)0x00000004) /*!< I/O port A clock enable */ +#define RCC_APB2ENR_IOPBEN ((uint32_t)0x00000008) /*!< I/O port B clock enable */ +#define RCC_APB2ENR_IOPCEN ((uint32_t)0x00000010) /*!< I/O port C clock enable */ +#define RCC_APB2ENR_IOPDEN ((uint32_t)0x00000020) /*!< I/O port D clock enable */ +#define RCC_APB2ENR_ADC1EN ((uint32_t)0x00000200) /*!< ADC 1 interface clock enable */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB2ENR_ADC2EN ((uint32_t)0x00000400) /*!< ADC 2 interface clock enable */ +#endif + +#define RCC_APB2ENR_TIM1EN ((uint32_t)0x00000800) /*!< TIM1 Timer clock enable */ +#define RCC_APB2ENR_SPI1EN ((uint32_t)0x00001000) /*!< SPI 1 clock enable */ +#define RCC_APB2ENR_USART1EN ((uint32_t)0x00004000) /*!< USART1 clock enable */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +#define RCC_APB2ENR_TIM15EN ((uint32_t)0x00010000) /*!< TIM15 Timer clock enable */ +#define RCC_APB2ENR_TIM16EN ((uint32_t)0x00020000) /*!< TIM16 Timer clock enable */ +#define RCC_APB2ENR_TIM17EN ((uint32_t)0x00040000) /*!< TIM17 Timer clock enable */ +#endif + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB2ENR_IOPEEN ((uint32_t)0x00000040) /*!< I/O port E clock enable */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_XL) + #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ + #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ + #define RCC_APB2ENR_TIM8EN ((uint32_t)0x00002000) /*!< TIM8 Timer clock enable */ + #define RCC_APB2ENR_ADC3EN ((uint32_t)0x00008000) /*!< DMA1 clock enable */ +#endif + +#if defined (STM32F10X_HD_VL) + #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ + #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ +#endif + +#ifdef STM32F10X_XL + #define RCC_APB2ENR_TIM9EN ((uint32_t)0x00080000) /*!< TIM9 Timer clock enable */ + #define RCC_APB2ENR_TIM10EN ((uint32_t)0x00100000) /*!< TIM10 Timer clock enable */ + #define RCC_APB2ENR_TIM11EN ((uint32_t)0x00200000) /*!< TIM11 Timer clock enable */ +#endif + +/***************** Bit definition for RCC_APB1ENR register ******************/ +#define RCC_APB1ENR_TIM2EN ((uint32_t)0x00000001) /*!< Timer 2 clock enabled*/ +#define RCC_APB1ENR_TIM3EN ((uint32_t)0x00000002) /*!< Timer 3 clock enable */ +#define RCC_APB1ENR_WWDGEN ((uint32_t)0x00000800) /*!< Window Watchdog clock enable */ +#define RCC_APB1ENR_USART2EN ((uint32_t)0x00020000) /*!< USART 2 clock enable */ +#define RCC_APB1ENR_I2C1EN ((uint32_t)0x00200000) /*!< I2C 1 clock enable */ + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) +#define RCC_APB1ENR_CAN1EN ((uint32_t)0x02000000) /*!< CAN1 clock enable */ +#endif + +#define RCC_APB1ENR_BKPEN ((uint32_t)0x08000000) /*!< Backup interface clock enable */ +#define RCC_APB1ENR_PWREN ((uint32_t)0x10000000) /*!< Power interface clock enable */ + +#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) + #define RCC_APB1ENR_TIM4EN ((uint32_t)0x00000004) /*!< Timer 4 clock enable */ + #define RCC_APB1ENR_SPI2EN ((uint32_t)0x00004000) /*!< SPI 2 clock enable */ + #define RCC_APB1ENR_USART3EN ((uint32_t)0x00040000) /*!< USART 3 clock enable */ + #define RCC_APB1ENR_I2C2EN ((uint32_t)0x00400000) /*!< I2C 2 clock enable */ +#endif /* STM32F10X_LD && STM32F10X_LD_VL */ + +#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) + #define RCC_APB1ENR_USBEN ((uint32_t)0x00800000) /*!< USB Device clock enable */ +#endif + +#if defined (STM32F10X_HD) || defined (STM32F10X_CL) + #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ + #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ + #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ + #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ + #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ + #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ + #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ +#endif + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ + #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ + #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ + #define RCC_APB1ENR_CECEN ((uint32_t)0x40000000) /*!< CEC interface clock enable */ +#endif + +#ifdef STM32F10X_HD_VL + #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ + #define RCC_APB1ENR_TIM12EN ((uint32_t)0x00000040) /*!< TIM12 Timer clock enable */ + #define RCC_APB1ENR_TIM13EN ((uint32_t)0x00000080) /*!< TIM13 Timer clock enable */ + #define RCC_APB1ENR_TIM14EN ((uint32_t)0x00000100) /*!< TIM14 Timer clock enable */ + #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ + #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ + #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ +#endif /* STM32F10X_HD_VL */ + +#ifdef STM32F10X_CL + #define RCC_APB1ENR_CAN2EN ((uint32_t)0x04000000) /*!< CAN2 clock enable */ +#endif /* STM32F10X_CL */ + +#ifdef STM32F10X_XL + #define RCC_APB1ENR_TIM12EN ((uint32_t)0x00000040) /*!< TIM12 Timer clock enable */ + #define RCC_APB1ENR_TIM13EN ((uint32_t)0x00000080) /*!< TIM13 Timer clock enable */ + #define RCC_APB1ENR_TIM14EN ((uint32_t)0x00000100) /*!< TIM14 Timer clock enable */ +#endif /* STM32F10X_XL */ + +/******************* Bit definition for RCC_BDCR register *******************/ +#define RCC_BDCR_LSEON ((uint32_t)0x00000001) /*!< External Low Speed oscillator enable */ +#define RCC_BDCR_LSERDY ((uint32_t)0x00000002) /*!< External Low Speed oscillator Ready */ +#define RCC_BDCR_LSEBYP ((uint32_t)0x00000004) /*!< External Low Speed oscillator Bypass */ + +#define RCC_BDCR_RTCSEL ((uint32_t)0x00000300) /*!< RTCSEL[1:0] bits (RTC clock source selection) */ +#define RCC_BDCR_RTCSEL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define RCC_BDCR_RTCSEL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +/*!< RTC congiguration */ +#define RCC_BDCR_RTCSEL_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ +#define RCC_BDCR_RTCSEL_LSE ((uint32_t)0x00000100) /*!< LSE oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_LSI ((uint32_t)0x00000200) /*!< LSI oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_HSE ((uint32_t)0x00000300) /*!< HSE oscillator clock divided by 128 used as RTC clock */ + +#define RCC_BDCR_RTCEN ((uint32_t)0x00008000) /*!< RTC clock enable */ +#define RCC_BDCR_BDRST ((uint32_t)0x00010000) /*!< Backup domain software reset */ + +/******************* Bit definition for RCC_CSR register ********************/ +#define RCC_CSR_LSION ((uint32_t)0x00000001) /*!< Internal Low Speed oscillator enable */ +#define RCC_CSR_LSIRDY ((uint32_t)0x00000002) /*!< Internal Low Speed oscillator Ready */ +#define RCC_CSR_RMVF ((uint32_t)0x01000000) /*!< Remove reset flag */ +#define RCC_CSR_PINRSTF ((uint32_t)0x04000000) /*!< PIN reset flag */ +#define RCC_CSR_PORRSTF ((uint32_t)0x08000000) /*!< POR/PDR reset flag */ +#define RCC_CSR_SFTRSTF ((uint32_t)0x10000000) /*!< Software Reset flag */ +#define RCC_CSR_IWDGRSTF ((uint32_t)0x20000000) /*!< Independent Watchdog reset flag */ +#define RCC_CSR_WWDGRSTF ((uint32_t)0x40000000) /*!< Window watchdog reset flag */ +#define RCC_CSR_LPWRRSTF ((uint32_t)0x80000000) /*!< Low-Power reset flag */ + +#ifdef STM32F10X_CL +/******************* Bit definition for RCC_AHBRSTR register ****************/ + #define RCC_AHBRSTR_OTGFSRST ((uint32_t)0x00001000) /*!< USB OTG FS reset */ + #define RCC_AHBRSTR_ETHMACRST ((uint32_t)0x00004000) /*!< ETHERNET MAC reset */ + +/******************* Bit definition for RCC_CFGR2 register ******************/ +/*!< PREDIV1 configuration */ + #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ + #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ + #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ + +/*!< PREDIV2 configuration */ + #define RCC_CFGR2_PREDIV2 ((uint32_t)0x000000F0) /*!< PREDIV2[3:0] bits */ + #define RCC_CFGR2_PREDIV2_0 ((uint32_t)0x00000010) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV2_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV2_2 ((uint32_t)0x00000040) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV2_3 ((uint32_t)0x00000080) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV2_DIV1 ((uint32_t)0x00000000) /*!< PREDIV2 input clock not divided */ + #define RCC_CFGR2_PREDIV2_DIV2 ((uint32_t)0x00000010) /*!< PREDIV2 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV2_DIV3 ((uint32_t)0x00000020) /*!< PREDIV2 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV2_DIV4 ((uint32_t)0x00000030) /*!< PREDIV2 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV2_DIV5 ((uint32_t)0x00000040) /*!< PREDIV2 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV2_DIV6 ((uint32_t)0x00000050) /*!< PREDIV2 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV2_DIV7 ((uint32_t)0x00000060) /*!< PREDIV2 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV2_DIV8 ((uint32_t)0x00000070) /*!< PREDIV2 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV2_DIV9 ((uint32_t)0x00000080) /*!< PREDIV2 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV2_DIV10 ((uint32_t)0x00000090) /*!< PREDIV2 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV2_DIV11 ((uint32_t)0x000000A0) /*!< PREDIV2 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV2_DIV12 ((uint32_t)0x000000B0) /*!< PREDIV2 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV2_DIV13 ((uint32_t)0x000000C0) /*!< PREDIV2 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV2_DIV14 ((uint32_t)0x000000D0) /*!< PREDIV2 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV2_DIV15 ((uint32_t)0x000000E0) /*!< PREDIV2 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV2_DIV16 ((uint32_t)0x000000F0) /*!< PREDIV2 input clock divided by 16 */ + +/*!< PLL2MUL configuration */ + #define RCC_CFGR2_PLL2MUL ((uint32_t)0x00000F00) /*!< PLL2MUL[3:0] bits */ + #define RCC_CFGR2_PLL2MUL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ + #define RCC_CFGR2_PLL2MUL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + #define RCC_CFGR2_PLL2MUL_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + #define RCC_CFGR2_PLL2MUL_3 ((uint32_t)0x00000800) /*!< Bit 3 */ + + #define RCC_CFGR2_PLL2MUL8 ((uint32_t)0x00000600) /*!< PLL2 input clock * 8 */ + #define RCC_CFGR2_PLL2MUL9 ((uint32_t)0x00000700) /*!< PLL2 input clock * 9 */ + #define RCC_CFGR2_PLL2MUL10 ((uint32_t)0x00000800) /*!< PLL2 input clock * 10 */ + #define RCC_CFGR2_PLL2MUL11 ((uint32_t)0x00000900) /*!< PLL2 input clock * 11 */ + #define RCC_CFGR2_PLL2MUL12 ((uint32_t)0x00000A00) /*!< PLL2 input clock * 12 */ + #define RCC_CFGR2_PLL2MUL13 ((uint32_t)0x00000B00) /*!< PLL2 input clock * 13 */ + #define RCC_CFGR2_PLL2MUL14 ((uint32_t)0x00000C00) /*!< PLL2 input clock * 14 */ + #define RCC_CFGR2_PLL2MUL16 ((uint32_t)0x00000E00) /*!< PLL2 input clock * 16 */ + #define RCC_CFGR2_PLL2MUL20 ((uint32_t)0x00000F00) /*!< PLL2 input clock * 20 */ + +/*!< PLL3MUL configuration */ + #define RCC_CFGR2_PLL3MUL ((uint32_t)0x0000F000) /*!< PLL3MUL[3:0] bits */ + #define RCC_CFGR2_PLL3MUL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ + #define RCC_CFGR2_PLL3MUL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + #define RCC_CFGR2_PLL3MUL_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + #define RCC_CFGR2_PLL3MUL_3 ((uint32_t)0x00008000) /*!< Bit 3 */ + + #define RCC_CFGR2_PLL3MUL8 ((uint32_t)0x00006000) /*!< PLL3 input clock * 8 */ + #define RCC_CFGR2_PLL3MUL9 ((uint32_t)0x00007000) /*!< PLL3 input clock * 9 */ + #define RCC_CFGR2_PLL3MUL10 ((uint32_t)0x00008000) /*!< PLL3 input clock * 10 */ + #define RCC_CFGR2_PLL3MUL11 ((uint32_t)0x00009000) /*!< PLL3 input clock * 11 */ + #define RCC_CFGR2_PLL3MUL12 ((uint32_t)0x0000A000) /*!< PLL3 input clock * 12 */ + #define RCC_CFGR2_PLL3MUL13 ((uint32_t)0x0000B000) /*!< PLL3 input clock * 13 */ + #define RCC_CFGR2_PLL3MUL14 ((uint32_t)0x0000C000) /*!< PLL3 input clock * 14 */ + #define RCC_CFGR2_PLL3MUL16 ((uint32_t)0x0000E000) /*!< PLL3 input clock * 16 */ + #define RCC_CFGR2_PLL3MUL20 ((uint32_t)0x0000F000) /*!< PLL3 input clock * 20 */ + + #define RCC_CFGR2_PREDIV1SRC ((uint32_t)0x00010000) /*!< PREDIV1 entry clock source */ + #define RCC_CFGR2_PREDIV1SRC_PLL2 ((uint32_t)0x00010000) /*!< PLL2 selected as PREDIV1 entry clock source */ + #define RCC_CFGR2_PREDIV1SRC_HSE ((uint32_t)0x00000000) /*!< HSE selected as PREDIV1 entry clock source */ + #define RCC_CFGR2_I2S2SRC ((uint32_t)0x00020000) /*!< I2S2 entry clock source */ + #define RCC_CFGR2_I2S3SRC ((uint32_t)0x00040000) /*!< I2S3 clock source */ +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/******************* Bit definition for RCC_CFGR2 register ******************/ +/*!< PREDIV1 configuration */ + #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ + #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ + #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ + + #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ + #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ + #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ + #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ + #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ + #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ + #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ + #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ + #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ + #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ + #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ + #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ + #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ + #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ + #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ + #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ +#endif + +/******************************************************************************/ +/* */ +/* General Purpose and Alternate Function I/O */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for GPIO_CRL register *******************/ +#define GPIO_CRL_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ + +#define GPIO_CRL_MODE0 ((uint32_t)0x00000003) /*!< MODE0[1:0] bits (Port x mode bits, pin 0) */ +#define GPIO_CRL_MODE0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define GPIO_CRL_MODE0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define GPIO_CRL_MODE1 ((uint32_t)0x00000030) /*!< MODE1[1:0] bits (Port x mode bits, pin 1) */ +#define GPIO_CRL_MODE1_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define GPIO_CRL_MODE1_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define GPIO_CRL_MODE2 ((uint32_t)0x00000300) /*!< MODE2[1:0] bits (Port x mode bits, pin 2) */ +#define GPIO_CRL_MODE2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define GPIO_CRL_MODE2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +#define GPIO_CRL_MODE3 ((uint32_t)0x00003000) /*!< MODE3[1:0] bits (Port x mode bits, pin 3) */ +#define GPIO_CRL_MODE3_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define GPIO_CRL_MODE3_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE4 ((uint32_t)0x00030000) /*!< MODE4[1:0] bits (Port x mode bits, pin 4) */ +#define GPIO_CRL_MODE4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define GPIO_CRL_MODE4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE5 ((uint32_t)0x00300000) /*!< MODE5[1:0] bits (Port x mode bits, pin 5) */ +#define GPIO_CRL_MODE5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define GPIO_CRL_MODE5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE6 ((uint32_t)0x03000000) /*!< MODE6[1:0] bits (Port x mode bits, pin 6) */ +#define GPIO_CRL_MODE6_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define GPIO_CRL_MODE6_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + +#define GPIO_CRL_MODE7 ((uint32_t)0x30000000) /*!< MODE7[1:0] bits (Port x mode bits, pin 7) */ +#define GPIO_CRL_MODE7_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define GPIO_CRL_MODE7_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ + +#define GPIO_CRL_CNF0 ((uint32_t)0x0000000C) /*!< CNF0[1:0] bits (Port x configuration bits, pin 0) */ +#define GPIO_CRL_CNF0_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define GPIO_CRL_CNF0_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define GPIO_CRL_CNF1 ((uint32_t)0x000000C0) /*!< CNF1[1:0] bits (Port x configuration bits, pin 1) */ +#define GPIO_CRL_CNF1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define GPIO_CRL_CNF1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define GPIO_CRL_CNF2 ((uint32_t)0x00000C00) /*!< CNF2[1:0] bits (Port x configuration bits, pin 2) */ +#define GPIO_CRL_CNF2_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define GPIO_CRL_CNF2_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +#define GPIO_CRL_CNF3 ((uint32_t)0x0000C000) /*!< CNF3[1:0] bits (Port x configuration bits, pin 3) */ +#define GPIO_CRL_CNF3_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define GPIO_CRL_CNF3_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF4 ((uint32_t)0x000C0000) /*!< CNF4[1:0] bits (Port x configuration bits, pin 4) */ +#define GPIO_CRL_CNF4_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define GPIO_CRL_CNF4_1 ((uint32_t)0x00080000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF5 ((uint32_t)0x00C00000) /*!< CNF5[1:0] bits (Port x configuration bits, pin 5) */ +#define GPIO_CRL_CNF5_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define GPIO_CRL_CNF5_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF6 ((uint32_t)0x0C000000) /*!< CNF6[1:0] bits (Port x configuration bits, pin 6) */ +#define GPIO_CRL_CNF6_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define GPIO_CRL_CNF6_1 ((uint32_t)0x08000000) /*!< Bit 1 */ + +#define GPIO_CRL_CNF7 ((uint32_t)0xC0000000) /*!< CNF7[1:0] bits (Port x configuration bits, pin 7) */ +#define GPIO_CRL_CNF7_0 ((uint32_t)0x40000000) /*!< Bit 0 */ +#define GPIO_CRL_CNF7_1 ((uint32_t)0x80000000) /*!< Bit 1 */ + +/******************* Bit definition for GPIO_CRH register *******************/ +#define GPIO_CRH_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ + +#define GPIO_CRH_MODE8 ((uint32_t)0x00000003) /*!< MODE8[1:0] bits (Port x mode bits, pin 8) */ +#define GPIO_CRH_MODE8_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define GPIO_CRH_MODE8_1 ((uint32_t)0x00000002) /*!< Bit 1 */ + +#define GPIO_CRH_MODE9 ((uint32_t)0x00000030) /*!< MODE9[1:0] bits (Port x mode bits, pin 9) */ +#define GPIO_CRH_MODE9_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define GPIO_CRH_MODE9_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +#define GPIO_CRH_MODE10 ((uint32_t)0x00000300) /*!< MODE10[1:0] bits (Port x mode bits, pin 10) */ +#define GPIO_CRH_MODE10_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define GPIO_CRH_MODE10_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +#define GPIO_CRH_MODE11 ((uint32_t)0x00003000) /*!< MODE11[1:0] bits (Port x mode bits, pin 11) */ +#define GPIO_CRH_MODE11_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define GPIO_CRH_MODE11_1 ((uint32_t)0x00002000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE12 ((uint32_t)0x00030000) /*!< MODE12[1:0] bits (Port x mode bits, pin 12) */ +#define GPIO_CRH_MODE12_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define GPIO_CRH_MODE12_1 ((uint32_t)0x00020000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE13 ((uint32_t)0x00300000) /*!< MODE13[1:0] bits (Port x mode bits, pin 13) */ +#define GPIO_CRH_MODE13_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define GPIO_CRH_MODE13_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE14 ((uint32_t)0x03000000) /*!< MODE14[1:0] bits (Port x mode bits, pin 14) */ +#define GPIO_CRH_MODE14_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define GPIO_CRH_MODE14_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + +#define GPIO_CRH_MODE15 ((uint32_t)0x30000000) /*!< MODE15[1:0] bits (Port x mode bits, pin 15) */ +#define GPIO_CRH_MODE15_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define GPIO_CRH_MODE15_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ + +#define GPIO_CRH_CNF8 ((uint32_t)0x0000000C) /*!< CNF8[1:0] bits (Port x configuration bits, pin 8) */ +#define GPIO_CRH_CNF8_0 ((uint32_t)0x00000004) /*!< Bit 0 */ +#define GPIO_CRH_CNF8_1 ((uint32_t)0x00000008) /*!< Bit 1 */ + +#define GPIO_CRH_CNF9 ((uint32_t)0x000000C0) /*!< CNF9[1:0] bits (Port x configuration bits, pin 9) */ +#define GPIO_CRH_CNF9_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define GPIO_CRH_CNF9_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +#define GPIO_CRH_CNF10 ((uint32_t)0x00000C00) /*!< CNF10[1:0] bits (Port x configuration bits, pin 10) */ +#define GPIO_CRH_CNF10_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define GPIO_CRH_CNF10_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +#define GPIO_CRH_CNF11 ((uint32_t)0x0000C000) /*!< CNF11[1:0] bits (Port x configuration bits, pin 11) */ +#define GPIO_CRH_CNF11_0 ((uint32_t)0x00004000) /*!< Bit 0 */ +#define GPIO_CRH_CNF11_1 ((uint32_t)0x00008000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF12 ((uint32_t)0x000C0000) /*!< CNF12[1:0] bits (Port x configuration bits, pin 12) */ +#define GPIO_CRH_CNF12_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define GPIO_CRH_CNF12_1 ((uint32_t)0x00080000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF13 ((uint32_t)0x00C00000) /*!< CNF13[1:0] bits (Port x configuration bits, pin 13) */ +#define GPIO_CRH_CNF13_0 ((uint32_t)0x00400000) /*!< Bit 0 */ +#define GPIO_CRH_CNF13_1 ((uint32_t)0x00800000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF14 ((uint32_t)0x0C000000) /*!< CNF14[1:0] bits (Port x configuration bits, pin 14) */ +#define GPIO_CRH_CNF14_0 ((uint32_t)0x04000000) /*!< Bit 0 */ +#define GPIO_CRH_CNF14_1 ((uint32_t)0x08000000) /*!< Bit 1 */ + +#define GPIO_CRH_CNF15 ((uint32_t)0xC0000000) /*!< CNF15[1:0] bits (Port x configuration bits, pin 15) */ +#define GPIO_CRH_CNF15_0 ((uint32_t)0x40000000) /*!< Bit 0 */ +#define GPIO_CRH_CNF15_1 ((uint32_t)0x80000000) /*!< Bit 1 */ + +/*!<****************** Bit definition for GPIO_IDR register *******************/ +#define GPIO_IDR_IDR0 ((uint16_t)0x0001) /*!< Port input data, bit 0 */ +#define GPIO_IDR_IDR1 ((uint16_t)0x0002) /*!< Port input data, bit 1 */ +#define GPIO_IDR_IDR2 ((uint16_t)0x0004) /*!< Port input data, bit 2 */ +#define GPIO_IDR_IDR3 ((uint16_t)0x0008) /*!< Port input data, bit 3 */ +#define GPIO_IDR_IDR4 ((uint16_t)0x0010) /*!< Port input data, bit 4 */ +#define GPIO_IDR_IDR5 ((uint16_t)0x0020) /*!< Port input data, bit 5 */ +#define GPIO_IDR_IDR6 ((uint16_t)0x0040) /*!< Port input data, bit 6 */ +#define GPIO_IDR_IDR7 ((uint16_t)0x0080) /*!< Port input data, bit 7 */ +#define GPIO_IDR_IDR8 ((uint16_t)0x0100) /*!< Port input data, bit 8 */ +#define GPIO_IDR_IDR9 ((uint16_t)0x0200) /*!< Port input data, bit 9 */ +#define GPIO_IDR_IDR10 ((uint16_t)0x0400) /*!< Port input data, bit 10 */ +#define GPIO_IDR_IDR11 ((uint16_t)0x0800) /*!< Port input data, bit 11 */ +#define GPIO_IDR_IDR12 ((uint16_t)0x1000) /*!< Port input data, bit 12 */ +#define GPIO_IDR_IDR13 ((uint16_t)0x2000) /*!< Port input data, bit 13 */ +#define GPIO_IDR_IDR14 ((uint16_t)0x4000) /*!< Port input data, bit 14 */ +#define GPIO_IDR_IDR15 ((uint16_t)0x8000) /*!< Port input data, bit 15 */ + +/******************* Bit definition for GPIO_ODR register *******************/ +#define GPIO_ODR_ODR0 ((uint16_t)0x0001) /*!< Port output data, bit 0 */ +#define GPIO_ODR_ODR1 ((uint16_t)0x0002) /*!< Port output data, bit 1 */ +#define GPIO_ODR_ODR2 ((uint16_t)0x0004) /*!< Port output data, bit 2 */ +#define GPIO_ODR_ODR3 ((uint16_t)0x0008) /*!< Port output data, bit 3 */ +#define GPIO_ODR_ODR4 ((uint16_t)0x0010) /*!< Port output data, bit 4 */ +#define GPIO_ODR_ODR5 ((uint16_t)0x0020) /*!< Port output data, bit 5 */ +#define GPIO_ODR_ODR6 ((uint16_t)0x0040) /*!< Port output data, bit 6 */ +#define GPIO_ODR_ODR7 ((uint16_t)0x0080) /*!< Port output data, bit 7 */ +#define GPIO_ODR_ODR8 ((uint16_t)0x0100) /*!< Port output data, bit 8 */ +#define GPIO_ODR_ODR9 ((uint16_t)0x0200) /*!< Port output data, bit 9 */ +#define GPIO_ODR_ODR10 ((uint16_t)0x0400) /*!< Port output data, bit 10 */ +#define GPIO_ODR_ODR11 ((uint16_t)0x0800) /*!< Port output data, bit 11 */ +#define GPIO_ODR_ODR12 ((uint16_t)0x1000) /*!< Port output data, bit 12 */ +#define GPIO_ODR_ODR13 ((uint16_t)0x2000) /*!< Port output data, bit 13 */ +#define GPIO_ODR_ODR14 ((uint16_t)0x4000) /*!< Port output data, bit 14 */ +#define GPIO_ODR_ODR15 ((uint16_t)0x8000) /*!< Port output data, bit 15 */ + +/****************** Bit definition for GPIO_BSRR register *******************/ +#define GPIO_BSRR_BS0 ((uint32_t)0x00000001) /*!< Port x Set bit 0 */ +#define GPIO_BSRR_BS1 ((uint32_t)0x00000002) /*!< Port x Set bit 1 */ +#define GPIO_BSRR_BS2 ((uint32_t)0x00000004) /*!< Port x Set bit 2 */ +#define GPIO_BSRR_BS3 ((uint32_t)0x00000008) /*!< Port x Set bit 3 */ +#define GPIO_BSRR_BS4 ((uint32_t)0x00000010) /*!< Port x Set bit 4 */ +#define GPIO_BSRR_BS5 ((uint32_t)0x00000020) /*!< Port x Set bit 5 */ +#define GPIO_BSRR_BS6 ((uint32_t)0x00000040) /*!< Port x Set bit 6 */ +#define GPIO_BSRR_BS7 ((uint32_t)0x00000080) /*!< Port x Set bit 7 */ +#define GPIO_BSRR_BS8 ((uint32_t)0x00000100) /*!< Port x Set bit 8 */ +#define GPIO_BSRR_BS9 ((uint32_t)0x00000200) /*!< Port x Set bit 9 */ +#define GPIO_BSRR_BS10 ((uint32_t)0x00000400) /*!< Port x Set bit 10 */ +#define GPIO_BSRR_BS11 ((uint32_t)0x00000800) /*!< Port x Set bit 11 */ +#define GPIO_BSRR_BS12 ((uint32_t)0x00001000) /*!< Port x Set bit 12 */ +#define GPIO_BSRR_BS13 ((uint32_t)0x00002000) /*!< Port x Set bit 13 */ +#define GPIO_BSRR_BS14 ((uint32_t)0x00004000) /*!< Port x Set bit 14 */ +#define GPIO_BSRR_BS15 ((uint32_t)0x00008000) /*!< Port x Set bit 15 */ + +#define GPIO_BSRR_BR0 ((uint32_t)0x00010000) /*!< Port x Reset bit 0 */ +#define GPIO_BSRR_BR1 ((uint32_t)0x00020000) /*!< Port x Reset bit 1 */ +#define GPIO_BSRR_BR2 ((uint32_t)0x00040000) /*!< Port x Reset bit 2 */ +#define GPIO_BSRR_BR3 ((uint32_t)0x00080000) /*!< Port x Reset bit 3 */ +#define GPIO_BSRR_BR4 ((uint32_t)0x00100000) /*!< Port x Reset bit 4 */ +#define GPIO_BSRR_BR5 ((uint32_t)0x00200000) /*!< Port x Reset bit 5 */ +#define GPIO_BSRR_BR6 ((uint32_t)0x00400000) /*!< Port x Reset bit 6 */ +#define GPIO_BSRR_BR7 ((uint32_t)0x00800000) /*!< Port x Reset bit 7 */ +#define GPIO_BSRR_BR8 ((uint32_t)0x01000000) /*!< Port x Reset bit 8 */ +#define GPIO_BSRR_BR9 ((uint32_t)0x02000000) /*!< Port x Reset bit 9 */ +#define GPIO_BSRR_BR10 ((uint32_t)0x04000000) /*!< Port x Reset bit 10 */ +#define GPIO_BSRR_BR11 ((uint32_t)0x08000000) /*!< Port x Reset bit 11 */ +#define GPIO_BSRR_BR12 ((uint32_t)0x10000000) /*!< Port x Reset bit 12 */ +#define GPIO_BSRR_BR13 ((uint32_t)0x20000000) /*!< Port x Reset bit 13 */ +#define GPIO_BSRR_BR14 ((uint32_t)0x40000000) /*!< Port x Reset bit 14 */ +#define GPIO_BSRR_BR15 ((uint32_t)0x80000000) /*!< Port x Reset bit 15 */ + +/******************* Bit definition for GPIO_BRR register *******************/ +#define GPIO_BRR_BR0 ((uint16_t)0x0001) /*!< Port x Reset bit 0 */ +#define GPIO_BRR_BR1 ((uint16_t)0x0002) /*!< Port x Reset bit 1 */ +#define GPIO_BRR_BR2 ((uint16_t)0x0004) /*!< Port x Reset bit 2 */ +#define GPIO_BRR_BR3 ((uint16_t)0x0008) /*!< Port x Reset bit 3 */ +#define GPIO_BRR_BR4 ((uint16_t)0x0010) /*!< Port x Reset bit 4 */ +#define GPIO_BRR_BR5 ((uint16_t)0x0020) /*!< Port x Reset bit 5 */ +#define GPIO_BRR_BR6 ((uint16_t)0x0040) /*!< Port x Reset bit 6 */ +#define GPIO_BRR_BR7 ((uint16_t)0x0080) /*!< Port x Reset bit 7 */ +#define GPIO_BRR_BR8 ((uint16_t)0x0100) /*!< Port x Reset bit 8 */ +#define GPIO_BRR_BR9 ((uint16_t)0x0200) /*!< Port x Reset bit 9 */ +#define GPIO_BRR_BR10 ((uint16_t)0x0400) /*!< Port x Reset bit 10 */ +#define GPIO_BRR_BR11 ((uint16_t)0x0800) /*!< Port x Reset bit 11 */ +#define GPIO_BRR_BR12 ((uint16_t)0x1000) /*!< Port x Reset bit 12 */ +#define GPIO_BRR_BR13 ((uint16_t)0x2000) /*!< Port x Reset bit 13 */ +#define GPIO_BRR_BR14 ((uint16_t)0x4000) /*!< Port x Reset bit 14 */ +#define GPIO_BRR_BR15 ((uint16_t)0x8000) /*!< Port x Reset bit 15 */ + +/****************** Bit definition for GPIO_LCKR register *******************/ +#define GPIO_LCKR_LCK0 ((uint32_t)0x00000001) /*!< Port x Lock bit 0 */ +#define GPIO_LCKR_LCK1 ((uint32_t)0x00000002) /*!< Port x Lock bit 1 */ +#define GPIO_LCKR_LCK2 ((uint32_t)0x00000004) /*!< Port x Lock bit 2 */ +#define GPIO_LCKR_LCK3 ((uint32_t)0x00000008) /*!< Port x Lock bit 3 */ +#define GPIO_LCKR_LCK4 ((uint32_t)0x00000010) /*!< Port x Lock bit 4 */ +#define GPIO_LCKR_LCK5 ((uint32_t)0x00000020) /*!< Port x Lock bit 5 */ +#define GPIO_LCKR_LCK6 ((uint32_t)0x00000040) /*!< Port x Lock bit 6 */ +#define GPIO_LCKR_LCK7 ((uint32_t)0x00000080) /*!< Port x Lock bit 7 */ +#define GPIO_LCKR_LCK8 ((uint32_t)0x00000100) /*!< Port x Lock bit 8 */ +#define GPIO_LCKR_LCK9 ((uint32_t)0x00000200) /*!< Port x Lock bit 9 */ +#define GPIO_LCKR_LCK10 ((uint32_t)0x00000400) /*!< Port x Lock bit 10 */ +#define GPIO_LCKR_LCK11 ((uint32_t)0x00000800) /*!< Port x Lock bit 11 */ +#define GPIO_LCKR_LCK12 ((uint32_t)0x00001000) /*!< Port x Lock bit 12 */ +#define GPIO_LCKR_LCK13 ((uint32_t)0x00002000) /*!< Port x Lock bit 13 */ +#define GPIO_LCKR_LCK14 ((uint32_t)0x00004000) /*!< Port x Lock bit 14 */ +#define GPIO_LCKR_LCK15 ((uint32_t)0x00008000) /*!< Port x Lock bit 15 */ +#define GPIO_LCKR_LCKK ((uint32_t)0x00010000) /*!< Lock key */ + +/*----------------------------------------------------------------------------*/ + +/****************** Bit definition for AFIO_EVCR register *******************/ +#define AFIO_EVCR_PIN ((uint8_t)0x0F) /*!< PIN[3:0] bits (Pin selection) */ +#define AFIO_EVCR_PIN_0 ((uint8_t)0x01) /*!< Bit 0 */ +#define AFIO_EVCR_PIN_1 ((uint8_t)0x02) /*!< Bit 1 */ +#define AFIO_EVCR_PIN_2 ((uint8_t)0x04) /*!< Bit 2 */ +#define AFIO_EVCR_PIN_3 ((uint8_t)0x08) /*!< Bit 3 */ + +/*!< PIN configuration */ +#define AFIO_EVCR_PIN_PX0 ((uint8_t)0x00) /*!< Pin 0 selected */ +#define AFIO_EVCR_PIN_PX1 ((uint8_t)0x01) /*!< Pin 1 selected */ +#define AFIO_EVCR_PIN_PX2 ((uint8_t)0x02) /*!< Pin 2 selected */ +#define AFIO_EVCR_PIN_PX3 ((uint8_t)0x03) /*!< Pin 3 selected */ +#define AFIO_EVCR_PIN_PX4 ((uint8_t)0x04) /*!< Pin 4 selected */ +#define AFIO_EVCR_PIN_PX5 ((uint8_t)0x05) /*!< Pin 5 selected */ +#define AFIO_EVCR_PIN_PX6 ((uint8_t)0x06) /*!< Pin 6 selected */ +#define AFIO_EVCR_PIN_PX7 ((uint8_t)0x07) /*!< Pin 7 selected */ +#define AFIO_EVCR_PIN_PX8 ((uint8_t)0x08) /*!< Pin 8 selected */ +#define AFIO_EVCR_PIN_PX9 ((uint8_t)0x09) /*!< Pin 9 selected */ +#define AFIO_EVCR_PIN_PX10 ((uint8_t)0x0A) /*!< Pin 10 selected */ +#define AFIO_EVCR_PIN_PX11 ((uint8_t)0x0B) /*!< Pin 11 selected */ +#define AFIO_EVCR_PIN_PX12 ((uint8_t)0x0C) /*!< Pin 12 selected */ +#define AFIO_EVCR_PIN_PX13 ((uint8_t)0x0D) /*!< Pin 13 selected */ +#define AFIO_EVCR_PIN_PX14 ((uint8_t)0x0E) /*!< Pin 14 selected */ +#define AFIO_EVCR_PIN_PX15 ((uint8_t)0x0F) /*!< Pin 15 selected */ + +#define AFIO_EVCR_PORT ((uint8_t)0x70) /*!< PORT[2:0] bits (Port selection) */ +#define AFIO_EVCR_PORT_0 ((uint8_t)0x10) /*!< Bit 0 */ +#define AFIO_EVCR_PORT_1 ((uint8_t)0x20) /*!< Bit 1 */ +#define AFIO_EVCR_PORT_2 ((uint8_t)0x40) /*!< Bit 2 */ + +/*!< PORT configuration */ +#define AFIO_EVCR_PORT_PA ((uint8_t)0x00) /*!< Port A selected */ +#define AFIO_EVCR_PORT_PB ((uint8_t)0x10) /*!< Port B selected */ +#define AFIO_EVCR_PORT_PC ((uint8_t)0x20) /*!< Port C selected */ +#define AFIO_EVCR_PORT_PD ((uint8_t)0x30) /*!< Port D selected */ +#define AFIO_EVCR_PORT_PE ((uint8_t)0x40) /*!< Port E selected */ + +#define AFIO_EVCR_EVOE ((uint8_t)0x80) /*!< Event Output Enable */ + +/****************** Bit definition for AFIO_MAPR register *******************/ +#define AFIO_MAPR_SPI1_REMAP ((uint32_t)0x00000001) /*!< SPI1 remapping */ +#define AFIO_MAPR_I2C1_REMAP ((uint32_t)0x00000002) /*!< I2C1 remapping */ +#define AFIO_MAPR_USART1_REMAP ((uint32_t)0x00000004) /*!< USART1 remapping */ +#define AFIO_MAPR_USART2_REMAP ((uint32_t)0x00000008) /*!< USART2 remapping */ + +#define AFIO_MAPR_USART3_REMAP ((uint32_t)0x00000030) /*!< USART3_REMAP[1:0] bits (USART3 remapping) */ +#define AFIO_MAPR_USART3_REMAP_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define AFIO_MAPR_USART3_REMAP_1 ((uint32_t)0x00000020) /*!< Bit 1 */ + +/* USART3_REMAP configuration */ +#define AFIO_MAPR_USART3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP ((uint32_t)0x00000010) /*!< Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_FULLREMAP ((uint32_t)0x00000030) /*!< Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */ + +#define AFIO_MAPR_TIM1_REMAP ((uint32_t)0x000000C0) /*!< TIM1_REMAP[1:0] bits (TIM1 remapping) */ +#define AFIO_MAPR_TIM1_REMAP_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define AFIO_MAPR_TIM1_REMAP_1 ((uint32_t)0x00000080) /*!< Bit 1 */ + +/*!< TIM1_REMAP configuration */ +#define AFIO_MAPR_TIM1_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */ +#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP ((uint32_t)0x00000040) /*!< Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */ +#define AFIO_MAPR_TIM1_REMAP_FULLREMAP ((uint32_t)0x000000C0) /*!< Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */ + +#define AFIO_MAPR_TIM2_REMAP ((uint32_t)0x00000300) /*!< TIM2_REMAP[1:0] bits (TIM2 remapping) */ +#define AFIO_MAPR_TIM2_REMAP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define AFIO_MAPR_TIM2_REMAP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ + +/*!< TIM2_REMAP configuration */ +#define AFIO_MAPR_TIM2_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1 ((uint32_t)0x00000100) /*!< Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2 ((uint32_t)0x00000200) /*!< Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */ +#define AFIO_MAPR_TIM2_REMAP_FULLREMAP ((uint32_t)0x00000300) /*!< Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */ + +#define AFIO_MAPR_TIM3_REMAP ((uint32_t)0x00000C00) /*!< TIM3_REMAP[1:0] bits (TIM3 remapping) */ +#define AFIO_MAPR_TIM3_REMAP_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define AFIO_MAPR_TIM3_REMAP_1 ((uint32_t)0x00000800) /*!< Bit 1 */ + +/*!< TIM3_REMAP configuration */ +#define AFIO_MAPR_TIM3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP ((uint32_t)0x00000800) /*!< Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_FULLREMAP ((uint32_t)0x00000C00) /*!< Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */ + +#define AFIO_MAPR_TIM4_REMAP ((uint32_t)0x00001000) /*!< TIM4_REMAP bit (TIM4 remapping) */ + +#define AFIO_MAPR_CAN_REMAP ((uint32_t)0x00006000) /*!< CAN_REMAP[1:0] bits (CAN Alternate function remapping) */ +#define AFIO_MAPR_CAN_REMAP_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define AFIO_MAPR_CAN_REMAP_1 ((uint32_t)0x00004000) /*!< Bit 1 */ + +/*!< CAN_REMAP configuration */ +#define AFIO_MAPR_CAN_REMAP_REMAP1 ((uint32_t)0x00000000) /*!< CANRX mapped to PA11, CANTX mapped to PA12 */ +#define AFIO_MAPR_CAN_REMAP_REMAP2 ((uint32_t)0x00004000) /*!< CANRX mapped to PB8, CANTX mapped to PB9 */ +#define AFIO_MAPR_CAN_REMAP_REMAP3 ((uint32_t)0x00006000) /*!< CANRX mapped to PD0, CANTX mapped to PD1 */ + +#define AFIO_MAPR_PD01_REMAP ((uint32_t)0x00008000) /*!< Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ +#define AFIO_MAPR_TIM5CH4_IREMAP ((uint32_t)0x00010000) /*!< TIM5 Channel4 Internal Remap */ +#define AFIO_MAPR_ADC1_ETRGINJ_REMAP ((uint32_t)0x00020000) /*!< ADC 1 External Trigger Injected Conversion remapping */ +#define AFIO_MAPR_ADC1_ETRGREG_REMAP ((uint32_t)0x00040000) /*!< ADC 1 External Trigger Regular Conversion remapping */ +#define AFIO_MAPR_ADC2_ETRGINJ_REMAP ((uint32_t)0x00080000) /*!< ADC 2 External Trigger Injected Conversion remapping */ +#define AFIO_MAPR_ADC2_ETRGREG_REMAP ((uint32_t)0x00100000) /*!< ADC 2 External Trigger Regular Conversion remapping */ + +/*!< SWJ_CFG configuration */ +#define AFIO_MAPR_SWJ_CFG ((uint32_t)0x07000000) /*!< SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ +#define AFIO_MAPR_SWJ_CFG_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define AFIO_MAPR_SWJ_CFG_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define AFIO_MAPR_SWJ_CFG_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + +#define AFIO_MAPR_SWJ_CFG_RESET ((uint32_t)0x00000000) /*!< Full SWJ (JTAG-DP + SW-DP) : Reset State */ +#define AFIO_MAPR_SWJ_CFG_NOJNTRST ((uint32_t)0x01000000) /*!< Full SWJ (JTAG-DP + SW-DP) but without JNTRST */ +#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE ((uint32_t)0x02000000) /*!< JTAG-DP Disabled and SW-DP Enabled */ +#define AFIO_MAPR_SWJ_CFG_DISABLE ((uint32_t)0x04000000) /*!< JTAG-DP Disabled and SW-DP Disabled */ + +#ifdef STM32F10X_CL +/*!< ETH_REMAP configuration */ + #define AFIO_MAPR_ETH_REMAP ((uint32_t)0x00200000) /*!< SPI3_REMAP bit (Ethernet MAC I/O remapping) */ + +/*!< CAN2_REMAP configuration */ + #define AFIO_MAPR_CAN2_REMAP ((uint32_t)0x00400000) /*!< CAN2_REMAP bit (CAN2 I/O remapping) */ + +/*!< MII_RMII_SEL configuration */ + #define AFIO_MAPR_MII_RMII_SEL ((uint32_t)0x00800000) /*!< MII_RMII_SEL bit (Ethernet MII or RMII selection) */ + +/*!< SPI3_REMAP configuration */ + #define AFIO_MAPR_SPI3_REMAP ((uint32_t)0x10000000) /*!< SPI3_REMAP bit (SPI3 remapping) */ + +/*!< TIM2ITR1_IREMAP configuration */ + #define AFIO_MAPR_TIM2ITR1_IREMAP ((uint32_t)0x20000000) /*!< TIM2ITR1_IREMAP bit (TIM2 internal trigger 1 remapping) */ + +/*!< PTP_PPS_REMAP configuration */ + #define AFIO_MAPR_PTP_PPS_REMAP ((uint32_t)0x20000000) /*!< PTP_PPS_REMAP bit (Ethernet PTP PPS remapping) */ +#endif + +/***************** Bit definition for AFIO_EXTICR1 register *****************/ +#define AFIO_EXTICR1_EXTI0 ((uint16_t)0x000F) /*!< EXTI 0 configuration */ +#define AFIO_EXTICR1_EXTI1 ((uint16_t)0x00F0) /*!< EXTI 1 configuration */ +#define AFIO_EXTICR1_EXTI2 ((uint16_t)0x0F00) /*!< EXTI 2 configuration */ +#define AFIO_EXTICR1_EXTI3 ((uint16_t)0xF000) /*!< EXTI 3 configuration */ + +/*!< EXTI0 configuration */ +#define AFIO_EXTICR1_EXTI0_PA ((uint16_t)0x0000) /*!< PA[0] pin */ +#define AFIO_EXTICR1_EXTI0_PB ((uint16_t)0x0001) /*!< PB[0] pin */ +#define AFIO_EXTICR1_EXTI0_PC ((uint16_t)0x0002) /*!< PC[0] pin */ +#define AFIO_EXTICR1_EXTI0_PD ((uint16_t)0x0003) /*!< PD[0] pin */ +#define AFIO_EXTICR1_EXTI0_PE ((uint16_t)0x0004) /*!< PE[0] pin */ +#define AFIO_EXTICR1_EXTI0_PF ((uint16_t)0x0005) /*!< PF[0] pin */ +#define AFIO_EXTICR1_EXTI0_PG ((uint16_t)0x0006) /*!< PG[0] pin */ + +/*!< EXTI1 configuration */ +#define AFIO_EXTICR1_EXTI1_PA ((uint16_t)0x0000) /*!< PA[1] pin */ +#define AFIO_EXTICR1_EXTI1_PB ((uint16_t)0x0010) /*!< PB[1] pin */ +#define AFIO_EXTICR1_EXTI1_PC ((uint16_t)0x0020) /*!< PC[1] pin */ +#define AFIO_EXTICR1_EXTI1_PD ((uint16_t)0x0030) /*!< PD[1] pin */ +#define AFIO_EXTICR1_EXTI1_PE ((uint16_t)0x0040) /*!< PE[1] pin */ +#define AFIO_EXTICR1_EXTI1_PF ((uint16_t)0x0050) /*!< PF[1] pin */ +#define AFIO_EXTICR1_EXTI1_PG ((uint16_t)0x0060) /*!< PG[1] pin */ + +/*!< EXTI2 configuration */ +#define AFIO_EXTICR1_EXTI2_PA ((uint16_t)0x0000) /*!< PA[2] pin */ +#define AFIO_EXTICR1_EXTI2_PB ((uint16_t)0x0100) /*!< PB[2] pin */ +#define AFIO_EXTICR1_EXTI2_PC ((uint16_t)0x0200) /*!< PC[2] pin */ +#define AFIO_EXTICR1_EXTI2_PD ((uint16_t)0x0300) /*!< PD[2] pin */ +#define AFIO_EXTICR1_EXTI2_PE ((uint16_t)0x0400) /*!< PE[2] pin */ +#define AFIO_EXTICR1_EXTI2_PF ((uint16_t)0x0500) /*!< PF[2] pin */ +#define AFIO_EXTICR1_EXTI2_PG ((uint16_t)0x0600) /*!< PG[2] pin */ + +/*!< EXTI3 configuration */ +#define AFIO_EXTICR1_EXTI3_PA ((uint16_t)0x0000) /*!< PA[3] pin */ +#define AFIO_EXTICR1_EXTI3_PB ((uint16_t)0x1000) /*!< PB[3] pin */ +#define AFIO_EXTICR1_EXTI3_PC ((uint16_t)0x2000) /*!< PC[3] pin */ +#define AFIO_EXTICR1_EXTI3_PD ((uint16_t)0x3000) /*!< PD[3] pin */ +#define AFIO_EXTICR1_EXTI3_PE ((uint16_t)0x4000) /*!< PE[3] pin */ +#define AFIO_EXTICR1_EXTI3_PF ((uint16_t)0x5000) /*!< PF[3] pin */ +#define AFIO_EXTICR1_EXTI3_PG ((uint16_t)0x6000) /*!< PG[3] pin */ + +/***************** Bit definition for AFIO_EXTICR2 register *****************/ +#define AFIO_EXTICR2_EXTI4 ((uint16_t)0x000F) /*!< EXTI 4 configuration */ +#define AFIO_EXTICR2_EXTI5 ((uint16_t)0x00F0) /*!< EXTI 5 configuration */ +#define AFIO_EXTICR2_EXTI6 ((uint16_t)0x0F00) /*!< EXTI 6 configuration */ +#define AFIO_EXTICR2_EXTI7 ((uint16_t)0xF000) /*!< EXTI 7 configuration */ + +/*!< EXTI4 configuration */ +#define AFIO_EXTICR2_EXTI4_PA ((uint16_t)0x0000) /*!< PA[4] pin */ +#define AFIO_EXTICR2_EXTI4_PB ((uint16_t)0x0001) /*!< PB[4] pin */ +#define AFIO_EXTICR2_EXTI4_PC ((uint16_t)0x0002) /*!< PC[4] pin */ +#define AFIO_EXTICR2_EXTI4_PD ((uint16_t)0x0003) /*!< PD[4] pin */ +#define AFIO_EXTICR2_EXTI4_PE ((uint16_t)0x0004) /*!< PE[4] pin */ +#define AFIO_EXTICR2_EXTI4_PF ((uint16_t)0x0005) /*!< PF[4] pin */ +#define AFIO_EXTICR2_EXTI4_PG ((uint16_t)0x0006) /*!< PG[4] pin */ + +/* EXTI5 configuration */ +#define AFIO_EXTICR2_EXTI5_PA ((uint16_t)0x0000) /*!< PA[5] pin */ +#define AFIO_EXTICR2_EXTI5_PB ((uint16_t)0x0010) /*!< PB[5] pin */ +#define AFIO_EXTICR2_EXTI5_PC ((uint16_t)0x0020) /*!< PC[5] pin */ +#define AFIO_EXTICR2_EXTI5_PD ((uint16_t)0x0030) /*!< PD[5] pin */ +#define AFIO_EXTICR2_EXTI5_PE ((uint16_t)0x0040) /*!< PE[5] pin */ +#define AFIO_EXTICR2_EXTI5_PF ((uint16_t)0x0050) /*!< PF[5] pin */ +#define AFIO_EXTICR2_EXTI5_PG ((uint16_t)0x0060) /*!< PG[5] pin */ + +/*!< EXTI6 configuration */ +#define AFIO_EXTICR2_EXTI6_PA ((uint16_t)0x0000) /*!< PA[6] pin */ +#define AFIO_EXTICR2_EXTI6_PB ((uint16_t)0x0100) /*!< PB[6] pin */ +#define AFIO_EXTICR2_EXTI6_PC ((uint16_t)0x0200) /*!< PC[6] pin */ +#define AFIO_EXTICR2_EXTI6_PD ((uint16_t)0x0300) /*!< PD[6] pin */ +#define AFIO_EXTICR2_EXTI6_PE ((uint16_t)0x0400) /*!< PE[6] pin */ +#define AFIO_EXTICR2_EXTI6_PF ((uint16_t)0x0500) /*!< PF[6] pin */ +#define AFIO_EXTICR2_EXTI6_PG ((uint16_t)0x0600) /*!< PG[6] pin */ + +/*!< EXTI7 configuration */ +#define AFIO_EXTICR2_EXTI7_PA ((uint16_t)0x0000) /*!< PA[7] pin */ +#define AFIO_EXTICR2_EXTI7_PB ((uint16_t)0x1000) /*!< PB[7] pin */ +#define AFIO_EXTICR2_EXTI7_PC ((uint16_t)0x2000) /*!< PC[7] pin */ +#define AFIO_EXTICR2_EXTI7_PD ((uint16_t)0x3000) /*!< PD[7] pin */ +#define AFIO_EXTICR2_EXTI7_PE ((uint16_t)0x4000) /*!< PE[7] pin */ +#define AFIO_EXTICR2_EXTI7_PF ((uint16_t)0x5000) /*!< PF[7] pin */ +#define AFIO_EXTICR2_EXTI7_PG ((uint16_t)0x6000) /*!< PG[7] pin */ + +/***************** Bit definition for AFIO_EXTICR3 register *****************/ +#define AFIO_EXTICR3_EXTI8 ((uint16_t)0x000F) /*!< EXTI 8 configuration */ +#define AFIO_EXTICR3_EXTI9 ((uint16_t)0x00F0) /*!< EXTI 9 configuration */ +#define AFIO_EXTICR3_EXTI10 ((uint16_t)0x0F00) /*!< EXTI 10 configuration */ +#define AFIO_EXTICR3_EXTI11 ((uint16_t)0xF000) /*!< EXTI 11 configuration */ + +/*!< EXTI8 configuration */ +#define AFIO_EXTICR3_EXTI8_PA ((uint16_t)0x0000) /*!< PA[8] pin */ +#define AFIO_EXTICR3_EXTI8_PB ((uint16_t)0x0001) /*!< PB[8] pin */ +#define AFIO_EXTICR3_EXTI8_PC ((uint16_t)0x0002) /*!< PC[8] pin */ +#define AFIO_EXTICR3_EXTI8_PD ((uint16_t)0x0003) /*!< PD[8] pin */ +#define AFIO_EXTICR3_EXTI8_PE ((uint16_t)0x0004) /*!< PE[8] pin */ +#define AFIO_EXTICR3_EXTI8_PF ((uint16_t)0x0005) /*!< PF[8] pin */ +#define AFIO_EXTICR3_EXTI8_PG ((uint16_t)0x0006) /*!< PG[8] pin */ + +/*!< EXTI9 configuration */ +#define AFIO_EXTICR3_EXTI9_PA ((uint16_t)0x0000) /*!< PA[9] pin */ +#define AFIO_EXTICR3_EXTI9_PB ((uint16_t)0x0010) /*!< PB[9] pin */ +#define AFIO_EXTICR3_EXTI9_PC ((uint16_t)0x0020) /*!< PC[9] pin */ +#define AFIO_EXTICR3_EXTI9_PD ((uint16_t)0x0030) /*!< PD[9] pin */ +#define AFIO_EXTICR3_EXTI9_PE ((uint16_t)0x0040) /*!< PE[9] pin */ +#define AFIO_EXTICR3_EXTI9_PF ((uint16_t)0x0050) /*!< PF[9] pin */ +#define AFIO_EXTICR3_EXTI9_PG ((uint16_t)0x0060) /*!< PG[9] pin */ + +/*!< EXTI10 configuration */ +#define AFIO_EXTICR3_EXTI10_PA ((uint16_t)0x0000) /*!< PA[10] pin */ +#define AFIO_EXTICR3_EXTI10_PB ((uint16_t)0x0100) /*!< PB[10] pin */ +#define AFIO_EXTICR3_EXTI10_PC ((uint16_t)0x0200) /*!< PC[10] pin */ +#define AFIO_EXTICR3_EXTI10_PD ((uint16_t)0x0300) /*!< PD[10] pin */ +#define AFIO_EXTICR3_EXTI10_PE ((uint16_t)0x0400) /*!< PE[10] pin */ +#define AFIO_EXTICR3_EXTI10_PF ((uint16_t)0x0500) /*!< PF[10] pin */ +#define AFIO_EXTICR3_EXTI10_PG ((uint16_t)0x0600) /*!< PG[10] pin */ + +/*!< EXTI11 configuration */ +#define AFIO_EXTICR3_EXTI11_PA ((uint16_t)0x0000) /*!< PA[11] pin */ +#define AFIO_EXTICR3_EXTI11_PB ((uint16_t)0x1000) /*!< PB[11] pin */ +#define AFIO_EXTICR3_EXTI11_PC ((uint16_t)0x2000) /*!< PC[11] pin */ +#define AFIO_EXTICR3_EXTI11_PD ((uint16_t)0x3000) /*!< PD[11] pin */ +#define AFIO_EXTICR3_EXTI11_PE ((uint16_t)0x4000) /*!< PE[11] pin */ +#define AFIO_EXTICR3_EXTI11_PF ((uint16_t)0x5000) /*!< PF[11] pin */ +#define AFIO_EXTICR3_EXTI11_PG ((uint16_t)0x6000) /*!< PG[11] pin */ + +/***************** Bit definition for AFIO_EXTICR4 register *****************/ +#define AFIO_EXTICR4_EXTI12 ((uint16_t)0x000F) /*!< EXTI 12 configuration */ +#define AFIO_EXTICR4_EXTI13 ((uint16_t)0x00F0) /*!< EXTI 13 configuration */ +#define AFIO_EXTICR4_EXTI14 ((uint16_t)0x0F00) /*!< EXTI 14 configuration */ +#define AFIO_EXTICR4_EXTI15 ((uint16_t)0xF000) /*!< EXTI 15 configuration */ + +/* EXTI12 configuration */ +#define AFIO_EXTICR4_EXTI12_PA ((uint16_t)0x0000) /*!< PA[12] pin */ +#define AFIO_EXTICR4_EXTI12_PB ((uint16_t)0x0001) /*!< PB[12] pin */ +#define AFIO_EXTICR4_EXTI12_PC ((uint16_t)0x0002) /*!< PC[12] pin */ +#define AFIO_EXTICR4_EXTI12_PD ((uint16_t)0x0003) /*!< PD[12] pin */ +#define AFIO_EXTICR4_EXTI12_PE ((uint16_t)0x0004) /*!< PE[12] pin */ +#define AFIO_EXTICR4_EXTI12_PF ((uint16_t)0x0005) /*!< PF[12] pin */ +#define AFIO_EXTICR4_EXTI12_PG ((uint16_t)0x0006) /*!< PG[12] pin */ + +/* EXTI13 configuration */ +#define AFIO_EXTICR4_EXTI13_PA ((uint16_t)0x0000) /*!< PA[13] pin */ +#define AFIO_EXTICR4_EXTI13_PB ((uint16_t)0x0010) /*!< PB[13] pin */ +#define AFIO_EXTICR4_EXTI13_PC ((uint16_t)0x0020) /*!< PC[13] pin */ +#define AFIO_EXTICR4_EXTI13_PD ((uint16_t)0x0030) /*!< PD[13] pin */ +#define AFIO_EXTICR4_EXTI13_PE ((uint16_t)0x0040) /*!< PE[13] pin */ +#define AFIO_EXTICR4_EXTI13_PF ((uint16_t)0x0050) /*!< PF[13] pin */ +#define AFIO_EXTICR4_EXTI13_PG ((uint16_t)0x0060) /*!< PG[13] pin */ + +/*!< EXTI14 configuration */ +#define AFIO_EXTICR4_EXTI14_PA ((uint16_t)0x0000) /*!< PA[14] pin */ +#define AFIO_EXTICR4_EXTI14_PB ((uint16_t)0x0100) /*!< PB[14] pin */ +#define AFIO_EXTICR4_EXTI14_PC ((uint16_t)0x0200) /*!< PC[14] pin */ +#define AFIO_EXTICR4_EXTI14_PD ((uint16_t)0x0300) /*!< PD[14] pin */ +#define AFIO_EXTICR4_EXTI14_PE ((uint16_t)0x0400) /*!< PE[14] pin */ +#define AFIO_EXTICR4_EXTI14_PF ((uint16_t)0x0500) /*!< PF[14] pin */ +#define AFIO_EXTICR4_EXTI14_PG ((uint16_t)0x0600) /*!< PG[14] pin */ + +/*!< EXTI15 configuration */ +#define AFIO_EXTICR4_EXTI15_PA ((uint16_t)0x0000) /*!< PA[15] pin */ +#define AFIO_EXTICR4_EXTI15_PB ((uint16_t)0x1000) /*!< PB[15] pin */ +#define AFIO_EXTICR4_EXTI15_PC ((uint16_t)0x2000) /*!< PC[15] pin */ +#define AFIO_EXTICR4_EXTI15_PD ((uint16_t)0x3000) /*!< PD[15] pin */ +#define AFIO_EXTICR4_EXTI15_PE ((uint16_t)0x4000) /*!< PE[15] pin */ +#define AFIO_EXTICR4_EXTI15_PF ((uint16_t)0x5000) /*!< PF[15] pin */ +#define AFIO_EXTICR4_EXTI15_PG ((uint16_t)0x6000) /*!< PG[15] pin */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/****************** Bit definition for AFIO_MAPR2 register ******************/ +#define AFIO_MAPR2_TIM15_REMAP ((uint32_t)0x00000001) /*!< TIM15 remapping */ +#define AFIO_MAPR2_TIM16_REMAP ((uint32_t)0x00000002) /*!< TIM16 remapping */ +#define AFIO_MAPR2_TIM17_REMAP ((uint32_t)0x00000004) /*!< TIM17 remapping */ +#define AFIO_MAPR2_CEC_REMAP ((uint32_t)0x00000008) /*!< CEC remapping */ +#define AFIO_MAPR2_TIM1_DMA_REMAP ((uint32_t)0x00000010) /*!< TIM1_DMA remapping */ +#endif + +#ifdef STM32F10X_HD_VL +#define AFIO_MAPR2_TIM13_REMAP ((uint32_t)0x00000100) /*!< TIM13 remapping */ +#define AFIO_MAPR2_TIM14_REMAP ((uint32_t)0x00000200) /*!< TIM14 remapping */ +#define AFIO_MAPR2_FSMC_NADV_REMAP ((uint32_t)0x00000400) /*!< FSMC NADV remapping */ +#define AFIO_MAPR2_TIM67_DAC_DMA_REMAP ((uint32_t)0x00000800) /*!< TIM6/TIM7 and DAC DMA remapping */ +#define AFIO_MAPR2_TIM12_REMAP ((uint32_t)0x00001000) /*!< TIM12 remapping */ +#define AFIO_MAPR2_MISC_REMAP ((uint32_t)0x00002000) /*!< Miscellaneous remapping */ +#endif + +#ifdef STM32F10X_XL +/****************** Bit definition for AFIO_MAPR2 register ******************/ +#define AFIO_MAPR2_TIM9_REMAP ((uint32_t)0x00000020) /*!< TIM9 remapping */ +#define AFIO_MAPR2_TIM10_REMAP ((uint32_t)0x00000040) /*!< TIM10 remapping */ +#define AFIO_MAPR2_TIM11_REMAP ((uint32_t)0x00000080) /*!< TIM11 remapping */ +#define AFIO_MAPR2_TIM13_REMAP ((uint32_t)0x00000100) /*!< TIM13 remapping */ +#define AFIO_MAPR2_TIM14_REMAP ((uint32_t)0x00000200) /*!< TIM14 remapping */ +#define AFIO_MAPR2_FSMC_NADV_REMAP ((uint32_t)0x00000400) /*!< FSMC NADV remapping */ +#endif + +/******************************************************************************/ +/* */ +/* SystemTick */ +/* */ +/******************************************************************************/ + +/***************** Bit definition for SysTick_CTRL register *****************/ +#define SysTick_CTRL_ENABLE ((uint32_t)0x00000001) /*!< Counter enable */ +#define SysTick_CTRL_TICKINT ((uint32_t)0x00000002) /*!< Counting down to 0 pends the SysTick handler */ +#define SysTick_CTRL_CLKSOURCE ((uint32_t)0x00000004) /*!< Clock source */ +#define SysTick_CTRL_COUNTFLAG ((uint32_t)0x00010000) /*!< Count Flag */ + +/***************** Bit definition for SysTick_LOAD register *****************/ +#define SysTick_LOAD_RELOAD ((uint32_t)0x00FFFFFF) /*!< Value to load into the SysTick Current Value Register when the counter reaches 0 */ + +/***************** Bit definition for SysTick_VAL register ******************/ +#define SysTick_VAL_CURRENT ((uint32_t)0x00FFFFFF) /*!< Current value at the time the register is accessed */ + +/***************** Bit definition for SysTick_CALIB register ****************/ +#define SysTick_CALIB_TENMS ((uint32_t)0x00FFFFFF) /*!< Reload value to use for 10ms timing */ +#define SysTick_CALIB_SKEW ((uint32_t)0x40000000) /*!< Calibration value is not exactly 10 ms */ +#define SysTick_CALIB_NOREF ((uint32_t)0x80000000) /*!< The reference clock is not provided */ + +/******************************************************************************/ +/* */ +/* Nested Vectored Interrupt Controller */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for NVIC_ISER register *******************/ +#define NVIC_ISER_SETENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt set enable bits */ +#define NVIC_ISER_SETENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ISER_SETENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ISER_SETENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ISER_SETENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ISER_SETENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ISER_SETENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ISER_SETENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ISER_SETENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ISER_SETENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ISER_SETENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ISER_SETENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ISER_SETENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ISER_SETENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ISER_SETENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ISER_SETENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ISER_SETENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ISER_SETENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ISER_SETENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ISER_SETENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ISER_SETENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ISER_SETENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ISER_SETENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ISER_SETENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ISER_SETENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ISER_SETENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ISER_SETENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ISER_SETENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ISER_SETENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ISER_SETENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ISER_SETENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ISER_SETENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ISER_SETENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ICER register *******************/ +#define NVIC_ICER_CLRENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-enable bits */ +#define NVIC_ICER_CLRENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ICER_CLRENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ICER_CLRENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ICER_CLRENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ICER_CLRENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ICER_CLRENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ICER_CLRENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ICER_CLRENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ICER_CLRENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ICER_CLRENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ICER_CLRENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ICER_CLRENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ICER_CLRENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ICER_CLRENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ICER_CLRENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ICER_CLRENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ICER_CLRENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ICER_CLRENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ICER_CLRENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ICER_CLRENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ICER_CLRENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ICER_CLRENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ICER_CLRENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ICER_CLRENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ICER_CLRENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ICER_CLRENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ICER_CLRENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ICER_CLRENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ICER_CLRENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ICER_CLRENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ICER_CLRENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ICER_CLRENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ISPR register *******************/ +#define NVIC_ISPR_SETPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt set-pending bits */ +#define NVIC_ISPR_SETPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ISPR_SETPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ISPR_SETPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ISPR_SETPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ISPR_SETPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ISPR_SETPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ISPR_SETPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ISPR_SETPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ISPR_SETPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ISPR_SETPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ISPR_SETPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ISPR_SETPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ISPR_SETPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ISPR_SETPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ISPR_SETPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ISPR_SETPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ISPR_SETPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ISPR_SETPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ISPR_SETPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ISPR_SETPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ISPR_SETPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ISPR_SETPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ISPR_SETPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ISPR_SETPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ISPR_SETPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ISPR_SETPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ISPR_SETPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ISPR_SETPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ISPR_SETPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ISPR_SETPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ISPR_SETPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ISPR_SETPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_ICPR register *******************/ +#define NVIC_ICPR_CLRPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-pending bits */ +#define NVIC_ICPR_CLRPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_ICPR_CLRPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_ICPR_CLRPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_ICPR_CLRPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_ICPR_CLRPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_ICPR_CLRPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_ICPR_CLRPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_ICPR_CLRPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_ICPR_CLRPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_ICPR_CLRPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_ICPR_CLRPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_ICPR_CLRPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_ICPR_CLRPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_ICPR_CLRPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_ICPR_CLRPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_ICPR_CLRPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_ICPR_CLRPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_ICPR_CLRPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_ICPR_CLRPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_ICPR_CLRPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_ICPR_CLRPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_ICPR_CLRPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_ICPR_CLRPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_ICPR_CLRPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_ICPR_CLRPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_ICPR_CLRPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_ICPR_CLRPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_ICPR_CLRPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_ICPR_CLRPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_ICPR_CLRPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_ICPR_CLRPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_ICPR_CLRPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_IABR register *******************/ +#define NVIC_IABR_ACTIVE ((uint32_t)0xFFFFFFFF) /*!< Interrupt active flags */ +#define NVIC_IABR_ACTIVE_0 ((uint32_t)0x00000001) /*!< bit 0 */ +#define NVIC_IABR_ACTIVE_1 ((uint32_t)0x00000002) /*!< bit 1 */ +#define NVIC_IABR_ACTIVE_2 ((uint32_t)0x00000004) /*!< bit 2 */ +#define NVIC_IABR_ACTIVE_3 ((uint32_t)0x00000008) /*!< bit 3 */ +#define NVIC_IABR_ACTIVE_4 ((uint32_t)0x00000010) /*!< bit 4 */ +#define NVIC_IABR_ACTIVE_5 ((uint32_t)0x00000020) /*!< bit 5 */ +#define NVIC_IABR_ACTIVE_6 ((uint32_t)0x00000040) /*!< bit 6 */ +#define NVIC_IABR_ACTIVE_7 ((uint32_t)0x00000080) /*!< bit 7 */ +#define NVIC_IABR_ACTIVE_8 ((uint32_t)0x00000100) /*!< bit 8 */ +#define NVIC_IABR_ACTIVE_9 ((uint32_t)0x00000200) /*!< bit 9 */ +#define NVIC_IABR_ACTIVE_10 ((uint32_t)0x00000400) /*!< bit 10 */ +#define NVIC_IABR_ACTIVE_11 ((uint32_t)0x00000800) /*!< bit 11 */ +#define NVIC_IABR_ACTIVE_12 ((uint32_t)0x00001000) /*!< bit 12 */ +#define NVIC_IABR_ACTIVE_13 ((uint32_t)0x00002000) /*!< bit 13 */ +#define NVIC_IABR_ACTIVE_14 ((uint32_t)0x00004000) /*!< bit 14 */ +#define NVIC_IABR_ACTIVE_15 ((uint32_t)0x00008000) /*!< bit 15 */ +#define NVIC_IABR_ACTIVE_16 ((uint32_t)0x00010000) /*!< bit 16 */ +#define NVIC_IABR_ACTIVE_17 ((uint32_t)0x00020000) /*!< bit 17 */ +#define NVIC_IABR_ACTIVE_18 ((uint32_t)0x00040000) /*!< bit 18 */ +#define NVIC_IABR_ACTIVE_19 ((uint32_t)0x00080000) /*!< bit 19 */ +#define NVIC_IABR_ACTIVE_20 ((uint32_t)0x00100000) /*!< bit 20 */ +#define NVIC_IABR_ACTIVE_21 ((uint32_t)0x00200000) /*!< bit 21 */ +#define NVIC_IABR_ACTIVE_22 ((uint32_t)0x00400000) /*!< bit 22 */ +#define NVIC_IABR_ACTIVE_23 ((uint32_t)0x00800000) /*!< bit 23 */ +#define NVIC_IABR_ACTIVE_24 ((uint32_t)0x01000000) /*!< bit 24 */ +#define NVIC_IABR_ACTIVE_25 ((uint32_t)0x02000000) /*!< bit 25 */ +#define NVIC_IABR_ACTIVE_26 ((uint32_t)0x04000000) /*!< bit 26 */ +#define NVIC_IABR_ACTIVE_27 ((uint32_t)0x08000000) /*!< bit 27 */ +#define NVIC_IABR_ACTIVE_28 ((uint32_t)0x10000000) /*!< bit 28 */ +#define NVIC_IABR_ACTIVE_29 ((uint32_t)0x20000000) /*!< bit 29 */ +#define NVIC_IABR_ACTIVE_30 ((uint32_t)0x40000000) /*!< bit 30 */ +#define NVIC_IABR_ACTIVE_31 ((uint32_t)0x80000000) /*!< bit 31 */ + +/****************** Bit definition for NVIC_PRI0 register *******************/ +#define NVIC_IPR0_PRI_0 ((uint32_t)0x000000FF) /*!< Priority of interrupt 0 */ +#define NVIC_IPR0_PRI_1 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 1 */ +#define NVIC_IPR0_PRI_2 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 2 */ +#define NVIC_IPR0_PRI_3 ((uint32_t)0xFF000000) /*!< Priority of interrupt 3 */ + +/****************** Bit definition for NVIC_PRI1 register *******************/ +#define NVIC_IPR1_PRI_4 ((uint32_t)0x000000FF) /*!< Priority of interrupt 4 */ +#define NVIC_IPR1_PRI_5 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 5 */ +#define NVIC_IPR1_PRI_6 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 6 */ +#define NVIC_IPR1_PRI_7 ((uint32_t)0xFF000000) /*!< Priority of interrupt 7 */ + +/****************** Bit definition for NVIC_PRI2 register *******************/ +#define NVIC_IPR2_PRI_8 ((uint32_t)0x000000FF) /*!< Priority of interrupt 8 */ +#define NVIC_IPR2_PRI_9 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 9 */ +#define NVIC_IPR2_PRI_10 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 10 */ +#define NVIC_IPR2_PRI_11 ((uint32_t)0xFF000000) /*!< Priority of interrupt 11 */ + +/****************** Bit definition for NVIC_PRI3 register *******************/ +#define NVIC_IPR3_PRI_12 ((uint32_t)0x000000FF) /*!< Priority of interrupt 12 */ +#define NVIC_IPR3_PRI_13 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 13 */ +#define NVIC_IPR3_PRI_14 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 14 */ +#define NVIC_IPR3_PRI_15 ((uint32_t)0xFF000000) /*!< Priority of interrupt 15 */ + +/****************** Bit definition for NVIC_PRI4 register *******************/ +#define NVIC_IPR4_PRI_16 ((uint32_t)0x000000FF) /*!< Priority of interrupt 16 */ +#define NVIC_IPR4_PRI_17 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 17 */ +#define NVIC_IPR4_PRI_18 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 18 */ +#define NVIC_IPR4_PRI_19 ((uint32_t)0xFF000000) /*!< Priority of interrupt 19 */ + +/****************** Bit definition for NVIC_PRI5 register *******************/ +#define NVIC_IPR5_PRI_20 ((uint32_t)0x000000FF) /*!< Priority of interrupt 20 */ +#define NVIC_IPR5_PRI_21 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 21 */ +#define NVIC_IPR5_PRI_22 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 22 */ +#define NVIC_IPR5_PRI_23 ((uint32_t)0xFF000000) /*!< Priority of interrupt 23 */ + +/****************** Bit definition for NVIC_PRI6 register *******************/ +#define NVIC_IPR6_PRI_24 ((uint32_t)0x000000FF) /*!< Priority of interrupt 24 */ +#define NVIC_IPR6_PRI_25 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 25 */ +#define NVIC_IPR6_PRI_26 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 26 */ +#define NVIC_IPR6_PRI_27 ((uint32_t)0xFF000000) /*!< Priority of interrupt 27 */ + +/****************** Bit definition for NVIC_PRI7 register *******************/ +#define NVIC_IPR7_PRI_28 ((uint32_t)0x000000FF) /*!< Priority of interrupt 28 */ +#define NVIC_IPR7_PRI_29 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 29 */ +#define NVIC_IPR7_PRI_30 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 30 */ +#define NVIC_IPR7_PRI_31 ((uint32_t)0xFF000000) /*!< Priority of interrupt 31 */ + +/****************** Bit definition for SCB_CPUID register *******************/ +#define SCB_CPUID_REVISION ((uint32_t)0x0000000F) /*!< Implementation defined revision number */ +#define SCB_CPUID_PARTNO ((uint32_t)0x0000FFF0) /*!< Number of processor within family */ +#define SCB_CPUID_Constant ((uint32_t)0x000F0000) /*!< Reads as 0x0F */ +#define SCB_CPUID_VARIANT ((uint32_t)0x00F00000) /*!< Implementation defined variant number */ +#define SCB_CPUID_IMPLEMENTER ((uint32_t)0xFF000000) /*!< Implementer code. ARM is 0x41 */ + +/******************* Bit definition for SCB_ICSR register *******************/ +#define SCB_ICSR_VECTACTIVE ((uint32_t)0x000001FF) /*!< Active ISR number field */ +#define SCB_ICSR_RETTOBASE ((uint32_t)0x00000800) /*!< All active exceptions minus the IPSR_current_exception yields the empty set */ +#define SCB_ICSR_VECTPENDING ((uint32_t)0x003FF000) /*!< Pending ISR number field */ +#define SCB_ICSR_ISRPENDING ((uint32_t)0x00400000) /*!< Interrupt pending flag */ +#define SCB_ICSR_ISRPREEMPT ((uint32_t)0x00800000) /*!< It indicates that a pending interrupt becomes active in the next running cycle */ +#define SCB_ICSR_PENDSTCLR ((uint32_t)0x02000000) /*!< Clear pending SysTick bit */ +#define SCB_ICSR_PENDSTSET ((uint32_t)0x04000000) /*!< Set pending SysTick bit */ +#define SCB_ICSR_PENDSVCLR ((uint32_t)0x08000000) /*!< Clear pending pendSV bit */ +#define SCB_ICSR_PENDSVSET ((uint32_t)0x10000000) /*!< Set pending pendSV bit */ +#define SCB_ICSR_NMIPENDSET ((uint32_t)0x80000000) /*!< Set pending NMI bit */ + +/******************* Bit definition for SCB_VTOR register *******************/ +#define SCB_VTOR_TBLOFF ((uint32_t)0x1FFFFF80) /*!< Vector table base offset field */ +#define SCB_VTOR_TBLBASE ((uint32_t)0x20000000) /*!< Table base in code(0) or RAM(1) */ + +/*!<***************** Bit definition for SCB_AIRCR register *******************/ +#define SCB_AIRCR_VECTRESET ((uint32_t)0x00000001) /*!< System Reset bit */ +#define SCB_AIRCR_VECTCLRACTIVE ((uint32_t)0x00000002) /*!< Clear active vector bit */ +#define SCB_AIRCR_SYSRESETREQ ((uint32_t)0x00000004) /*!< Requests chip control logic to generate a reset */ + +#define SCB_AIRCR_PRIGROUP ((uint32_t)0x00000700) /*!< PRIGROUP[2:0] bits (Priority group) */ +#define SCB_AIRCR_PRIGROUP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ +#define SCB_AIRCR_PRIGROUP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ +#define SCB_AIRCR_PRIGROUP_2 ((uint32_t)0x00000400) /*!< Bit 2 */ + +/* prority group configuration */ +#define SCB_AIRCR_PRIGROUP0 ((uint32_t)0x00000000) /*!< Priority group=0 (7 bits of pre-emption priority, 1 bit of subpriority) */ +#define SCB_AIRCR_PRIGROUP1 ((uint32_t)0x00000100) /*!< Priority group=1 (6 bits of pre-emption priority, 2 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP2 ((uint32_t)0x00000200) /*!< Priority group=2 (5 bits of pre-emption priority, 3 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP3 ((uint32_t)0x00000300) /*!< Priority group=3 (4 bits of pre-emption priority, 4 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP4 ((uint32_t)0x00000400) /*!< Priority group=4 (3 bits of pre-emption priority, 5 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP5 ((uint32_t)0x00000500) /*!< Priority group=5 (2 bits of pre-emption priority, 6 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP6 ((uint32_t)0x00000600) /*!< Priority group=6 (1 bit of pre-emption priority, 7 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP7 ((uint32_t)0x00000700) /*!< Priority group=7 (no pre-emption priority, 8 bits of subpriority) */ + +#define SCB_AIRCR_ENDIANESS ((uint32_t)0x00008000) /*!< Data endianness bit */ +#define SCB_AIRCR_VECTKEY ((uint32_t)0xFFFF0000) /*!< Register key (VECTKEY) - Reads as 0xFA05 (VECTKEYSTAT) */ + +/******************* Bit definition for SCB_SCR register ********************/ +#define SCB_SCR_SLEEPONEXIT ((uint8_t)0x02) /*!< Sleep on exit bit */ +#define SCB_SCR_SLEEPDEEP ((uint8_t)0x04) /*!< Sleep deep bit */ +#define SCB_SCR_SEVONPEND ((uint8_t)0x10) /*!< Wake up from WFE */ + +/******************** Bit definition for SCB_CCR register *******************/ +#define SCB_CCR_NONBASETHRDENA ((uint16_t)0x0001) /*!< Thread mode can be entered from any level in Handler mode by controlled return value */ +#define SCB_CCR_USERSETMPEND ((uint16_t)0x0002) /*!< Enables user code to write the Software Trigger Interrupt register to trigger (pend) a Main exception */ +#define SCB_CCR_UNALIGN_TRP ((uint16_t)0x0008) /*!< Trap for unaligned access */ +#define SCB_CCR_DIV_0_TRP ((uint16_t)0x0010) /*!< Trap on Divide by 0 */ +#define SCB_CCR_BFHFNMIGN ((uint16_t)0x0100) /*!< Handlers running at priority -1 and -2 */ +#define SCB_CCR_STKALIGN ((uint16_t)0x0200) /*!< On exception entry, the SP used prior to the exception is adjusted to be 8-byte aligned */ + +/******************* Bit definition for SCB_SHPR register ********************/ +#define SCB_SHPR_PRI_N ((uint32_t)0x000000FF) /*!< Priority of system handler 4,8, and 12. Mem Manage, reserved and Debug Monitor */ +#define SCB_SHPR_PRI_N1 ((uint32_t)0x0000FF00) /*!< Priority of system handler 5,9, and 13. Bus Fault, reserved and reserved */ +#define SCB_SHPR_PRI_N2 ((uint32_t)0x00FF0000) /*!< Priority of system handler 6,10, and 14. Usage Fault, reserved and PendSV */ +#define SCB_SHPR_PRI_N3 ((uint32_t)0xFF000000) /*!< Priority of system handler 7,11, and 15. Reserved, SVCall and SysTick */ + +/****************** Bit definition for SCB_SHCSR register *******************/ +#define SCB_SHCSR_MEMFAULTACT ((uint32_t)0x00000001) /*!< MemManage is active */ +#define SCB_SHCSR_BUSFAULTACT ((uint32_t)0x00000002) /*!< BusFault is active */ +#define SCB_SHCSR_USGFAULTACT ((uint32_t)0x00000008) /*!< UsageFault is active */ +#define SCB_SHCSR_SVCALLACT ((uint32_t)0x00000080) /*!< SVCall is active */ +#define SCB_SHCSR_MONITORACT ((uint32_t)0x00000100) /*!< Monitor is active */ +#define SCB_SHCSR_PENDSVACT ((uint32_t)0x00000400) /*!< PendSV is active */ +#define SCB_SHCSR_SYSTICKACT ((uint32_t)0x00000800) /*!< SysTick is active */ +#define SCB_SHCSR_USGFAULTPENDED ((uint32_t)0x00001000) /*!< Usage Fault is pended */ +#define SCB_SHCSR_MEMFAULTPENDED ((uint32_t)0x00002000) /*!< MemManage is pended */ +#define SCB_SHCSR_BUSFAULTPENDED ((uint32_t)0x00004000) /*!< Bus Fault is pended */ +#define SCB_SHCSR_SVCALLPENDED ((uint32_t)0x00008000) /*!< SVCall is pended */ +#define SCB_SHCSR_MEMFAULTENA ((uint32_t)0x00010000) /*!< MemManage enable */ +#define SCB_SHCSR_BUSFAULTENA ((uint32_t)0x00020000) /*!< Bus Fault enable */ +#define SCB_SHCSR_USGFAULTENA ((uint32_t)0x00040000) /*!< UsageFault enable */ + +/******************* Bit definition for SCB_CFSR register *******************/ +/*!< MFSR */ +#define SCB_CFSR_IACCVIOL ((uint32_t)0x00000001) /*!< Instruction access violation */ +#define SCB_CFSR_DACCVIOL ((uint32_t)0x00000002) /*!< Data access violation */ +#define SCB_CFSR_MUNSTKERR ((uint32_t)0x00000008) /*!< Unstacking error */ +#define SCB_CFSR_MSTKERR ((uint32_t)0x00000010) /*!< Stacking error */ +#define SCB_CFSR_MMARVALID ((uint32_t)0x00000080) /*!< Memory Manage Address Register address valid flag */ +/*!< BFSR */ +#define SCB_CFSR_IBUSERR ((uint32_t)0x00000100) /*!< Instruction bus error flag */ +#define SCB_CFSR_PRECISERR ((uint32_t)0x00000200) /*!< Precise data bus error */ +#define SCB_CFSR_IMPRECISERR ((uint32_t)0x00000400) /*!< Imprecise data bus error */ +#define SCB_CFSR_UNSTKERR ((uint32_t)0x00000800) /*!< Unstacking error */ +#define SCB_CFSR_STKERR ((uint32_t)0x00001000) /*!< Stacking error */ +#define SCB_CFSR_BFARVALID ((uint32_t)0x00008000) /*!< Bus Fault Address Register address valid flag */ +/*!< UFSR */ +#define SCB_CFSR_UNDEFINSTR ((uint32_t)0x00010000) /*!< The processor attempt to excecute an undefined instruction */ +#define SCB_CFSR_INVSTATE ((uint32_t)0x00020000) /*!< Invalid combination of EPSR and instruction */ +#define SCB_CFSR_INVPC ((uint32_t)0x00040000) /*!< Attempt to load EXC_RETURN into pc illegally */ +#define SCB_CFSR_NOCP ((uint32_t)0x00080000) /*!< Attempt to use a coprocessor instruction */ +#define SCB_CFSR_UNALIGNED ((uint32_t)0x01000000) /*!< Fault occurs when there is an attempt to make an unaligned memory access */ +#define SCB_CFSR_DIVBYZERO ((uint32_t)0x02000000) /*!< Fault occurs when SDIV or DIV instruction is used with a divisor of 0 */ + +/******************* Bit definition for SCB_HFSR register *******************/ +#define SCB_HFSR_VECTTBL ((uint32_t)0x00000002) /*!< Fault occures because of vector table read on exception processing */ +#define SCB_HFSR_FORCED ((uint32_t)0x40000000) /*!< Hard Fault activated when a configurable Fault was received and cannot activate */ +#define SCB_HFSR_DEBUGEVT ((uint32_t)0x80000000) /*!< Fault related to debug */ + +/******************* Bit definition for SCB_DFSR register *******************/ +#define SCB_DFSR_HALTED ((uint8_t)0x01) /*!< Halt request flag */ +#define SCB_DFSR_BKPT ((uint8_t)0x02) /*!< BKPT flag */ +#define SCB_DFSR_DWTTRAP ((uint8_t)0x04) /*!< Data Watchpoint and Trace (DWT) flag */ +#define SCB_DFSR_VCATCH ((uint8_t)0x08) /*!< Vector catch flag */ +#define SCB_DFSR_EXTERNAL ((uint8_t)0x10) /*!< External debug request flag */ + +/******************* Bit definition for SCB_MMFAR register ******************/ +#define SCB_MMFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Mem Manage fault address field */ + +/******************* Bit definition for SCB_BFAR register *******************/ +#define SCB_BFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Bus fault address field */ + +/******************* Bit definition for SCB_afsr register *******************/ +#define SCB_AFSR_IMPDEF ((uint32_t)0xFFFFFFFF) /*!< Implementation defined */ + +/******************************************************************************/ +/* */ +/* External Interrupt/Event Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for EXTI_IMR register *******************/ +#define EXTI_IMR_MR0 ((uint32_t)0x00000001) /*!< Interrupt Mask on line 0 */ +#define EXTI_IMR_MR1 ((uint32_t)0x00000002) /*!< Interrupt Mask on line 1 */ +#define EXTI_IMR_MR2 ((uint32_t)0x00000004) /*!< Interrupt Mask on line 2 */ +#define EXTI_IMR_MR3 ((uint32_t)0x00000008) /*!< Interrupt Mask on line 3 */ +#define EXTI_IMR_MR4 ((uint32_t)0x00000010) /*!< Interrupt Mask on line 4 */ +#define EXTI_IMR_MR5 ((uint32_t)0x00000020) /*!< Interrupt Mask on line 5 */ +#define EXTI_IMR_MR6 ((uint32_t)0x00000040) /*!< Interrupt Mask on line 6 */ +#define EXTI_IMR_MR7 ((uint32_t)0x00000080) /*!< Interrupt Mask on line 7 */ +#define EXTI_IMR_MR8 ((uint32_t)0x00000100) /*!< Interrupt Mask on line 8 */ +#define EXTI_IMR_MR9 ((uint32_t)0x00000200) /*!< Interrupt Mask on line 9 */ +#define EXTI_IMR_MR10 ((uint32_t)0x00000400) /*!< Interrupt Mask on line 10 */ +#define EXTI_IMR_MR11 ((uint32_t)0x00000800) /*!< Interrupt Mask on line 11 */ +#define EXTI_IMR_MR12 ((uint32_t)0x00001000) /*!< Interrupt Mask on line 12 */ +#define EXTI_IMR_MR13 ((uint32_t)0x00002000) /*!< Interrupt Mask on line 13 */ +#define EXTI_IMR_MR14 ((uint32_t)0x00004000) /*!< Interrupt Mask on line 14 */ +#define EXTI_IMR_MR15 ((uint32_t)0x00008000) /*!< Interrupt Mask on line 15 */ +#define EXTI_IMR_MR16 ((uint32_t)0x00010000) /*!< Interrupt Mask on line 16 */ +#define EXTI_IMR_MR17 ((uint32_t)0x00020000) /*!< Interrupt Mask on line 17 */ +#define EXTI_IMR_MR18 ((uint32_t)0x00040000) /*!< Interrupt Mask on line 18 */ +#define EXTI_IMR_MR19 ((uint32_t)0x00080000) /*!< Interrupt Mask on line 19 */ + +/******************* Bit definition for EXTI_EMR register *******************/ +#define EXTI_EMR_MR0 ((uint32_t)0x00000001) /*!< Event Mask on line 0 */ +#define EXTI_EMR_MR1 ((uint32_t)0x00000002) /*!< Event Mask on line 1 */ +#define EXTI_EMR_MR2 ((uint32_t)0x00000004) /*!< Event Mask on line 2 */ +#define EXTI_EMR_MR3 ((uint32_t)0x00000008) /*!< Event Mask on line 3 */ +#define EXTI_EMR_MR4 ((uint32_t)0x00000010) /*!< Event Mask on line 4 */ +#define EXTI_EMR_MR5 ((uint32_t)0x00000020) /*!< Event Mask on line 5 */ +#define EXTI_EMR_MR6 ((uint32_t)0x00000040) /*!< Event Mask on line 6 */ +#define EXTI_EMR_MR7 ((uint32_t)0x00000080) /*!< Event Mask on line 7 */ +#define EXTI_EMR_MR8 ((uint32_t)0x00000100) /*!< Event Mask on line 8 */ +#define EXTI_EMR_MR9 ((uint32_t)0x00000200) /*!< Event Mask on line 9 */ +#define EXTI_EMR_MR10 ((uint32_t)0x00000400) /*!< Event Mask on line 10 */ +#define EXTI_EMR_MR11 ((uint32_t)0x00000800) /*!< Event Mask on line 11 */ +#define EXTI_EMR_MR12 ((uint32_t)0x00001000) /*!< Event Mask on line 12 */ +#define EXTI_EMR_MR13 ((uint32_t)0x00002000) /*!< Event Mask on line 13 */ +#define EXTI_EMR_MR14 ((uint32_t)0x00004000) /*!< Event Mask on line 14 */ +#define EXTI_EMR_MR15 ((uint32_t)0x00008000) /*!< Event Mask on line 15 */ +#define EXTI_EMR_MR16 ((uint32_t)0x00010000) /*!< Event Mask on line 16 */ +#define EXTI_EMR_MR17 ((uint32_t)0x00020000) /*!< Event Mask on line 17 */ +#define EXTI_EMR_MR18 ((uint32_t)0x00040000) /*!< Event Mask on line 18 */ +#define EXTI_EMR_MR19 ((uint32_t)0x00080000) /*!< Event Mask on line 19 */ + +/****************** Bit definition for EXTI_RTSR register *******************/ +#define EXTI_RTSR_TR0 ((uint32_t)0x00000001) /*!< Rising trigger event configuration bit of line 0 */ +#define EXTI_RTSR_TR1 ((uint32_t)0x00000002) /*!< Rising trigger event configuration bit of line 1 */ +#define EXTI_RTSR_TR2 ((uint32_t)0x00000004) /*!< Rising trigger event configuration bit of line 2 */ +#define EXTI_RTSR_TR3 ((uint32_t)0x00000008) /*!< Rising trigger event configuration bit of line 3 */ +#define EXTI_RTSR_TR4 ((uint32_t)0x00000010) /*!< Rising trigger event configuration bit of line 4 */ +#define EXTI_RTSR_TR5 ((uint32_t)0x00000020) /*!< Rising trigger event configuration bit of line 5 */ +#define EXTI_RTSR_TR6 ((uint32_t)0x00000040) /*!< Rising trigger event configuration bit of line 6 */ +#define EXTI_RTSR_TR7 ((uint32_t)0x00000080) /*!< Rising trigger event configuration bit of line 7 */ +#define EXTI_RTSR_TR8 ((uint32_t)0x00000100) /*!< Rising trigger event configuration bit of line 8 */ +#define EXTI_RTSR_TR9 ((uint32_t)0x00000200) /*!< Rising trigger event configuration bit of line 9 */ +#define EXTI_RTSR_TR10 ((uint32_t)0x00000400) /*!< Rising trigger event configuration bit of line 10 */ +#define EXTI_RTSR_TR11 ((uint32_t)0x00000800) /*!< Rising trigger event configuration bit of line 11 */ +#define EXTI_RTSR_TR12 ((uint32_t)0x00001000) /*!< Rising trigger event configuration bit of line 12 */ +#define EXTI_RTSR_TR13 ((uint32_t)0x00002000) /*!< Rising trigger event configuration bit of line 13 */ +#define EXTI_RTSR_TR14 ((uint32_t)0x00004000) /*!< Rising trigger event configuration bit of line 14 */ +#define EXTI_RTSR_TR15 ((uint32_t)0x00008000) /*!< Rising trigger event configuration bit of line 15 */ +#define EXTI_RTSR_TR16 ((uint32_t)0x00010000) /*!< Rising trigger event configuration bit of line 16 */ +#define EXTI_RTSR_TR17 ((uint32_t)0x00020000) /*!< Rising trigger event configuration bit of line 17 */ +#define EXTI_RTSR_TR18 ((uint32_t)0x00040000) /*!< Rising trigger event configuration bit of line 18 */ +#define EXTI_RTSR_TR19 ((uint32_t)0x00080000) /*!< Rising trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_FTSR register *******************/ +#define EXTI_FTSR_TR0 ((uint32_t)0x00000001) /*!< Falling trigger event configuration bit of line 0 */ +#define EXTI_FTSR_TR1 ((uint32_t)0x00000002) /*!< Falling trigger event configuration bit of line 1 */ +#define EXTI_FTSR_TR2 ((uint32_t)0x00000004) /*!< Falling trigger event configuration bit of line 2 */ +#define EXTI_FTSR_TR3 ((uint32_t)0x00000008) /*!< Falling trigger event configuration bit of line 3 */ +#define EXTI_FTSR_TR4 ((uint32_t)0x00000010) /*!< Falling trigger event configuration bit of line 4 */ +#define EXTI_FTSR_TR5 ((uint32_t)0x00000020) /*!< Falling trigger event configuration bit of line 5 */ +#define EXTI_FTSR_TR6 ((uint32_t)0x00000040) /*!< Falling trigger event configuration bit of line 6 */ +#define EXTI_FTSR_TR7 ((uint32_t)0x00000080) /*!< Falling trigger event configuration bit of line 7 */ +#define EXTI_FTSR_TR8 ((uint32_t)0x00000100) /*!< Falling trigger event configuration bit of line 8 */ +#define EXTI_FTSR_TR9 ((uint32_t)0x00000200) /*!< Falling trigger event configuration bit of line 9 */ +#define EXTI_FTSR_TR10 ((uint32_t)0x00000400) /*!< Falling trigger event configuration bit of line 10 */ +#define EXTI_FTSR_TR11 ((uint32_t)0x00000800) /*!< Falling trigger event configuration bit of line 11 */ +#define EXTI_FTSR_TR12 ((uint32_t)0x00001000) /*!< Falling trigger event configuration bit of line 12 */ +#define EXTI_FTSR_TR13 ((uint32_t)0x00002000) /*!< Falling trigger event configuration bit of line 13 */ +#define EXTI_FTSR_TR14 ((uint32_t)0x00004000) /*!< Falling trigger event configuration bit of line 14 */ +#define EXTI_FTSR_TR15 ((uint32_t)0x00008000) /*!< Falling trigger event configuration bit of line 15 */ +#define EXTI_FTSR_TR16 ((uint32_t)0x00010000) /*!< Falling trigger event configuration bit of line 16 */ +#define EXTI_FTSR_TR17 ((uint32_t)0x00020000) /*!< Falling trigger event configuration bit of line 17 */ +#define EXTI_FTSR_TR18 ((uint32_t)0x00040000) /*!< Falling trigger event configuration bit of line 18 */ +#define EXTI_FTSR_TR19 ((uint32_t)0x00080000) /*!< Falling trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_SWIER register ******************/ +#define EXTI_SWIER_SWIER0 ((uint32_t)0x00000001) /*!< Software Interrupt on line 0 */ +#define EXTI_SWIER_SWIER1 ((uint32_t)0x00000002) /*!< Software Interrupt on line 1 */ +#define EXTI_SWIER_SWIER2 ((uint32_t)0x00000004) /*!< Software Interrupt on line 2 */ +#define EXTI_SWIER_SWIER3 ((uint32_t)0x00000008) /*!< Software Interrupt on line 3 */ +#define EXTI_SWIER_SWIER4 ((uint32_t)0x00000010) /*!< Software Interrupt on line 4 */ +#define EXTI_SWIER_SWIER5 ((uint32_t)0x00000020) /*!< Software Interrupt on line 5 */ +#define EXTI_SWIER_SWIER6 ((uint32_t)0x00000040) /*!< Software Interrupt on line 6 */ +#define EXTI_SWIER_SWIER7 ((uint32_t)0x00000080) /*!< Software Interrupt on line 7 */ +#define EXTI_SWIER_SWIER8 ((uint32_t)0x00000100) /*!< Software Interrupt on line 8 */ +#define EXTI_SWIER_SWIER9 ((uint32_t)0x00000200) /*!< Software Interrupt on line 9 */ +#define EXTI_SWIER_SWIER10 ((uint32_t)0x00000400) /*!< Software Interrupt on line 10 */ +#define EXTI_SWIER_SWIER11 ((uint32_t)0x00000800) /*!< Software Interrupt on line 11 */ +#define EXTI_SWIER_SWIER12 ((uint32_t)0x00001000) /*!< Software Interrupt on line 12 */ +#define EXTI_SWIER_SWIER13 ((uint32_t)0x00002000) /*!< Software Interrupt on line 13 */ +#define EXTI_SWIER_SWIER14 ((uint32_t)0x00004000) /*!< Software Interrupt on line 14 */ +#define EXTI_SWIER_SWIER15 ((uint32_t)0x00008000) /*!< Software Interrupt on line 15 */ +#define EXTI_SWIER_SWIER16 ((uint32_t)0x00010000) /*!< Software Interrupt on line 16 */ +#define EXTI_SWIER_SWIER17 ((uint32_t)0x00020000) /*!< Software Interrupt on line 17 */ +#define EXTI_SWIER_SWIER18 ((uint32_t)0x00040000) /*!< Software Interrupt on line 18 */ +#define EXTI_SWIER_SWIER19 ((uint32_t)0x00080000) /*!< Software Interrupt on line 19 */ + +/******************* Bit definition for EXTI_PR register ********************/ +#define EXTI_PR_PR0 ((uint32_t)0x00000001) /*!< Pending bit for line 0 */ +#define EXTI_PR_PR1 ((uint32_t)0x00000002) /*!< Pending bit for line 1 */ +#define EXTI_PR_PR2 ((uint32_t)0x00000004) /*!< Pending bit for line 2 */ +#define EXTI_PR_PR3 ((uint32_t)0x00000008) /*!< Pending bit for line 3 */ +#define EXTI_PR_PR4 ((uint32_t)0x00000010) /*!< Pending bit for line 4 */ +#define EXTI_PR_PR5 ((uint32_t)0x00000020) /*!< Pending bit for line 5 */ +#define EXTI_PR_PR6 ((uint32_t)0x00000040) /*!< Pending bit for line 6 */ +#define EXTI_PR_PR7 ((uint32_t)0x00000080) /*!< Pending bit for line 7 */ +#define EXTI_PR_PR8 ((uint32_t)0x00000100) /*!< Pending bit for line 8 */ +#define EXTI_PR_PR9 ((uint32_t)0x00000200) /*!< Pending bit for line 9 */ +#define EXTI_PR_PR10 ((uint32_t)0x00000400) /*!< Pending bit for line 10 */ +#define EXTI_PR_PR11 ((uint32_t)0x00000800) /*!< Pending bit for line 11 */ +#define EXTI_PR_PR12 ((uint32_t)0x00001000) /*!< Pending bit for line 12 */ +#define EXTI_PR_PR13 ((uint32_t)0x00002000) /*!< Pending bit for line 13 */ +#define EXTI_PR_PR14 ((uint32_t)0x00004000) /*!< Pending bit for line 14 */ +#define EXTI_PR_PR15 ((uint32_t)0x00008000) /*!< Pending bit for line 15 */ +#define EXTI_PR_PR16 ((uint32_t)0x00010000) /*!< Pending bit for line 16 */ +#define EXTI_PR_PR17 ((uint32_t)0x00020000) /*!< Pending bit for line 17 */ +#define EXTI_PR_PR18 ((uint32_t)0x00040000) /*!< Pending bit for line 18 */ +#define EXTI_PR_PR19 ((uint32_t)0x00080000) /*!< Pending bit for line 19 */ + +/******************************************************************************/ +/* */ +/* DMA Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for DMA_ISR register ********************/ +#define DMA_ISR_GIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt flag */ +#define DMA_ISR_TCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete flag */ +#define DMA_ISR_HTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer flag */ +#define DMA_ISR_TEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error flag */ +#define DMA_ISR_GIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt flag */ +#define DMA_ISR_TCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete flag */ +#define DMA_ISR_HTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer flag */ +#define DMA_ISR_TEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error flag */ +#define DMA_ISR_GIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt flag */ +#define DMA_ISR_TCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete flag */ +#define DMA_ISR_HTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer flag */ +#define DMA_ISR_TEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error flag */ +#define DMA_ISR_GIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt flag */ +#define DMA_ISR_TCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete flag */ +#define DMA_ISR_HTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer flag */ +#define DMA_ISR_TEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error flag */ +#define DMA_ISR_GIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt flag */ +#define DMA_ISR_TCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete flag */ +#define DMA_ISR_HTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer flag */ +#define DMA_ISR_TEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error flag */ +#define DMA_ISR_GIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt flag */ +#define DMA_ISR_TCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete flag */ +#define DMA_ISR_HTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer flag */ +#define DMA_ISR_TEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error flag */ +#define DMA_ISR_GIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt flag */ +#define DMA_ISR_TCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete flag */ +#define DMA_ISR_HTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer flag */ +#define DMA_ISR_TEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error flag */ + +/******************* Bit definition for DMA_IFCR register *******************/ +#define DMA_IFCR_CGIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt clearr */ +#define DMA_IFCR_CTCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete clear */ +#define DMA_IFCR_CHTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer clear */ +#define DMA_IFCR_CTEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error clear */ +#define DMA_IFCR_CGIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt clear */ +#define DMA_IFCR_CTCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete clear */ +#define DMA_IFCR_CHTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer clear */ +#define DMA_IFCR_CTEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error clear */ +#define DMA_IFCR_CGIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt clear */ +#define DMA_IFCR_CTCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete clear */ +#define DMA_IFCR_CHTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer clear */ +#define DMA_IFCR_CTEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error clear */ +#define DMA_IFCR_CGIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt clear */ +#define DMA_IFCR_CTCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete clear */ +#define DMA_IFCR_CHTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer clear */ +#define DMA_IFCR_CTEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error clear */ +#define DMA_IFCR_CGIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt clear */ +#define DMA_IFCR_CTCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete clear */ +#define DMA_IFCR_CHTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer clear */ +#define DMA_IFCR_CTEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error clear */ +#define DMA_IFCR_CGIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt clear */ +#define DMA_IFCR_CTCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete clear */ +#define DMA_IFCR_CHTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer clear */ +#define DMA_IFCR_CTEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error clear */ +#define DMA_IFCR_CGIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt clear */ +#define DMA_IFCR_CTCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete clear */ +#define DMA_IFCR_CHTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer clear */ +#define DMA_IFCR_CTEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error clear */ + +/******************* Bit definition for DMA_CCR1 register *******************/ +#define DMA_CCR1_EN ((uint16_t)0x0001) /*!< Channel enable*/ +#define DMA_CCR1_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR1_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR1_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR1_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR1_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR1_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR1_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR1_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR1_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR1_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR1_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR1_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR1_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR1_PL ((uint16_t)0x3000) /*!< PL[1:0] bits(Channel Priority level) */ +#define DMA_CCR1_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR1_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR1_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR2 register *******************/ +#define DMA_CCR2_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR2_TCIE ((uint16_t)0x0002) /*!< ransfer complete interrupt enable */ +#define DMA_CCR2_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR2_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR2_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR2_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR2_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR2_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR2_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR2_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR2_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR2_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR2_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR2_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR2_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR2_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR2_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR2_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/******************* Bit definition for DMA_CCR3 register *******************/ +#define DMA_CCR3_EN ((uint16_t)0x0001) /*!< Channel enable */ +#define DMA_CCR3_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ +#define DMA_CCR3_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ +#define DMA_CCR3_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ +#define DMA_CCR3_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ +#define DMA_CCR3_CIRC ((uint16_t)0x0020) /*!< Circular mode */ +#define DMA_CCR3_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ +#define DMA_CCR3_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ + +#define DMA_CCR3_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR3_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ +#define DMA_CCR3_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ + +#define DMA_CCR3_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR3_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ +#define DMA_CCR3_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ + +#define DMA_CCR3_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ +#define DMA_CCR3_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ +#define DMA_CCR3_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ + +#define DMA_CCR3_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ + +/*!<****************** Bit definition for DMA_CCR4 register *******************/ +#define DMA_CCR4_EN ((uint16_t)0x0001) /*!
© COPYRIGHT 2010 STMicroelectronics
+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_adc.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup ADC + * @brief ADC driver modules + * @{ + */ + +/** @defgroup ADC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_Defines + * @{ + */ + +/* ADC DISCNUM mask */ +#define CR1_DISCNUM_Reset ((uint32_t)0xFFFF1FFF) + +/* ADC DISCEN mask */ +#define CR1_DISCEN_Set ((uint32_t)0x00000800) +#define CR1_DISCEN_Reset ((uint32_t)0xFFFFF7FF) + +/* ADC JAUTO mask */ +#define CR1_JAUTO_Set ((uint32_t)0x00000400) +#define CR1_JAUTO_Reset ((uint32_t)0xFFFFFBFF) + +/* ADC JDISCEN mask */ +#define CR1_JDISCEN_Set ((uint32_t)0x00001000) +#define CR1_JDISCEN_Reset ((uint32_t)0xFFFFEFFF) + +/* ADC AWDCH mask */ +#define CR1_AWDCH_Reset ((uint32_t)0xFFFFFFE0) + +/* ADC Analog watchdog enable mode mask */ +#define CR1_AWDMode_Reset ((uint32_t)0xFF3FFDFF) + +/* CR1 register Mask */ +#define CR1_CLEAR_Mask ((uint32_t)0xFFF0FEFF) + +/* ADC ADON mask */ +#define CR2_ADON_Set ((uint32_t)0x00000001) +#define CR2_ADON_Reset ((uint32_t)0xFFFFFFFE) + +/* ADC DMA mask */ +#define CR2_DMA_Set ((uint32_t)0x00000100) +#define CR2_DMA_Reset ((uint32_t)0xFFFFFEFF) + +/* ADC RSTCAL mask */ +#define CR2_RSTCAL_Set ((uint32_t)0x00000008) + +/* ADC CAL mask */ +#define CR2_CAL_Set ((uint32_t)0x00000004) + +/* ADC SWSTART mask */ +#define CR2_SWSTART_Set ((uint32_t)0x00400000) + +/* ADC EXTTRIG mask */ +#define CR2_EXTTRIG_Set ((uint32_t)0x00100000) +#define CR2_EXTTRIG_Reset ((uint32_t)0xFFEFFFFF) + +/* ADC Software start mask */ +#define CR2_EXTTRIG_SWSTART_Set ((uint32_t)0x00500000) +#define CR2_EXTTRIG_SWSTART_Reset ((uint32_t)0xFFAFFFFF) + +/* ADC JEXTSEL mask */ +#define CR2_JEXTSEL_Reset ((uint32_t)0xFFFF8FFF) + +/* ADC JEXTTRIG mask */ +#define CR2_JEXTTRIG_Set ((uint32_t)0x00008000) +#define CR2_JEXTTRIG_Reset ((uint32_t)0xFFFF7FFF) + +/* ADC JSWSTART mask */ +#define CR2_JSWSTART_Set ((uint32_t)0x00200000) + +/* ADC injected software start mask */ +#define CR2_JEXTTRIG_JSWSTART_Set ((uint32_t)0x00208000) +#define CR2_JEXTTRIG_JSWSTART_Reset ((uint32_t)0xFFDF7FFF) + +/* ADC TSPD mask */ +#define CR2_TSVREFE_Set ((uint32_t)0x00800000) +#define CR2_TSVREFE_Reset ((uint32_t)0xFF7FFFFF) + +/* CR2 register Mask */ +#define CR2_CLEAR_Mask ((uint32_t)0xFFF1F7FD) + +/* ADC SQx mask */ +#define SQR3_SQ_Set ((uint32_t)0x0000001F) +#define SQR2_SQ_Set ((uint32_t)0x0000001F) +#define SQR1_SQ_Set ((uint32_t)0x0000001F) + +/* SQR1 register Mask */ +#define SQR1_CLEAR_Mask ((uint32_t)0xFF0FFFFF) + +/* ADC JSQx mask */ +#define JSQR_JSQ_Set ((uint32_t)0x0000001F) + +/* ADC JL mask */ +#define JSQR_JL_Set ((uint32_t)0x00300000) +#define JSQR_JL_Reset ((uint32_t)0xFFCFFFFF) + +/* ADC SMPx mask */ +#define SMPR1_SMP_Set ((uint32_t)0x00000007) +#define SMPR2_SMP_Set ((uint32_t)0x00000007) + +/* ADC JDRx registers offset */ +#define JDR_Offset ((uint8_t)0x28) + +/* ADC1 DR register base address */ +#define DR_ADDRESS ((uint32_t)0x4001244C) + +/** + * @} + */ + +/** @defgroup ADC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the ADCx peripheral registers to their default reset values. + * @param ADCx: where x can be 1, 2 or 3 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); + } + else if (ADCx == ADC2) + { + /* Enable ADC2 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, ENABLE); + /* Release ADC2 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, DISABLE); + } + else + { + if (ADCx == ADC3) + { + /* Enable ADC3 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3, ENABLE); + /* Release ADC3 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3, DISABLE); + } + } +} + +/** + * @brief Initializes the ADCx peripheral according to the specified parameters + * in the ADC_InitStruct. + * @param ADCx: where x can be 1, 2 or 3 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 tmpreg1 = 0; + uint8_t tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_MODE(ADC_InitStruct->ADC_Mode)); + assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ScanConvMode)); + assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode)); + assert_param(IS_ADC_EXT_TRIG(ADC_InitStruct->ADC_ExternalTrigConv)); + assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign)); + assert_param(IS_ADC_REGULAR_LENGTH(ADC_InitStruct->ADC_NbrOfChannel)); + + /*---------------------------- ADCx CR1 Configuration -----------------*/ + /* Get the ADCx CR1 value */ + tmpreg1 = ADCx->CR1; + /* Clear DUALMOD and SCAN bits */ + tmpreg1 &= CR1_CLEAR_Mask; + /* Configure ADCx: Dual mode and scan conversion mode */ + /* Set DUALMOD bits according to ADC_Mode value */ + /* Set SCAN bit according to ADC_ScanConvMode value */ + tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_Mode | ((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8)); + /* Write to ADCx CR1 */ + ADCx->CR1 = tmpreg1; + + /*---------------------------- ADCx CR2 Configuration -----------------*/ + /* Get the ADCx CR2 value */ + tmpreg1 = ADCx->CR2; + /* Clear CONT, ALIGN and EXTSEL bits */ + tmpreg1 &= CR2_CLEAR_Mask; + /* Configure ADCx: external trigger event and continuous conversion mode */ + /* Set ALIGN bit according to ADC_DataAlign value */ + /* Set EXTSEL bits according to ADC_ExternalTrigConv value */ + /* Set CONT bit according to ADC_ContinuousConvMode value */ + tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ExternalTrigConv | + ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1)); + /* Write to ADCx CR2 */ + ADCx->CR2 = tmpreg1; + + /*---------------------------- ADCx SQR1 Configuration -----------------*/ + /* Get the ADCx SQR1 value */ + tmpreg1 = ADCx->SQR1; + /* Clear L bits */ + tmpreg1 &= SQR1_CLEAR_Mask; + /* Configure ADCx: regular channel sequence length */ + /* Set L bits according to ADC_NbrOfChannel value */ + tmpreg2 |= (uint8_t) (ADC_InitStruct->ADC_NbrOfChannel - (uint8_t)1); + tmpreg1 |= (uint32_t)tmpreg2 << 20; + /* Write to ADCx SQR1 */ + ADCx->SQR1 = tmpreg1; +} + +/** + * @brief Fills each ADC_InitStruct member with its default value. + * @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_Mode member */ + ADC_InitStruct->ADC_Mode = ADC_Mode_Independent; + /* initialize the ADC_ScanConvMode member */ + ADC_InitStruct->ADC_ScanConvMode = DISABLE; + /* Initialize the ADC_ContinuousConvMode member */ + ADC_InitStruct->ADC_ContinuousConvMode = DISABLE; + /* Initialize the ADC_ExternalTrigConv member */ + ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; + /* Initialize the ADC_DataAlign member */ + ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right; + /* Initialize the ADC_NbrOfChannel member */ + ADC_InitStruct->ADC_NbrOfChannel = 1; +} + +/** + * @brief Enables or disables the specified ADC peripheral. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC 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 ADON bit to wake up the ADC from power down mode */ + ADCx->CR2 |= CR2_ADON_Set; + } + else + { + /* Disable the selected ADC peripheral */ + ADCx->CR2 &= CR2_ADON_Reset; + } +} + +/** + * @brief Enables or disables the specified ADC DMA request. + * @param ADCx: where x can be 1 or 3 to select the ADC peripheral. + * Note: ADC2 hasn't a DMA capability. + * @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_DMA_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected ADC DMA request */ + ADCx->CR2 |= CR2_DMA_Set; + } + else + { + /* Disable the selected ADC DMA request */ + ADCx->CR2 &= CR2_DMA_Reset; + } +} + +/** + * @brief Enables or disables the specified ADC interrupts. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_IT: specifies the ADC interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt mask + * @arg ADC_IT_AWD: Analog watchdog interrupt mask + * @arg ADC_IT_JEOC: End of injected conversion interrupt mask + * @param NewState: new state of the specified ADC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState) +{ + uint8_t itmask = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_ADC_IT(ADC_IT)); + /* Get the ADC IT index */ + itmask = (uint8_t)ADC_IT; + if (NewState != DISABLE) + { + /* Enable the selected ADC interrupts */ + ADCx->CR1 |= itmask; + } + else + { + /* Disable the selected ADC interrupts */ + ADCx->CR1 &= (~(uint32_t)itmask); + } +} + +/** + * @brief Resets the selected ADC calibration registers. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval None + */ +void ADC_ResetCalibration(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Resets the selected ADC calibartion registers */ + ADCx->CR2 |= CR2_RSTCAL_Set; +} + +/** + * @brief Gets the selected ADC reset calibration registers status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC reset calibration registers (SET or RESET). + */ +FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of RSTCAL bit */ + if ((ADCx->CR2 & CR2_RSTCAL_Set) != (uint32_t)RESET) + { + /* RSTCAL bit is set */ + bitstatus = SET; + } + else + { + /* RSTCAL bit is reset */ + bitstatus = RESET; + } + /* Return the RSTCAL bit status */ + return bitstatus; +} + +/** + * @brief Starts the selected ADC calibration process. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval None + */ +void ADC_StartCalibration(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Enable the selected ADC calibration process */ + ADCx->CR2 |= CR2_CAL_Set; +} + +/** + * @brief Gets the selected ADC calibration status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC calibration (SET or RESET). + */ +FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of CAL bit */ + if ((ADCx->CR2 & CR2_CAL_Set) != (uint32_t)RESET) + { + /* CAL bit is set: calibration on going */ + bitstatus = SET; + } + else + { + /* CAL bit is reset: end of calibration */ + bitstatus = RESET; + } + /* Return the CAL bit status */ + return bitstatus; +} + +/** + * @brief Enables or disables the selected ADC software start conversion . + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC software start conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_SoftwareStartConvCmd(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 conversion on external event and start the selected + ADC conversion */ + ADCx->CR2 |= CR2_EXTTRIG_SWSTART_Set; + } + else + { + /* Disable the selected ADC conversion on external event and stop the selected + ADC conversion */ + ADCx->CR2 &= CR2_EXTTRIG_SWSTART_Reset; + } +} + +/** + * @brief Gets the selected ADC Software start conversion Status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC software start conversion (SET or RESET). + */ +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of SWSTART bit */ + if ((ADCx->CR2 & CR2_SWSTART_Set) != (uint32_t)RESET) + { + /* SWSTART bit is set */ + bitstatus = SET; + } + else + { + /* SWSTART bit is reset */ + bitstatus = RESET; + } + /* Return the SWSTART bit status */ + return bitstatus; +} + +/** + * @brief Configures the discontinuous mode for the selected ADC regular + * group channel. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param Number: specifies the discontinuous mode regular channel + * count value. This number must be between 1 and 8. + * @retval None + */ +void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_REGULAR_DISC_NUMBER(Number)); + /* Get the old register value */ + tmpreg1 = ADCx->CR1; + /* Clear the old discontinuous mode channel count */ + tmpreg1 &= CR1_DISCNUM_Reset; + /* Set the discontinuous mode channel count */ + tmpreg2 = Number - 1; + tmpreg1 |= tmpreg2 << 13; + /* Store the new register value */ + ADCx->CR1 = tmpreg1; +} + +/** + * @brief Enables or disables the discontinuous mode on regular group + * channel for the specified ADC + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC discontinuous mode + * on regular group channel. + * This parameter can be: ENABLE or DISABLE. + * @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 selected ADC regular discontinuous mode */ + ADCx->CR1 |= CR1_DISCEN_Set; + } + else + { + /* Disable the selected ADC regular discontinuous mode */ + ADCx->CR1 &= CR1_DISCEN_Reset; + } +} + +/** + * @brief Configures for the selected ADC regular channel its corresponding + * rank in the sequencer and its sample time. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_Channel: the ADC channel to configure. + * This parameter can be one 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 + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @param Rank: The rank in the regular group sequencer. This parameter must be between 1 to 16. + * @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_1Cycles5: Sample time equal to 1.5 cycles + * @arg ADC_SampleTime_7Cycles5: Sample time equal to 7.5 cycles + * @arg ADC_SampleTime_13Cycles5: Sample time equal to 13.5 cycles + * @arg ADC_SampleTime_28Cycles5: Sample time equal to 28.5 cycles + * @arg ADC_SampleTime_41Cycles5: Sample time equal to 41.5 cycles + * @arg ADC_SampleTime_55Cycles5: Sample time equal to 55.5 cycles + * @arg ADC_SampleTime_71Cycles5: Sample time equal to 71.5 cycles + * @arg ADC_SampleTime_239Cycles5: Sample time equal to 239.5 cycles + * @retval None + */ +void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + assert_param(IS_ADC_REGULAR_RANK(Rank)); + assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); + /* if ADC_Channel_10 ... ADC_Channel_17 is selected */ + if (ADC_Channel > ADC_Channel_9) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR1; + /* Calculate the mask to clear */ + tmpreg2 = SMPR1_SMP_Set << (3 * (ADC_Channel - 10)); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR1 = tmpreg1; + } + else /* ADC_Channel include in ADC_Channel_[0..9] */ + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR2; + /* Calculate the mask to clear */ + tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR2 = tmpreg1; + } + /* For Rank 1 to 6 */ + if (Rank < 7) + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR3; + /* Calculate the mask to clear */ + tmpreg2 = SQR3_SQ_Set << (5 * (Rank - 1)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR3 = tmpreg1; + } + /* For Rank 7 to 12 */ + else if (Rank < 13) + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR2; + /* Calculate the mask to clear */ + tmpreg2 = SQR2_SQ_Set << (5 * (Rank - 7)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR2 = tmpreg1; + } + /* For Rank 13 to 16 */ + else + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR1; + /* Calculate the mask to clear */ + tmpreg2 = SQR1_SQ_Set << (5 * (Rank - 13)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR1 = tmpreg1; + } +} + +/** + * @brief Enables or disables the ADCx conversion through external trigger. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC external trigger start of conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_ExternalTrigConvCmd(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 conversion on external event */ + ADCx->CR2 |= CR2_EXTTRIG_Set; + } + else + { + /* Disable the selected ADC conversion on external event */ + ADCx->CR2 &= CR2_EXTTRIG_Reset; + } +} + +/** + * @brief Returns the last ADCx conversion result data for regular channel. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC 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; +} + +/** + * @brief Returns the last ADC1 and ADC2 conversion result data in dual mode. + * @retval The Data conversion value. + */ +uint32_t ADC_GetDualModeConversionValue(void) +{ + /* Return the dual mode conversion value */ + return (*(__IO uint32_t *) DR_ADDRESS); +} + +/** + * @brief Enables or disables the selected ADC automatic injected group + * conversion after regular one. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC auto injected conversion + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_AutoInjectedConvCmd(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 automatic injected group conversion */ + ADCx->CR1 |= CR1_JAUTO_Set; + } + else + { + /* Disable the selected ADC automatic injected group conversion */ + ADCx->CR1 &= CR1_JAUTO_Reset; + } +} + +/** + * @brief Enables or disables the discontinuous mode for injected group + * channel for the specified ADC + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC discontinuous mode + * on injected group channel. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_InjectedDiscModeCmd(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 injected discontinuous mode */ + ADCx->CR1 |= CR1_JDISCEN_Set; + } + else + { + /* Disable the selected ADC injected discontinuous mode */ + ADCx->CR1 &= CR1_JDISCEN_Reset; + } +} + +/** + * @brief Configures the ADCx external trigger for injected channels conversion. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_ExternalTrigInjecConv: specifies the ADC trigger to start injected conversion. + * This parameter can be one of the following values: + * @arg ADC_ExternalTrigInjecConv_T1_TRGO: Timer1 TRGO event selected (for ADC1, ADC2 and ADC3) + * @arg ADC_ExternalTrigInjecConv_T1_CC4: Timer1 capture compare4 selected (for ADC1, ADC2 and ADC3) + * @arg ADC_ExternalTrigInjecConv_T2_TRGO: Timer2 TRGO event selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T2_CC1: Timer2 capture compare1 selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T3_CC4: Timer3 capture compare4 selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T4_TRGO: Timer4 TRGO event selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4: External interrupt line 15 or Timer8 + * capture compare4 event selected (for ADC1 and ADC2) + * @arg ADC_ExternalTrigInjecConv_T4_CC3: Timer4 capture compare3 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T8_CC2: Timer8 capture compare2 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T8_CC4: Timer8 capture compare4 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T5_TRGO: Timer5 TRGO event selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_T5_CC4: Timer5 capture compare4 selected (for ADC3 only) + * @arg ADC_ExternalTrigInjecConv_None: Injected conversion started by software and not + * by external trigger (for ADC1, ADC2 and ADC3) + * @retval None + */ +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_EXT_INJEC_TRIG(ADC_ExternalTrigInjecConv)); + /* Get the old register value */ + tmpreg = ADCx->CR2; + /* Clear the old external event selection for injected group */ + tmpreg &= CR2_JEXTSEL_Reset; + /* Set the external event selection for injected group */ + tmpreg |= ADC_ExternalTrigInjecConv; + /* Store the new register value */ + ADCx->CR2 = tmpreg; +} + +/** + * @brief Enables or disables the ADCx injected channels conversion through + * external trigger + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC external trigger start of + * injected conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_ExternalTrigInjectedConvCmd(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 external event selection for injected group */ + ADCx->CR2 |= CR2_JEXTTRIG_Set; + } + else + { + /* Disable the selected ADC external event selection for injected group */ + ADCx->CR2 &= CR2_JEXTTRIG_Reset; + } +} + +/** + * @brief Enables or disables the selected ADC start of the injected + * channels conversion. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param NewState: new state of the selected ADC software start injected conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_SoftwareStartInjectedConvCmd(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 conversion for injected group on external event and start the selected + ADC injected conversion */ + ADCx->CR2 |= CR2_JEXTTRIG_JSWSTART_Set; + } + else + { + /* Disable the selected ADC conversion on external event for injected group and stop the selected + ADC injected conversion */ + ADCx->CR2 &= CR2_JEXTTRIG_JSWSTART_Reset; + } +} + +/** + * @brief Gets the selected ADC Software start injected conversion Status. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @retval The new state of ADC software start injected conversion (SET or RESET). + */ +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Check the status of JSWSTART bit */ + if ((ADCx->CR2 & CR2_JSWSTART_Set) != (uint32_t)RESET) + { + /* JSWSTART bit is set */ + bitstatus = SET; + } + else + { + /* JSWSTART bit is reset */ + bitstatus = RESET; + } + /* Return the JSWSTART bit status */ + return bitstatus; +} + +/** + * @brief Configures for the selected ADC injected channel its corresponding + * rank in the sequencer and its sample time. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_Channel: the ADC channel to configure. + * This parameter can be one 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 + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @param Rank: The rank in the injected group sequencer. This parameter must be between 1 and 4. + * @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_1Cycles5: Sample time equal to 1.5 cycles + * @arg ADC_SampleTime_7Cycles5: Sample time equal to 7.5 cycles + * @arg ADC_SampleTime_13Cycles5: Sample time equal to 13.5 cycles + * @arg ADC_SampleTime_28Cycles5: Sample time equal to 28.5 cycles + * @arg ADC_SampleTime_41Cycles5: Sample time equal to 41.5 cycles + * @arg ADC_SampleTime_55Cycles5: Sample time equal to 55.5 cycles + * @arg ADC_SampleTime_71Cycles5: Sample time equal to 71.5 cycles + * @arg ADC_SampleTime_239Cycles5: Sample time equal to 239.5 cycles + * @retval None + */ +void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0, tmpreg3 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + assert_param(IS_ADC_INJECTED_RANK(Rank)); + assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); + /* if ADC_Channel_10 ... ADC_Channel_17 is selected */ + if (ADC_Channel > ADC_Channel_9) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR1; + /* Calculate the mask to clear */ + tmpreg2 = SMPR1_SMP_Set << (3*(ADC_Channel - 10)); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3*(ADC_Channel - 10)); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR1 = tmpreg1; + } + else /* ADC_Channel include in ADC_Channel_[0..9] */ + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR2; + /* Calculate the mask to clear */ + tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel); + /* Clear the old channel sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + /* Set the new channel sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR2 = tmpreg1; + } + /* Rank configuration */ + /* Get the old register value */ + tmpreg1 = ADCx->JSQR; + /* Get JL value: Number = JL+1 */ + tmpreg3 = (tmpreg1 & JSQR_JL_Set)>> 20; + /* Calculate the mask to clear: ((Rank-1)+(4-JL-1)) */ + tmpreg2 = JSQR_JSQ_Set << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); + /* Clear the old JSQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set: ((Rank-1)+(4-JL-1)) */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); + /* Set the JSQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->JSQR = tmpreg1; +} + +/** + * @brief Configures the sequencer length for injected channels + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param Length: The sequencer length. + * This parameter must be a number between 1 to 4. + * @retval None + */ +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_LENGTH(Length)); + + /* Get the old register value */ + tmpreg1 = ADCx->JSQR; + /* Clear the old injected sequnence lenght JL bits */ + tmpreg1 &= JSQR_JL_Reset; + /* Set the injected sequnence lenght JL bits */ + tmpreg2 = Length - 1; + tmpreg1 |= tmpreg2 << 20; + /* Store the new register value */ + ADCx->JSQR = tmpreg1; +} + +/** + * @brief Set the injected channels conversion value offset + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_InjectedChannel: the ADC injected channel to set its offset. + * This parameter can be one of the following values: + * @arg ADC_InjectedChannel_1: Injected Channel1 selected + * @arg ADC_InjectedChannel_2: Injected Channel2 selected + * @arg ADC_InjectedChannel_3: Injected Channel3 selected + * @arg ADC_InjectedChannel_4: Injected Channel4 selected + * @param Offset: the offset value for the selected ADC injected channel + * This parameter must be a 12bit value. + * @retval None + */ +void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); + assert_param(IS_ADC_OFFSET(Offset)); + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel; + + /* Set the selected injected channel data offset */ + *(__IO uint32_t *) tmp = (uint32_t)Offset; +} + +/** + * @brief Returns the ADC injected channel conversion result + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_InjectedChannel: the converted ADC injected channel. + * This parameter can be one of the following values: + * @arg ADC_InjectedChannel_1: Injected Channel1 selected + * @arg ADC_InjectedChannel_2: Injected Channel2 selected + * @arg ADC_InjectedChannel_3: Injected Channel3 selected + * @arg ADC_InjectedChannel_4: Injected Channel4 selected + * @retval The Data conversion value. + */ +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel + JDR_Offset; + + /* Returns the selected injected channel conversion data value */ + return (uint16_t) (*(__IO uint32_t*) tmp); +} + +/** + * @brief Enables or disables the analog watchdog on single/all regular + * or injected channels + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_AnalogWatchdog: the ADC analog watchdog configuration. + * This parameter can be one of the following values: + * @arg ADC_AnalogWatchdog_SingleRegEnable: Analog watchdog on a single regular channel + * @arg ADC_AnalogWatchdog_SingleInjecEnable: Analog watchdog on a single injected channel + * @arg ADC_AnalogWatchdog_SingleRegOrInjecEnable: Analog watchdog on a single regular or injected channel + * @arg ADC_AnalogWatchdog_AllRegEnable: Analog watchdog on all regular channel + * @arg ADC_AnalogWatchdog_AllInjecEnable: Analog watchdog on all injected channel + * @arg ADC_AnalogWatchdog_AllRegAllInjecEnable: Analog watchdog on all regular and injected channels + * @arg ADC_AnalogWatchdog_None: No channel guarded by the analog watchdog + * @retval None + */ +void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_ANALOG_WATCHDOG(ADC_AnalogWatchdog)); + /* Get the old register value */ + tmpreg = ADCx->CR1; + /* Clear AWDEN, AWDENJ and AWDSGL bits */ + tmpreg &= CR1_AWDMode_Reset; + /* Set the analog watchdog enable mode */ + tmpreg |= ADC_AnalogWatchdog; + /* Store the new register value */ + ADCx->CR1 = tmpreg; +} + +/** + * @brief Configures the high and low thresholds of the analog watchdog. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC 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 threshold */ + ADCx->HTR = HighThreshold; + /* Set the ADCx low threshold */ + ADCx->LTR = LowThreshold; +} + +/** + * @brief Configures the analog watchdog guarded single channel + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_Channel: the ADC channel to configure for the analog watchdog. + * This parameter can be one 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 + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @retval None + */ +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + /* Get the old register value */ + tmpreg = ADCx->CR1; + /* Clear the Analog watchdog channel select bits */ + tmpreg &= CR1_AWDCH_Reset; + /* Set the Analog watchdog channel */ + tmpreg |= ADC_Channel; + /* Store the new register value */ + ADCx->CR1 = tmpreg; +} + +/** + * @brief Enables or disables the temperature sensor and Vrefint channel. + * @param NewState: new state of the temperature sensor. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_TempSensorVrefintCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the temperature sensor and Vrefint channel*/ + ADC1->CR2 |= CR2_TSVREFE_Set; + } + else + { + /* Disable the temperature sensor and Vrefint channel*/ + ADC1->CR2 &= CR2_TSVREFE_Reset; + } +} + +/** + * @brief Checks whether the specified ADC flag is set or not. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC 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_EOC: End of conversion flag + * @arg ADC_FLAG_JEOC: End of injected group conversion flag + * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag + * @arg ADC_FLAG_STRT: Start of regular group conversion flag + * @retval The new state of ADC_FLAG (SET or RESET). + */ +FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_GET_FLAG(ADC_FLAG)); + /* Check the status of the specified ADC flag */ + if ((ADCx->SR & ADC_FLAG) != (uint8_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, 2 or 3 to select the ADC 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_JEOC: End of injected group conversion flag + * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag + * @arg ADC_FLAG_STRT: Start of regular group conversion flag + * @retval None + */ +void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_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->SR = ~(uint32_t)ADC_FLAG; +} + +/** + * @brief Checks whether the specified ADC interrupt has occurred or not. + * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. + * @param ADC_IT: specifies the ADC interrupt source to check. + * This parameter can be one of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt mask + * @arg ADC_IT_AWD: Analog watchdog interrupt mask + * @arg ADC_IT_JEOC: End of injected conversion interrupt mask + * @retval The new state of ADC_IT (SET or RESET). + */ +ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t itmask = 0, enablestatus = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_GET_IT(ADC_IT)); + /* Get the ADC IT index */ + itmask = ADC_IT >> 8; + /* Get the ADC_IT enable bit status */ + enablestatus = (ADCx->CR1 & (uint8_t)ADC_IT) ; + /* Check the status of the specified ADC interrupt */ + if (((ADCx->SR & itmask) != (uint32_t)RESET) && enablestatus) + { + /* 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, 2 or 3 to select the ADC peripheral. + * @param ADC_IT: specifies the ADC interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt mask + * @arg ADC_IT_AWD: Analog watchdog interrupt mask + * @arg ADC_IT_JEOC: End of injected conversion interrupt mask + * @retval None + */ +void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT) +{ + uint8_t itmask = 0; + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_IT(ADC_IT)); + /* Get the ADC IT index */ + itmask = (uint8_t)(ADC_IT >> 8); + /* Clear the selected ADC interrupt pending bits */ + ADCx->SR = ~(uint32_t)itmask; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_adc.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_adc.h new file mode 100644 index 0000000..26e725f --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_adc.h @@ -0,0 +1,482 @@ +/** + ****************************************************************************** + * @file stm32f10x_adc.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the ADC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_ADC_H +#define __STM32F10x_ADC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup ADC + * @{ + */ + +/** @defgroup ADC_Exported_Types + * @{ + */ + +/** + * @brief ADC Init structure definition + */ + +typedef struct +{ + uint32_t ADC_Mode; /*!< Configures the ADC to operate in independent or + dual mode. + This parameter can be a value of @ref ADC_mode */ + + FunctionalState ADC_ScanConvMode; /*!< Specifies whether the conversion is performed in + Scan (multichannels) or Single (one channel) mode. + This parameter can be set to ENABLE or DISABLE */ + + 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_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_regular_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 */ + + uint8_t ADC_NbrOfChannel; /*!< Specifies the number of ADC channels that will be converted + using the sequencer for regular channel group. + This parameter must range from 1 to 16. */ +}ADC_InitTypeDef; +/** + * @} + */ + +/** @defgroup ADC_Exported_Constants + * @{ + */ + +#define IS_ADC_ALL_PERIPH(PERIPH) (((PERIPH) == ADC1) || \ + ((PERIPH) == ADC2) || \ + ((PERIPH) == ADC3)) + +#define IS_ADC_DMA_PERIPH(PERIPH) (((PERIPH) == ADC1) || \ + ((PERIPH) == ADC3)) + +/** @defgroup ADC_mode + * @{ + */ + +#define ADC_Mode_Independent ((uint32_t)0x00000000) +#define ADC_Mode_RegInjecSimult ((uint32_t)0x00010000) +#define ADC_Mode_RegSimult_AlterTrig ((uint32_t)0x00020000) +#define ADC_Mode_InjecSimult_FastInterl ((uint32_t)0x00030000) +#define ADC_Mode_InjecSimult_SlowInterl ((uint32_t)0x00040000) +#define ADC_Mode_InjecSimult ((uint32_t)0x00050000) +#define ADC_Mode_RegSimult ((uint32_t)0x00060000) +#define ADC_Mode_FastInterl ((uint32_t)0x00070000) +#define ADC_Mode_SlowInterl ((uint32_t)0x00080000) +#define ADC_Mode_AlterTrig ((uint32_t)0x00090000) + +#define IS_ADC_MODE(MODE) (((MODE) == ADC_Mode_Independent) || \ + ((MODE) == ADC_Mode_RegInjecSimult) || \ + ((MODE) == ADC_Mode_RegSimult_AlterTrig) || \ + ((MODE) == ADC_Mode_InjecSimult_FastInterl) || \ + ((MODE) == ADC_Mode_InjecSimult_SlowInterl) || \ + ((MODE) == ADC_Mode_InjecSimult) || \ + ((MODE) == ADC_Mode_RegSimult) || \ + ((MODE) == ADC_Mode_FastInterl) || \ + ((MODE) == ADC_Mode_SlowInterl) || \ + ((MODE) == ADC_Mode_AlterTrig)) +/** + * @} + */ + +/** @defgroup ADC_external_trigger_sources_for_regular_channels_conversion + * @{ + */ + +#define ADC_ExternalTrigConv_T1_CC1 ((uint32_t)0x00000000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T1_CC2 ((uint32_t)0x00020000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x00060000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)0x00080000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_T4_CC4 ((uint32_t)0x000A0000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO ((uint32_t)0x000C0000) /*!< For ADC1 and ADC2 */ + +#define ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x00040000) /*!< For ADC1, ADC2 and ADC3 */ +#define ADC_ExternalTrigConv_None ((uint32_t)0x000E0000) /*!< For ADC1, ADC2 and ADC3 */ + +#define ADC_ExternalTrigConv_T3_CC1 ((uint32_t)0x00000000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T2_CC3 ((uint32_t)0x00020000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T8_CC1 ((uint32_t)0x00060000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T8_TRGO ((uint32_t)0x00080000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T5_CC1 ((uint32_t)0x000A0000) /*!< For ADC3 only */ +#define ADC_ExternalTrigConv_T5_CC3 ((uint32_t)0x000C0000) /*!< For ADC3 only */ + +#define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_ExternalTrigConv_T1_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T1_CC2) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T1_CC3) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T2_CC2) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T3_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T4_CC4) || \ + ((REGTRIG) == ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_None) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T3_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T2_CC3) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T8_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T8_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T5_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T5_CC3)) +/** + * @} + */ + +/** @defgroup ADC_data_align + * @{ + */ + +#define ADC_DataAlign_Right ((uint32_t)0x00000000) +#define ADC_DataAlign_Left ((uint32_t)0x00000800) +#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \ + ((ALIGN) == ADC_DataAlign_Left)) +/** + * @} + */ + +/** @defgroup ADC_channels + * @{ + */ + +#define ADC_Channel_0 ((uint8_t)0x00) +#define ADC_Channel_1 ((uint8_t)0x01) +#define ADC_Channel_2 ((uint8_t)0x02) +#define ADC_Channel_3 ((uint8_t)0x03) +#define ADC_Channel_4 ((uint8_t)0x04) +#define ADC_Channel_5 ((uint8_t)0x05) +#define ADC_Channel_6 ((uint8_t)0x06) +#define ADC_Channel_7 ((uint8_t)0x07) +#define ADC_Channel_8 ((uint8_t)0x08) +#define ADC_Channel_9 ((uint8_t)0x09) +#define ADC_Channel_10 ((uint8_t)0x0A) +#define ADC_Channel_11 ((uint8_t)0x0B) +#define ADC_Channel_12 ((uint8_t)0x0C) +#define ADC_Channel_13 ((uint8_t)0x0D) +#define ADC_Channel_14 ((uint8_t)0x0E) +#define ADC_Channel_15 ((uint8_t)0x0F) +#define ADC_Channel_16 ((uint8_t)0x10) +#define ADC_Channel_17 ((uint8_t)0x11) + +#define ADC_Channel_TempSensor ((uint8_t)ADC_Channel_16) +#define ADC_Channel_Vrefint ((uint8_t)ADC_Channel_17) + +#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_Channel_0) || ((CHANNEL) == ADC_Channel_1) || \ + ((CHANNEL) == ADC_Channel_2) || ((CHANNEL) == ADC_Channel_3) || \ + ((CHANNEL) == ADC_Channel_4) || ((CHANNEL) == ADC_Channel_5) || \ + ((CHANNEL) == ADC_Channel_6) || ((CHANNEL) == ADC_Channel_7) || \ + ((CHANNEL) == ADC_Channel_8) || ((CHANNEL) == ADC_Channel_9) || \ + ((CHANNEL) == ADC_Channel_10) || ((CHANNEL) == ADC_Channel_11) || \ + ((CHANNEL) == ADC_Channel_12) || ((CHANNEL) == ADC_Channel_13) || \ + ((CHANNEL) == ADC_Channel_14) || ((CHANNEL) == ADC_Channel_15) || \ + ((CHANNEL) == ADC_Channel_16) || ((CHANNEL) == ADC_Channel_17)) +/** + * @} + */ + +/** @defgroup ADC_sampling_time + * @{ + */ + +#define ADC_SampleTime_1Cycles5 ((uint8_t)0x00) +#define ADC_SampleTime_7Cycles5 ((uint8_t)0x01) +#define ADC_SampleTime_13Cycles5 ((uint8_t)0x02) +#define ADC_SampleTime_28Cycles5 ((uint8_t)0x03) +#define ADC_SampleTime_41Cycles5 ((uint8_t)0x04) +#define ADC_SampleTime_55Cycles5 ((uint8_t)0x05) +#define ADC_SampleTime_71Cycles5 ((uint8_t)0x06) +#define ADC_SampleTime_239Cycles5 ((uint8_t)0x07) +#define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SampleTime_1Cycles5) || \ + ((TIME) == ADC_SampleTime_7Cycles5) || \ + ((TIME) == ADC_SampleTime_13Cycles5) || \ + ((TIME) == ADC_SampleTime_28Cycles5) || \ + ((TIME) == ADC_SampleTime_41Cycles5) || \ + ((TIME) == ADC_SampleTime_55Cycles5) || \ + ((TIME) == ADC_SampleTime_71Cycles5) || \ + ((TIME) == ADC_SampleTime_239Cycles5)) +/** + * @} + */ + +/** @defgroup ADC_external_trigger_sources_for_injected_channels_conversion + * @{ + */ + +#define ADC_ExternalTrigInjecConv_T2_TRGO ((uint32_t)0x00002000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_T2_CC1 ((uint32_t)0x00003000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_T3_CC4 ((uint32_t)0x00004000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_T4_TRGO ((uint32_t)0x00005000) /*!< For ADC1 and ADC2 */ +#define ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4 ((uint32_t)0x00006000) /*!< For ADC1 and ADC2 */ + +#define ADC_ExternalTrigInjecConv_T1_TRGO ((uint32_t)0x00000000) /*!< For ADC1, ADC2 and ADC3 */ +#define ADC_ExternalTrigInjecConv_T1_CC4 ((uint32_t)0x00001000) /*!< For ADC1, ADC2 and ADC3 */ +#define ADC_ExternalTrigInjecConv_None ((uint32_t)0x00007000) /*!< For ADC1, ADC2 and ADC3 */ + +#define ADC_ExternalTrigInjecConv_T4_CC3 ((uint32_t)0x00002000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T8_CC2 ((uint32_t)0x00003000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T8_CC4 ((uint32_t)0x00004000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T5_TRGO ((uint32_t)0x00005000) /*!< For ADC3 only */ +#define ADC_ExternalTrigInjecConv_T5_CC4 ((uint32_t)0x00006000) /*!< For ADC3 only */ + +#define IS_ADC_EXT_INJEC_TRIG(INJTRIG) (((INJTRIG) == ADC_ExternalTrigInjecConv_T1_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T1_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_CC1) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T3_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_None) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC3) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC2) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_CC4)) +/** + * @} + */ + +/** @defgroup ADC_injected_channel_selection + * @{ + */ + +#define ADC_InjectedChannel_1 ((uint8_t)0x14) +#define ADC_InjectedChannel_2 ((uint8_t)0x18) +#define ADC_InjectedChannel_3 ((uint8_t)0x1C) +#define ADC_InjectedChannel_4 ((uint8_t)0x20) +#define IS_ADC_INJECTED_CHANNEL(CHANNEL) (((CHANNEL) == ADC_InjectedChannel_1) || \ + ((CHANNEL) == ADC_InjectedChannel_2) || \ + ((CHANNEL) == ADC_InjectedChannel_3) || \ + ((CHANNEL) == ADC_InjectedChannel_4)) +/** + * @} + */ + +/** @defgroup ADC_analog_watchdog_selection + * @{ + */ + +#define ADC_AnalogWatchdog_SingleRegEnable ((uint32_t)0x00800200) +#define ADC_AnalogWatchdog_SingleInjecEnable ((uint32_t)0x00400200) +#define ADC_AnalogWatchdog_SingleRegOrInjecEnable ((uint32_t)0x00C00200) +#define ADC_AnalogWatchdog_AllRegEnable ((uint32_t)0x00800000) +#define ADC_AnalogWatchdog_AllInjecEnable ((uint32_t)0x00400000) +#define ADC_AnalogWatchdog_AllRegAllInjecEnable ((uint32_t)0x00C00000) +#define ADC_AnalogWatchdog_None ((uint32_t)0x00000000) + +#define IS_ADC_ANALOG_WATCHDOG(WATCHDOG) (((WATCHDOG) == ADC_AnalogWatchdog_SingleRegEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_SingleInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_SingleRegOrInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllRegEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllRegAllInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_None)) +/** + * @} + */ + +/** @defgroup ADC_interrupts_definition + * @{ + */ + +#define ADC_IT_EOC ((uint16_t)0x0220) +#define ADC_IT_AWD ((uint16_t)0x0140) +#define ADC_IT_JEOC ((uint16_t)0x0480) + +#define IS_ADC_IT(IT) ((((IT) & (uint16_t)0xF81F) == 0x00) && ((IT) != 0x00)) + +#define IS_ADC_GET_IT(IT) (((IT) == ADC_IT_EOC) || ((IT) == ADC_IT_AWD) || \ + ((IT) == ADC_IT_JEOC)) +/** + * @} + */ + +/** @defgroup ADC_flags_definition + * @{ + */ + +#define ADC_FLAG_AWD ((uint8_t)0x01) +#define ADC_FLAG_EOC ((uint8_t)0x02) +#define ADC_FLAG_JEOC ((uint8_t)0x04) +#define ADC_FLAG_JSTRT ((uint8_t)0x08) +#define ADC_FLAG_STRT ((uint8_t)0x10) +#define IS_ADC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint8_t)0xE0) == 0x00) && ((FLAG) != 0x00)) +#define IS_ADC_GET_FLAG(FLAG) (((FLAG) == ADC_FLAG_AWD) || ((FLAG) == ADC_FLAG_EOC) || \ + ((FLAG) == ADC_FLAG_JEOC) || ((FLAG)== ADC_FLAG_JSTRT) || \ + ((FLAG) == ADC_FLAG_STRT)) +/** + * @} + */ + +/** @defgroup ADC_thresholds + * @{ + */ + +#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFF) + +/** + * @} + */ + +/** @defgroup ADC_injected_offset + * @{ + */ + +#define IS_ADC_OFFSET(OFFSET) ((OFFSET) <= 0xFFF) + +/** + * @} + */ + +/** @defgroup ADC_injected_length + * @{ + */ + +#define IS_ADC_INJECTED_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x4)) + +/** + * @} + */ + +/** @defgroup ADC_injected_rank + * @{ + */ + +#define IS_ADC_INJECTED_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x4)) + +/** + * @} + */ + + +/** @defgroup ADC_regular_length + * @{ + */ + +#define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x10)) +/** + * @} + */ + +/** @defgroup ADC_regular_rank + * @{ + */ + +#define IS_ADC_REGULAR_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x10)) + +/** + * @} + */ + +/** @defgroup ADC_regular_discontinuous_mode_number + * @{ + */ + +#define IS_ADC_REGULAR_DISC_NUMBER(NUMBER) (((NUMBER) >= 0x1) && ((NUMBER) <= 0x8)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup ADC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup ADC_Exported_Functions + * @{ + */ + +void ADC_DeInit(ADC_TypeDef* ADCx); +void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); +void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); +void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); +void ADC_ResetCalibration(ADC_TypeDef* ADCx); +FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx); +void ADC_StartCalibration(ADC_TypeDef* ADCx); +FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx); +void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); +void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); +void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); +uint32_t ADC_GetDualModeConversionValue(void); +void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv); +void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx); +void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length); +void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset); +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel); +void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog); +void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold); +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel); +void ADC_TempSensorVrefintCmd(FunctionalState NewState); +FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); +void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); +ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT); +void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_ADC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.c new file mode 100644 index 0000000..3ad63af --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.c @@ -0,0 +1,307 @@ +/** + ****************************************************************************** + * @file stm32f10x_bkp.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the BKP firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_bkp.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup BKP + * @brief BKP driver modules + * @{ + */ + +/** @defgroup BKP_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_Defines + * @{ + */ + +/* ------------ BKP registers bit address in the alias region --------------- */ +#define BKP_OFFSET (BKP_BASE - PERIPH_BASE) + +/* --- CR Register ----*/ + +/* Alias word address of TPAL bit */ +#define CR_OFFSET (BKP_OFFSET + 0x30) +#define TPAL_BitNumber 0x01 +#define CR_TPAL_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (TPAL_BitNumber * 4)) + +/* Alias word address of TPE bit */ +#define TPE_BitNumber 0x00 +#define CR_TPE_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (TPE_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of TPIE bit */ +#define CSR_OFFSET (BKP_OFFSET + 0x34) +#define TPIE_BitNumber 0x02 +#define CSR_TPIE_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TPIE_BitNumber * 4)) + +/* Alias word address of TIF bit */ +#define TIF_BitNumber 0x09 +#define CSR_TIF_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TIF_BitNumber * 4)) + +/* Alias word address of TEF bit */ +#define TEF_BitNumber 0x08 +#define CSR_TEF_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TEF_BitNumber * 4)) + +/* ---------------------- BKP registers bit mask ------------------------ */ + +/* RTCCR register bit mask */ +#define RTCCR_CAL_MASK ((uint16_t)0xFF80) +#define RTCCR_MASK ((uint16_t)0xFC7F) + +/** + * @} + */ + + +/** @defgroup BKP_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the BKP peripheral registers to their default reset values. + * @param None + * @retval None + */ +void BKP_DeInit(void) +{ + RCC_BackupResetCmd(ENABLE); + RCC_BackupResetCmd(DISABLE); +} + +/** + * @brief Configures the Tamper Pin active level. + * @param BKP_TamperPinLevel: specifies the Tamper Pin active level. + * This parameter can be one of the following values: + * @arg BKP_TamperPinLevel_High: Tamper pin active on high level + * @arg BKP_TamperPinLevel_Low: Tamper pin active on low level + * @retval None + */ +void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel) +{ + /* Check the parameters */ + assert_param(IS_BKP_TAMPER_PIN_LEVEL(BKP_TamperPinLevel)); + *(__IO uint32_t *) CR_TPAL_BB = BKP_TamperPinLevel; +} + +/** + * @brief Enables or disables the Tamper Pin activation. + * @param NewState: new state of the Tamper Pin activation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void BKP_TamperPinCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_TPE_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Tamper Pin Interrupt. + * @param NewState: new state of the Tamper Pin Interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void BKP_ITConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CSR_TPIE_BB = (uint32_t)NewState; +} + +/** + * @brief Select the RTC output source to output on the Tamper pin. + * @param BKP_RTCOutputSource: specifies the RTC output source. + * This parameter can be one of the following values: + * @arg BKP_RTCOutputSource_None: no RTC output on the Tamper pin. + * @arg BKP_RTCOutputSource_CalibClock: output the RTC clock with frequency + * divided by 64 on the Tamper pin. + * @arg BKP_RTCOutputSource_Alarm: output the RTC Alarm pulse signal on + * the Tamper pin. + * @arg BKP_RTCOutputSource_Second: output the RTC Second pulse signal on + * the Tamper pin. + * @retval None + */ +void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource) +{ + uint16_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_BKP_RTC_OUTPUT_SOURCE(BKP_RTCOutputSource)); + tmpreg = BKP->RTCCR; + /* Clear CCO, ASOE and ASOS bits */ + tmpreg &= RTCCR_MASK; + + /* Set CCO, ASOE and ASOS bits according to BKP_RTCOutputSource value */ + tmpreg |= BKP_RTCOutputSource; + /* Store the new value */ + BKP->RTCCR = tmpreg; +} + +/** + * @brief Sets RTC Clock Calibration value. + * @param CalibrationValue: specifies the RTC Clock Calibration value. + * This parameter must be a number between 0 and 0x7F. + * @retval None + */ +void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue) +{ + uint16_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_BKP_CALIBRATION_VALUE(CalibrationValue)); + tmpreg = BKP->RTCCR; + /* Clear CAL[6:0] bits */ + tmpreg &= RTCCR_CAL_MASK; + /* Set CAL[6:0] bits according to CalibrationValue value */ + tmpreg |= CalibrationValue; + /* Store the new value */ + BKP->RTCCR = tmpreg; +} + +/** + * @brief Writes user data to the specified Data Backup Register. + * @param BKP_DR: specifies the Data Backup Register. + * This parameter can be BKP_DRx where x:[1, 42] + * @param Data: data to write + * @retval None + */ +void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_BKP_DR(BKP_DR)); + + tmp = (uint32_t)BKP_BASE; + tmp += BKP_DR; + + *(__IO uint32_t *) tmp = Data; +} + +/** + * @brief Reads data from the specified Data Backup Register. + * @param BKP_DR: specifies the Data Backup Register. + * This parameter can be BKP_DRx where x:[1, 42] + * @retval The content of the specified Data Backup Register + */ +uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_BKP_DR(BKP_DR)); + + tmp = (uint32_t)BKP_BASE; + tmp += BKP_DR; + + return (*(__IO uint16_t *) tmp); +} + +/** + * @brief Checks whether the Tamper Pin Event flag is set or not. + * @param None + * @retval The new state of the Tamper Pin Event flag (SET or RESET). + */ +FlagStatus BKP_GetFlagStatus(void) +{ + return (FlagStatus)(*(__IO uint32_t *) CSR_TEF_BB); +} + +/** + * @brief Clears Tamper Pin Event pending flag. + * @param None + * @retval None + */ +void BKP_ClearFlag(void) +{ + /* Set CTE bit to clear Tamper Pin Event flag */ + BKP->CSR |= BKP_CSR_CTE; +} + +/** + * @brief Checks whether the Tamper Pin Interrupt has occurred or not. + * @param None + * @retval The new state of the Tamper Pin Interrupt (SET or RESET). + */ +ITStatus BKP_GetITStatus(void) +{ + return (ITStatus)(*(__IO uint32_t *) CSR_TIF_BB); +} + +/** + * @brief Clears Tamper Pin Interrupt pending bit. + * @param None + * @retval None + */ +void BKP_ClearITPendingBit(void) +{ + /* Set CTI bit to clear Tamper Pin Interrupt pending bit */ + BKP->CSR |= BKP_CSR_CTI; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.h new file mode 100644 index 0000000..dc40ec2 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_bkp.h @@ -0,0 +1,194 @@ +/** + ****************************************************************************** + * @file stm32f10x_bkp.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the BKP firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_BKP_H +#define __STM32F10x_BKP_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup BKP + * @{ + */ + +/** @defgroup BKP_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Exported_Constants + * @{ + */ + +/** @defgroup Tamper_Pin_active_level + * @{ + */ + +#define BKP_TamperPinLevel_High ((uint16_t)0x0000) +#define BKP_TamperPinLevel_Low ((uint16_t)0x0001) +#define IS_BKP_TAMPER_PIN_LEVEL(LEVEL) (((LEVEL) == BKP_TamperPinLevel_High) || \ + ((LEVEL) == BKP_TamperPinLevel_Low)) +/** + * @} + */ + +/** @defgroup RTC_output_source_to_output_on_the_Tamper_pin + * @{ + */ + +#define BKP_RTCOutputSource_None ((uint16_t)0x0000) +#define BKP_RTCOutputSource_CalibClock ((uint16_t)0x0080) +#define BKP_RTCOutputSource_Alarm ((uint16_t)0x0100) +#define BKP_RTCOutputSource_Second ((uint16_t)0x0300) +#define IS_BKP_RTC_OUTPUT_SOURCE(SOURCE) (((SOURCE) == BKP_RTCOutputSource_None) || \ + ((SOURCE) == BKP_RTCOutputSource_CalibClock) || \ + ((SOURCE) == BKP_RTCOutputSource_Alarm) || \ + ((SOURCE) == BKP_RTCOutputSource_Second)) +/** + * @} + */ + +/** @defgroup Data_Backup_Register + * @{ + */ + +#define BKP_DR1 ((uint16_t)0x0004) +#define BKP_DR2 ((uint16_t)0x0008) +#define BKP_DR3 ((uint16_t)0x000C) +#define BKP_DR4 ((uint16_t)0x0010) +#define BKP_DR5 ((uint16_t)0x0014) +#define BKP_DR6 ((uint16_t)0x0018) +#define BKP_DR7 ((uint16_t)0x001C) +#define BKP_DR8 ((uint16_t)0x0020) +#define BKP_DR9 ((uint16_t)0x0024) +#define BKP_DR10 ((uint16_t)0x0028) +#define BKP_DR11 ((uint16_t)0x0040) +#define BKP_DR12 ((uint16_t)0x0044) +#define BKP_DR13 ((uint16_t)0x0048) +#define BKP_DR14 ((uint16_t)0x004C) +#define BKP_DR15 ((uint16_t)0x0050) +#define BKP_DR16 ((uint16_t)0x0054) +#define BKP_DR17 ((uint16_t)0x0058) +#define BKP_DR18 ((uint16_t)0x005C) +#define BKP_DR19 ((uint16_t)0x0060) +#define BKP_DR20 ((uint16_t)0x0064) +#define BKP_DR21 ((uint16_t)0x0068) +#define BKP_DR22 ((uint16_t)0x006C) +#define BKP_DR23 ((uint16_t)0x0070) +#define BKP_DR24 ((uint16_t)0x0074) +#define BKP_DR25 ((uint16_t)0x0078) +#define BKP_DR26 ((uint16_t)0x007C) +#define BKP_DR27 ((uint16_t)0x0080) +#define BKP_DR28 ((uint16_t)0x0084) +#define BKP_DR29 ((uint16_t)0x0088) +#define BKP_DR30 ((uint16_t)0x008C) +#define BKP_DR31 ((uint16_t)0x0090) +#define BKP_DR32 ((uint16_t)0x0094) +#define BKP_DR33 ((uint16_t)0x0098) +#define BKP_DR34 ((uint16_t)0x009C) +#define BKP_DR35 ((uint16_t)0x00A0) +#define BKP_DR36 ((uint16_t)0x00A4) +#define BKP_DR37 ((uint16_t)0x00A8) +#define BKP_DR38 ((uint16_t)0x00AC) +#define BKP_DR39 ((uint16_t)0x00B0) +#define BKP_DR40 ((uint16_t)0x00B4) +#define BKP_DR41 ((uint16_t)0x00B8) +#define BKP_DR42 ((uint16_t)0x00BC) + +#define IS_BKP_DR(DR) (((DR) == BKP_DR1) || ((DR) == BKP_DR2) || ((DR) == BKP_DR3) || \ + ((DR) == BKP_DR4) || ((DR) == BKP_DR5) || ((DR) == BKP_DR6) || \ + ((DR) == BKP_DR7) || ((DR) == BKP_DR8) || ((DR) == BKP_DR9) || \ + ((DR) == BKP_DR10) || ((DR) == BKP_DR11) || ((DR) == BKP_DR12) || \ + ((DR) == BKP_DR13) || ((DR) == BKP_DR14) || ((DR) == BKP_DR15) || \ + ((DR) == BKP_DR16) || ((DR) == BKP_DR17) || ((DR) == BKP_DR18) || \ + ((DR) == BKP_DR19) || ((DR) == BKP_DR20) || ((DR) == BKP_DR21) || \ + ((DR) == BKP_DR22) || ((DR) == BKP_DR23) || ((DR) == BKP_DR24) || \ + ((DR) == BKP_DR25) || ((DR) == BKP_DR26) || ((DR) == BKP_DR27) || \ + ((DR) == BKP_DR28) || ((DR) == BKP_DR29) || ((DR) == BKP_DR30) || \ + ((DR) == BKP_DR31) || ((DR) == BKP_DR32) || ((DR) == BKP_DR33) || \ + ((DR) == BKP_DR34) || ((DR) == BKP_DR35) || ((DR) == BKP_DR36) || \ + ((DR) == BKP_DR37) || ((DR) == BKP_DR38) || ((DR) == BKP_DR39) || \ + ((DR) == BKP_DR40) || ((DR) == BKP_DR41) || ((DR) == BKP_DR42)) + +#define IS_BKP_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x7F) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup BKP_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup BKP_Exported_Functions + * @{ + */ + +void BKP_DeInit(void); +void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel); +void BKP_TamperPinCmd(FunctionalState NewState); +void BKP_ITConfig(FunctionalState NewState); +void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource); +void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue); +void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data); +uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR); +FlagStatus BKP_GetFlagStatus(void); +void BKP_ClearFlag(void); +ITStatus BKP_GetITStatus(void); +void BKP_ClearITPendingBit(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_BKP_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_can.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_can.c new file mode 100644 index 0000000..043819a --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_can.c @@ -0,0 +1,1166 @@ +/** + ****************************************************************************** + * @file stm32f10x_can.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the CAN firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_can.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup CAN + * @brief CAN driver modules + * @{ + */ + +/** @defgroup CAN_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Private_Defines + * @{ + */ + +/* 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)0x0000FFFF) +/* Time out for SLAK bit */ +#define SLAK_TIMEOUT ((uint32_t)0x0000FFFF) + + + +/* 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) + + +/** + * @} + */ + +/** @defgroup CAN_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Private_FunctionPrototypes + * @{ + */ + +static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit); + +/** + * @} + */ + +/** @defgroup CAN_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the CAN peripheral registers to their default reset values. + * @param CANx: where x can be 1 or 2 to select the CAN peripheral. + * @retval None. + */ +void CAN_DeInit(CAN_TypeDef* CANx) +{ + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + + if (CANx == CAN1) + { + /* Enable CAN1 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE); + /* Release CAN1 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, DISABLE); + } + else + { + /* Enable CAN2 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, ENABLE); + /* Release CAN2 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, DISABLE); + } +} + +/** + * @brief Initializes the CAN peripheral according to the specified + * parameters in the CAN_InitStruct. + * @param CANx: where x can be 1 or 2 to 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 + * CANINITFAILED or CANINITOK. + */ +uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct) +{ + uint8_t InitStatus = CANINITFAILED; + 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++; + } + + /* ...and check acknowledged */ + if ((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) + { + InitStatus = CANINITFAILED; + } + 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 = 0x00; + + while (((CANx->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT)) + { + wait_ack++; + } + + /* ...and check acknowledged */ + if ((CANx->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) + { + InitStatus = CANINITFAILED; + } + else + { + InitStatus = CANINITOK ; + } + } + + /* At this step, return the status of initialization */ + return InitStatus; +} + +/** + * @brief Initializes the CAN peripheral 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)0x00000001) << CAN_FilterInitStruct->CAN_FilterNumber; + + /* Initialisation mode for the filter */ + CAN1->FMR |= FMR_FINIT; + + /* Filter Deactivation */ + CAN1->FA1R &= ~(uint32_t)filter_number_bit_pos; + + /* Filter Scale */ + if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_16bit) + { + /* 16-bit scale for the filter */ + CAN1->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 */ + CAN1->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 */ + CAN1->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 */ + CAN1->FS1R |= filter_number_bit_pos; + /* 32-bit identifier or First 32-bit identifier */ + CAN1->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 */ + CAN1->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*/ + CAN1->FM1R &= ~(uint32_t)filter_number_bit_pos; + } + else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */ + { + /*Identifier list mode for the filter*/ + CAN1->FM1R |= (uint32_t)filter_number_bit_pos; + } + + /* Filter FIFO assignment */ + if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_FilterFIFO0) + { + /* FIFO 0 assignation for the filter */ + CAN1->FFA1R &= ~(uint32_t)filter_number_bit_pos; + } + + if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_FilterFIFO1) + { + /* FIFO 1 assignation for the filter */ + CAN1->FFA1R |= (uint32_t)filter_number_bit_pos; + } + + /* Filter activation */ + if (CAN_FilterInitStruct->CAN_FilterActivation == ENABLE) + { + CAN1->FA1R |= filter_number_bit_pos; + } + + /* Leave the initialisation mode for the filter */ + CAN1->FMR &= ~FMR_FINIT; +} + +/** + * @brief Fills each CAN_InitStruct member with its default value. + * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure which + * will 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. + * @note This function applies only to STM32 Connectivity line devices. + * @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 */ + CAN1->FMR |= FMR_FINIT; + /* Select the start slave bank */ + CAN1->FMR &= (uint32_t)0xFFFFC0F1 ; + CAN1->FMR |= (uint32_t)(CAN_BankNumber)<<8; + /* Leave Initialisation mode for the filter */ + CAN1->FMR &= ~FMR_FINIT; +} + +/** + * @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: + * -CAN_IT_TME, + * -CAN_IT_FMP0, + * -CAN_IT_FF0, + * -CAN_IT_FOV0, + * -CAN_IT_FMP1, + * -CAN_IT_FF1, + * -CAN_IT_FOV1, + * -CAN_IT_EWG, + * -CAN_IT_EPV, + * -CAN_IT_LEC, + * -CAN_IT_ERR, + * -CAN_IT_WKU or + * -CAN_IT_SLK. + * @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 Initiates the transmission of a 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 datas. + * @retval The number of the mailbox that is used for transmission + * or CAN_NO_MB 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_NO_MB; + } + + if (transmit_mailbox != CAN_NO_MB) + { + /* Set up the Id */ + CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ; + if (TxMessage->IDE == CAN_ID_STD) + { + 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 of a message. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param TransmitMailbox: the number of the mailbox that is used for transmission. + * @retval CANTXOK if the CAN driver transmits the message, CANTXFAILED in an other case. + */ +uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox) +{ + /* RQCP, TXOK and TME bits */ + uint8_t state = 0; + /* Check the parameters */ + assert_param(IS_CAN_ALL_PERIPH(CANx)); + assert_param(IS_CAN_TRANSMITMAILBOX(TransmitMailbox)); + switch (TransmitMailbox) + { + case (0): state |= (uint8_t)((CANx->TSR & CAN_TSR_RQCP0) << 2); + state |= (uint8_t)((CANx->TSR & CAN_TSR_TXOK0) >> 0); + state |= (uint8_t)((CANx->TSR & CAN_TSR_TME0) >> 26); + break; + case (1): state |= (uint8_t)((CANx->TSR & CAN_TSR_RQCP1) >> 6); + state |= (uint8_t)((CANx->TSR & CAN_TSR_TXOK1) >> 8); + state |= (uint8_t)((CANx->TSR & CAN_TSR_TME1) >> 27); + break; + case (2): state |= (uint8_t)((CANx->TSR & CAN_TSR_RQCP2) >> 14); + state |= (uint8_t)((CANx->TSR & CAN_TSR_TXOK2) >> 16); + state |= (uint8_t)((CANx->TSR & CAN_TSR_TME2) >> 28); + break; + default: + state = CANTXFAILED; + break; + } + switch (state) + { + /* transmit pending */ + case (0x0): state = CANTXPENDING; + break; + /* transmit failed */ + case (0x5): state = CANTXFAILED; + break; + /* transmit succedeed */ + case (0x7): state = CANTXOK; + break; + default: + state = CANTXFAILED; + break; + } + return state; +} + +/** + * @brief Cancels a transmit request. + * @param CANx: where x can be 1 or 2 to 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 (0): CANx->TSR |= CAN_TSR_ABRQ0; + break; + case (1): CANx->TSR |= CAN_TSR_ABRQ1; + break; + case (2): CANx->TSR |= CAN_TSR_ABRQ2; + break; + default: + break; + } +} + +/** + * @brief Releases a FIFO. + * @param CANx: where x can be 1 or 2 to 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 messages. + * @param CANx: where x can be 1 or 2 to 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; +} + +/** + * @brief Receives a message. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1. + * @param RxMessage: pointer to a structure receive message which + * contains CAN Id, CAN DLC, CAN datas 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_STD) + { + 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 */ + CAN_FIFORelease(CANx, FIFONumber); +} + +/** + * @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 or DISABLE. + * @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 Enters the low power mode. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @retval CANSLEEPOK if sleep entered, CANSLEEPFAILED in an other case. + */ +uint8_t CAN_Sleep(CAN_TypeDef* CANx) +{ + uint8_t sleepstatus = CANSLEEPFAILED; + + /* 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 = CANSLEEPOK; + } + /* At this step, sleep mode status */ + return (uint8_t)sleepstatus; +} + +/** + * @brief Wakes the CAN up. + * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. + * @retval CANWAKEUPOK if sleep mode left, CANWAKEUPFAILED in an other case. + */ +uint8_t CAN_WakeUp(CAN_TypeDef* CANx) +{ + uint32_t wait_slak = SLAK_TIMEOUT; + uint8_t wakeupstatus = CANWAKEUPFAILED; + + /* 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) + { + /* Sleep mode exited */ + wakeupstatus = CANWAKEUPOK; + } + /* At this step, sleep mode status */ + return (uint8_t)wakeupstatus; +} + +/** + * @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 flags: + * - CAN_FLAG_EWG + * - CAN_FLAG_EPV + * - CAN_FLAG_BOF + * - CAN_FLAG_RQCP0 + * - CAN_FLAG_RQCP1 + * - CAN_FLAG_RQCP2 + * - CAN_FLAG_FMP1 + * - CAN_FLAG_FF1 + * - CAN_FLAG_FOV1 + * - CAN_FLAG_FMP0 + * - CAN_FLAG_FF0 + * - CAN_FLAG_FOV0 + * - CAN_FLAG_WKU + * - CAN_FLAG_SLAK + * - CAN_FLAG_LEC + * @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 flags: + * - CAN_FLAG_RQCP0 + * - CAN_FLAG_RQCP1 + * - CAN_FLAG_RQCP2 + * - CAN_FLAG_FF1 + * - CAN_FLAG_FOV1 + * - CAN_FLAG_FF0 + * - CAN_FLAG_FOV0 + * - CAN_FLAG_WKU + * - CAN_FLAG_SLAK + * - CAN_FLAG_LEC + * @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 flags: + * - CAN_IT_TME + * - CAN_IT_FMP0 + * - CAN_IT_FF0 + * - CAN_IT_FOV0 + * - CAN_IT_FMP1 + * - CAN_IT_FF1 + * - CAN_IT_FOV1 + * - CAN_IT_WKU + * - CAN_IT_SLK + * - CAN_IT_EWG + * - CAN_IT_EPV + * - CAN_IT_BOF + * - CAN_IT_LEC + * - CAN_IT_ERR + * @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 enable interrupt 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, CAN_ESR_EWGF, CAN_ESR_EPVF, CAN_ESR_BOFF and CAN_ESR_LEC bits */ + itstatus = CheckITStatus(CANx->ESR, CAN_ESR_EWGF|CAN_ESR_EPVF|CAN_ESR_BOFF|CAN_ESR_LEC); + 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. + * - CAN_IT_TME + * - CAN_IT_FF0 + * - CAN_IT_FOV0 + * - CAN_IT_FF1 + * - CAN_IT_FOV1 + * - CAN_IT_WKU + * - CAN_IT_SLK + * - CAN_IT_EWG + * - CAN_IT_EPV + * - CAN_IT_BOF + * - CAN_IT_LEC + * - CAN_IT_ERR + * @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 of 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 of 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 of 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 of 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 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_can.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_can.h new file mode 100644 index 0000000..544d779 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_can.h @@ -0,0 +1,583 @@ +/** + ****************************************************************************** + * @file stm32f10x_can.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the CAN firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_CAN_H +#define __STM32F10x_CAN_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup CAN + * @{ + */ + +/** @defgroup CAN_Exported_Types + * @{ + */ + +#define IS_CAN_ALL_PERIPH(PERIPH) (((PERIPH) == CAN1) || \ + ((PERIPH) == CAN2)) + +/** + * @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 no-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; + +/** + * @} + */ + +/** @defgroup CAN_Exported_Constants + * @{ + */ + +/** @defgroup CAN_sleep_constants + * @{ + */ + +#define CANINITFAILED ((uint8_t)0x00) /*!< CAN initialization failed */ +#define CANINITOK ((uint8_t)0x01) /*!< CAN initialization failed */ + +/** + * @} + */ + +/** @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_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 + * @{ + */ +#ifndef STM32F10X_CL + #define IS_CAN_FILTER_NUMBER(NUMBER) ((NUMBER) <= 13) +#else + #define IS_CAN_FILTER_NUMBER(NUMBER) ((NUMBER) <= 27) +#endif /* STM32F10X_CL */ +/** + * @} + */ + +/** @defgroup CAN_filter_mode + * @{ + */ + +#define CAN_FilterMode_IdMask ((uint8_t)0x00) /*!< id/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_FilterFIFO0 ((uint8_t)0x00) /*!< Filter FIFO 0 assignment for filter x */ +#define CAN_FilterFIFO1 ((uint8_t)0x01) /*!< Filter FIFO 1 assignment for filter x */ +#define IS_CAN_FILTER_FIFO(FIFO) (((FIFO) == CAN_FilterFIFO0) || \ + ((FIFO) == CAN_FilterFIFO1)) + +/** + * @} + */ + +/** @defgroup 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_STD ((uint32_t)0x00000000) /*!< Standard Id */ +#define CAN_ID_EXT ((uint32_t)0x00000004) /*!< Extended Id */ +#define IS_CAN_IDTYPE(IDTYPE) (((IDTYPE) == CAN_ID_STD) || ((IDTYPE) == CAN_ID_EXT)) + +/** + * @} + */ + +/** @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)) + +/** + * @} + */ + +/** @defgroup CAN_transmit_constants + * @{ + */ + +#define CANTXFAILED ((uint8_t)0x00) /*!< CAN transmission failed */ +#define CANTXOK ((uint8_t)0x01) /*!< CAN transmission succeeded */ +#define CANTXPENDING ((uint8_t)0x02) /*!< CAN transmission pending */ +#define CAN_NO_MB ((uint8_t)0x04) /*!< CAN cell did not provide an empty mailbox */ + +/** + * @} + */ + +/** @defgroup CAN_receive_FIFO_number_constants + * @{ + */ + +#define CAN_FIFO0 ((uint8_t)0x00) /*!< CAN FIFO0 used to receive */ +#define CAN_FIFO1 ((uint8_t)0x01) /*!< CAN FIFO1 used to receive */ + +#define IS_CAN_FIFO(FIFO) (((FIFO) == CAN_FIFO0) || ((FIFO) == CAN_FIFO1)) + +/** + * @} + */ + +/** @defgroup CAN_sleep_constants + * @{ + */ + +#define CANSLEEPFAILED ((uint8_t)0x00) /*!< CAN did not enter the sleep mode */ +#define CANSLEEPOK ((uint8_t)0x01) /*!< CAN entered the sleep mode */ + +/** + * @} + */ + +/** @defgroup CAN_wake_up_constants + * @{ + */ + +#define CANWAKEUPFAILED ((uint8_t)0x00) /*!< CAN did not leave the sleep mode */ +#define CANWAKEUPOK ((uint8_t)0x01) /*!< CAN leaved the sleep mode */ + +/** + * @} + */ + +/** @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 intterupt 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)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup CAN_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions + * @{ + */ + +void CAN_DeInit(CAN_TypeDef* CANx); +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_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState); +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); +void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber); +uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber); +void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage); +void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState); +uint8_t CAN_Sleep(CAN_TypeDef* CANx); +uint8_t CAN_WakeUp(CAN_TypeDef* CANx); +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 /* __STM32F10x_CAN_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_cec.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_cec.c new file mode 100644 index 0000000..5b3f9b5 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_cec.c @@ -0,0 +1,432 @@ +/** + ****************************************************************************** + * @file stm32f10x_cec.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the CEC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_cec.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup CEC + * @brief CEC driver modules + * @{ + */ + +/** @defgroup CEC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + + +/** @defgroup CEC_Private_Defines + * @{ + */ + +/* ------------ CEC registers bit address in the alias region ----------- */ +#define CEC_OFFSET (CEC_BASE - PERIPH_BASE) + +/* --- CFGR Register ---*/ + +/* Alias word address of PE bit */ +#define CFGR_OFFSET (CEC_OFFSET + 0x00) +#define PE_BitNumber 0x00 +#define CFGR_PE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (PE_BitNumber * 4)) + +/* Alias word address of IE bit */ +#define IE_BitNumber 0x01 +#define CFGR_IE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (IE_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of TSOM bit */ +#define CSR_OFFSET (CEC_OFFSET + 0x10) +#define TSOM_BitNumber 0x00 +#define CSR_TSOM_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TSOM_BitNumber * 4)) + +/* Alias word address of TEOM bit */ +#define TEOM_BitNumber 0x01 +#define CSR_TEOM_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TEOM_BitNumber * 4)) + +#define CFGR_CLEAR_Mask (uint8_t)(0xF3) /* CFGR register Mask */ +#define FLAG_Mask ((uint32_t)0x00FFFFFF) /* CEC FLAG mask */ + +/** + * @} + */ + + +/** @defgroup CEC_Private_Macros + * @{ + */ + +/** + * @} + */ + + +/** @defgroup CEC_Private_Variables + * @{ + */ + +/** + * @} + */ + + +/** @defgroup CEC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + + +/** @defgroup CEC_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the CEC peripheral registers to their default reset + * values. + * @param None + * @retval None + */ +void CEC_DeInit(void) +{ + /* Enable CEC reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CEC, ENABLE); + /* Release CEC from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CEC, DISABLE); +} + + +/** + * @brief Initializes the CEC peripheral according to the specified + * parameters in the CEC_InitStruct. + * @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) +{ + uint16_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_CEC_BIT_TIMING_ERROR_MODE(CEC_InitStruct->CEC_BitTimingMode)); + assert_param(IS_CEC_BIT_PERIOD_ERROR_MODE(CEC_InitStruct->CEC_BitPeriodMode)); + + /*---------------------------- CEC CFGR Configuration -----------------*/ + /* Get the CEC CFGR value */ + tmpreg = CEC->CFGR; + + /* Clear BTEM and BPEM bits */ + tmpreg &= CFGR_CLEAR_Mask; + + /* Configure CEC: Bit Timing Error and Bit Period Error */ + tmpreg |= (uint16_t)(CEC_InitStruct->CEC_BitTimingMode | CEC_InitStruct->CEC_BitPeriodMode); + + /* Write to CEC CFGR register*/ + CEC->CFGR = tmpreg; + +} + +/** + * @brief Enables or disables the specified CEC peripheral. + * @param NewState: new state of the CEC peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void CEC_Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CFGR_PE_BB = (uint32_t)NewState; + + if(NewState == DISABLE) + { + /* Wait until the PE bit is cleared by hardware (Idle Line detected) */ + while((CEC->CFGR & CEC_CFGR_PE) != (uint32_t)RESET) + { + } + } +} + +/** + * @brief Enables or disables the CEC interrupt. + * @param NewState: new state of the CEC interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void CEC_ITConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CFGR_IE_BB = (uint32_t)NewState; +} + +/** + * @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) +{ + /* Check the parameters */ + assert_param(IS_CEC_ADDRESS(CEC_OwnAddress)); + + /* Set the CEC own address */ + CEC->OAR = CEC_OwnAddress; +} + +/** + * @brief Sets the CEC prescaler value. + * @param CEC_Prescaler: CEC prescaler new value + * @retval None + */ +void CEC_SetPrescaler(uint16_t CEC_Prescaler) +{ + /* Check the parameters */ + assert_param(IS_CEC_PRESCALER(CEC_Prescaler)); + + /* Set the Prescaler value*/ + CEC->PRES = CEC_Prescaler; +} + +/** + * @brief Transmits single data through the CEC peripheral. + * @param Data: the data to transmit. + * @retval None + */ +void CEC_SendDataByte(uint8_t Data) +{ + /* Transmit Data */ + CEC->TXD = Data ; +} + + +/** + * @brief Returns the most recent received data by the CEC peripheral. + * @param None + * @retval The received data. + */ +uint8_t CEC_ReceiveDataByte(void) +{ + /* Receive Data */ + return (uint8_t)(CEC->RXD); +} + +/** + * @brief Starts a new message. + * @param None + * @retval None + */ +void CEC_StartOfMessage(void) +{ + /* Starts of new message */ + *(__IO uint32_t *) CSR_TSOM_BB = (uint32_t)0x1; +} + +/** + * @brief Transmits message with or without an EOM bit. + * @param NewState: new state of the CEC Tx End Of Message. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void CEC_EndOfMessageCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* The data byte will be transmitted with or without an EOM bit*/ + *(__IO uint32_t *) CSR_TEOM_BB = (uint32_t)NewState; +} + +/** + * @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_BTE: Bit Timing Error + * @arg CEC_FLAG_BPE: Bit Period Error + * @arg CEC_FLAG_RBTFE: Rx Block Transfer Finished Error + * @arg CEC_FLAG_SBE: Start Bit Error + * @arg CEC_FLAG_ACKE: Block Acknowledge Error + * @arg CEC_FLAG_LINE: Line Error + * @arg CEC_FLAG_TBTFE: Tx Block Transfer Finsihed Error + * @arg CEC_FLAG_TEOM: Tx End Of Message + * @arg CEC_FLAG_TERR: Tx Error + * @arg CEC_FLAG_TBTRF: Tx Byte Transfer Request or Block Transfer Finished + * @arg CEC_FLAG_RSOM: Rx Start Of Message + * @arg CEC_FLAG_REOM: Rx End Of Message + * @arg CEC_FLAG_RERR: Rx Error + * @arg CEC_FLAG_RBTF: Rx Byte/Block Transfer Finished + * @retval The new state of CEC_FLAG (SET or RESET) + */ +FlagStatus CEC_GetFlagStatus(uint32_t CEC_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t cecreg = 0, cecbase = 0; + + /* Check the parameters */ + assert_param(IS_CEC_GET_FLAG(CEC_FLAG)); + + /* Get the CEC peripheral base address */ + cecbase = (uint32_t)(CEC_BASE); + + /* Read flag register index */ + cecreg = CEC_FLAG >> 28; + + /* Get bit[23:0] of the flag */ + CEC_FLAG &= FLAG_Mask; + + if(cecreg != 0) + { + /* Flag in CEC ESR Register */ + CEC_FLAG = (uint32_t)(CEC_FLAG >> 16); + + /* Get the CEC ESR register address */ + cecbase += 0xC; + } + else + { + /* Get the CEC CSR register address */ + cecbase += 0x10; + } + + if(((*(__IO uint32_t *)cecbase) & CEC_FLAG) != (uint32_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_TERR: Tx Error + * @arg CEC_FLAG_TBTRF: Tx Byte Transfer Request or Block Transfer Finished + * @arg CEC_FLAG_RSOM: Rx Start Of Message + * @arg CEC_FLAG_REOM: Rx End Of Message + * @arg CEC_FLAG_RERR: Rx Error + * @arg CEC_FLAG_RBTF: Rx Byte/Block Transfer Finished + * @retval None + */ +void CEC_ClearFlag(uint32_t CEC_FLAG) +{ + uint32_t tmp = 0x0; + + /* Check the parameters */ + assert_param(IS_CEC_CLEAR_FLAG(CEC_FLAG)); + + tmp = CEC->CSR & 0x2; + + /* Clear the selected CEC flags */ + CEC->CSR &= (uint32_t)(((~(uint32_t)CEC_FLAG) & 0xFFFFFFFC) | tmp); +} + +/** + * @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_TERR: Tx Error + * @arg CEC_IT_TBTF: Tx Block Transfer Finished + * @arg CEC_IT_RERR: Rx Error + * @arg CEC_IT_RBTF: Rx Block Transfer Finished + * @retval The new state of CEC_IT (SET or RESET). + */ +ITStatus CEC_GetITStatus(uint8_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->CFGR & (uint8_t)CEC_CFGR_IE) ; + + /* Check the status of the specified CEC interrupt */ + if (((CEC->CSR & CEC_IT) != (uint32_t)RESET) && enablestatus) + { + /* CEC_IT is set */ + bitstatus = SET; + } + else + { + /* CEC_IT is reset */ + bitstatus = RESET; + } + /* Return the CEC_IT 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_TERR: Tx Error + * @arg CEC_IT_TBTF: Tx Block Transfer Finished + * @arg CEC_IT_RERR: Rx Error + * @arg CEC_IT_RBTF: Rx Block Transfer Finished + * @retval None + */ +void CEC_ClearITPendingBit(uint16_t CEC_IT) +{ + uint32_t tmp = 0x0; + + /* Check the parameters */ + assert_param(IS_CEC_GET_IT(CEC_IT)); + + tmp = CEC->CSR & 0x2; + + /* Clear the selected CEC interrupt pending bits */ + CEC->CSR &= (uint32_t)(((~(uint32_t)CEC_IT) & 0xFFFFFFFC) | tmp); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_cec.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_cec.h new file mode 100644 index 0000000..10aaba7 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_cec.h @@ -0,0 +1,209 @@ +/** + ****************************************************************************** + * @file stm32f10x_cec.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the CEC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_CEC_H +#define __STM32F10x_CEC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup CEC + * @{ + */ + + +/** @defgroup CEC_Exported_Types + * @{ + */ + +/** + * @brief CEC Init structure definition + */ +typedef struct +{ + uint16_t CEC_BitTimingMode; /*!< Configures the CEC Bit Timing Error Mode. + This parameter can be a value of @ref CEC_BitTiming_Mode */ + uint16_t CEC_BitPeriodMode; /*!< Configures the CEC Bit Period Error Mode. + This parameter can be a value of @ref CEC_BitPeriod_Mode */ +}CEC_InitTypeDef; + +/** + * @} + */ + +/** @defgroup CEC_Exported_Constants + * @{ + */ + +/** @defgroup CEC_BitTiming_Mode + * @{ + */ +#define CEC_BitTimingStdMode ((uint16_t)0x00) /*!< Bit timing error Standard Mode */ +#define CEC_BitTimingErrFreeMode CEC_CFGR_BTEM /*!< Bit timing error Free Mode */ + +#define IS_CEC_BIT_TIMING_ERROR_MODE(MODE) (((MODE) == CEC_BitTimingStdMode) || \ + ((MODE) == CEC_BitTimingErrFreeMode)) +/** + * @} + */ + +/** @defgroup CEC_BitPeriod_Mode + * @{ + */ +#define CEC_BitPeriodStdMode ((uint16_t)0x00) /*!< Bit period error Standard Mode */ +#define CEC_BitPeriodFlexibleMode CEC_CFGR_BPEM /*!< Bit period error Flexible Mode */ + +#define IS_CEC_BIT_PERIOD_ERROR_MODE(MODE) (((MODE) == CEC_BitPeriodStdMode) || \ + ((MODE) == CEC_BitPeriodFlexibleMode)) +/** + * @} + */ + + +/** @defgroup CEC_interrupts_definition + * @{ + */ +#define CEC_IT_TERR CEC_CSR_TERR +#define CEC_IT_TBTRF CEC_CSR_TBTRF +#define CEC_IT_RERR CEC_CSR_RERR +#define CEC_IT_RBTF CEC_CSR_RBTF +#define IS_CEC_GET_IT(IT) (((IT) == CEC_IT_TERR) || ((IT) == CEC_IT_TBTRF) || \ + ((IT) == CEC_IT_RERR) || ((IT) == CEC_IT_RBTF)) +/** + * @} + */ + + +/** @defgroup CEC_Own_Addres + * @{ + */ +#define IS_CEC_ADDRESS(ADDRESS) ((ADDRESS) < 0x10) +/** + * @} + */ + +/** @defgroup CEC_Prescaler + * @{ + */ +#define IS_CEC_PRESCALER(PRESCALER) ((PRESCALER) <= 0x3FFF) + +/** + * @} + */ + +/** @defgroup CEC_flags_definition + * @{ + */ + +/** + * @brief ESR register flags + */ +#define CEC_FLAG_BTE ((uint32_t)0x10010000) +#define CEC_FLAG_BPE ((uint32_t)0x10020000) +#define CEC_FLAG_RBTFE ((uint32_t)0x10040000) +#define CEC_FLAG_SBE ((uint32_t)0x10080000) +#define CEC_FLAG_ACKE ((uint32_t)0x10100000) +#define CEC_FLAG_LINE ((uint32_t)0x10200000) +#define CEC_FLAG_TBTFE ((uint32_t)0x10400000) + +/** + * @brief CSR register flags + */ +#define CEC_FLAG_TEOM ((uint32_t)0x00000002) +#define CEC_FLAG_TERR ((uint32_t)0x00000004) +#define CEC_FLAG_TBTRF ((uint32_t)0x00000008) +#define CEC_FLAG_RSOM ((uint32_t)0x00000010) +#define CEC_FLAG_REOM ((uint32_t)0x00000020) +#define CEC_FLAG_RERR ((uint32_t)0x00000040) +#define CEC_FLAG_RBTF ((uint32_t)0x00000080) + +#define IS_CEC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFF03) == 0x00) && ((FLAG) != 0x00)) + +#define IS_CEC_GET_FLAG(FLAG) (((FLAG) == CEC_FLAG_BTE) || ((FLAG) == CEC_FLAG_BPE) || \ + ((FLAG) == CEC_FLAG_RBTFE) || ((FLAG)== CEC_FLAG_SBE) || \ + ((FLAG) == CEC_FLAG_ACKE) || ((FLAG) == CEC_FLAG_LINE) || \ + ((FLAG) == CEC_FLAG_TBTFE) || ((FLAG) == CEC_FLAG_TEOM) || \ + ((FLAG) == CEC_FLAG_TERR) || ((FLAG) == CEC_FLAG_TBTRF) || \ + ((FLAG) == CEC_FLAG_RSOM) || ((FLAG) == CEC_FLAG_REOM) || \ + ((FLAG) == CEC_FLAG_RERR) || ((FLAG) == CEC_FLAG_RBTF)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup CEC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CEC_Exported_Functions + * @{ + */ +void CEC_DeInit(void); +void CEC_Init(CEC_InitTypeDef* CEC_InitStruct); +void CEC_Cmd(FunctionalState NewState); +void CEC_ITConfig(FunctionalState NewState); +void CEC_OwnAddressConfig(uint8_t CEC_OwnAddress); +void CEC_SetPrescaler(uint16_t CEC_Prescaler); +void CEC_SendDataByte(uint8_t Data); +uint8_t CEC_ReceiveDataByte(void); +void CEC_StartOfMessage(void); +void CEC_EndOfMessageCmd(FunctionalState NewState); +FlagStatus CEC_GetFlagStatus(uint32_t CEC_FLAG); +void CEC_ClearFlag(uint32_t CEC_FLAG); +ITStatus CEC_GetITStatus(uint8_t CEC_IT); +void CEC_ClearITPendingBit(uint16_t CEC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_CEC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h new file mode 100644 index 0000000..f632039 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h @@ -0,0 +1,78 @@ +/** + ****************************************************************************** + * @file TIM/6Steps/stm32f10x_conf.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief Library configuration file. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_CONF_H +#define __STM32F10x_CONF_H + +/* Includes ------------------------------------------------------------------*/ +/* Uncomment the line below to enable peripheral header file inclusion */ +/* #include "stm32f10x_adc.h" */ +/* #include "stm32f10x_bkp.h" */ +/* #include "stm32f10x_can.h" */ +/* #include "stm32f10x_cec.h" */ +/* #include "stm32f10x_crc.h" */ +/* #include "stm32f10x_dac.h" */ +/* #include "stm32f10x_dbgmcu.h" */ +#include "stm32f10x_dma.h" + #include "stm32f10x_exti.h" +/* #include "stm32f10x_flash.h" */ +/* #include "stm32f10x_fsmc.h" */ +#include "stm32f10x_gpio.h" +/* #include "stm32f10x_i2c.h" */ +/* #include "stm32f10x_iwdg.h" */ + #include "stm32f10x_pwr.h" +#include "stm32f10x_rcc.h" +/* #include "stm32f10x_rtc.h" */ +/* #include "stm32f10x_sdio.h" */ +#include "stm32f10x_spi.h" +#include "stm32f10x_tim.h" +#include "stm32f10x_usart.h" +/* #include "stm32f10x_wwdg.h" */ +#include "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 /* __STM32F10x_CONF_H */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h.bak b/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h.bak new file mode 100644 index 0000000..7e3e178 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_conf.h.bak @@ -0,0 +1,78 @@ +/** + ****************************************************************************** + * @file TIM/6Steps/stm32f10x_conf.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief Library configuration file. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_CONF_H +#define __STM32F10x_CONF_H + +/* Includes ------------------------------------------------------------------*/ +/* Uncomment the line below to enable peripheral header file inclusion */ +/* #include "stm32f10x_adc.h" */ +/* #include "stm32f10x_bkp.h" */ +/* #include "stm32f10x_can.h" */ +/* #include "stm32f10x_cec.h" */ +/* #include "stm32f10x_crc.h" */ +/* #include "stm32f10x_dac.h" */ +/* #include "stm32f10x_dbgmcu.h" */ +#include "stm32f10x_dma.h" + #include "stm32f10x_exti.h" +/* #include "stm32f10x_flash.h" */ +/* #include "stm32f10x_fsmc.h" */ +#include "stm32f10x_gpio.h" +/* #include "stm32f10x_i2c.h" */ +/* #include "stm32f10x_iwdg.h" */ +/* #include "stm32f10x_pwr.h" */ +#include "stm32f10x_rcc.h" +/* #include "stm32f10x_rtc.h" */ +/* #include "stm32f10x_sdio.h" */ +#include "stm32f10x_spi.h" +#include "stm32f10x_tim.h" +#include "stm32f10x_usart.h" +/* #include "stm32f10x_wwdg.h" */ +#include "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 /* __STM32F10x_CONF_H */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_crc.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_crc.c new file mode 100644 index 0000000..511a7b9 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_crc.c @@ -0,0 +1,159 @@ +/** + ****************************************************************************** + * @file stm32f10x_crc.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the CRC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_crc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup CRC + * @brief CRC driver modules + * @{ + */ + +/** @defgroup CRC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Private_Functions + * @{ + */ + +/** + * @brief Resets the CRC Data register (DR). + * @param None + * @retval None + */ +void CRC_ResetDR(void) +{ + /* Reset CRC generator */ + CRC->CR = CRC_CR_RESET; +} + +/** + * @brief Computes the 32-bit CRC of a given data word(32-bit). + * @param Data: data word(32-bit) to compute its CRC + * @retval 32-bit CRC + */ +uint32_t CRC_CalcCRC(uint32_t Data) +{ + CRC->DR = 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); +} + +/** + * @brief Stores a 8-bit data in the Independent Data(ID) register. + * @param IDValue: 8-bit value to be stored in the ID register + * @retval None + */ +void CRC_SetIDRegister(uint8_t IDValue) +{ + CRC->IDR = 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 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_crc.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_crc.h new file mode 100644 index 0000000..12acce0 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_crc.h @@ -0,0 +1,93 @@ +/** + ****************************************************************************** + * @file stm32f10x_crc.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the CRC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_CRC_H +#define __STM32F10x_CRC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup CRC + * @{ + */ + +/** @defgroup CRC_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Exported_Constants + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup CRC_Exported_Functions + * @{ + */ + +void CRC_ResetDR(void); +uint32_t CRC_CalcCRC(uint32_t Data); +uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength); +uint32_t CRC_GetCRC(void); +void CRC_SetIDRegister(uint8_t IDValue); +uint8_t CRC_GetIDRegister(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_CRC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_dac.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_dac.c new file mode 100644 index 0000000..55e91c0 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_dac.c @@ -0,0 +1,570 @@ +/** + ****************************************************************************** + * @file stm32f10x_dac.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the DAC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_dac.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup DAC + * @brief DAC driver modules + * @{ + */ + +/** @defgroup DAC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_Defines + * @{ + */ + +/* CR register Mask */ +#define CR_CLEAR_MASK ((uint32_t)0x00000FFE) + +/* DAC Dual Channels SWTRIG masks */ +#define DUAL_SWTRIG_SET ((uint32_t)0x00000003) +#define DUAL_SWTRIG_RESET ((uint32_t)0xFFFFFFFC) + +/* DHR registers offsets */ +#define DHR12R1_OFFSET ((uint32_t)0x00000008) +#define DHR12R2_OFFSET ((uint32_t)0x00000014) +#define DHR12RD_OFFSET ((uint32_t)0x00000020) + +/* DOR register offset */ +#define DOR_OFFSET ((uint32_t)0x0000002C) +/** + * @} + */ + +/** @defgroup DAC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Private_Functions + * @{ + */ + +/** + * @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 one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @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 genration, + mask/amplitude for wave genration */ + /* 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 + * @param NewState: new state of the DAC channel. + * This parameter can be: ENABLE or DISABLE. + * @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); + } +} +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/** + * @brief Enables or disables the specified DAC interrupts. + * @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 + * @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 + * @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)); + } +} +#endif + +/** + * @brief Enables or disables the specified DAC channel DMA request. + * @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 + * @param NewState: new state of the selected DAC channel DMA request. + * This parameter can be: ENABLE or DISABLE. + * @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); + } +} + +/** + * @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 + * @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. + * @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. + * @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 + * @param DAC_Wave: Specifies the wave type to enable or disable. + * This parameter can be one of the following values: + * @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 alignement for DAC channel1. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignement selected + * @arg DAC_Align_12b_L: 12bit left data alignement selected + * @arg DAC_Align_12b_R: 12bit right data alignement 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 Set the specified data holding register value for DAC channel2. + * @param DAC_Align: Specifies the data alignement for DAC channel2. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignement selected + * @arg DAC_Align_12b_L: 12bit left data alignement selected + * @arg DAC_Align_12b_R: 12bit right data alignement 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 Set the specified data holding register value for dual channel + * DAC. + * @param DAC_Align: Specifies the data alignement for dual channel DAC. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignement selected + * @arg DAC_Align_12b_L: 12bit left data alignement selected + * @arg DAC_Align_12b_R: 12bit right data alignement 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. + * @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 cahnnel. + * @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 + * @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); +} + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/** + * @brief Checks whether the specified DAC flag is set or not. + * @param DAC_Channel: thee 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 + * @param DAC_FLAG: specifies the flag to check. + * This parameter can be only of the following value: + * @arg DAC_FLAG_DMAUDR: DMA underrun flag + * @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 channelx'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 + * @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 + * @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 + * @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 channelx’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 + * @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); +} +#endif + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_dac.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_dac.h new file mode 100644 index 0000000..9abd636 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_dac.h @@ -0,0 +1,316 @@ +/** + ****************************************************************************** + * @file stm32f10x_dac.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the DAC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_DAC_H +#define __STM32F10x_DAC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DAC + * @{ + */ + +/** @defgroup 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 */ + + 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 */ + + 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; + +/** + * @} + */ + +/** @defgroup DAC_Exported_Constants + * @{ + */ + +/** @defgroup DAC_trigger_selection + * @{ + */ + +#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 channel */ +#define DAC_Trigger_T8_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel + only in High-density devices*/ +#define DAC_Trigger_T3_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel + only in Connectivity line, Medium-density and Low-density Value Line devices */ +#define DAC_Trigger_T7_TRGO ((uint32_t)0x00000014) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T5_TRGO ((uint32_t)0x0000001C) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T15_TRGO ((uint32_t)0x0000001C) /*!< TIM15 TRGO selected as external conversion trigger for DAC channel + only in Medium-density and Low-density Value Line devices*/ +#define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T4_TRGO ((uint32_t)0x0000002C) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_Software ((uint32_t)0x0000003C) /*!< Conversion started by software trigger for DAC channel */ + +#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_Trigger_None) || \ + ((TRIGGER) == DAC_Trigger_T6_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T8_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T7_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T5_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T2_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T4_TRGO) || \ + ((TRIGGER) == DAC_Trigger_Ext_IT9) || \ + ((TRIGGER) == DAC_Trigger_Software)) + +/** + * @} + */ + +/** @defgroup DAC_wave_generation + * @{ + */ + +#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 + * @{ + */ + +#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_output_buffer + * @{ + */ + +#define DAC_OutputBuffer_Enable ((uint32_t)0x00000000) +#define DAC_OutputBuffer_Disable ((uint32_t)0x00000002) +#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) +#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_Channel_1) || \ + ((CHANNEL) == DAC_Channel_2)) +/** + * @} + */ + +/** @defgroup DAC_data_alignement + * @{ + */ + +#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 + * @{ + */ + +#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) +/** + * @} + */ +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/** @defgroup DAC_interrupts_definition + * @{ + */ + +#define DAC_IT_DMAUDR ((uint32_t)0x00002000) +#define IS_DAC_IT(IT) (((IT) == DAC_IT_DMAUDR)) + +/** + * @} + */ + +/** @defgroup DAC_flags_definition + * @{ + */ + +#define DAC_FLAG_DMAUDR ((uint32_t)0x00002000) +#define IS_DAC_FLAG(FLAG) (((FLAG) == DAC_FLAG_DMAUDR)) + +/** + * @} + */ +#endif + +/** + * @} + */ + +/** @defgroup DAC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DAC_Exported_Functions + * @{ + */ + +void DAC_DeInit(void); +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); +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState); +#endif +void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_DualSoftwareTriggerCmd(FunctionalState NewState); +void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState); +void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data); +void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data); +void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1); +uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel); +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +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); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_DAC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.c new file mode 100644 index 0000000..3f4e627 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.c @@ -0,0 +1,161 @@ +/** + ****************************************************************************** + * @file stm32f10x_dbgmcu.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the DBGMCU firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_dbgmcu.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup DBGMCU + * @brief DBGMCU driver modules + * @{ + */ + +/** @defgroup DBGMCU_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Defines + * @{ + */ + +#define IDCODE_DEVID_MASK ((uint32_t)0x00000FFF) +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Private_Functions + * @{ + */ + +/** + * @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); +} + +/** + * @brief Configures the specified peripheral and low power mode behavior + * when the MCU under Debug mode. + * @param DBGMCU_Periph: specifies the peripheral and low power mode. + * This parameter can be any combination of the following values: + * @arg DBGMCU_SLEEP: Keep debugger connection during SLEEP mode + * @arg DBGMCU_STOP: Keep debugger connection during STOP mode + * @arg DBGMCU_STANDBY: Keep debugger connection during STANDBY mode + * @arg DBGMCU_IWDG_STOP: Debug IWDG stopped when Core is halted + * @arg DBGMCU_WWDG_STOP: Debug WWDG stopped when Core is halted + * @arg DBGMCU_TIM1_STOP: TIM1 counter stopped when Core is halted + * @arg DBGMCU_TIM2_STOP: TIM2 counter stopped when Core is halted + * @arg DBGMCU_TIM3_STOP: TIM3 counter stopped when Core is halted + * @arg DBGMCU_TIM4_STOP: TIM4 counter stopped when Core is halted + * @arg DBGMCU_CAN1_STOP: Debug CAN2 stopped when Core is halted + * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_I2C2_SMBUS_TIMEOUT: I2C2 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_TIM5_STOP: TIM5 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 + * @arg DBGMCU_TIM8_STOP: TIM8 counter stopped when Core is halted + * @arg DBGMCU_CAN2_STOP: Debug CAN2 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 + * @arg DBGMCU_TIM9_STOP: TIM9 counter stopped when Core is halted + * @arg DBGMCU_TIM10_STOP: TIM10 counter stopped when Core is halted + * @arg DBGMCU_TIM11_STOP: TIM11 counter stopped when Core is halted + * @arg DBGMCU_TIM12_STOP: TIM12 counter stopped when Core is halted + * @arg DBGMCU_TIM13_STOP: TIM13 counter stopped when Core is halted + * @arg DBGMCU_TIM14_STOP: TIM14 counter stopped when Core is halted + * @param NewState: new state of the specified peripheral 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; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.h new file mode 100644 index 0000000..918e25f --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_dbgmcu.h @@ -0,0 +1,118 @@ +/** + ****************************************************************************** + * @file stm32f10x_dbgmcu.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the DBGMCU + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_DBGMCU_H +#define __STM32F10x_DBGMCU_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DBGMCU + * @{ + */ + +/** @defgroup DBGMCU_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Exported_Constants + * @{ + */ + +#define DBGMCU_SLEEP ((uint32_t)0x00000001) +#define DBGMCU_STOP ((uint32_t)0x00000002) +#define DBGMCU_STANDBY ((uint32_t)0x00000004) +#define DBGMCU_IWDG_STOP ((uint32_t)0x00000100) +#define DBGMCU_WWDG_STOP ((uint32_t)0x00000200) +#define DBGMCU_TIM1_STOP ((uint32_t)0x00000400) +#define DBGMCU_TIM2_STOP ((uint32_t)0x00000800) +#define DBGMCU_TIM3_STOP ((uint32_t)0x00001000) +#define DBGMCU_TIM4_STOP ((uint32_t)0x00002000) +#define DBGMCU_CAN1_STOP ((uint32_t)0x00004000) +#define DBGMCU_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00008000) +#define DBGMCU_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00010000) +#define DBGMCU_TIM8_STOP ((uint32_t)0x00020000) +#define DBGMCU_TIM5_STOP ((uint32_t)0x00040000) +#define DBGMCU_TIM6_STOP ((uint32_t)0x00080000) +#define DBGMCU_TIM7_STOP ((uint32_t)0x00100000) +#define DBGMCU_CAN2_STOP ((uint32_t)0x00200000) +#define DBGMCU_TIM15_STOP ((uint32_t)0x00400000) +#define DBGMCU_TIM16_STOP ((uint32_t)0x00800000) +#define DBGMCU_TIM17_STOP ((uint32_t)0x01000000) +#define DBGMCU_TIM12_STOP ((uint32_t)0x02000000) +#define DBGMCU_TIM13_STOP ((uint32_t)0x04000000) +#define DBGMCU_TIM14_STOP ((uint32_t)0x08000000) +#define DBGMCU_TIM9_STOP ((uint32_t)0x10000000) +#define DBGMCU_TIM10_STOP ((uint32_t)0x20000000) +#define DBGMCU_TIM11_STOP ((uint32_t)0x40000000) + +#define IS_DBGMCU_PERIPH(PERIPH) ((((PERIPH) & 0x800000F8) == 0x00) && ((PERIPH) != 0x00)) +/** + * @} + */ + +/** @defgroup DBGMCU_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DBGMCU_Exported_Functions + * @{ + */ + +uint32_t DBGMCU_GetREVID(void); +uint32_t DBGMCU_GetDEVID(void); +void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_DBGMCU_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.c new file mode 100644 index 0000000..7f72b54 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.c @@ -0,0 +1,711 @@ +/** + ****************************************************************************** + * @file stm32f10x_dma.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the DMA firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_dma.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup DMA + * @brief DMA driver modules + * @{ + */ + +/** @defgroup DMA_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @defgroup DMA_Private_Defines + * @{ + */ + + +/* 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)) +#define DMA1_Channel7_IT_Mask ((uint32_t)(DMA_ISR_GIF7 | DMA_ISR_TCIF7 | DMA_ISR_HTIF7 | DMA_ISR_TEIF7)) + +/* DMA2 Channelx interrupt pending bit masks */ +#define DMA2_Channel1_IT_Mask ((uint32_t)(DMA_ISR_GIF1 | DMA_ISR_TCIF1 | DMA_ISR_HTIF1 | DMA_ISR_TEIF1)) +#define DMA2_Channel2_IT_Mask ((uint32_t)(DMA_ISR_GIF2 | DMA_ISR_TCIF2 | DMA_ISR_HTIF2 | DMA_ISR_TEIF2)) +#define DMA2_Channel3_IT_Mask ((uint32_t)(DMA_ISR_GIF3 | DMA_ISR_TCIF3 | DMA_ISR_HTIF3 | DMA_ISR_TEIF3)) +#define DMA2_Channel4_IT_Mask ((uint32_t)(DMA_ISR_GIF4 | DMA_ISR_TCIF4 | DMA_ISR_HTIF4 | DMA_ISR_TEIF4)) +#define DMA2_Channel5_IT_Mask ((uint32_t)(DMA_ISR_GIF5 | DMA_ISR_TCIF5 | DMA_ISR_HTIF5 | DMA_ISR_TEIF5)) + +/* DMA2 FLAG mask */ +#define FLAG_Mask ((uint32_t)0x10000000) + +/* DMA registers Masks */ +#define CCR_CLEAR_Mask ((uint32_t)0xFFFF800F) + +/** + * @} + */ + +/** @defgroup DMA_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the DMAy Channelx registers to their default reset + * values. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @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_CCR1_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; + } + else if (DMAy_Channelx == DMA2_Channel1) + { + /* Reset interrupt pending bits for DMA2 Channel1 */ + DMA2->IFCR |= DMA2_Channel1_IT_Mask; + } + else if (DMAy_Channelx == DMA2_Channel2) + { + /* Reset interrupt pending bits for DMA2 Channel2 */ + DMA2->IFCR |= DMA2_Channel2_IT_Mask; + } + else if (DMAy_Channelx == DMA2_Channel3) + { + /* Reset interrupt pending bits for DMA2 Channel3 */ + DMA2->IFCR |= DMA2_Channel3_IT_Mask; + } + else if (DMAy_Channelx == DMA2_Channel4) + { + /* Reset interrupt pending bits for DMA2 Channel4 */ + DMA2->IFCR |= DMA2_Channel4_IT_Mask; + } + else + { + if (DMAy_Channelx == DMA2_Channel5) + { + /* Reset interrupt pending bits for DMA2 Channel5 */ + DMA2->IFCR |= DMA2_Channel5_IT_Mask; + } + } +} + +/** + * @brief Initializes the DMAy Channelx according to the specified + * parameters in the DMA_InitStruct. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @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 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @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_CCR1_EN; + } + else + { + /* Disable the selected DMAy Channelx */ + DMAy_Channelx->CCR &= (uint16_t)(~DMA_CCR1_EN); + } +} + +/** + * @brief Enables or disables the specified DMAy Channelx interrupts. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @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 Sets the number of data units in the current DMAy Channelx transfer. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @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 or 2 to select the DMA and + * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @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)); +} + +/** + * @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. + * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. + * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag. + * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. + * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag. + * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag. + * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag. + * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag. + * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag. + * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag. + * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag. + * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag. + * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag. + * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag. + * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag. + * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag. + * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag. + * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag. + * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag. + * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag. + * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag. + * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag. + * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag. + * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag. + * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag. + * @retval The new state of DMA_FLAG (SET or RESET). + */ +FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_DMA_GET_FLAG(DMA_FLAG)); + + /* Calculate the used DMA */ + if ((DMA_FLAG & FLAG_Mask) != (uint32_t)RESET) + { + /* Get DMA2 ISR register value */ + tmpreg = DMA2->ISR ; + } + else + { + /* Get DMA1 ISR register value */ + tmpreg = DMA1->ISR ; + } + + /* Check the status of the specified DMA flag */ + if ((tmpreg & 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. + * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. + * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag. + * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. + * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag. + * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag. + * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag. + * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag. + * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag. + * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag. + * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag. + * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag. + * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag. + * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag. + * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag. + * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag. + * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag. + * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag. + * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag. + * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag. + * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag. + * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag. + * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag. + * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag. + * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag. + * @retval None + */ +void DMA_ClearFlag(uint32_t DMA_FLAG) +{ + /* Check the parameters */ + assert_param(IS_DMA_CLEAR_FLAG(DMA_FLAG)); + /* Calculate the used DMA */ + + if ((DMA_FLAG & FLAG_Mask) != (uint32_t)RESET) + { + /* Clear the selected DMA flags */ + DMA2->IFCR = DMA_FLAG; + } + else + { + /* 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. + * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt. + * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt. + * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt. + * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt. + * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt. + * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt. + * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt. + * @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt. + * @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt. + * @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt. + * @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt. + * @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt. + * @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt. + * @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt. + * @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt. + * @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt. + * @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt. + * @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt. + * @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt. + * @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt. + * @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt. + * @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt. + * @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt. + * @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt. + * @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt. + * @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt. + * @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt. + * @retval The new state of DMA_IT (SET or RESET). + */ +ITStatus DMA_GetITStatus(uint32_t DMA_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_DMA_GET_IT(DMA_IT)); + + /* Calculate the used DMA */ + if ((DMA_IT & FLAG_Mask) != (uint32_t)RESET) + { + /* Get DMA2 ISR register value */ + tmpreg = DMA2->ISR ; + } + else + { + /* Get DMA1 ISR register value */ + tmpreg = DMA1->ISR ; + } + + /* Check the status of the specified DMA interrupt */ + if ((tmpreg & 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. + * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt. + * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt. + * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt. + * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt. + * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt. + * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt. + * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt. + * @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt. + * @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt. + * @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt. + * @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt. + * @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt. + * @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt. + * @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt. + * @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt. + * @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt. + * @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt. + * @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt. + * @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt. + * @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt. + * @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt. + * @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt. + * @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt. + * @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt. + * @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt. + * @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt. + * @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt. + * @retval None + */ +void DMA_ClearITPendingBit(uint32_t DMA_IT) +{ + /* Check the parameters */ + assert_param(IS_DMA_CLEAR_IT(DMA_IT)); + + /* Calculate the used DMA */ + if ((DMA_IT & FLAG_Mask) != (uint32_t)RESET) + { + /* Clear the selected DMA interrupt pending bits */ + DMA2->IFCR = DMA_IT; + } + else + { + /* Clear the selected DMA interrupt pending bits */ + DMA1->IFCR = DMA_IT; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h new file mode 100644 index 0000000..2c5302b --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_dma.h @@ -0,0 +1,438 @@ +/** + ****************************************************************************** + * @file stm32f10x_dma.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the DMA firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_DMA_H +#define __STM32F10x_DMA_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DMA + * @{ + */ + +/** @defgroup DMA_Exported_Types + * @{ + */ + +/** + * @brief DMA Init structure 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; + +/** + * @} + */ + +/** @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) || \ + ((PERIPH) == DMA2_Channel1) || \ + ((PERIPH) == DMA2_Channel2) || \ + ((PERIPH) == DMA2_Channel3) || \ + ((PERIPH) == DMA2_Channel4) || \ + ((PERIPH) == DMA2_Channel5)) + +/** @defgroup DMA_data_transfer_direction + * @{ + */ + +#define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) +#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000) +#define IS_DMA_DIR(DIR) (((DIR) == DMA_DIR_PeripheralDST) || \ + ((DIR) == DMA_DIR_PeripheralSRC)) +/** + * @} + */ + +/** @defgroup DMA_peripheral_incremented_mode + * @{ + */ + +#define DMA_PeripheralInc_Enable ((uint32_t)0x00000040) +#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000) +#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PeripheralInc_Enable) || \ + ((STATE) == DMA_PeripheralInc_Disable)) +/** + * @} + */ + +/** @defgroup DMA_memory_incremented_mode + * @{ + */ + +#define DMA_MemoryInc_Enable ((uint32_t)0x00000080) +#define DMA_MemoryInc_Disable ((uint32_t)0x00000000) +#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MemoryInc_Enable) || \ + ((STATE) == DMA_MemoryInc_Disable)) +/** + * @} + */ + +/** @defgroup DMA_peripheral_data_size + * @{ + */ + +#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) +#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100) +#define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200) +#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 ((uint32_t)0x00000400) +#define DMA_MemoryDataSize_Word ((uint32_t)0x00000800) +#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_Circular ((uint32_t)0x00000020) +#define DMA_Mode_Normal ((uint32_t)0x00000000) +#define IS_DMA_MODE(MODE) (((MODE) == DMA_Mode_Circular) || ((MODE) == DMA_Mode_Normal)) +/** + * @} + */ + +/** @defgroup DMA_priority_level + * @{ + */ + +#define DMA_Priority_VeryHigh ((uint32_t)0x00003000) +#define DMA_Priority_High ((uint32_t)0x00002000) +#define DMA_Priority_Medium ((uint32_t)0x00001000) +#define DMA_Priority_Low ((uint32_t)0x00000000) +#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_Enable ((uint32_t)0x00004000) +#define DMA_M2M_Disable ((uint32_t)0x00000000) +#define IS_DMA_M2M_STATE(STATE) (((STATE) == DMA_M2M_Enable) || ((STATE) == DMA_M2M_Disable)) + +/** + * @} + */ + +/** @defgroup DMA_interrupts_definition + * @{ + */ + +#define DMA_IT_TC ((uint32_t)0x00000002) +#define DMA_IT_HT ((uint32_t)0x00000004) +#define DMA_IT_TE ((uint32_t)0x00000008) +#define IS_DMA_CONFIG_IT(IT) ((((IT) & 0xFFFFFFF1) == 0x00) && ((IT) != 0x00)) + +#define DMA1_IT_GL1 ((uint32_t)0x00000001) +#define DMA1_IT_TC1 ((uint32_t)0x00000002) +#define DMA1_IT_HT1 ((uint32_t)0x00000004) +#define DMA1_IT_TE1 ((uint32_t)0x00000008) +#define DMA1_IT_GL2 ((uint32_t)0x00000010) +#define DMA1_IT_TC2 ((uint32_t)0x00000020) +#define DMA1_IT_HT2 ((uint32_t)0x00000040) +#define DMA1_IT_TE2 ((uint32_t)0x00000080) +#define DMA1_IT_GL3 ((uint32_t)0x00000100) +#define DMA1_IT_TC3 ((uint32_t)0x00000200) +#define DMA1_IT_HT3 ((uint32_t)0x00000400) +#define DMA1_IT_TE3 ((uint32_t)0x00000800) +#define DMA1_IT_GL4 ((uint32_t)0x00001000) +#define DMA1_IT_TC4 ((uint32_t)0x00002000) +#define DMA1_IT_HT4 ((uint32_t)0x00004000) +#define DMA1_IT_TE4 ((uint32_t)0x00008000) +#define DMA1_IT_GL5 ((uint32_t)0x00010000) +#define DMA1_IT_TC5 ((uint32_t)0x00020000) +#define DMA1_IT_HT5 ((uint32_t)0x00040000) +#define DMA1_IT_TE5 ((uint32_t)0x00080000) +#define DMA1_IT_GL6 ((uint32_t)0x00100000) +#define DMA1_IT_TC6 ((uint32_t)0x00200000) +#define DMA1_IT_HT6 ((uint32_t)0x00400000) +#define DMA1_IT_TE6 ((uint32_t)0x00800000) +#define DMA1_IT_GL7 ((uint32_t)0x01000000) +#define DMA1_IT_TC7 ((uint32_t)0x02000000) +#define DMA1_IT_HT7 ((uint32_t)0x04000000) +#define DMA1_IT_TE7 ((uint32_t)0x08000000) + +#define DMA2_IT_GL1 ((uint32_t)0x10000001) +#define DMA2_IT_TC1 ((uint32_t)0x10000002) +#define DMA2_IT_HT1 ((uint32_t)0x10000004) +#define DMA2_IT_TE1 ((uint32_t)0x10000008) +#define DMA2_IT_GL2 ((uint32_t)0x10000010) +#define DMA2_IT_TC2 ((uint32_t)0x10000020) +#define DMA2_IT_HT2 ((uint32_t)0x10000040) +#define DMA2_IT_TE2 ((uint32_t)0x10000080) +#define DMA2_IT_GL3 ((uint32_t)0x10000100) +#define DMA2_IT_TC3 ((uint32_t)0x10000200) +#define DMA2_IT_HT3 ((uint32_t)0x10000400) +#define DMA2_IT_TE3 ((uint32_t)0x10000800) +#define DMA2_IT_GL4 ((uint32_t)0x10001000) +#define DMA2_IT_TC4 ((uint32_t)0x10002000) +#define DMA2_IT_HT4 ((uint32_t)0x10004000) +#define DMA2_IT_TE4 ((uint32_t)0x10008000) +#define DMA2_IT_GL5 ((uint32_t)0x10010000) +#define DMA2_IT_TC5 ((uint32_t)0x10020000) +#define DMA2_IT_HT5 ((uint32_t)0x10040000) +#define DMA2_IT_TE5 ((uint32_t)0x10080000) + +#define IS_DMA_CLEAR_IT(IT) (((((IT) & 0xF0000000) == 0x00) || (((IT) & 0xEFF00000) == 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) || \ + ((IT) == DMA2_IT_GL1) || ((IT) == DMA2_IT_TC1) || \ + ((IT) == DMA2_IT_HT1) || ((IT) == DMA2_IT_TE1) || \ + ((IT) == DMA2_IT_GL2) || ((IT) == DMA2_IT_TC2) || \ + ((IT) == DMA2_IT_HT2) || ((IT) == DMA2_IT_TE2) || \ + ((IT) == DMA2_IT_GL3) || ((IT) == DMA2_IT_TC3) || \ + ((IT) == DMA2_IT_HT3) || ((IT) == DMA2_IT_TE3) || \ + ((IT) == DMA2_IT_GL4) || ((IT) == DMA2_IT_TC4) || \ + ((IT) == DMA2_IT_HT4) || ((IT) == DMA2_IT_TE4) || \ + ((IT) == DMA2_IT_GL5) || ((IT) == DMA2_IT_TC5) || \ + ((IT) == DMA2_IT_HT5) || ((IT) == DMA2_IT_TE5)) + +/** + * @} + */ + +/** @defgroup DMA_flags_definition + * @{ + */ +#define DMA1_FLAG_GL1 ((uint32_t)0x00000001) +#define DMA1_FLAG_TC1 ((uint32_t)0x00000002) +#define DMA1_FLAG_HT1 ((uint32_t)0x00000004) +#define DMA1_FLAG_TE1 ((uint32_t)0x00000008) +#define DMA1_FLAG_GL2 ((uint32_t)0x00000010) +#define DMA1_FLAG_TC2 ((uint32_t)0x00000020) +#define DMA1_FLAG_HT2 ((uint32_t)0x00000040) +#define DMA1_FLAG_TE2 ((uint32_t)0x00000080) +#define DMA1_FLAG_GL3 ((uint32_t)0x00000100) +#define DMA1_FLAG_TC3 ((uint32_t)0x00000200) +#define DMA1_FLAG_HT3 ((uint32_t)0x00000400) +#define DMA1_FLAG_TE3 ((uint32_t)0x00000800) +#define DMA1_FLAG_GL4 ((uint32_t)0x00001000) +#define DMA1_FLAG_TC4 ((uint32_t)0x00002000) +#define DMA1_FLAG_HT4 ((uint32_t)0x00004000) +#define DMA1_FLAG_TE4 ((uint32_t)0x00008000) +#define DMA1_FLAG_GL5 ((uint32_t)0x00010000) +#define DMA1_FLAG_TC5 ((uint32_t)0x00020000) +#define DMA1_FLAG_HT5 ((uint32_t)0x00040000) +#define DMA1_FLAG_TE5 ((uint32_t)0x00080000) +#define DMA1_FLAG_GL6 ((uint32_t)0x00100000) +#define DMA1_FLAG_TC6 ((uint32_t)0x00200000) +#define DMA1_FLAG_HT6 ((uint32_t)0x00400000) +#define DMA1_FLAG_TE6 ((uint32_t)0x00800000) +#define DMA1_FLAG_GL7 ((uint32_t)0x01000000) +#define DMA1_FLAG_TC7 ((uint32_t)0x02000000) +#define DMA1_FLAG_HT7 ((uint32_t)0x04000000) +#define DMA1_FLAG_TE7 ((uint32_t)0x08000000) + +#define DMA2_FLAG_GL1 ((uint32_t)0x10000001) +#define DMA2_FLAG_TC1 ((uint32_t)0x10000002) +#define DMA2_FLAG_HT1 ((uint32_t)0x10000004) +#define DMA2_FLAG_TE1 ((uint32_t)0x10000008) +#define DMA2_FLAG_GL2 ((uint32_t)0x10000010) +#define DMA2_FLAG_TC2 ((uint32_t)0x10000020) +#define DMA2_FLAG_HT2 ((uint32_t)0x10000040) +#define DMA2_FLAG_TE2 ((uint32_t)0x10000080) +#define DMA2_FLAG_GL3 ((uint32_t)0x10000100) +#define DMA2_FLAG_TC3 ((uint32_t)0x10000200) +#define DMA2_FLAG_HT3 ((uint32_t)0x10000400) +#define DMA2_FLAG_TE3 ((uint32_t)0x10000800) +#define DMA2_FLAG_GL4 ((uint32_t)0x10001000) +#define DMA2_FLAG_TC4 ((uint32_t)0x10002000) +#define DMA2_FLAG_HT4 ((uint32_t)0x10004000) +#define DMA2_FLAG_TE4 ((uint32_t)0x10008000) +#define DMA2_FLAG_GL5 ((uint32_t)0x10010000) +#define DMA2_FLAG_TC5 ((uint32_t)0x10020000) +#define DMA2_FLAG_HT5 ((uint32_t)0x10040000) +#define DMA2_FLAG_TE5 ((uint32_t)0x10080000) + +#define IS_DMA_CLEAR_FLAG(FLAG) (((((FLAG) & 0xF0000000) == 0x00) || (((FLAG) & 0xEFF00000) == 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) || \ + ((FLAG) == DMA2_FLAG_GL1) || ((FLAG) == DMA2_FLAG_TC1) || \ + ((FLAG) == DMA2_FLAG_HT1) || ((FLAG) == DMA2_FLAG_TE1) || \ + ((FLAG) == DMA2_FLAG_GL2) || ((FLAG) == DMA2_FLAG_TC2) || \ + ((FLAG) == DMA2_FLAG_HT2) || ((FLAG) == DMA2_FLAG_TE2) || \ + ((FLAG) == DMA2_FLAG_GL3) || ((FLAG) == DMA2_FLAG_TC3) || \ + ((FLAG) == DMA2_FLAG_HT3) || ((FLAG) == DMA2_FLAG_TE3) || \ + ((FLAG) == DMA2_FLAG_GL4) || ((FLAG) == DMA2_FLAG_TC4) || \ + ((FLAG) == DMA2_FLAG_HT4) || ((FLAG) == DMA2_FLAG_TE4) || \ + ((FLAG) == DMA2_FLAG_GL5) || ((FLAG) == DMA2_FLAG_TC5) || \ + ((FLAG) == DMA2_FLAG_HT5) || ((FLAG) == DMA2_FLAG_TE5)) +/** + * @} + */ + +/** @defgroup DMA_Buffer_Size + * @{ + */ + +#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x1) && ((SIZE) < 0x10000)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup DMA_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions + * @{ + */ + +void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); +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); +void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); +void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); +uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); +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 /*__STM32F10x_DMA_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.c new file mode 100644 index 0000000..f9467d0 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.c @@ -0,0 +1,268 @@ +/** + ****************************************************************************** + * @file stm32f10x_exti.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the EXTI firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_exti.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup EXTI + * @brief EXTI driver modules + * @{ + */ + +/** @defgroup EXTI_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Defines + * @{ + */ + +#define EXTI_LINENONE ((uint32_t)0x00000) /* No interrupt selected */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the EXTI peripheral registers to their default reset values. + * @param None + * @retval None + */ +void EXTI_DeInit(void) +{ + EXTI->IMR = 0x00000000; + EXTI->EMR = 0x00000000; + EXTI->RTSR = 0x00000000; + EXTI->FTSR = 0x00000000; + EXTI->PR = 0x000FFFFF; +} + +/** + * @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 external 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. + * @param EXTI_Line: specifies the EXTI lines to be enabled or disabled. + * This parameter can be any combination of EXTI_Linex where x can be (0..19). + * @retval None + */ +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(EXTI_Line)); + + EXTI->SWIER |= EXTI_Line; +} + +/** + * @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: + * @arg EXTI_Linex: External interrupt line x where x(0..19) + * @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..19). + * @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: + * @arg EXTI_Linex: External interrupt line x where x(0..19) + * @retval The new state of EXTI_Line (SET or RESET). + */ +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + /* Check the parameters */ + assert_param(IS_GET_EXTI_LINE(EXTI_Line)); + + enablestatus = EXTI->IMR & EXTI_Line; + if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (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..19). + * @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 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h new file mode 100644 index 0000000..29bed11 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_exti.h @@ -0,0 +1,183 @@ +/** + ****************************************************************************** + * @file stm32f10x_exti.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the EXTI firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_EXTI_H +#define __STM32F10x_EXTI_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup EXTI + * @{ + */ + +/** @defgroup 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; + +/** + * @} + */ + +/** @defgroup EXTI_Exported_Constants + * @{ + */ + +/** @defgroup EXTI_Lines + * @{ + */ + +#define EXTI_Line0 ((uint32_t)0x00001) /*!< External interrupt line 0 */ +#define EXTI_Line1 ((uint32_t)0x00002) /*!< External interrupt line 1 */ +#define EXTI_Line2 ((uint32_t)0x00004) /*!< External interrupt line 2 */ +#define EXTI_Line3 ((uint32_t)0x00008) /*!< External interrupt line 3 */ +#define EXTI_Line4 ((uint32_t)0x00010) /*!< External interrupt line 4 */ +#define EXTI_Line5 ((uint32_t)0x00020) /*!< External interrupt line 5 */ +#define EXTI_Line6 ((uint32_t)0x00040) /*!< External interrupt line 6 */ +#define EXTI_Line7 ((uint32_t)0x00080) /*!< External interrupt line 7 */ +#define EXTI_Line8 ((uint32_t)0x00100) /*!< External interrupt line 8 */ +#define EXTI_Line9 ((uint32_t)0x00200) /*!< External interrupt line 9 */ +#define EXTI_Line10 ((uint32_t)0x00400) /*!< External interrupt line 10 */ +#define EXTI_Line11 ((uint32_t)0x00800) /*!< External interrupt line 11 */ +#define EXTI_Line12 ((uint32_t)0x01000) /*!< External interrupt line 12 */ +#define EXTI_Line13 ((uint32_t)0x02000) /*!< External interrupt line 13 */ +#define EXTI_Line14 ((uint32_t)0x04000) /*!< External interrupt line 14 */ +#define EXTI_Line15 ((uint32_t)0x08000) /*!< External interrupt line 15 */ +#define EXTI_Line16 ((uint32_t)0x10000) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_Line17 ((uint32_t)0x20000) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_Line18 ((uint32_t)0x40000) /*!< External interrupt line 18 Connected to the USB Device/USB OTG FS + Wakeup from suspend event */ +#define EXTI_Line19 ((uint32_t)0x80000) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ + +#define IS_EXTI_LINE(LINE) ((((LINE) & (uint32_t)0xFFF00000) == 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)) + + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup EXTI_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_Exported_Functions + * @{ + */ + +void EXTI_DeInit(void); +void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); +void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct); +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); +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 /* __STM32F10x_EXTI_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_flash.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_flash.c new file mode 100644 index 0000000..57bb715 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_flash.c @@ -0,0 +1,1683 @@ +/** + ****************************************************************************** + * @file stm32f10x_flash.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the FLASH firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_flash.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup FLASH + * @brief FLASH driver modules + * @{ + */ + +/** @defgroup FLASH_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Private_Defines + * @{ + */ + +/* Flash Access Control Register bits */ +#define ACR_LATENCY_Mask ((uint32_t)0x00000038) +#define ACR_HLFCYA_Mask ((uint32_t)0xFFFFFFF7) +#define ACR_PRFTBE_Mask ((uint32_t)0xFFFFFFEF) + +/* Flash Access Control Register bits */ +#define ACR_PRFTBS_Mask ((uint32_t)0x00000020) + +/* Flash Control Register bits */ +#define CR_PG_Set ((uint32_t)0x00000001) +#define CR_PG_Reset ((uint32_t)0x00001FFE) +#define CR_PER_Set ((uint32_t)0x00000002) +#define CR_PER_Reset ((uint32_t)0x00001FFD) +#define CR_MER_Set ((uint32_t)0x00000004) +#define CR_MER_Reset ((uint32_t)0x00001FFB) +#define CR_OPTPG_Set ((uint32_t)0x00000010) +#define CR_OPTPG_Reset ((uint32_t)0x00001FEF) +#define CR_OPTER_Set ((uint32_t)0x00000020) +#define CR_OPTER_Reset ((uint32_t)0x00001FDF) +#define CR_STRT_Set ((uint32_t)0x00000040) +#define CR_LOCK_Set ((uint32_t)0x00000080) + +/* FLASH Mask */ +#define RDPRT_Mask ((uint32_t)0x00000002) +#define WRP0_Mask ((uint32_t)0x000000FF) +#define WRP1_Mask ((uint32_t)0x0000FF00) +#define WRP2_Mask ((uint32_t)0x00FF0000) +#define WRP3_Mask ((uint32_t)0xFF000000) +#define OB_USER_BFB2 ((uint16_t)0x0008) + +/* FLASH Keys */ +#define RDP_Key ((uint16_t)0x00A5) +#define FLASH_KEY1 ((uint32_t)0x45670123) +#define FLASH_KEY2 ((uint32_t)0xCDEF89AB) + +/* FLASH BANK address */ +#define FLASH_BANK1_END_ADDRESS ((uint32_t)0x807FFFF) + +/* Delay definition */ +#define EraseTimeout ((uint32_t)0x000B0000) +#define ProgramTimeout ((uint32_t)0x00002000) +/** + * @} + */ + +/** @defgroup FLASH_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Private_Functions + * @{ + */ + +/** +@code + + This driver provides functions to configure and program the Flash memory of all STM32F10x devices, + including the latest STM32F10x_XL density devices. + + STM32F10x_XL devices feature up to 1 Mbyte with dual bank architecture for read-while-write (RWW) capability: + - bank1: fixed size of 512 Kbytes (256 pages of 2Kbytes each) + - bank2: up to 512 Kbytes (up to 256 pages of 2Kbytes each) + While other STM32F10x devices features only one bank with memory up to 512 Kbytes. + + In version V3.3.0, some functions were updated and new ones were added to support + STM32F10x_XL devices. Thus some functions manages all devices, while other are + dedicated for XL devices only. + + The table below presents the list of available functions depending on the used STM32F10x devices. + + *************************************************** + * Legacy functions used for all STM32F10x devices * + *************************************************** + +----------------------------------------------------------------------------------------------------------------------------------+ + | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments | + | | devices | devices | | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_SetLatency | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_HalfCycleAccessCmd | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_PrefetchBufferCmd | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_Unlock | Yes | Yes | - For STM32F10X_XL devices: unlock Bank1 and Bank2. | + | | | | - For other devices: unlock Bank1 and it is equivalent | + | | | | to FLASH_UnlockBank1 function. | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_Lock | Yes | Yes | - For STM32F10X_XL devices: lock Bank1 and Bank2. | + | | | | - For other devices: lock Bank1 and it is equivalent | + | | | | to FLASH_LockBank1 function. | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ErasePage | Yes | Yes | - For STM32F10x_XL devices: erase a page in Bank1 and Bank2 | + | | | | - For other devices: erase a page in Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_EraseAllPages | Yes | Yes | - For STM32F10x_XL devices: erase all pages in Bank1 and Bank2 | + | | | | - For other devices: erase all pages in Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_EraseOptionBytes | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ProgramWord | Yes | Yes | Updated to program up to 1MByte (depending on the used device) | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ProgramHalfWord | Yes | Yes | Updated to program up to 1MByte (depending on the used device) | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ProgramOptionByteData | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_EnableWriteProtection | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ReadOutProtection | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_UserOptionByteConfig | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetUserOptionByte | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetWriteProtectionOptionByte | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetReadOutProtectionStatus | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetPrefetchBufferStatus | Yes | Yes | No change | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ITConfig | Yes | Yes | - For STM32F10x_XL devices: enable Bank1 and Bank2's interrupts| + | | | | - For other devices: enable Bank1's interrupts | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetFlagStatus | Yes | Yes | - For STM32F10x_XL devices: return Bank1 and Bank2's flag status| + | | | | - For other devices: return Bank1's flag status | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_ClearFlag | Yes | Yes | - For STM32F10x_XL devices: clear Bank1 and Bank2's flag | + | | | | - For other devices: clear Bank1's flag | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_GetStatus | Yes | Yes | - Return the status of Bank1 (for all devices) | + | | | | equivalent to FLASH_GetBank1Status function | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_WaitForLastOperation | Yes | Yes | - Wait for Bank1 last operation (for all devices) | + | | | | equivalent to: FLASH_WaitForLastBank1Operation function | + +----------------------------------------------------------------------------------------------------------------------------------+ + + ************************************************************************************************************************ + * New functions used for all STM32F10x devices to manage Bank1: * + * - These functions are mainly useful for STM32F10x_XL density devices, to have separate control for Bank1 and bank2 * + * - For other devices, these functions are optional (covered by functions listed above) * + ************************************************************************************************************************ + +----------------------------------------------------------------------------------------------------------------------------------+ + | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments | + | | devices | devices | | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_UnlockBank1 | Yes | Yes | - Unlock Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_LockBank1 | Yes | Yes | - Lock Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_EraseAllBank1Pages | Yes | Yes | - Erase all pages in Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_GetBank1Status | Yes | Yes | - Return the status of Bank1 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_WaitForLastBank1Operation | Yes | Yes | - Wait for Bank1 last operation | + +----------------------------------------------------------------------------------------------------------------------------------+ + + ***************************************************************************** + * New Functions used only with STM32F10x_XL density devices to manage Bank2 * + ***************************************************************************** + +----------------------------------------------------------------------------------------------------------------------------------+ + | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments | + | | devices | devices | | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_UnlockBank2 | Yes | No | - Unlock Bank2 | + |----------------------------------------------------------------------------------------------------------------------------------| + |FLASH_LockBank2 | Yes | No | - Lock Bank2 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_EraseAllBank2Pages | Yes | No | - Erase all pages in Bank2 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_GetBank2Status | Yes | No | - Return the status of Bank2 | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_WaitForLastBank2Operation | Yes | No | - Wait for Bank2 last operation | + |----------------------------------------------------------------------------------------------------------------------------------| + | FLASH_BootConfig | Yes | No | - Configure to boot from Bank1 or Bank2 | + +----------------------------------------------------------------------------------------------------------------------------------+ +@endcode +*/ + + +/** + * @brief Sets the code latency value. + * @note This function can be used for all STM32F10x devices. + * @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 + * @arg FLASH_Latency_2: FLASH Two Latency cycles + * @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 &= ACR_LATENCY_Mask; + tmpreg |= FLASH_Latency; + + /* Write the ACR register */ + FLASH->ACR = tmpreg; +} + +/** + * @brief Enables or disables the Half cycle flash access. + * @note This function can be used for all STM32F10x devices. + * @param FLASH_HalfCycleAccess: specifies the FLASH Half cycle Access mode. + * This parameter can be one of the following values: + * @arg FLASH_HalfCycleAccess_Enable: FLASH Half Cycle Enable + * @arg FLASH_HalfCycleAccess_Disable: FLASH Half Cycle Disable + * @retval None + */ +void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess) +{ + /* Check the parameters */ + assert_param(IS_FLASH_HALFCYCLEACCESS_STATE(FLASH_HalfCycleAccess)); + + /* Enable or disable the Half cycle access */ + FLASH->ACR &= ACR_HLFCYA_Mask; + FLASH->ACR |= FLASH_HalfCycleAccess; +} + +/** + * @brief Enables or disables the Prefetch Buffer. + * @note This function can be used for all STM32F10x devices. + * @param FLASH_PrefetchBuffer: specifies the Prefetch buffer status. + * This parameter can be one of the following values: + * @arg FLASH_PrefetchBuffer_Enable: FLASH Prefetch Buffer Enable + * @arg FLASH_PrefetchBuffer_Disable: FLASH Prefetch Buffer Disable + * @retval None + */ +void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer) +{ + /* Check the parameters */ + assert_param(IS_FLASH_PREFETCHBUFFER_STATE(FLASH_PrefetchBuffer)); + + /* Enable or disable the Prefetch Buffer */ + FLASH->ACR &= ACR_PRFTBE_Mask; + FLASH->ACR |= FLASH_PrefetchBuffer; +} + +/** + * @brief Unlocks the FLASH Program Erase Controller. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices this function unlocks Bank1 and Bank2. + * - For all other devices it unlocks Bank1 and it is equivalent + * to FLASH_UnlockBank1 function.. + * @param None + * @retval None + */ +void FLASH_Unlock(void) +{ + /* Authorize the FPEC of Bank1 Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; + +#ifdef STM32F10X_XL + /* Authorize the FPEC of Bank2 Access */ + FLASH->KEYR2 = FLASH_KEY1; + FLASH->KEYR2 = FLASH_KEY2; +#endif /* STM32F10X_XL */ +} +/** + * @brief Unlocks the FLASH Bank1 Program Erase Controller. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices this function unlocks Bank1. + * - For all other devices it unlocks Bank1 and it is + * equivalent to FLASH_Unlock function. + * @param None + * @retval None + */ +void FLASH_UnlockBank1(void) +{ + /* Authorize the FPEC of Bank1 Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; +} + +#ifdef STM32F10X_XL +/** + * @brief Unlocks the FLASH Bank2 Program Erase Controller. + * @note This function can be used only for STM32F10X_XL density devices. + * @param None + * @retval None + */ +void FLASH_UnlockBank2(void) +{ + /* Authorize the FPEC of Bank2 Access */ + FLASH->KEYR2 = FLASH_KEY1; + FLASH->KEYR2 = FLASH_KEY2; + +} +#endif /* STM32F10X_XL */ + +/** + * @brief Locks the FLASH Program Erase Controller. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices this function Locks Bank1 and Bank2. + * - For all other devices it Locks Bank1 and it is equivalent + * to FLASH_LockBank1 function. + * @param None + * @retval None + */ +void FLASH_Lock(void) +{ + /* Set the Lock Bit to lock the FPEC and the CR of Bank1 */ + FLASH->CR |= CR_LOCK_Set; + +#ifdef STM32F10X_XL + /* Set the Lock Bit to lock the FPEC and the CR of Bank2 */ + FLASH->CR2 |= CR_LOCK_Set; +#endif /* STM32F10X_XL */ +} + +/** + * @brief Locks the FLASH Bank1 Program Erase Controller. + * @note this function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices this function Locks Bank1. + * - For all other devices it Locks Bank1 and it is equivalent + * to FLASH_Lock function. + * @param None + * @retval None + */ +void FLASH_LockBank1(void) +{ + /* Set the Lock Bit to lock the FPEC and the CR of Bank1 */ + FLASH->CR |= CR_LOCK_Set; +} + +#ifdef STM32F10X_XL +/** + * @brief Locks the FLASH Bank2 Program Erase Controller. + * @note This function can be used only for STM32F10X_XL density devices. + * @param None + * @retval None + */ +void FLASH_LockBank2(void) +{ + /* Set the Lock Bit to lock the FPEC and the CR of Bank2 */ + FLASH->CR2 |= CR_LOCK_Set; +} +#endif /* STM32F10X_XL */ + +/** + * @brief Erases a specified FLASH page. + * @note This function can be used for all STM32F10x devices. + * @param Page_Address: The page address to be erased. + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * 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_ADDRESS(Page_Address)); + +#ifdef STM32F10X_XL + if(Page_Address < FLASH_BANK1_END_ADDRESS) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase the page */ + FLASH->CR|= CR_PER_Set; + FLASH->AR = Page_Address; + FLASH->CR|= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + /* Disable the PER Bit */ + FLASH->CR &= CR_PER_Reset; + } + } + else + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase the page */ + FLASH->CR2|= CR_PER_Set; + FLASH->AR2 = Page_Address; + FLASH->CR2|= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(EraseTimeout); + + /* Disable the PER Bit */ + FLASH->CR2 &= CR_PER_Reset; + } + } +#else + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase the page */ + FLASH->CR|= CR_PER_Set; + FLASH->AR = Page_Address; + FLASH->CR|= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + /* Disable the PER Bit */ + FLASH->CR &= CR_PER_Reset; + } +#endif /* STM32F10X_XL */ + + /* Return the Erase Status */ + return status; +} + +/** + * @brief Erases all FLASH pages. + * @note This function can be used for all STM32F10x devices. + * @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; + +#ifdef STM32F10X_XL + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase all pages */ + FLASH->CR |= CR_MER_Set; + FLASH->CR |= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + /* Disable the MER Bit */ + FLASH->CR &= CR_MER_Reset; + } + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase all pages */ + FLASH->CR2 |= CR_MER_Set; + FLASH->CR2 |= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(EraseTimeout); + + /* Disable the MER Bit */ + FLASH->CR2 &= CR_MER_Reset; + } +#else + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase all pages */ + FLASH->CR |= CR_MER_Set; + FLASH->CR |= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + /* Disable the MER Bit */ + FLASH->CR &= CR_MER_Reset; + } +#endif /* STM32F10X_XL */ + + /* Return the Erase Status */ + return status; +} + +/** + * @brief Erases all Bank1 FLASH pages. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices this function erases all Bank1 pages. + * - For all other devices it erases all Bank1 pages and it is equivalent + * to FLASH_EraseAllPages function. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseAllBank1Pages(void) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase all pages */ + FLASH->CR |= CR_MER_Set; + FLASH->CR |= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + /* Disable the MER Bit */ + FLASH->CR &= CR_MER_Reset; + } + /* Return the Erase Status */ + return status; +} + +#ifdef STM32F10X_XL +/** + * @brief Erases all Bank2 FLASH pages. + * @note This function can be used only for STM32F10x_XL density devices. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseAllBank2Pages(void) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to erase all pages */ + FLASH->CR2 |= CR_MER_Set; + FLASH->CR2 |= CR_STRT_Set; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(EraseTimeout); + + /* Disable the MER Bit */ + FLASH->CR2 &= CR_MER_Reset; + } + /* Return the Erase Status */ + return status; +} +#endif /* STM32F10X_XL */ + +/** + * @brief Erases the FLASH option bytes. + * @note This functions erases all option bytes except the Read protection (RDP). + * @note This function can be used for all STM32F10x devices. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseOptionBytes(void) +{ + uint16_t rdptmp = RDP_Key; + + FLASH_Status status = FLASH_COMPLETE; + + /* Get the actual read protection Option Byte value */ + if(FLASH_GetReadOutProtectionStatus() != RESET) + { + rdptmp = 0x00; + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* Authorize the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + + /* if the previous operation is completed, proceed to erase the option bytes */ + FLASH->CR |= CR_OPTER_Set; + FLASH->CR |= CR_STRT_Set; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the erase operation is completed, disable the OPTER Bit */ + FLASH->CR &= CR_OPTER_Reset; + + /* Enable the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + /* Restore the last read protection Option Byte value */ + OB->RDP = (uint16_t)rdptmp; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + else + { + if (status != FLASH_TIMEOUT) + { + /* Disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + } + /* Return the erase status */ + return status; +} + +/** + * @brief Programs a word at a specified address. + * @note This function can be used for all STM32F10x devices. + * @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_ADDRESS(Address)); + +#ifdef STM32F10X_XL + if(Address < FLASH_BANK1_END_ADDRESS - 2) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(ProgramTimeout); + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new first + half word */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = (uint16_t)Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + 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(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + else + { + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + } + } + else if(Address == (FLASH_BANK1_END_ADDRESS - 1)) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new first + half word */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = (uint16_t)Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + else + { + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new second + half word */ + FLASH->CR2 |= CR_PG_Set; + tmp = Address + 2; + + *(__IO uint16_t*) tmp = Data >> 16; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR2 &= CR_PG_Reset; + } + else + { + /* Disable the PG Bit */ + FLASH->CR2 &= CR_PG_Reset; + } + } + else + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new first + half word */ + FLASH->CR2 |= CR_PG_Set; + + *(__IO uint16_t*)Address = (uint16_t)Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(ProgramTimeout); + + 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_WaitForLastBank2Operation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR2 &= CR_PG_Reset; + } + else + { + /* Disable the PG Bit */ + FLASH->CR2 &= CR_PG_Reset; + } + } + } +#else + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new first + half word */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = (uint16_t)Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + 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(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + else + { + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + } +#endif /* STM32F10X_XL */ + + /* Return the Program Status */ + return status; +} + +/** + * @brief Programs a half word at a specified address. + * @note This function can be used for all STM32F10x devices. + * @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_ADDRESS(Address)); + +#ifdef STM32F10X_XL + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(Address < FLASH_BANK1_END_ADDRESS) + { + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new data */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank1Operation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } + } + else + { + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new data */ + FLASH->CR2 |= CR_PG_Set; + + *(__IO uint16_t*)Address = Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastBank2Operation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR2 &= CR_PG_Reset; + } + } +#else + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new data */ + FLASH->CR |= CR_PG_Set; + + *(__IO uint16_t*)Address = Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + /* Disable the PG Bit */ + FLASH->CR &= CR_PG_Reset; + } +#endif /* STM32F10X_XL */ + + /* Return the Program Status */ + return status; +} + +/** + * @brief Programs a half word at a specified Option Byte Data address. + * @note This function can be used for all STM32F10x devices. + * @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_ProgramOptionByteData(uint32_t Address, uint8_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + assert_param(IS_OB_DATA_ADDRESS(Address)); + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Authorize the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + /* Enables the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + *(__IO uint16_t*)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + /* Return the Option Byte Data Program Status */ + return status; +} + +/** + * @brief Write protects the desired pages + * @note This function can be used for all STM32F10x devices. + * @param FLASH_Pages: specifies the address of the pages to be write protected. + * This parameter can be: + * @arg For @b STM32_Low-density_devices: value between FLASH_WRProt_Pages0to3 and FLASH_WRProt_Pages28to31 + * @arg For @b STM32_Medium-density_devices: value between FLASH_WRProt_Pages0to3 + * and FLASH_WRProt_Pages124to127 + * @arg For @b STM32_High-density_devices: value between FLASH_WRProt_Pages0to1 and + * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to255 + * @arg For @b STM32_Connectivity_line_devices: value between FLASH_WRProt_Pages0to1 and + * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to127 + * @arg For @b STM32_XL-density_devices: value between FLASH_WRProt_Pages0to1 and + * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to511 + * @arg FLASH_WRProt_AllPages + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages) +{ + 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_FLASH_WRPROT_PAGE(FLASH_Pages)); + + FLASH_Pages = (uint32_t)(~FLASH_Pages); + WRP0_Data = (uint16_t)(FLASH_Pages & WRP0_Mask); + WRP1_Data = (uint16_t)((FLASH_Pages & WRP1_Mask) >> 8); + WRP2_Data = (uint16_t)((FLASH_Pages & WRP2_Mask) >> 16); + WRP3_Data = (uint16_t)((FLASH_Pages & WRP3_Mask) >> 24); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Authorizes the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + FLASH->CR |= CR_OPTPG_Set; + if(WRP0_Data != 0xFF) + { + OB->WRP0 = WRP0_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + if((status == FLASH_COMPLETE) && (WRP1_Data != 0xFF)) + { + OB->WRP1 = WRP1_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + if((status == FLASH_COMPLETE) && (WRP2_Data != 0xFF)) + { + OB->WRP2 = WRP2_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + + if((status == FLASH_COMPLETE)&& (WRP3_Data != 0xFF)) + { + OB->WRP3 = WRP3_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + } + + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + /* Return the write protection operation Status */ + return status; +} + +/** + * @brief Enables or disables the read out protection. + * @note If the user has already programmed the other option bytes before calling + * this function, he must re-program them since this function erases all option bytes. + * @note This function can be used for all STM32F10x devices. + * @param Newstate: new state of the ReadOut Protection. + * This parameter can be: ENABLE or DISABLE. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState) +{ + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* Authorizes the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + FLASH->CR |= CR_OPTER_Set; + FLASH->CR |= CR_STRT_Set; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + /* if the erase operation is completed, disable the OPTER Bit */ + FLASH->CR &= CR_OPTER_Reset; + /* Enable the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + if(NewState != DISABLE) + { + OB->RDP = 0x00; + } + else + { + OB->RDP = RDP_Key; + } + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + else + { + if(status != FLASH_TIMEOUT) + { + /* Disable the OPTER Bit */ + FLASH->CR &= CR_OPTER_Reset; + } + } + } + /* Return the protection operation Status */ + return status; +} + +/** + * @brief Programs the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. + * @note This function can be used for all STM32F10x devices. + * @param OB_IWDG: Selects the IWDG mode + * This parameter can be one of the following values: + * @arg OB_IWDG_SW: Software IWDG selected + * @arg OB_IWDG_HW: Hardware IWDG 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_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_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)); + + /* Authorize the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Enable the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + + OB->USER = OB_IWDG | (uint16_t)(OB_STOP | (uint16_t)(OB_STDBY | ((uint16_t)0xF8))); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + /* Return the Option Byte program Status */ + return status; +} + +#ifdef STM32F10X_XL +/** + * @brief Configures to boot from Bank1 or Bank2. + * @note This function can be used only for STM32F10x_XL density devices. + * @param FLASH_BOOT: select the FLASH Bank to boot from. + * This parameter can be one of the following values: + * @arg FLASH_BOOT_Bank1: At startup, if boot pins are set in boot from user Flash + * position and this parameter is selected the device will boot from Bank1(Default). + * @arg FLASH_BOOT_Bank2: At startup, if boot pins are set in boot from user Flash + * position and this parameter is selected the device will boot from Bank2 or Bank1, + * depending on the activation of the bank. The active banks are checked in + * the following order: Bank2, followed by Bank1. + * The active bank is recognized by the value programmed at the base address + * of the respective bank (corresponding to the initial stack pointer value + * in the interrupt vector table). + * For more information, please refer to AN2606 from www.st.com. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_BootConfig(uint16_t FLASH_BOOT) +{ + FLASH_Status status = FLASH_COMPLETE; + assert_param(IS_FLASH_BOOT(FLASH_BOOT)); + /* Authorize the small information block programming */ + FLASH->OPTKEYR = FLASH_KEY1; + FLASH->OPTKEYR = FLASH_KEY2; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Enable the Option Bytes Programming operation */ + FLASH->CR |= CR_OPTPG_Set; + + if(FLASH_BOOT == FLASH_BOOT_Bank1) + { + OB->USER |= OB_USER_BFB2; + } + else + { + OB->USER &= (uint16_t)(~(uint16_t)(OB_USER_BFB2)); + } + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status != FLASH_TIMEOUT) + { + /* if the program operation is completed, disable the OPTPG Bit */ + FLASH->CR &= CR_OPTPG_Reset; + } + } + /* Return the Option Byte program Status */ + return status; +} +#endif /* STM32F10X_XL */ + +/** + * @brief Returns the FLASH User Option Bytes values. + * @note This function can be used for all STM32F10x devices. + * @param None + * @retval The FLASH User Option Bytes values:IWDG_SW(Bit0), RST_STOP(Bit1) + * and RST_STDBY(Bit2). + */ +uint32_t FLASH_GetUserOptionByte(void) +{ + /* Return the User Option Byte */ + return (uint32_t)(FLASH->OBR >> 2); +} + +/** + * @brief Returns the FLASH Write Protection Option Bytes Register value. + * @note This function can be used for all STM32F10x devices. + * @param None + * @retval The FLASH Write Protection Option Bytes Register value + */ +uint32_t FLASH_GetWriteProtectionOptionByte(void) +{ + /* Return the Falsh write protection Register value */ + return (uint32_t)(FLASH->WRPR); +} + +/** + * @brief Checks whether the FLASH Read Out Protection Status is set or not. + * @note This function can be used for all STM32F10x devices. + * @param None + * @retval FLASH ReadOut Protection Status(SET or RESET) + */ +FlagStatus FLASH_GetReadOutProtectionStatus(void) +{ + FlagStatus readoutstatus = RESET; + if ((FLASH->OBR & RDPRT_Mask) != (uint32_t)RESET) + { + readoutstatus = SET; + } + else + { + readoutstatus = RESET; + } + return readoutstatus; +} + +/** + * @brief Checks whether the FLASH Prefetch Buffer status is set or not. + * @note This function can be used for all STM32F10x devices. + * @param None + * @retval FLASH Prefetch Buffer Status (SET or RESET). + */ +FlagStatus FLASH_GetPrefetchBufferStatus(void) +{ + FlagStatus bitstatus = RESET; + + if ((FLASH->ACR & ACR_PRFTBS_Mask) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the new state of FLASH Prefetch Buffer Status (SET or RESET) */ + return bitstatus; +} + +/** + * @brief Enables or disables the specified FLASH interrupts. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices, enables or disables the specified FLASH interrupts + for Bank1 and Bank2. + * - For other devices it enables or disables the specified FLASH interrupts for Bank1. + * @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_ERROR: FLASH Error Interrupt + * @arg FLASH_IT_EOP: FLASH end of operation Interrupt + * @param NewState: new state of the specified Flash interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState) +{ +#ifdef STM32F10X_XL + /* Check the parameters */ + assert_param(IS_FLASH_IT(FLASH_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if((FLASH_IT & 0x80000000) != 0x0) + { + if(NewState != DISABLE) + { + /* Enable the interrupt sources */ + FLASH->CR2 |= (FLASH_IT & 0x7FFFFFFF); + } + else + { + /* Disable the interrupt sources */ + FLASH->CR2 &= ~(uint32_t)(FLASH_IT & 0x7FFFFFFF); + } + } + else + { + if(NewState != DISABLE) + { + /* Enable the interrupt sources */ + FLASH->CR |= FLASH_IT; + } + else + { + /* Disable the interrupt sources */ + FLASH->CR &= ~(uint32_t)FLASH_IT; + } + } +#else + /* 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; + } +#endif /* STM32F10X_XL */ +} + +/** + * @brief Checks whether the specified FLASH flag is set or not. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices, this function checks whether the specified + * Bank1 or Bank2 flag is set or not. + * - For other devices, it checks whether the specified Bank1 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 Busy flag + * @arg FLASH_FLAG_PGERR: FLASH Program error flag + * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag + * @arg FLASH_FLAG_EOP: FLASH End of Operation flag + * @arg FLASH_FLAG_OPTERR: FLASH Option Byte error flag + * @retval The new state of FLASH_FLAG (SET or RESET). + */ +FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG) +{ + FlagStatus bitstatus = RESET; + +#ifdef STM32F10X_XL + /* Check the parameters */ + assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)) ; + if(FLASH_FLAG == FLASH_FLAG_OPTERR) + { + if((FLASH->OBR & FLASH_FLAG_OPTERR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if((FLASH_FLAG & 0x80000000) != 0x0) + { + if((FLASH->SR2 & FLASH_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + } +#else + /* Check the parameters */ + assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)) ; + if(FLASH_FLAG == FLASH_FLAG_OPTERR) + { + if((FLASH->OBR & FLASH_FLAG_OPTERR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } +#endif /* STM32F10X_XL */ + + /* Return the new state of FLASH_FLAG (SET or RESET) */ + return bitstatus; +} + +/** + * @brief Clears the FLASH’s pending flags. + * @note This function can be used for all STM32F10x devices. + * - For STM32F10X_XL devices, this function clears Bank1 or Bank2’s pending flags + * - For other devices, it clears Bank1’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 Program error flag + * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag + * @arg FLASH_FLAG_EOP: FLASH End of Operation flag + * @retval None + */ +void FLASH_ClearFlag(uint32_t FLASH_FLAG) +{ +#ifdef STM32F10X_XL + /* Check the parameters */ + assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)) ; + + if((FLASH_FLAG & 0x80000000) != 0x0) + { + /* Clear the flags */ + FLASH->SR2 = FLASH_FLAG; + } + else + { + /* Clear the flags */ + FLASH->SR = FLASH_FLAG; + } + +#else + /* Check the parameters */ + assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)) ; + + /* Clear the flags */ + FLASH->SR = FLASH_FLAG; +#endif /* STM32F10X_XL */ +} + +/** + * @brief Returns the FLASH Status. + * @note This function can be used for all STM32F10x devices, it is equivalent + * to FLASH_GetBank1Status function. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * 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 & FLASH_FLAG_PGERR) != 0) + { + flashstatus = FLASH_ERROR_PG; + } + else + { + if((FLASH->SR & FLASH_FLAG_WRPRTERR) != 0 ) + { + flashstatus = FLASH_ERROR_WRP; + } + else + { + flashstatus = FLASH_COMPLETE; + } + } + } + /* Return the Flash Status */ + return flashstatus; +} + +/** + * @brief Returns the FLASH Bank1 Status. + * @note This function can be used for all STM32F10x devices, it is equivalent + * to FLASH_GetStatus function. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE + */ +FLASH_Status FLASH_GetBank1Status(void) +{ + FLASH_Status flashstatus = FLASH_COMPLETE; + + if((FLASH->SR & FLASH_FLAG_BANK1_BSY) == FLASH_FLAG_BSY) + { + flashstatus = FLASH_BUSY; + } + else + { + if((FLASH->SR & FLASH_FLAG_BANK1_PGERR) != 0) + { + flashstatus = FLASH_ERROR_PG; + } + else + { + if((FLASH->SR & FLASH_FLAG_BANK1_WRPRTERR) != 0 ) + { + flashstatus = FLASH_ERROR_WRP; + } + else + { + flashstatus = FLASH_COMPLETE; + } + } + } + /* Return the Flash Status */ + return flashstatus; +} + +#ifdef STM32F10X_XL +/** + * @brief Returns the FLASH Bank2 Status. + * @note This function can be used for STM32F10x_XL density devices. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE + */ +FLASH_Status FLASH_GetBank2Status(void) +{ + FLASH_Status flashstatus = FLASH_COMPLETE; + + if((FLASH->SR2 & (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF)) == (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF)) + { + flashstatus = FLASH_BUSY; + } + else + { + if((FLASH->SR2 & (FLASH_FLAG_BANK2_PGERR & 0x7FFFFFFF)) != 0) + { + flashstatus = FLASH_ERROR_PG; + } + else + { + if((FLASH->SR2 & (FLASH_FLAG_BANK2_WRPRTERR & 0x7FFFFFFF)) != 0 ) + { + flashstatus = FLASH_ERROR_WRP; + } + else + { + flashstatus = FLASH_COMPLETE; + } + } + } + /* Return the Flash Status */ + return flashstatus; +} +#endif /* STM32F10X_XL */ +/** + * @brief Waits for a Flash operation to complete or a TIMEOUT to occur. + * @note This function can be used for all STM32F10x devices, + * it is equivalent to FLASH_WaitForLastBank1Operation. + * - For STM32F10X_XL devices this function waits for a Bank1 Flash operation + * to complete or a TIMEOUT to occur. + * - For all other devices it waits for a Flash operation to complete + * or a TIMEOUT to occur. + * @param Timeout: FLASH progamming Timeout + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * 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_GetBank1Status(); + /* Wait for a Flash operation to complete or a TIMEOUT to occur */ + while((status == FLASH_BUSY) && (Timeout != 0x00)) + { + status = FLASH_GetBank1Status(); + Timeout--; + } + if(Timeout == 0x00 ) + { + status = FLASH_TIMEOUT; + } + /* Return the operation status */ + return status; +} + +/** + * @brief Waits for a Flash operation on Bank1 to complete or a TIMEOUT to occur. + * @note This function can be used for all STM32F10x devices, + * it is equivalent to FLASH_WaitForLastOperation. + * @param Timeout: FLASH progamming Timeout + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check for the Flash Status */ + status = FLASH_GetBank1Status(); + /* Wait for a Flash operation to complete or a TIMEOUT to occur */ + while((status == FLASH_FLAG_BANK1_BSY) && (Timeout != 0x00)) + { + status = FLASH_GetBank1Status(); + Timeout--; + } + if(Timeout == 0x00 ) + { + status = FLASH_TIMEOUT; + } + /* Return the operation status */ + return status; +} + +#ifdef STM32F10X_XL +/** + * @brief Waits for a Flash operation on Bank2 to complete or a TIMEOUT to occur. + * @note This function can be used only for STM32F10x_XL density devices. + * @param Timeout: FLASH progamming Timeout + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_WaitForLastBank2Operation(uint32_t Timeout) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check for the Flash Status */ + status = FLASH_GetBank2Status(); + /* Wait for a Flash operation to complete or a TIMEOUT to occur */ + while((status == (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF)) && (Timeout != 0x00)) + { + status = FLASH_GetBank2Status(); + Timeout--; + } + if(Timeout == 0x00 ) + { + status = FLASH_TIMEOUT; + } + /* Return the operation status */ + return status; +} +#endif /* STM32F10X_XL */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_flash.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_flash.h new file mode 100644 index 0000000..5e2047d --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_flash.h @@ -0,0 +1,425 @@ +/** + ****************************************************************************** + * @file stm32f10x_flash.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the FLASH + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_FLASH_H +#define __STM32F10x_FLASH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup FLASH + * @{ + */ + +/** @defgroup FLASH_Exported_Types + * @{ + */ + +/** + * @brief FLASH Status + */ + +typedef enum +{ + FLASH_BUSY = 1, + FLASH_ERROR_PG, + FLASH_ERROR_WRP, + FLASH_COMPLETE, + FLASH_TIMEOUT +}FLASH_Status; + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Constants + * @{ + */ + +/** @defgroup Flash_Latency + * @{ + */ + +#define FLASH_Latency_0 ((uint32_t)0x00000000) /*!< FLASH Zero Latency cycle */ +#define FLASH_Latency_1 ((uint32_t)0x00000001) /*!< FLASH One Latency cycle */ +#define FLASH_Latency_2 ((uint32_t)0x00000002) /*!< FLASH Two Latency cycles */ +#define IS_FLASH_LATENCY(LATENCY) (((LATENCY) == FLASH_Latency_0) || \ + ((LATENCY) == FLASH_Latency_1) || \ + ((LATENCY) == FLASH_Latency_2)) +/** + * @} + */ + +/** @defgroup Half_Cycle_Enable_Disable + * @{ + */ + +#define FLASH_HalfCycleAccess_Enable ((uint32_t)0x00000008) /*!< FLASH Half Cycle Enable */ +#define FLASH_HalfCycleAccess_Disable ((uint32_t)0x00000000) /*!< FLASH Half Cycle Disable */ +#define IS_FLASH_HALFCYCLEACCESS_STATE(STATE) (((STATE) == FLASH_HalfCycleAccess_Enable) || \ + ((STATE) == FLASH_HalfCycleAccess_Disable)) +/** + * @} + */ + +/** @defgroup Prefetch_Buffer_Enable_Disable + * @{ + */ + +#define FLASH_PrefetchBuffer_Enable ((uint32_t)0x00000010) /*!< FLASH Prefetch Buffer Enable */ +#define FLASH_PrefetchBuffer_Disable ((uint32_t)0x00000000) /*!< FLASH Prefetch Buffer Disable */ +#define IS_FLASH_PREFETCHBUFFER_STATE(STATE) (((STATE) == FLASH_PrefetchBuffer_Enable) || \ + ((STATE) == FLASH_PrefetchBuffer_Disable)) +/** + * @} + */ + +/** @defgroup Option_Bytes_Write_Protection + * @{ + */ + +/* Values to be used with STM32 Low and Medium density devices */ +#define FLASH_WRProt_Pages0to3 ((uint32_t)0x00000001) /*!< STM32 Low and Medium density devices: Write protection of page 0 to 3 */ +#define FLASH_WRProt_Pages4to7 ((uint32_t)0x00000002) /*!< STM32 Low and Medium density devices: Write protection of page 4 to 7 */ +#define FLASH_WRProt_Pages8to11 ((uint32_t)0x00000004) /*!< STM32 Low and Medium density devices: Write protection of page 8 to 11 */ +#define FLASH_WRProt_Pages12to15 ((uint32_t)0x00000008) /*!< STM32 Low and Medium density devices: Write protection of page 12 to 15 */ +#define FLASH_WRProt_Pages16to19 ((uint32_t)0x00000010) /*!< STM32 Low and Medium density devices: Write protection of page 16 to 19 */ +#define FLASH_WRProt_Pages20to23 ((uint32_t)0x00000020) /*!< STM32 Low and Medium density devices: Write protection of page 20 to 23 */ +#define FLASH_WRProt_Pages24to27 ((uint32_t)0x00000040) /*!< STM32 Low and Medium density devices: Write protection of page 24 to 27 */ +#define FLASH_WRProt_Pages28to31 ((uint32_t)0x00000080) /*!< STM32 Low and Medium density devices: Write protection of page 28 to 31 */ + +/* Values to be used with STM32 Medium-density devices */ +#define FLASH_WRProt_Pages32to35 ((uint32_t)0x00000100) /*!< STM32 Medium-density devices: Write protection of page 32 to 35 */ +#define FLASH_WRProt_Pages36to39 ((uint32_t)0x00000200) /*!< STM32 Medium-density devices: Write protection of page 36 to 39 */ +#define FLASH_WRProt_Pages40to43 ((uint32_t)0x00000400) /*!< STM32 Medium-density devices: Write protection of page 40 to 43 */ +#define FLASH_WRProt_Pages44to47 ((uint32_t)0x00000800) /*!< STM32 Medium-density devices: Write protection of page 44 to 47 */ +#define FLASH_WRProt_Pages48to51 ((uint32_t)0x00001000) /*!< STM32 Medium-density devices: Write protection of page 48 to 51 */ +#define FLASH_WRProt_Pages52to55 ((uint32_t)0x00002000) /*!< STM32 Medium-density devices: Write protection of page 52 to 55 */ +#define FLASH_WRProt_Pages56to59 ((uint32_t)0x00004000) /*!< STM32 Medium-density devices: Write protection of page 56 to 59 */ +#define FLASH_WRProt_Pages60to63 ((uint32_t)0x00008000) /*!< STM32 Medium-density devices: Write protection of page 60 to 63 */ +#define FLASH_WRProt_Pages64to67 ((uint32_t)0x00010000) /*!< STM32 Medium-density devices: Write protection of page 64 to 67 */ +#define FLASH_WRProt_Pages68to71 ((uint32_t)0x00020000) /*!< STM32 Medium-density devices: Write protection of page 68 to 71 */ +#define FLASH_WRProt_Pages72to75 ((uint32_t)0x00040000) /*!< STM32 Medium-density devices: Write protection of page 72 to 75 */ +#define FLASH_WRProt_Pages76to79 ((uint32_t)0x00080000) /*!< STM32 Medium-density devices: Write protection of page 76 to 79 */ +#define FLASH_WRProt_Pages80to83 ((uint32_t)0x00100000) /*!< STM32 Medium-density devices: Write protection of page 80 to 83 */ +#define FLASH_WRProt_Pages84to87 ((uint32_t)0x00200000) /*!< STM32 Medium-density devices: Write protection of page 84 to 87 */ +#define FLASH_WRProt_Pages88to91 ((uint32_t)0x00400000) /*!< STM32 Medium-density devices: Write protection of page 88 to 91 */ +#define FLASH_WRProt_Pages92to95 ((uint32_t)0x00800000) /*!< STM32 Medium-density devices: Write protection of page 92 to 95 */ +#define FLASH_WRProt_Pages96to99 ((uint32_t)0x01000000) /*!< STM32 Medium-density devices: Write protection of page 96 to 99 */ +#define FLASH_WRProt_Pages100to103 ((uint32_t)0x02000000) /*!< STM32 Medium-density devices: Write protection of page 100 to 103 */ +#define FLASH_WRProt_Pages104to107 ((uint32_t)0x04000000) /*!< STM32 Medium-density devices: Write protection of page 104 to 107 */ +#define FLASH_WRProt_Pages108to111 ((uint32_t)0x08000000) /*!< STM32 Medium-density devices: Write protection of page 108 to 111 */ +#define FLASH_WRProt_Pages112to115 ((uint32_t)0x10000000) /*!< STM32 Medium-density devices: Write protection of page 112 to 115 */ +#define FLASH_WRProt_Pages116to119 ((uint32_t)0x20000000) /*!< STM32 Medium-density devices: Write protection of page 115 to 119 */ +#define FLASH_WRProt_Pages120to123 ((uint32_t)0x40000000) /*!< STM32 Medium-density devices: Write protection of page 120 to 123 */ +#define FLASH_WRProt_Pages124to127 ((uint32_t)0x80000000) /*!< STM32 Medium-density devices: Write protection of page 124 to 127 */ + +/* Values to be used with STM32 High-density and STM32F10X Connectivity line devices */ +#define FLASH_WRProt_Pages0to1 ((uint32_t)0x00000001) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 0 to 1 */ +#define FLASH_WRProt_Pages2to3 ((uint32_t)0x00000002) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 2 to 3 */ +#define FLASH_WRProt_Pages4to5 ((uint32_t)0x00000004) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 4 to 5 */ +#define FLASH_WRProt_Pages6to7 ((uint32_t)0x00000008) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 6 to 7 */ +#define FLASH_WRProt_Pages8to9 ((uint32_t)0x00000010) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 8 to 9 */ +#define FLASH_WRProt_Pages10to11 ((uint32_t)0x00000020) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 10 to 11 */ +#define FLASH_WRProt_Pages12to13 ((uint32_t)0x00000040) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 12 to 13 */ +#define FLASH_WRProt_Pages14to15 ((uint32_t)0x00000080) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 14 to 15 */ +#define FLASH_WRProt_Pages16to17 ((uint32_t)0x00000100) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 16 to 17 */ +#define FLASH_WRProt_Pages18to19 ((uint32_t)0x00000200) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 18 to 19 */ +#define FLASH_WRProt_Pages20to21 ((uint32_t)0x00000400) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 20 to 21 */ +#define FLASH_WRProt_Pages22to23 ((uint32_t)0x00000800) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 22 to 23 */ +#define FLASH_WRProt_Pages24to25 ((uint32_t)0x00001000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 24 to 25 */ +#define FLASH_WRProt_Pages26to27 ((uint32_t)0x00002000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 26 to 27 */ +#define FLASH_WRProt_Pages28to29 ((uint32_t)0x00004000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 28 to 29 */ +#define FLASH_WRProt_Pages30to31 ((uint32_t)0x00008000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 30 to 31 */ +#define FLASH_WRProt_Pages32to33 ((uint32_t)0x00010000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 32 to 33 */ +#define FLASH_WRProt_Pages34to35 ((uint32_t)0x00020000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 34 to 35 */ +#define FLASH_WRProt_Pages36to37 ((uint32_t)0x00040000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 36 to 37 */ +#define FLASH_WRProt_Pages38to39 ((uint32_t)0x00080000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 38 to 39 */ +#define FLASH_WRProt_Pages40to41 ((uint32_t)0x00100000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 40 to 41 */ +#define FLASH_WRProt_Pages42to43 ((uint32_t)0x00200000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 42 to 43 */ +#define FLASH_WRProt_Pages44to45 ((uint32_t)0x00400000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 44 to 45 */ +#define FLASH_WRProt_Pages46to47 ((uint32_t)0x00800000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 46 to 47 */ +#define FLASH_WRProt_Pages48to49 ((uint32_t)0x01000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 48 to 49 */ +#define FLASH_WRProt_Pages50to51 ((uint32_t)0x02000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 50 to 51 */ +#define FLASH_WRProt_Pages52to53 ((uint32_t)0x04000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 52 to 53 */ +#define FLASH_WRProt_Pages54to55 ((uint32_t)0x08000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 54 to 55 */ +#define FLASH_WRProt_Pages56to57 ((uint32_t)0x10000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 56 to 57 */ +#define FLASH_WRProt_Pages58to59 ((uint32_t)0x20000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 58 to 59 */ +#define FLASH_WRProt_Pages60to61 ((uint32_t)0x40000000) /*!< STM32 High-density, XL-density and Connectivity line devices: + Write protection of page 60 to 61 */ +#define FLASH_WRProt_Pages62to127 ((uint32_t)0x80000000) /*!< STM32 Connectivity line devices: Write protection of page 62 to 127 */ +#define FLASH_WRProt_Pages62to255 ((uint32_t)0x80000000) /*!< STM32 Medium-density devices: Write protection of page 62 to 255 */ +#define FLASH_WRProt_Pages62to511 ((uint32_t)0x80000000) /*!< STM32 XL-density devices: Write protection of page 62 to 511 */ + +#define FLASH_WRProt_AllPages ((uint32_t)0xFFFFFFFF) /*!< Write protection of all Pages */ + +#define IS_FLASH_WRPROT_PAGE(PAGE) (((PAGE) != 0x00000000)) + +#define IS_FLASH_ADDRESS(ADDRESS) (((ADDRESS) >= 0x08000000) && ((ADDRESS) < 0x080FFFFF)) + +#define IS_OB_DATA_ADDRESS(ADDRESS) (((ADDRESS) == 0x1FFFF804) || ((ADDRESS) == 0x1FFFF806)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_IWatchdog + * @{ + */ + +#define OB_IWDG_SW ((uint16_t)0x0001) /*!< Software IWDG selected */ +#define OB_IWDG_HW ((uint16_t)0x0000) /*!< Hardware IWDG selected */ +#define IS_OB_IWDG_SOURCE(SOURCE) (((SOURCE) == OB_IWDG_SW) || ((SOURCE) == OB_IWDG_HW)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_nRST_STOP + * @{ + */ + +#define OB_STOP_NoRST ((uint16_t)0x0002) /*!< No reset generated when entering in STOP */ +#define OB_STOP_RST ((uint16_t)0x0000) /*!< Reset generated when entering in STOP */ +#define IS_OB_STOP_SOURCE(SOURCE) (((SOURCE) == OB_STOP_NoRST) || ((SOURCE) == OB_STOP_RST)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_nRST_STDBY + * @{ + */ + +#define OB_STDBY_NoRST ((uint16_t)0x0004) /*!< No reset generated when entering in STANDBY */ +#define OB_STDBY_RST ((uint16_t)0x0000) /*!< Reset generated when entering in STANDBY */ +#define IS_OB_STDBY_SOURCE(SOURCE) (((SOURCE) == OB_STDBY_NoRST) || ((SOURCE) == OB_STDBY_RST)) + +#ifdef STM32F10X_XL +/** + * @} + */ +/** @defgroup FLASH_Boot + * @{ + */ +#define FLASH_BOOT_Bank1 ((uint16_t)0x0000) /*!< At startup, if boot pins are set in boot from user Flash position + and this parameter is selected the device will boot from Bank1(Default) */ +#define FLASH_BOOT_Bank2 ((uint16_t)0x0001) /*!< At startup, if boot pins are set in boot from user Flash position + and this parameter is selected the device will boot from Bank 2 or Bank 1, + depending on the activation of the bank */ +#define IS_FLASH_BOOT(BOOT) (((BOOT) == FLASH_BOOT_Bank1) || ((BOOT) == FLASH_BOOT_Bank2)) +#endif +/** + * @} + */ +/** @defgroup FLASH_Interrupts + * @{ + */ +#ifdef STM32F10X_XL +#define FLASH_IT_BANK2_ERROR ((uint32_t)0x80000400) /*!< FPEC BANK2 error interrupt source */ +#define FLASH_IT_BANK2_EOP ((uint32_t)0x80001000) /*!< End of FLASH BANK2 Operation Interrupt source */ + +#define FLASH_IT_BANK1_ERROR FLASH_IT_ERROR /*!< FPEC BANK1 error interrupt source */ +#define FLASH_IT_BANK1_EOP FLASH_IT_EOP /*!< End of FLASH BANK1 Operation Interrupt source */ + +#define FLASH_IT_ERROR ((uint32_t)0x00000400) /*!< FPEC BANK1 error interrupt source */ +#define FLASH_IT_EOP ((uint32_t)0x00001000) /*!< End of FLASH BANK1 Operation Interrupt source */ +#define IS_FLASH_IT(IT) ((((IT) & (uint32_t)0x7FFFEBFF) == 0x00000000) && (((IT) != 0x00000000))) +#else +#define FLASH_IT_ERROR ((uint32_t)0x00000400) /*!< FPEC error interrupt source */ +#define FLASH_IT_EOP ((uint32_t)0x00001000) /*!< End of FLASH Operation Interrupt source */ +#define FLASH_IT_BANK1_ERROR FLASH_IT_ERROR /*!< FPEC BANK1 error interrupt source */ +#define FLASH_IT_BANK1_EOP FLASH_IT_EOP /*!< End of FLASH BANK1 Operation Interrupt source */ + +#define IS_FLASH_IT(IT) ((((IT) & (uint32_t)0xFFFFEBFF) == 0x00000000) && (((IT) != 0x00000000))) +#endif + +/** + * @} + */ + +/** @defgroup FLASH_Flags + * @{ + */ +#ifdef STM32F10X_XL +#define FLASH_FLAG_BANK2_BSY ((uint32_t)0x80000001) /*!< FLASH BANK2 Busy flag */ +#define FLASH_FLAG_BANK2_EOP ((uint32_t)0x80000020) /*!< FLASH BANK2 End of Operation flag */ +#define FLASH_FLAG_BANK2_PGERR ((uint32_t)0x80000004) /*!< FLASH BANK2 Program error flag */ +#define FLASH_FLAG_BANK2_WRPRTERR ((uint32_t)0x80000010) /*!< FLASH BANK2 Write protected error flag */ + +#define FLASH_FLAG_BANK1_BSY FLASH_FLAG_BSY /*!< FLASH BANK1 Busy flag*/ +#define FLASH_FLAG_BANK1_EOP FLASH_FLAG_EOP /*!< FLASH BANK1 End of Operation flag */ +#define FLASH_FLAG_BANK1_PGERR FLASH_FLAG_PGERR /*!< FLASH BANK1 Program error flag */ +#define FLASH_FLAG_BANK1_WRPRTERR FLASH_FLAG_WRPRTERR /*!< FLASH BANK1 Write protected error flag */ + +#define FLASH_FLAG_BSY ((uint32_t)0x00000001) /*!< FLASH Busy flag */ +#define FLASH_FLAG_EOP ((uint32_t)0x00000020) /*!< FLASH End of Operation flag */ +#define FLASH_FLAG_PGERR ((uint32_t)0x00000004) /*!< FLASH Program error flag */ +#define FLASH_FLAG_WRPRTERR ((uint32_t)0x00000010) /*!< FLASH Write protected error flag */ +#define FLASH_FLAG_OPTERR ((uint32_t)0x00000001) /*!< FLASH Option Byte error flag */ + +#define IS_FLASH_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0x7FFFFFCA) == 0x00000000) && ((FLAG) != 0x00000000)) +#define IS_FLASH_GET_FLAG(FLAG) (((FLAG) == FLASH_FLAG_BSY) || ((FLAG) == FLASH_FLAG_EOP) || \ + ((FLAG) == FLASH_FLAG_PGERR) || ((FLAG) == FLASH_FLAG_WRPRTERR) || \ + ((FLAG) == FLASH_FLAG_OPTERR)|| \ + ((FLAG) == FLASH_FLAG_BANK1_BSY) || ((FLAG) == FLASH_FLAG_BANK1_EOP) || \ + ((FLAG) == FLASH_FLAG_BANK1_PGERR) || ((FLAG) == FLASH_FLAG_BANK1_WRPRTERR) || \ + ((FLAG) == FLASH_FLAG_BANK2_BSY) || ((FLAG) == FLASH_FLAG_BANK2_EOP) || \ + ((FLAG) == FLASH_FLAG_BANK2_PGERR) || ((FLAG) == FLASH_FLAG_BANK2_WRPRTERR)) +#else +#define FLASH_FLAG_BSY ((uint32_t)0x00000001) /*!< FLASH Busy flag */ +#define FLASH_FLAG_EOP ((uint32_t)0x00000020) /*!< FLASH End of Operation flag */ +#define FLASH_FLAG_PGERR ((uint32_t)0x00000004) /*!< FLASH Program error flag */ +#define FLASH_FLAG_WRPRTERR ((uint32_t)0x00000010) /*!< FLASH Write protected error flag */ +#define FLASH_FLAG_OPTERR ((uint32_t)0x00000001) /*!< FLASH Option Byte error flag */ + +#define FLASH_FLAG_BANK1_BSY FLASH_FLAG_BSY /*!< FLASH BANK1 Busy flag*/ +#define FLASH_FLAG_BANK1_EOP FLASH_FLAG_EOP /*!< FLASH BANK1 End of Operation flag */ +#define FLASH_FLAG_BANK1_PGERR FLASH_FLAG_PGERR /*!< FLASH BANK1 Program error flag */ +#define FLASH_FLAG_BANK1_WRPRTERR FLASH_FLAG_WRPRTERR /*!< FLASH BANK1 Write protected error flag */ + +#define IS_FLASH_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFCA) == 0x00000000) && ((FLAG) != 0x00000000)) +#define IS_FLASH_GET_FLAG(FLAG) (((FLAG) == FLASH_FLAG_BSY) || ((FLAG) == FLASH_FLAG_EOP) || \ + ((FLAG) == FLASH_FLAG_PGERR) || ((FLAG) == FLASH_FLAG_WRPRTERR) || \ + ((FLAG) == FLASH_FLAG_BANK1_BSY) || ((FLAG) == FLASH_FLAG_BANK1_EOP) || \ + ((FLAG) == FLASH_FLAG_BANK1_PGERR) || ((FLAG) == FLASH_FLAG_BANK1_WRPRTERR) || \ + ((FLAG) == FLASH_FLAG_OPTERR)) +#endif + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions + * @{ + */ + +/*------------ Functions used for all STM32F10x devices -----*/ +void FLASH_SetLatency(uint32_t FLASH_Latency); +void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess); +void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer); +void FLASH_Unlock(void); +void FLASH_Lock(void); +FLASH_Status FLASH_ErasePage(uint32_t Page_Address); +FLASH_Status FLASH_EraseAllPages(void); +FLASH_Status FLASH_EraseOptionBytes(void); +FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); +FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data); +FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages); +FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState); +FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY); +uint32_t FLASH_GetUserOptionByte(void); +uint32_t FLASH_GetWriteProtectionOptionByte(void); +FlagStatus FLASH_GetReadOutProtectionStatus(void); +FlagStatus FLASH_GetPrefetchBufferStatus(void); +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); + +/*------------ New function used for all STM32F10x devices -----*/ +void FLASH_UnlockBank1(void); +void FLASH_LockBank1(void); +FLASH_Status FLASH_EraseAllBank1Pages(void); +FLASH_Status FLASH_GetBank1Status(void); +FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout); + +#ifdef STM32F10X_XL +/*---- New Functions used only with STM32F10x_XL density devices -----*/ +void FLASH_UnlockBank2(void); +void FLASH_LockBank2(void); +FLASH_Status FLASH_EraseAllBank2Pages(void); +FLASH_Status FLASH_GetBank2Status(void); +FLASH_Status FLASH_WaitForLastBank2Operation(uint32_t Timeout); +FLASH_Status FLASH_BootConfig(uint16_t FLASH_BOOT); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_FLASH_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.c new file mode 100644 index 0000000..db9a5aa --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.c @@ -0,0 +1,863 @@ +/** + ****************************************************************************** + * @file stm32f10x_fsmc.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the FSMC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_fsmc.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup FSMC + * @brief FSMC driver modules + * @{ + */ + +/** @defgroup FSMC_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @defgroup FSMC_Private_Defines + * @{ + */ + +/* --------------------- FSMC registers bit mask ---------------------------- */ + +/* FSMC BCRx Mask */ +#define BCR_MBKEN_Set ((uint32_t)0x00000001) +#define BCR_MBKEN_Reset ((uint32_t)0x000FFFFE) +#define BCR_FACCEN_Set ((uint32_t)0x00000040) + +/* FSMC PCRx Mask */ +#define PCR_PBKEN_Set ((uint32_t)0x00000004) +#define PCR_PBKEN_Reset ((uint32_t)0x000FFFFB) +#define PCR_ECCEN_Set ((uint32_t)0x00000040) +#define PCR_ECCEN_Reset ((uint32_t)0x000FFFBF) +#define PCR_MemoryType_NAND ((uint32_t)0x00000008) +/** + * @} + */ + +/** @defgroup FSMC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the FSMC NOR/SRAM Banks registers to their default + * reset values. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @retval None + */ +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank) +{ + /* Check the parameter */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + + /* FSMC_Bank1_NORSRAM1 */ + if(FSMC_Bank == FSMC_Bank1_NORSRAM1) + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030DB; + } + /* FSMC_Bank1_NORSRAM2, FSMC_Bank1_NORSRAM3 or FSMC_Bank1_NORSRAM4 */ + else + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030D2; + } + FSMC_Bank1->BTCR[FSMC_Bank + 1] = 0x0FFFFFFF; + FSMC_Bank1E->BWTR[FSMC_Bank] = 0x0FFFFFFF; +} + +/** + * @brief Deinitializes the FSMC NAND Banks registers to their default reset values. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @retval None + */ +void FSMC_NANDDeInit(uint32_t FSMC_Bank) +{ + /* Check the parameter */ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + /* Set the FSMC_Bank2 registers to their reset values */ + FSMC_Bank2->PCR2 = 0x00000018; + FSMC_Bank2->SR2 = 0x00000040; + FSMC_Bank2->PMEM2 = 0xFCFCFCFC; + FSMC_Bank2->PATT2 = 0xFCFCFCFC; + } + /* FSMC_Bank3_NAND */ + else + { + /* Set the FSMC_Bank3 registers to their reset values */ + FSMC_Bank3->PCR3 = 0x00000018; + FSMC_Bank3->SR3 = 0x00000040; + FSMC_Bank3->PMEM3 = 0xFCFCFCFC; + FSMC_Bank3->PATT3 = 0xFCFCFCFC; + } +} + +/** + * @brief Deinitializes the FSMC PCCARD Bank registers to their default reset values. + * @param None + * @retval None + */ +void FSMC_PCCARDDeInit(void) +{ + /* Set the FSMC_Bank4 registers to their reset values */ + FSMC_Bank4->PCR4 = 0x00000018; + FSMC_Bank4->SR4 = 0x00000000; + FSMC_Bank4->PMEM4 = 0xFCFCFCFC; + FSMC_Bank4->PATT4 = 0xFCFCFCFC; + FSMC_Bank4->PIO4 = 0xFCFCFCFC; +} + +/** + * @brief Initializes the FSMC NOR/SRAM Banks according to the specified + * parameters in the FSMC_NORSRAMInitStruct. + * @param FSMC_NORSRAMInitStruct : pointer to a FSMC_NORSRAMInitTypeDef + * structure that contains the configuration information for + * the FSMC NOR/SRAM specified Banks. + * @retval None + */ +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + /* Check the parameters */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_NORSRAMInitStruct->FSMC_Bank)); + assert_param(IS_FSMC_MUX(FSMC_NORSRAMInitStruct->FSMC_DataAddressMux)); + assert_param(IS_FSMC_MEMORY(FSMC_NORSRAMInitStruct->FSMC_MemoryType)); + assert_param(IS_FSMC_MEMORY_WIDTH(FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth)); + assert_param(IS_FSMC_BURSTMODE(FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode)); + assert_param(IS_FSMC_ASYNWAIT(FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait)); + assert_param(IS_FSMC_WAIT_POLARITY(FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity)); + assert_param(IS_FSMC_WRAP_MODE(FSMC_NORSRAMInitStruct->FSMC_WrapMode)); + assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive)); + assert_param(IS_FSMC_WRITE_OPERATION(FSMC_NORSRAMInitStruct->FSMC_WriteOperation)); + assert_param(IS_FSMC_WAITE_SIGNAL(FSMC_NORSRAMInitStruct->FSMC_WaitSignal)); + assert_param(IS_FSMC_EXTENDED_MODE(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode)); + assert_param(IS_FSMC_WRITE_BURST(FSMC_NORSRAMInitStruct->FSMC_WriteBurst)); + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_TURNAROUND_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration)); + assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision)); + assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode)); + + /* Bank1 NOR/SRAM control register configuration */ + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_DataAddressMux | + FSMC_NORSRAMInitStruct->FSMC_MemoryType | + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth | + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode | + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity | + FSMC_NORSRAMInitStruct->FSMC_WrapMode | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive | + FSMC_NORSRAMInitStruct->FSMC_WriteOperation | + FSMC_NORSRAMInitStruct->FSMC_WaitSignal | + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode | + FSMC_NORSRAMInitStruct->FSMC_WriteBurst; + + if(FSMC_NORSRAMInitStruct->FSMC_MemoryType == FSMC_MemoryType_NOR) + { + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] |= (uint32_t)BCR_FACCEN_Set; + } + + /* Bank1 NOR/SRAM timing register configuration */ + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) | + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode; + + + /* Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */ + if(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode == FSMC_ExtendedMode_Enable) + { + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision)); + assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode)); + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime << 4 )| + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision << 20) | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency << 24) | + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode; + } + else + { + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 0x0FFFFFFF; + } +} + +/** + * @brief Initializes the FSMC NAND Banks according to the specified + * parameters in the FSMC_NANDInitStruct. + * @param FSMC_NANDInitStruct : pointer to a FSMC_NANDInitTypeDef + * structure that contains the configuration information for the FSMC NAND specified Banks. + * @retval None + */ +void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) +{ + uint32_t tmppcr = 0x00000000, tmppmem = 0x00000000, tmppatt = 0x00000000; + + /* Check the parameters */ + assert_param( IS_FSMC_NAND_BANK(FSMC_NANDInitStruct->FSMC_Bank)); + assert_param( IS_FSMC_WAIT_FEATURE(FSMC_NANDInitStruct->FSMC_Waitfeature)); + assert_param( IS_FSMC_MEMORY_WIDTH(FSMC_NANDInitStruct->FSMC_MemoryDataWidth)); + assert_param( IS_FSMC_ECC_STATE(FSMC_NANDInitStruct->FSMC_ECC)); + assert_param( IS_FSMC_ECCPAGE_SIZE(FSMC_NANDInitStruct->FSMC_ECCPageSize)); + assert_param( IS_FSMC_TCLR_TIME(FSMC_NANDInitStruct->FSMC_TCLRSetupTime)); + assert_param( IS_FSMC_TAR_TIME(FSMC_NANDInitStruct->FSMC_TARSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); + + /* Set the tmppcr value according to FSMC_NANDInitStruct parameters */ + tmppcr = (uint32_t)FSMC_NANDInitStruct->FSMC_Waitfeature | + PCR_MemoryType_NAND | + FSMC_NANDInitStruct->FSMC_MemoryDataWidth | + FSMC_NANDInitStruct->FSMC_ECC | + FSMC_NANDInitStruct->FSMC_ECCPageSize | + (FSMC_NANDInitStruct->FSMC_TCLRSetupTime << 9 )| + (FSMC_NANDInitStruct->FSMC_TARSetupTime << 13); + + /* Set tmppmem value according to FSMC_CommonSpaceTimingStructure parameters */ + tmppmem = (uint32_t)FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + /* Set tmppatt value according to FSMC_AttributeSpaceTimingStructure parameters */ + tmppatt = (uint32_t)FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + /* FSMC_Bank2_NAND registers configuration */ + FSMC_Bank2->PCR2 = tmppcr; + FSMC_Bank2->PMEM2 = tmppmem; + FSMC_Bank2->PATT2 = tmppatt; + } + else + { + /* FSMC_Bank3_NAND registers configuration */ + FSMC_Bank3->PCR3 = tmppcr; + FSMC_Bank3->PMEM3 = tmppmem; + FSMC_Bank3->PATT3 = tmppatt; + } +} + +/** + * @brief Initializes the FSMC PCCARD Bank according to the specified + * parameters in the FSMC_PCCARDInitStruct. + * @param FSMC_PCCARDInitStruct : pointer to a FSMC_PCCARDInitTypeDef + * structure that contains the configuration information for the FSMC PCCARD Bank. + * @retval None + */ +void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) +{ + /* Check the parameters */ + assert_param(IS_FSMC_WAIT_FEATURE(FSMC_PCCARDInitStruct->FSMC_Waitfeature)); + assert_param(IS_FSMC_TCLR_TIME(FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime)); + assert_param(IS_FSMC_TAR_TIME(FSMC_PCCARDInitStruct->FSMC_TARSetupTime)); + + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); + + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime)); + + /* Set the PCR4 register value according to FSMC_PCCARDInitStruct parameters */ + FSMC_Bank4->PCR4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_Waitfeature | + FSMC_MemoryDataWidth_16b | + (FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime << 9) | + (FSMC_PCCARDInitStruct->FSMC_TARSetupTime << 13); + + /* Set PMEM4 register value according to FSMC_CommonSpaceTimingStructure parameters */ + FSMC_Bank4->PMEM4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + /* Set PATT4 register value according to FSMC_AttributeSpaceTimingStructure parameters */ + FSMC_Bank4->PATT4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + /* Set PIO4 register value according to FSMC_IOSpaceTimingStructure parameters */ + FSMC_Bank4->PIO4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime << 24); +} + +/** + * @brief Fills each FSMC_NORSRAMInitStruct member with its default value. + * @param FSMC_NORSRAMInitStruct: pointer to a FSMC_NORSRAMInitTypeDef + * structure which will be initialized. + * @retval None + */ +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + /* Reset NOR/SRAM Init structure parameters values */ + FSMC_NORSRAMInitStruct->FSMC_Bank = FSMC_Bank1_NORSRAM1; + FSMC_NORSRAMInitStruct->FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; + FSMC_NORSRAMInitStruct->FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStruct->FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStruct->FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignal = FSMC_WaitSignal_Enable; + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime = 0xFF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime = 0xFF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; +} + +/** + * @brief Fills each FSMC_NANDInitStruct member with its default value. + * @param FSMC_NANDInitStruct: pointer to a FSMC_NANDInitTypeDef + * structure which will be initialized. + * @retval None + */ +void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) +{ + /* Reset NAND Init structure parameters values */ + FSMC_NANDInitStruct->FSMC_Bank = FSMC_Bank2_NAND; + FSMC_NANDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; + FSMC_NANDInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NANDInitStruct->FSMC_ECC = FSMC_ECC_Disable; + FSMC_NANDInitStruct->FSMC_ECCPageSize = FSMC_ECCPageSize_256Bytes; + FSMC_NANDInitStruct->FSMC_TCLRSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_TARSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; +} + +/** + * @brief Fills each FSMC_PCCARDInitStruct member with its default value. + * @param FSMC_PCCARDInitStruct: pointer to a FSMC_PCCARDInitTypeDef + * structure which will be initialized. + * @retval None + */ +void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) +{ + /* Reset PCCARD Init structure parameters values */ + FSMC_PCCARDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; + FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime = 0x0; + FSMC_PCCARDInitStruct->FSMC_TARSetupTime = 0x0; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; +} + +/** + * @brief Enables or disables the specified NOR/SRAM Memory Bank. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NOR/SRAM Bank by setting the PBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] |= BCR_MBKEN_Set; + } + else + { + /* Disable the selected NOR/SRAM Bank by clearing the PBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] &= BCR_MBKEN_Reset; + } +} + +/** + * @brief Enables or disables the specified NAND Memory Bank. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NAND Bank by setting the PBKEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_PBKEN_Set; + } + else + { + FSMC_Bank3->PCR3 |= PCR_PBKEN_Set; + } + } + else + { + /* Disable the selected NAND Bank by clearing the PBKEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_PBKEN_Reset; + } + else + { + FSMC_Bank3->PCR3 &= PCR_PBKEN_Reset; + } + } +} + +/** + * @brief Enables or disables the PCCARD Memory Bank. + * @param NewState: new state of the PCCARD Memory Bank. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_PCCARDCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the PCCARD Bank by setting the PBKEN bit in the PCR4 register */ + FSMC_Bank4->PCR4 |= PCR_PBKEN_Set; + } + else + { + /* Disable the PCCARD Bank by clearing the PBKEN bit in the PCR4 register */ + FSMC_Bank4->PCR4 &= PCR_PBKEN_Reset; + } +} + +/** + * @brief Enables or disables the FSMC NAND ECC feature. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @param NewState: new state of the FSMC NAND ECC feature. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NAND Bank ECC function by setting the ECCEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_ECCEN_Set; + } + else + { + FSMC_Bank3->PCR3 |= PCR_ECCEN_Set; + } + } + else + { + /* Disable the selected NAND Bank ECC function by clearing the ECCEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_ECCEN_Reset; + } + else + { + FSMC_Bank3->PCR3 &= PCR_ECCEN_Reset; + } + } +} + +/** + * @brief Returns the error correction code register value. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @retval The Error Correction Code (ECC) value. + */ +uint32_t FSMC_GetECC(uint32_t FSMC_Bank) +{ + uint32_t eccval = 0x00000000; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + /* Get the ECCR2 register value */ + eccval = FSMC_Bank2->ECCR2; + } + else + { + /* Get the ECCR3 register value */ + eccval = FSMC_Bank3->ECCR3; + } + /* Return the error correction code value */ + return(eccval); +} + +/** + * @brief Enables or disables the specified FSMC interrupts. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the FSMC interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @param NewState: new state of the specified FSMC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState) +{ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_IT(FSMC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected FSMC_Bank2 interrupts */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 |= FSMC_IT; + } + /* Enable the selected FSMC_Bank3 interrupts */ + else if (FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 |= FSMC_IT; + } + /* Enable the selected FSMC_Bank4 interrupts */ + else + { + FSMC_Bank4->SR4 |= FSMC_IT; + } + } + else + { + /* Disable the selected FSMC_Bank2 interrupts */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + + FSMC_Bank2->SR2 &= (uint32_t)~FSMC_IT; + } + /* Disable the selected FSMC_Bank3 interrupts */ + else if (FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= (uint32_t)~FSMC_IT; + } + /* Disable the selected FSMC_Bank4 interrupts */ + else + { + FSMC_Bank4->SR4 &= (uint32_t)~FSMC_IT; + } + } +} + +/** + * @brief Checks whether the specified FSMC flag is set or not. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg FSMC_FLAG_RisingEdge: Rising egde detection Flag. + * @arg FSMC_FLAG_Level: Level detection Flag. + * @arg FSMC_FLAG_FallingEdge: Falling egde detection Flag. + * @arg FSMC_FLAG_FEMPT: Fifo empty Flag. + * @retval The new state of FSMC_FLAG (SET or RESET). + */ +FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpsr = 0x00000000; + + /* Check the parameters */ + assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); + assert_param(IS_FSMC_GET_FLAG(FSMC_FLAG)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + tmpsr = FSMC_Bank2->SR2; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + tmpsr = FSMC_Bank3->SR3; + } + /* FSMC_Bank4_PCCARD*/ + else + { + tmpsr = FSMC_Bank4->SR4; + } + + /* Get the flag status */ + if ((tmpsr & FSMC_FLAG) != (uint16_t)RESET ) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the FSMC’s pending flags. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg FSMC_FLAG_RisingEdge: Rising egde detection Flag. + * @arg FSMC_FLAG_Level: Level detection Flag. + * @arg FSMC_FLAG_FallingEdge: Falling egde detection Flag. + * @retval None + */ +void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); + assert_param(IS_FSMC_CLEAR_FLAG(FSMC_FLAG)) ; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 &= ~FSMC_FLAG; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= ~FSMC_FLAG; + } + /* FSMC_Bank4_PCCARD*/ + else + { + FSMC_Bank4->SR4 &= ~FSMC_FLAG; + } +} + +/** + * @brief Checks whether the specified FSMC interrupt has occurred or not. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the FSMC interrupt source to check. + * This parameter can be one of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @retval The new state of FSMC_IT (SET or RESET). + */ +ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpsr = 0x0, itstatus = 0x0, itenable = 0x0; + + /* Check the parameters */ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_GET_IT(FSMC_IT)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + tmpsr = FSMC_Bank2->SR2; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + tmpsr = FSMC_Bank3->SR3; + } + /* FSMC_Bank4_PCCARD*/ + else + { + tmpsr = FSMC_Bank4->SR4; + } + + itstatus = tmpsr & FSMC_IT; + + itenable = tmpsr & (FSMC_IT >> 3); + if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the FSMC’s interrupt pending bits. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @retval None + */ +void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT) +{ + /* Check the parameters */ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_IT(FSMC_IT)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 &= ~(FSMC_IT >> 3); + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= ~(FSMC_IT >> 3); + } + /* FSMC_Bank4_PCCARD*/ + else + { + FSMC_Bank4->SR4 &= ~(FSMC_IT >> 3); + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.h new file mode 100644 index 0000000..9cf9847 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_fsmc.h @@ -0,0 +1,732 @@ +/** + ****************************************************************************** + * @file stm32f10x_fsmc.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the FSMC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_FSMC_H +#define __STM32F10x_FSMC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup FSMC + * @{ + */ + +/** @defgroup FSMC_Exported_Types + * @{ + */ + +/** + * @brief Timing parameters For NOR/SRAM Banks + */ + +typedef struct +{ + uint32_t FSMC_AddressSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address setup time. + This parameter can be a value between 0 and 0xF. + @note: It is not used with synchronous NOR Flash memories. */ + + uint32_t FSMC_AddressHoldTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address hold time. + This parameter can be a value between 0 and 0xF. + @note: It is not used with synchronous NOR Flash memories.*/ + + uint32_t FSMC_DataSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the data setup time. + This parameter can be a value between 0 and 0xFF. + @note: It is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */ + + uint32_t FSMC_BusTurnAroundDuration; /*!< Defines the number of HCLK cycles to configure + the duration of the bus turnaround. + This parameter can be a value between 0 and 0xF. + @note: It is only used for multiplexed NOR Flash memories. */ + + uint32_t FSMC_CLKDivision; /*!< Defines the period of CLK clock output signal, expressed in number of HCLK cycles. + This parameter can be a value between 1 and 0xF. + @note: This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */ + + uint32_t FSMC_DataLatency; /*!< Defines the number of memory clock cycles to issue + to the memory before getting the first data. + The value of this parameter depends on the memory type as shown below: + - It must be set to 0 in case of a CRAM + - It is don’t care in asynchronous NOR, SRAM or ROM accesses + - It may assume a value between 0 and 0xF in NOR Flash memories + with synchronous burst mode enable */ + + uint32_t FSMC_AccessMode; /*!< Specifies the asynchronous access mode. + This parameter can be a value of @ref FSMC_Access_Mode */ +}FSMC_NORSRAMTimingInitTypeDef; + +/** + * @brief FSMC NOR/SRAM Init structure definition + */ + +typedef struct +{ + uint32_t FSMC_Bank; /*!< Specifies the NOR/SRAM memory bank that will be used. + This parameter can be a value of @ref FSMC_NORSRAM_Bank */ + + uint32_t FSMC_DataAddressMux; /*!< Specifies whether the address and data values are + multiplexed on the databus or not. + This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */ + + uint32_t FSMC_MemoryType; /*!< Specifies the type of external memory attached to + the corresponding memory bank. + This parameter can be a value of @ref FSMC_Memory_Type */ + + uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. + This parameter can be a value of @ref FSMC_Data_Width */ + + uint32_t FSMC_BurstAccessMode; /*!< Enables or disables the burst access mode for Flash memory, + valid only with synchronous burst Flash memories. + This parameter can be a value of @ref FSMC_Burst_Access_Mode */ + + uint32_t FSMC_AsynchronousWait; /*!< Enables or disables wait signal during asynchronous transfers, + valid only with asynchronous Flash memories. + This parameter can be a value of @ref FSMC_AsynchronousWait */ + + uint32_t FSMC_WaitSignalPolarity; /*!< Specifies the wait signal polarity, valid only when accessing + the Flash memory in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */ + + uint32_t FSMC_WrapMode; /*!< Enables or disables the Wrapped burst access mode for Flash + memory, valid only when accessing Flash memories in burst mode. + This parameter can be a value of @ref FSMC_Wrap_Mode */ + + uint32_t FSMC_WaitSignalActive; /*!< Specifies if the wait signal is asserted by the memory one + clock cycle before the wait state or during the wait state, + valid only when accessing memories in burst mode. + This parameter can be a value of @ref FSMC_Wait_Timing */ + + uint32_t FSMC_WriteOperation; /*!< Enables or disables the write operation in the selected bank by the FSMC. + This parameter can be a value of @ref FSMC_Write_Operation */ + + uint32_t FSMC_WaitSignal; /*!< Enables or disables the wait-state insertion via wait + signal, valid for Flash memory access in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal */ + + uint32_t FSMC_ExtendedMode; /*!< Enables or disables the extended mode. + This parameter can be a value of @ref FSMC_Extended_Mode */ + + uint32_t FSMC_WriteBurst; /*!< Enables or disables the write burst operation. + This parameter can be a value of @ref FSMC_Write_Burst */ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /*!< Timing Parameters for write and read access if the ExtendedMode is not used*/ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct; /*!< Timing Parameters for write access if the ExtendedMode is used*/ +}FSMC_NORSRAMInitTypeDef; + +/** + * @brief Timing parameters For FSMC NAND and PCCARD Banks + */ + +typedef struct +{ + uint32_t FSMC_SetupTime; /*!< Defines the number of HCLK cycles to setup address before + the command assertion for NAND-Flash read or write access + to common/Attribute or I/O memory space (depending on + the memory space timing to be configured). + This parameter can be a value between 0 and 0xFF.*/ + + uint32_t FSMC_WaitSetupTime; /*!< Defines the minimum number of HCLK cycles to assert the + command for NAND-Flash read or write access to + common/Attribute or I/O memory space (depending on the + memory space timing to be configured). + This parameter can be a number between 0x00 and 0xFF */ + + uint32_t FSMC_HoldSetupTime; /*!< Defines the number of HCLK clock cycles to hold address + (and data for write access) after the command deassertion + for NAND-Flash read or write access to common/Attribute + or I/O memory space (depending on the memory space timing + to be configured). + This parameter can be a number between 0x00 and 0xFF */ + + uint32_t FSMC_HiZSetupTime; /*!< Defines the number of HCLK clock cycles during which the + databus is kept in HiZ after the start of a NAND-Flash + write access to common/Attribute or I/O memory space (depending + on the memory space timing to be configured). + This parameter can be a number between 0x00 and 0xFF */ +}FSMC_NAND_PCCARDTimingInitTypeDef; + +/** + * @brief FSMC NAND Init structure definition + */ + +typedef struct +{ + uint32_t FSMC_Bank; /*!< Specifies the NAND memory bank that will be used. + This parameter can be a value of @ref FSMC_NAND_Bank */ + + uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the NAND Memory Bank. + This parameter can be any value of @ref FSMC_Wait_feature */ + + uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. + This parameter can be any value of @ref FSMC_Data_Width */ + + uint32_t FSMC_ECC; /*!< Enables or disables the ECC computation. + This parameter can be any value of @ref FSMC_ECC */ + + uint32_t FSMC_ECCPageSize; /*!< Defines the page size for the extended ECC. + This parameter can be any value of @ref FSMC_ECC_Page_Size */ + + uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between CLE low and RE low. + This parameter can be a value between 0 and 0xFF. */ + + uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between ALE low and RE low. + This parameter can be a number between 0x0 and 0xFF */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ +}FSMC_NANDInitTypeDef; + +/** + * @brief FSMC PCCARD Init structure definition + */ + +typedef struct +{ + uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the Memory Bank. + This parameter can be any value of @ref FSMC_Wait_feature */ + + uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between CLE low and RE low. + This parameter can be a value between 0 and 0xFF. */ + + uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between ALE low and RE low. + This parameter can be a number between 0x0 and 0xFF */ + + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_IOSpaceTimingStruct; /*!< FSMC IO Space Timing */ +}FSMC_PCCARDInitTypeDef; + +/** + * @} + */ + +/** @defgroup FSMC_Exported_Constants + * @{ + */ + +/** @defgroup FSMC_NORSRAM_Bank + * @{ + */ +#define FSMC_Bank1_NORSRAM1 ((uint32_t)0x00000000) +#define FSMC_Bank1_NORSRAM2 ((uint32_t)0x00000002) +#define FSMC_Bank1_NORSRAM3 ((uint32_t)0x00000004) +#define FSMC_Bank1_NORSRAM4 ((uint32_t)0x00000006) +/** + * @} + */ + +/** @defgroup FSMC_NAND_Bank + * @{ + */ +#define FSMC_Bank2_NAND ((uint32_t)0x00000010) +#define FSMC_Bank3_NAND ((uint32_t)0x00000100) +/** + * @} + */ + +/** @defgroup FSMC_PCCARD_Bank + * @{ + */ +#define FSMC_Bank4_PCCARD ((uint32_t)0x00001000) +/** + * @} + */ + +#define IS_FSMC_NORSRAM_BANK(BANK) (((BANK) == FSMC_Bank1_NORSRAM1) || \ + ((BANK) == FSMC_Bank1_NORSRAM2) || \ + ((BANK) == FSMC_Bank1_NORSRAM3) || \ + ((BANK) == FSMC_Bank1_NORSRAM4)) + +#define IS_FSMC_NAND_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND)) + +#define IS_FSMC_GETFLAG_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND) || \ + ((BANK) == FSMC_Bank4_PCCARD)) + +#define IS_FSMC_IT_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND) || \ + ((BANK) == FSMC_Bank4_PCCARD)) + +/** @defgroup NOR_SRAM_Controller + * @{ + */ + +/** @defgroup FSMC_Data_Address_Bus_Multiplexing + * @{ + */ + +#define FSMC_DataAddressMux_Disable ((uint32_t)0x00000000) +#define FSMC_DataAddressMux_Enable ((uint32_t)0x00000002) +#define IS_FSMC_MUX(MUX) (((MUX) == FSMC_DataAddressMux_Disable) || \ + ((MUX) == FSMC_DataAddressMux_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Memory_Type + * @{ + */ + +#define FSMC_MemoryType_SRAM ((uint32_t)0x00000000) +#define FSMC_MemoryType_PSRAM ((uint32_t)0x00000004) +#define FSMC_MemoryType_NOR ((uint32_t)0x00000008) +#define IS_FSMC_MEMORY(MEMORY) (((MEMORY) == FSMC_MemoryType_SRAM) || \ + ((MEMORY) == FSMC_MemoryType_PSRAM)|| \ + ((MEMORY) == FSMC_MemoryType_NOR)) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Width + * @{ + */ + +#define FSMC_MemoryDataWidth_8b ((uint32_t)0x00000000) +#define FSMC_MemoryDataWidth_16b ((uint32_t)0x00000010) +#define IS_FSMC_MEMORY_WIDTH(WIDTH) (((WIDTH) == FSMC_MemoryDataWidth_8b) || \ + ((WIDTH) == FSMC_MemoryDataWidth_16b)) + +/** + * @} + */ + +/** @defgroup FSMC_Burst_Access_Mode + * @{ + */ + +#define FSMC_BurstAccessMode_Disable ((uint32_t)0x00000000) +#define FSMC_BurstAccessMode_Enable ((uint32_t)0x00000100) +#define IS_FSMC_BURSTMODE(STATE) (((STATE) == FSMC_BurstAccessMode_Disable) || \ + ((STATE) == FSMC_BurstAccessMode_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_AsynchronousWait + * @{ + */ +#define FSMC_AsynchronousWait_Disable ((uint32_t)0x00000000) +#define FSMC_AsynchronousWait_Enable ((uint32_t)0x00008000) +#define IS_FSMC_ASYNWAIT(STATE) (((STATE) == FSMC_AsynchronousWait_Disable) || \ + ((STATE) == FSMC_AsynchronousWait_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Signal_Polarity + * @{ + */ + +#define FSMC_WaitSignalPolarity_Low ((uint32_t)0x00000000) +#define FSMC_WaitSignalPolarity_High ((uint32_t)0x00000200) +#define IS_FSMC_WAIT_POLARITY(POLARITY) (((POLARITY) == FSMC_WaitSignalPolarity_Low) || \ + ((POLARITY) == FSMC_WaitSignalPolarity_High)) + +/** + * @} + */ + +/** @defgroup FSMC_Wrap_Mode + * @{ + */ + +#define FSMC_WrapMode_Disable ((uint32_t)0x00000000) +#define FSMC_WrapMode_Enable ((uint32_t)0x00000400) +#define IS_FSMC_WRAP_MODE(MODE) (((MODE) == FSMC_WrapMode_Disable) || \ + ((MODE) == FSMC_WrapMode_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Timing + * @{ + */ + +#define FSMC_WaitSignalActive_BeforeWaitState ((uint32_t)0x00000000) +#define FSMC_WaitSignalActive_DuringWaitState ((uint32_t)0x00000800) +#define IS_FSMC_WAIT_SIGNAL_ACTIVE(ACTIVE) (((ACTIVE) == FSMC_WaitSignalActive_BeforeWaitState) || \ + ((ACTIVE) == FSMC_WaitSignalActive_DuringWaitState)) + +/** + * @} + */ + +/** @defgroup FSMC_Write_Operation + * @{ + */ + +#define FSMC_WriteOperation_Disable ((uint32_t)0x00000000) +#define FSMC_WriteOperation_Enable ((uint32_t)0x00001000) +#define IS_FSMC_WRITE_OPERATION(OPERATION) (((OPERATION) == FSMC_WriteOperation_Disable) || \ + ((OPERATION) == FSMC_WriteOperation_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Signal + * @{ + */ + +#define FSMC_WaitSignal_Disable ((uint32_t)0x00000000) +#define FSMC_WaitSignal_Enable ((uint32_t)0x00002000) +#define IS_FSMC_WAITE_SIGNAL(SIGNAL) (((SIGNAL) == FSMC_WaitSignal_Disable) || \ + ((SIGNAL) == FSMC_WaitSignal_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Extended_Mode + * @{ + */ + +#define FSMC_ExtendedMode_Disable ((uint32_t)0x00000000) +#define FSMC_ExtendedMode_Enable ((uint32_t)0x00004000) + +#define IS_FSMC_EXTENDED_MODE(MODE) (((MODE) == FSMC_ExtendedMode_Disable) || \ + ((MODE) == FSMC_ExtendedMode_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Write_Burst + * @{ + */ + +#define FSMC_WriteBurst_Disable ((uint32_t)0x00000000) +#define FSMC_WriteBurst_Enable ((uint32_t)0x00080000) +#define IS_FSMC_WRITE_BURST(BURST) (((BURST) == FSMC_WriteBurst_Disable) || \ + ((BURST) == FSMC_WriteBurst_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Address_Setup_Time + * @{ + */ + +#define IS_FSMC_ADDRESS_SETUP_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Address_Hold_Time + * @{ + */ + +#define IS_FSMC_ADDRESS_HOLD_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Setup_Time + * @{ + */ + +#define IS_FSMC_DATASETUP_TIME(TIME) (((TIME) > 0) && ((TIME) <= 0xFF)) + +/** + * @} + */ + +/** @defgroup FSMC_Bus_Turn_around_Duration + * @{ + */ + +#define IS_FSMC_TURNAROUND_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_CLK_Division + * @{ + */ + +#define IS_FSMC_CLK_DIV(DIV) ((DIV) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Latency + * @{ + */ + +#define IS_FSMC_DATA_LATENCY(LATENCY) ((LATENCY) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Access_Mode + * @{ + */ + +#define FSMC_AccessMode_A ((uint32_t)0x00000000) +#define FSMC_AccessMode_B ((uint32_t)0x10000000) +#define FSMC_AccessMode_C ((uint32_t)0x20000000) +#define FSMC_AccessMode_D ((uint32_t)0x30000000) +#define IS_FSMC_ACCESS_MODE(MODE) (((MODE) == FSMC_AccessMode_A) || \ + ((MODE) == FSMC_AccessMode_B) || \ + ((MODE) == FSMC_AccessMode_C) || \ + ((MODE) == FSMC_AccessMode_D)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup NAND_PCCARD_Controller + * @{ + */ + +/** @defgroup FSMC_Wait_feature + * @{ + */ + +#define FSMC_Waitfeature_Disable ((uint32_t)0x00000000) +#define FSMC_Waitfeature_Enable ((uint32_t)0x00000002) +#define IS_FSMC_WAIT_FEATURE(FEATURE) (((FEATURE) == FSMC_Waitfeature_Disable) || \ + ((FEATURE) == FSMC_Waitfeature_Enable)) + +/** + * @} + */ + + +/** @defgroup FSMC_ECC + * @{ + */ + +#define FSMC_ECC_Disable ((uint32_t)0x00000000) +#define FSMC_ECC_Enable ((uint32_t)0x00000040) +#define IS_FSMC_ECC_STATE(STATE) (((STATE) == FSMC_ECC_Disable) || \ + ((STATE) == FSMC_ECC_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_ECC_Page_Size + * @{ + */ + +#define FSMC_ECCPageSize_256Bytes ((uint32_t)0x00000000) +#define FSMC_ECCPageSize_512Bytes ((uint32_t)0x00020000) +#define FSMC_ECCPageSize_1024Bytes ((uint32_t)0x00040000) +#define FSMC_ECCPageSize_2048Bytes ((uint32_t)0x00060000) +#define FSMC_ECCPageSize_4096Bytes ((uint32_t)0x00080000) +#define FSMC_ECCPageSize_8192Bytes ((uint32_t)0x000A0000) +#define IS_FSMC_ECCPAGE_SIZE(SIZE) (((SIZE) == FSMC_ECCPageSize_256Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_512Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_1024Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_2048Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_4096Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_8192Bytes)) + +/** + * @} + */ + +/** @defgroup FSMC_TCLR_Setup_Time + * @{ + */ + +#define IS_FSMC_TCLR_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_TAR_Setup_Time + * @{ + */ + +#define IS_FSMC_TAR_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Setup_Time + * @{ + */ + +#define IS_FSMC_SETUP_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Setup_Time + * @{ + */ + +#define IS_FSMC_WAIT_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Hold_Setup_Time + * @{ + */ + +#define IS_FSMC_HOLD_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_HiZ_Setup_Time + * @{ + */ + +#define IS_FSMC_HIZ_TIME(TIME) ((TIME) <= 0xFF) + +/** + * @} + */ + +/** @defgroup FSMC_Interrupt_sources + * @{ + */ + +#define FSMC_IT_RisingEdge ((uint32_t)0x00000008) +#define FSMC_IT_Level ((uint32_t)0x00000010) +#define FSMC_IT_FallingEdge ((uint32_t)0x00000020) +#define IS_FSMC_IT(IT) ((((IT) & (uint32_t)0xFFFFFFC7) == 0x00000000) && ((IT) != 0x00000000)) +#define IS_FSMC_GET_IT(IT) (((IT) == FSMC_IT_RisingEdge) || \ + ((IT) == FSMC_IT_Level) || \ + ((IT) == FSMC_IT_FallingEdge)) +/** + * @} + */ + +/** @defgroup FSMC_Flags + * @{ + */ + +#define FSMC_FLAG_RisingEdge ((uint32_t)0x00000001) +#define FSMC_FLAG_Level ((uint32_t)0x00000002) +#define FSMC_FLAG_FallingEdge ((uint32_t)0x00000004) +#define FSMC_FLAG_FEMPT ((uint32_t)0x00000040) +#define IS_FSMC_GET_FLAG(FLAG) (((FLAG) == FSMC_FLAG_RisingEdge) || \ + ((FLAG) == FSMC_FLAG_Level) || \ + ((FLAG) == FSMC_FLAG_FallingEdge) || \ + ((FLAG) == FSMC_FLAG_FEMPT)) + +#define IS_FSMC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFF8) == 0x00000000) && ((FLAG) != 0x00000000)) + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup FSMC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup FSMC_Exported_Functions + * @{ + */ + +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank); +void FSMC_NANDDeInit(uint32_t FSMC_Bank); +void FSMC_PCCARDDeInit(void); +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); +void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); +void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState); +void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState); +void FSMC_PCCARDCmd(FunctionalState NewState); +void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState); +uint32_t FSMC_GetECC(uint32_t FSMC_Bank); +void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState); +FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); +void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); +ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT); +void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_FSMC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.c new file mode 100644 index 0000000..4ec0509 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.c @@ -0,0 +1,647 @@ +/** + ****************************************************************************** + * @file stm32f10x_gpio.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the GPIO firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_gpio.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup GPIO + * @brief GPIO driver modules + * @{ + */ + +/** @defgroup GPIO_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Defines + * @{ + */ + +/* ------------ RCC registers bit address in the alias region ----------------*/ +#define AFIO_OFFSET (AFIO_BASE - PERIPH_BASE) + +/* --- EVENTCR Register -----*/ + +/* Alias word address of EVOE bit */ +#define EVCR_OFFSET (AFIO_OFFSET + 0x00) +#define EVOE_BitNumber ((uint8_t)0x07) +#define EVCR_EVOE_BB (PERIPH_BB_BASE + (EVCR_OFFSET * 32) + (EVOE_BitNumber * 4)) + + +/* --- MAPR Register ---*/ +/* Alias word address of MII_RMII_SEL bit */ +#define MAPR_OFFSET (AFIO_OFFSET + 0x04) +#define MII_RMII_SEL_BitNumber ((u8)0x17) +#define MAPR_MII_RMII_SEL_BB (PERIPH_BB_BASE + (MAPR_OFFSET * 32) + (MII_RMII_SEL_BitNumber * 4)) + + +#define EVCR_PORTPINCONFIG_MASK ((uint16_t)0xFF80) +#define LSB_MASK ((uint16_t)0xFFFF) +#define DBGAFR_POSITION_MASK ((uint32_t)0x000F0000) +#define DBGAFR_SWJCFG_MASK ((uint32_t)0xF0FFFFFF) +#define DBGAFR_LOCATION_MASK ((uint32_t)0x00200000) +#define DBGAFR_NUMBITS_MASK ((uint32_t)0x00100000) +/** + * @} + */ + +/** @defgroup GPIO_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the GPIOx peripheral registers to their default reset values. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @retval None + */ +void GPIO_DeInit(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + if (GPIOx == GPIOA) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE); + } + else if (GPIOx == GPIOB) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE); + } + else if (GPIOx == GPIOC) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE); + } + else if (GPIOx == GPIOD) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE); + } + else if (GPIOx == GPIOE) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE); + } + else if (GPIOx == GPIOF) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, DISABLE); + } + else + { + if (GPIOx == GPIOG) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, DISABLE); + } + } +} + +/** + * @brief Deinitializes the Alternate Functions (remap, event control + * and EXTI configuration) registers to their default reset values. + * @param None + * @retval None + */ +void GPIO_AFIODeInit(void) +{ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE); +} + +/** + * @brief Initializes the GPIOx peripheral according to the specified + * parameters in the GPIO_InitStruct. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @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 currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00; + uint32_t tmpreg = 0x00, pinmask = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode)); + assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)); + +/*---------------------------- GPIO Mode Configuration -----------------------*/ + currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F); + if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00) + { + /* Check the parameters */ + assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); + /* Output mode */ + currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed; + } +/*---------------------------- GPIO CRL Configuration ------------------------*/ + /* Configure the eight low port pins */ + if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00) + { + tmpreg = GPIOx->CRL; + for (pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = ((uint32_t)0x01) << pinpos; + /* Get the port pins position */ + currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; + if (currentpin == pos) + { + pos = pinpos << 2; + /* Clear the corresponding low control register bits */ + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + /* Write the mode configuration in the corresponding bits */ + tmpreg |= (currentmode << pos); + /* Reset the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BRR = (((uint32_t)0x01) << pinpos); + } + else + { + /* Set the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSRR = (((uint32_t)0x01) << pinpos); + } + } + } + } + GPIOx->CRL = tmpreg; + } +/*---------------------------- GPIO CRH Configuration ------------------------*/ + /* Configure the eight high port pins */ + if (GPIO_InitStruct->GPIO_Pin > 0x00FF) + { + tmpreg = GPIOx->CRH; + for (pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = (((uint32_t)0x01) << (pinpos + 0x08)); + /* Get the port pins position */ + currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos); + if (currentpin == pos) + { + pos = pinpos << 2; + /* Clear the corresponding high control register bits */ + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + /* Write the mode configuration in the corresponding bits */ + tmpreg |= (currentmode << pos); + /* Reset the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + /* Set the corresponding ODR bit */ + if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + } + } + GPIOx->CRH = tmpreg; + } +} + +/** + * @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_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING; +} + +/** + * @brief Reads the specified input port pin. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * @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 GPIO input data port. + * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. + * @retval GPIO input data port 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..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * @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..G) to select the GPIO peripheral. + * @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..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @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..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @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..G) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to be written. + * This parameter can be one of GPIO_Pin_x where x can be (0..15). + * @param BitVal: specifies the value to be written to the selected bit. + * This parameter can be one of the BitAction enum values: + * @arg Bit_RESET: to clear the port pin + * @arg Bit_SET: to set the port pin + * @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..G) to select the GPIO peripheral. + * @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; +} + +/** + * @brief Locks GPIO Pins configuration registers. + * @param GPIOx: where x can be (A..G) 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) +{ + uint32_t tmp = 0x00010000; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_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; +} + +/** + * @brief Selects the GPIO pin used as Event output. + * @param GPIO_PortSource: selects the GPIO port to be used as source + * for Event output. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..E). + * @param GPIO_PinSource: specifies the pin for the Event output. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * @retval None + */ +void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmpreg = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_EVENTOUT_PORT_SOURCE(GPIO_PortSource)); + assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); + + tmpreg = AFIO->EVCR; + /* Clear the PORT[6:4] and PIN[3:0] bits */ + tmpreg &= EVCR_PORTPINCONFIG_MASK; + tmpreg |= (uint32_t)GPIO_PortSource << 0x04; + tmpreg |= GPIO_PinSource; + AFIO->EVCR = tmpreg; +} + +/** + * @brief Enables or disables the Event Output. + * @param NewState: new state of the Event output. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void GPIO_EventOutputCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) EVCR_EVOE_BB = (uint32_t)NewState; +} + +/** + * @brief Changes the mapping of the specified pin. + * @param GPIO_Remap: selects the pin to remap. + * This parameter can be one of the following values: + * @arg GPIO_Remap_SPI1 : SPI1 Alternate Function mapping + * @arg GPIO_Remap_I2C1 : I2C1 Alternate Function mapping + * @arg GPIO_Remap_USART1 : USART1 Alternate Function mapping + * @arg GPIO_Remap_USART2 : USART2 Alternate Function mapping + * @arg GPIO_PartialRemap_USART3 : USART3 Partial Alternate Function mapping + * @arg GPIO_FullRemap_USART3 : USART3 Full Alternate Function mapping + * @arg GPIO_PartialRemap_TIM1 : TIM1 Partial Alternate Function mapping + * @arg GPIO_FullRemap_TIM1 : TIM1 Full Alternate Function mapping + * @arg GPIO_PartialRemap1_TIM2 : TIM2 Partial1 Alternate Function mapping + * @arg GPIO_PartialRemap2_TIM2 : TIM2 Partial2 Alternate Function mapping + * @arg GPIO_FullRemap_TIM2 : TIM2 Full Alternate Function mapping + * @arg GPIO_PartialRemap_TIM3 : TIM3 Partial Alternate Function mapping + * @arg GPIO_FullRemap_TIM3 : TIM3 Full Alternate Function mapping + * @arg GPIO_Remap_TIM4 : TIM4 Alternate Function mapping + * @arg GPIO_Remap1_CAN1 : CAN1 Alternate Function mapping + * @arg GPIO_Remap2_CAN1 : CAN1 Alternate Function mapping + * @arg GPIO_Remap_PD01 : PD01 Alternate Function mapping + * @arg GPIO_Remap_TIM5CH4_LSI : LSI connected to TIM5 Channel4 input capture for calibration + * @arg GPIO_Remap_ADC1_ETRGINJ : ADC1 External Trigger Injected Conversion remapping + * @arg GPIO_Remap_ADC1_ETRGREG : ADC1 External Trigger Regular Conversion remapping + * @arg GPIO_Remap_ADC2_ETRGINJ : ADC2 External Trigger Injected Conversion remapping + * @arg GPIO_Remap_ADC2_ETRGREG : ADC2 External Trigger Regular Conversion remapping + * @arg GPIO_Remap_ETH : Ethernet remapping (only for Connectivity line devices) + * @arg GPIO_Remap_CAN2 : CAN2 remapping (only for Connectivity line devices) + * @arg GPIO_Remap_SWJ_NoJTRST : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST + * @arg GPIO_Remap_SWJ_JTAGDisable : JTAG-DP Disabled and SW-DP Enabled + * @arg GPIO_Remap_SWJ_Disable : Full SWJ Disabled (JTAG-DP + SW-DP) + * @arg GPIO_Remap_SPI3 : SPI3/I2S3 Alternate Function mapping (only for Connectivity line devices) + * @arg GPIO_Remap_TIM2ITR1_PTP_SOF : Ethernet PTP output or USB OTG SOF (Start of Frame) connected + * to TIM2 Internal Trigger 1 for calibration (only for Connectivity line devices) + * If the GPIO_Remap_TIM2ITR1_PTP_SOF is enabled the TIM2 ITR1 is connected to + * Ethernet PTP output. When Reset TIM2 ITR1 is connected to USB OTG SOF output. + * @arg GPIO_Remap_PTP_PPS : Ethernet MAC PPS_PTS output on PB05 (only for Connectivity line devices) + * @arg GPIO_Remap_TIM15 : TIM15 Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_TIM16 : TIM16 Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_TIM17 : TIM17 Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_CEC : CEC Alternate Function mapping (only for Value line devices) + * @arg GPIO_Remap_TIM1_DMA : TIM1 DMA requests mapping (only for Value line devices) + * @arg GPIO_Remap_TIM9 : TIM9 Alternate Function mapping (only for XL-density devices) + * @arg GPIO_Remap_TIM10 : TIM10 Alternate Function mapping (only for XL-density devices) + * @arg GPIO_Remap_TIM11 : TIM11 Alternate Function mapping (only for XL-density devices) + * @arg GPIO_Remap_TIM13 : TIM13 Alternate Function mapping (only for High density Value line and XL-density devices) + * @arg GPIO_Remap_TIM14 : TIM14 Alternate Function mapping (only for High density Value line and XL-density devices) + * @arg GPIO_Remap_FSMC_NADV : FSMC_NADV Alternate Function mapping (only for High density Value line and XL-density devices) + * @arg GPIO_Remap_TIM67_DAC_DMA : TIM6/TIM7 and DAC DMA requests remapping (only for High density Value line devices) + * @arg GPIO_Remap_TIM12 : TIM12 Alternate Function mapping (only for High density Value line devices) + * @arg GPIO_Remap_MISC : Miscellaneous Remap (DMA2 Channel5 Position and DAC Trigger remapping, + * only for High density Value line devices) + * @param NewState: new state of the port pin remapping. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) +{ + uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00; + + /* Check the parameters */ + assert_param(IS_GPIO_REMAP(GPIO_Remap)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if((GPIO_Remap & 0x80000000) == 0x80000000) + { + tmpreg = AFIO->MAPR2; + } + else + { + tmpreg = AFIO->MAPR; + } + + tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10; + tmp = GPIO_Remap & LSB_MASK; + + if ((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) + { + tmpreg &= DBGAFR_SWJCFG_MASK; + AFIO->MAPR &= DBGAFR_SWJCFG_MASK; + } + else if ((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK) + { + tmp1 = ((uint32_t)0x03) << tmpmask; + tmpreg &= ~tmp1; + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + else + { + tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15)*0x10)); + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + + if (NewState != DISABLE) + { + tmpreg |= (tmp << ((GPIO_Remap >> 0x15)*0x10)); + } + + if((GPIO_Remap & 0x80000000) == 0x80000000) + { + AFIO->MAPR2 = tmpreg; + } + else + { + AFIO->MAPR = tmpreg; + } +} + +/** + * @brief Selects the GPIO pin used as EXTI Line. + * @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G). + * @param GPIO_PinSource: specifies the EXTI line to be configured. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * @retval None + */ +void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmp = 0x00; + /* Check the parameters */ + assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource)); + assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); + + tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)); + AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp; + AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03))); +} + +/** + * @brief Selects the Ethernet media interface. + * @note This function applies only to STM32 Connectivity line devices. + * @param GPIO_ETH_MediaInterface: specifies the Media Interface mode. + * This parameter can be one of the following values: + * @arg GPIO_ETH_MediaInterface_MII: MII mode + * @arg GPIO_ETH_MediaInterface_RMII: RMII mode + * @retval None + */ +void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface) +{ + assert_param(IS_GPIO_ETH_MEDIA_INTERFACE(GPIO_ETH_MediaInterface)); + + /* Configure MII_RMII selection bit */ + *(__IO uint32_t *) MAPR_MII_RMII_SEL_BB = GPIO_ETH_MediaInterface; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h new file mode 100644 index 0000000..1d99df0 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_gpio.h @@ -0,0 +1,384 @@ +/** + ****************************************************************************** + * @file stm32f10x_gpio.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the GPIO + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_GPIO_H +#define __STM32F10x_GPIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup GPIO + * @{ + */ + +/** @defgroup GPIO_Exported_Types + * @{ + */ + +#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \ + ((PERIPH) == GPIOB) || \ + ((PERIPH) == GPIOC) || \ + ((PERIPH) == GPIOD) || \ + ((PERIPH) == GPIOE) || \ + ((PERIPH) == GPIOF) || \ + ((PERIPH) == GPIOG)) + +/** + * @brief Output Maximum frequency selection + */ + +typedef enum +{ + GPIO_Speed_10MHz = 1, + GPIO_Speed_2MHz, + GPIO_Speed_50MHz +}GPIOSpeed_TypeDef; +#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) || \ + ((SPEED) == GPIO_Speed_50MHz)) + +/** + * @brief Configuration Mode enumeration + */ + +typedef enum +{ GPIO_Mode_AIN = 0x0, + GPIO_Mode_IN_FLOATING = 0x04, + GPIO_Mode_IPD = 0x28, + GPIO_Mode_IPU = 0x48, + GPIO_Mode_Out_OD = 0x14, + GPIO_Mode_Out_PP = 0x10, + GPIO_Mode_AF_OD = 0x1C, + GPIO_Mode_AF_PP = 0x18 +}GPIOMode_TypeDef; + +#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || \ + ((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) || \ + ((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) || \ + ((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP)) + +/** + * @brief GPIO Init structure definition + */ + +typedef struct +{ + uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_pins_define */ + + GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIOSpeed_TypeDef */ + + GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIOMode_TypeDef */ +}GPIO_InitTypeDef; + + +/** + * @brief 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)) + +/** + * @} + */ + +/** @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) == 0x00) && ((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_Remap_define + * @{ + */ + +#define GPIO_Remap_SPI1 ((uint32_t)0x00000001) /*!< SPI1 Alternate Function mapping */ +#define GPIO_Remap_I2C1 ((uint32_t)0x00000002) /*!< I2C1 Alternate Function mapping */ +#define GPIO_Remap_USART1 ((uint32_t)0x00000004) /*!< USART1 Alternate Function mapping */ +#define GPIO_Remap_USART2 ((uint32_t)0x00000008) /*!< USART2 Alternate Function mapping */ +#define GPIO_PartialRemap_USART3 ((uint32_t)0x00140010) /*!< USART3 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART3 ((uint32_t)0x00140030) /*!< USART3 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM1 ((uint32_t)0x00160040) /*!< TIM1 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM1 ((uint32_t)0x001600C0) /*!< TIM1 Full Alternate Function mapping */ +#define GPIO_PartialRemap1_TIM2 ((uint32_t)0x00180100) /*!< TIM2 Partial1 Alternate Function mapping */ +#define GPIO_PartialRemap2_TIM2 ((uint32_t)0x00180200) /*!< TIM2 Partial2 Alternate Function mapping */ +#define GPIO_FullRemap_TIM2 ((uint32_t)0x00180300) /*!< TIM2 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM3 ((uint32_t)0x001A0800) /*!< TIM3 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM3 ((uint32_t)0x001A0C00) /*!< TIM3 Full Alternate Function mapping */ +#define GPIO_Remap_TIM4 ((uint32_t)0x00001000) /*!< TIM4 Alternate Function mapping */ +#define GPIO_Remap1_CAN1 ((uint32_t)0x001D4000) /*!< CAN1 Alternate Function mapping */ +#define GPIO_Remap2_CAN1 ((uint32_t)0x001D6000) /*!< CAN1 Alternate Function mapping */ +#define GPIO_Remap_PD01 ((uint32_t)0x00008000) /*!< PD01 Alternate Function mapping */ +#define GPIO_Remap_TIM5CH4_LSI ((uint32_t)0x00200001) /*!< LSI connected to TIM5 Channel4 input capture for calibration */ +#define GPIO_Remap_ADC1_ETRGINJ ((uint32_t)0x00200002) /*!< ADC1 External Trigger Injected Conversion remapping */ +#define GPIO_Remap_ADC1_ETRGREG ((uint32_t)0x00200004) /*!< ADC1 External Trigger Regular Conversion remapping */ +#define GPIO_Remap_ADC2_ETRGINJ ((uint32_t)0x00200008) /*!< ADC2 External Trigger Injected Conversion remapping */ +#define GPIO_Remap_ADC2_ETRGREG ((uint32_t)0x00200010) /*!< ADC2 External Trigger Regular Conversion remapping */ +#define GPIO_Remap_ETH ((uint32_t)0x00200020) /*!< Ethernet remapping (only for Connectivity line devices) */ +#define GPIO_Remap_CAN2 ((uint32_t)0x00200040) /*!< CAN2 remapping (only for Connectivity line devices) */ +#define GPIO_Remap_SWJ_NoJTRST ((uint32_t)0x00300100) /*!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */ +#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200) /*!< JTAG-DP Disabled and SW-DP Enabled */ +#define GPIO_Remap_SWJ_Disable ((uint32_t)0x00300400) /*!< Full SWJ Disabled (JTAG-DP + SW-DP) */ +#define GPIO_Remap_SPI3 ((uint32_t)0x00201000) /*!< SPI3/I2S3 Alternate Function mapping (only for Connectivity line devices) */ +#define GPIO_Remap_TIM2ITR1_PTP_SOF ((uint32_t)0x00202000) /*!< Ethernet PTP output or USB OTG SOF (Start of Frame) connected + to TIM2 Internal Trigger 1 for calibration + (only for Connectivity line devices) */ +#define GPIO_Remap_PTP_PPS ((uint32_t)0x00204000) /*!< Ethernet MAC PPS_PTS output on PB05 (only for Connectivity line devices) */ + +#define GPIO_Remap_TIM15 ((uint32_t)0x80000001) /*!< TIM15 Alternate Function mapping (only for Value line devices) */ +#define GPIO_Remap_TIM16 ((uint32_t)0x80000002) /*!< TIM16 Alternate Function mapping (only for Value line devices) */ +#define GPIO_Remap_TIM17 ((uint32_t)0x80000004) /*!< TIM17 Alternate Function mapping (only for Value line devices) */ +#define GPIO_Remap_CEC ((uint32_t)0x80000008) /*!< CEC Alternate Function mapping (only for Value line devices) */ +#define GPIO_Remap_TIM1_DMA ((uint32_t)0x80000010) /*!< TIM1 DMA requests mapping (only for Value line devices) */ + +#define GPIO_Remap_TIM9 ((uint32_t)0x80000020) /*!< TIM9 Alternate Function mapping (only for XL-density devices) */ +#define GPIO_Remap_TIM10 ((uint32_t)0x80000040) /*!< TIM10 Alternate Function mapping (only for XL-density devices) */ +#define GPIO_Remap_TIM11 ((uint32_t)0x80000080) /*!< TIM11 Alternate Function mapping (only for XL-density devices) */ +#define GPIO_Remap_TIM13 ((uint32_t)0x80000100) /*!< TIM13 Alternate Function mapping (only for High density Value line and XL-density devices) */ +#define GPIO_Remap_TIM14 ((uint32_t)0x80000200) /*!< TIM14 Alternate Function mapping (only for High density Value line and XL-density devices) */ +#define GPIO_Remap_FSMC_NADV ((uint32_t)0x80000400) /*!< FSMC_NADV Alternate Function mapping (only for High density Value line and XL-density devices) */ + +#define GPIO_Remap_TIM67_DAC_DMA ((uint32_t)0x80000800) /*!< TIM6/TIM7 and DAC DMA requests remapping (only for High density Value line devices) */ +#define GPIO_Remap_TIM12 ((uint32_t)0x80001000) /*!< TIM12 Alternate Function mapping (only for High density Value line devices) */ +#define GPIO_Remap_MISC ((uint32_t)0x80002000) /*!< Miscellaneous Remap (DMA2 Channel5 Position and DAC Trigger remapping, + only for High density Value line devices) */ + +#define IS_GPIO_REMAP(REMAP) (((REMAP) == GPIO_Remap_SPI1) || ((REMAP) == GPIO_Remap_I2C1) || \ + ((REMAP) == GPIO_Remap_USART1) || ((REMAP) == GPIO_Remap_USART2) || \ + ((REMAP) == GPIO_PartialRemap_USART3) || ((REMAP) == GPIO_FullRemap_USART3) || \ + ((REMAP) == GPIO_PartialRemap_TIM1) || ((REMAP) == GPIO_FullRemap_TIM1) || \ + ((REMAP) == GPIO_PartialRemap1_TIM2) || ((REMAP) == GPIO_PartialRemap2_TIM2) || \ + ((REMAP) == GPIO_FullRemap_TIM2) || ((REMAP) == GPIO_PartialRemap_TIM3) || \ + ((REMAP) == GPIO_FullRemap_TIM3) || ((REMAP) == GPIO_Remap_TIM4) || \ + ((REMAP) == GPIO_Remap1_CAN1) || ((REMAP) == GPIO_Remap2_CAN1) || \ + ((REMAP) == GPIO_Remap_PD01) || ((REMAP) == GPIO_Remap_TIM5CH4_LSI) || \ + ((REMAP) == GPIO_Remap_ADC1_ETRGINJ) ||((REMAP) == GPIO_Remap_ADC1_ETRGREG) || \ + ((REMAP) == GPIO_Remap_ADC2_ETRGINJ) ||((REMAP) == GPIO_Remap_ADC2_ETRGREG) || \ + ((REMAP) == GPIO_Remap_ETH) ||((REMAP) == GPIO_Remap_CAN2) || \ + ((REMAP) == GPIO_Remap_SWJ_NoJTRST) || ((REMAP) == GPIO_Remap_SWJ_JTAGDisable) || \ + ((REMAP) == GPIO_Remap_SWJ_Disable)|| ((REMAP) == GPIO_Remap_SPI3) || \ + ((REMAP) == GPIO_Remap_TIM2ITR1_PTP_SOF) || ((REMAP) == GPIO_Remap_PTP_PPS) || \ + ((REMAP) == GPIO_Remap_TIM15) || ((REMAP) == GPIO_Remap_TIM16) || \ + ((REMAP) == GPIO_Remap_TIM17) || ((REMAP) == GPIO_Remap_CEC) || \ + ((REMAP) == GPIO_Remap_TIM1_DMA) || ((REMAP) == GPIO_Remap_TIM9) || \ + ((REMAP) == GPIO_Remap_TIM10) || ((REMAP) == GPIO_Remap_TIM11) || \ + ((REMAP) == GPIO_Remap_TIM13) || ((REMAP) == GPIO_Remap_TIM14) || \ + ((REMAP) == GPIO_Remap_FSMC_NADV) || ((REMAP) == GPIO_Remap_TIM67_DAC_DMA) || \ + ((REMAP) == GPIO_Remap_TIM12) || ((REMAP) == GPIO_Remap_MISC)) + +/** + * @} + */ + +/** @defgroup GPIO_Port_Sources + * @{ + */ + +#define GPIO_PortSourceGPIOA ((uint8_t)0x00) +#define GPIO_PortSourceGPIOB ((uint8_t)0x01) +#define GPIO_PortSourceGPIOC ((uint8_t)0x02) +#define GPIO_PortSourceGPIOD ((uint8_t)0x03) +#define GPIO_PortSourceGPIOE ((uint8_t)0x04) +#define GPIO_PortSourceGPIOF ((uint8_t)0x05) +#define GPIO_PortSourceGPIOG ((uint8_t)0x06) +#define IS_GPIO_EVENTOUT_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == GPIO_PortSourceGPIOA) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOB) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOC) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOD) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOE)) + +#define IS_GPIO_EXTI_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == GPIO_PortSourceGPIOA) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOB) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOC) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOD) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOE) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOF) || \ + ((PORTSOURCE) == GPIO_PortSourceGPIOG)) + +/** + * @} + */ + +/** @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 Ethernet_Media_Interface + * @{ + */ +#define GPIO_ETH_MediaInterface_MII ((u32)0x00000000) +#define GPIO_ETH_MediaInterface_RMII ((u32)0x00000001) + +#define IS_GPIO_ETH_MEDIA_INTERFACE(INTERFACE) (((INTERFACE) == GPIO_ETH_MediaInterface_MII) || \ + ((INTERFACE) == GPIO_ETH_MediaInterface_RMII)) + +/** + * @} + */ +/** + * @} + */ + +/** @defgroup GPIO_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup GPIO_Exported_Functions + * @{ + */ + +void GPIO_DeInit(GPIO_TypeDef* GPIOx); +void GPIO_AFIODeInit(void); +void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); +void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); +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); +void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); +void GPIO_EventOutputCmd(FunctionalState NewState); +void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState); +void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); +void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_GPIO_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.c new file mode 100644 index 0000000..5a2521c --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.c @@ -0,0 +1,1285 @@ +/** + ****************************************************************************** + * @file stm32f10x_i2c.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the I2C firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_i2c.h" +#include "stm32f10x_rcc.h" + + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup I2C + * @brief I2C driver modules + * @{ + */ + +/** @defgroup I2C_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_Defines + * @{ + */ + +/* I2C SPE mask */ +#define CR1_PE_Set ((uint16_t)0x0001) +#define CR1_PE_Reset ((uint16_t)0xFFFE) + +/* I2C START mask */ +#define CR1_START_Set ((uint16_t)0x0100) +#define CR1_START_Reset ((uint16_t)0xFEFF) + +/* I2C STOP mask */ +#define CR1_STOP_Set ((uint16_t)0x0200) +#define CR1_STOP_Reset ((uint16_t)0xFDFF) + +/* I2C ACK mask */ +#define CR1_ACK_Set ((uint16_t)0x0400) +#define CR1_ACK_Reset ((uint16_t)0xFBFF) + +/* I2C ENGC mask */ +#define CR1_ENGC_Set ((uint16_t)0x0040) +#define CR1_ENGC_Reset ((uint16_t)0xFFBF) + +/* I2C SWRST mask */ +#define CR1_SWRST_Set ((uint16_t)0x8000) +#define CR1_SWRST_Reset ((uint16_t)0x7FFF) + +/* I2C PEC mask */ +#define CR1_PEC_Set ((uint16_t)0x1000) +#define CR1_PEC_Reset ((uint16_t)0xEFFF) + +/* I2C ENPEC mask */ +#define CR1_ENPEC_Set ((uint16_t)0x0020) +#define CR1_ENPEC_Reset ((uint16_t)0xFFDF) + +/* I2C ENARP mask */ +#define CR1_ENARP_Set ((uint16_t)0x0010) +#define CR1_ENARP_Reset ((uint16_t)0xFFEF) + +/* I2C NOSTRETCH mask */ +#define CR1_NOSTRETCH_Set ((uint16_t)0x0080) +#define CR1_NOSTRETCH_Reset ((uint16_t)0xFF7F) + +/* I2C registers Masks */ +#define CR1_CLEAR_Mask ((uint16_t)0xFBF5) + +/* I2C DMAEN mask */ +#define CR2_DMAEN_Set ((uint16_t)0x0800) +#define CR2_DMAEN_Reset ((uint16_t)0xF7FF) + +/* I2C LAST mask */ +#define CR2_LAST_Set ((uint16_t)0x1000) +#define CR2_LAST_Reset ((uint16_t)0xEFFF) + +/* I2C FREQ mask */ +#define CR2_FREQ_Reset ((uint16_t)0xFFC0) + +/* I2C ADD0 mask */ +#define OAR1_ADD0_Set ((uint16_t)0x0001) +#define OAR1_ADD0_Reset ((uint16_t)0xFFFE) + +/* I2C ENDUAL mask */ +#define OAR2_ENDUAL_Set ((uint16_t)0x0001) +#define OAR2_ENDUAL_Reset ((uint16_t)0xFFFE) + +/* I2C ADD2 mask */ +#define OAR2_ADD2_Reset ((uint16_t)0xFF01) + +/* I2C F/S mask */ +#define CCR_FS_Set ((uint16_t)0x8000) + +/* I2C CCR mask */ +#define CCR_CCR_Set ((uint16_t)0x0FFF) + +/* I2C FLAG mask */ +#define FLAG_Mask ((uint32_t)0x00FFFFFF) + +/* I2C Interrupt Enable mask */ +#define ITEN_Mask ((uint32_t)0x07000000) + +/** + * @} + */ + +/** @defgroup I2C_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the I2Cx peripheral registers to their default reset values. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval None + */ +void I2C_DeInit(I2C_TypeDef* I2Cx) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + + if (I2Cx == I2C1) + { + /* Enable I2C1 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); + /* Release I2C1 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); + } + else + { + /* Enable I2C2 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE); + /* Release I2C2 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE); + } +} + +/** + * @brief Initializes the I2Cx peripheral according to the specified + * parameters in the I2C_InitStruct. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_InitStruct: pointer to a I2C_InitTypeDef structure that + * contains the configuration information for the specified I2C peripheral. + * @retval None + */ +void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct) +{ + uint16_t tmpreg = 0, freqrange = 0; + uint16_t result = 0x04; + uint32_t pclk1 = 8000000; + RCC_ClocksTypeDef rcc_clocks; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed)); + assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode)); + assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle)); + assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1)); + assert_param(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack)); + assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress)); + +/*---------------------------- I2Cx CR2 Configuration ------------------------*/ + /* Get the I2Cx CR2 value */ + tmpreg = I2Cx->CR2; + /* Clear frequency FREQ[5:0] bits */ + tmpreg &= CR2_FREQ_Reset; + /* Get pclk1 frequency value */ + RCC_GetClocksFreq(&rcc_clocks); + pclk1 = rcc_clocks.PCLK1_Frequency; + /* Set frequency bits depending on pclk1 value */ + freqrange = (uint16_t)(pclk1 / 1000000); + tmpreg |= freqrange; + /* Write to I2Cx CR2 */ + I2Cx->CR2 = tmpreg; + +/*---------------------------- I2Cx CCR Configuration ------------------------*/ + /* Disable the selected I2C peripheral to configure TRISE */ + I2Cx->CR1 &= CR1_PE_Reset; + /* Reset tmpreg value */ + /* Clear F/S, DUTY and CCR[11:0] bits */ + tmpreg = 0; + + /* Configure speed in standard mode */ + if (I2C_InitStruct->I2C_ClockSpeed <= 100000) + { + /* Standard mode speed calculate */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1)); + /* Test if CCR value is under 0x4*/ + if (result < 0x04) + { + /* Set minimum allowed value */ + result = 0x04; + } + /* Set speed value for standard mode */ + tmpreg |= result; + /* Set Maximum Rise Time for standard mode */ + I2Cx->TRISE = freqrange + 1; + } + /* Configure speed in fast mode */ + else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/ + { + if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2) + { + /* Fast mode speed calculate: Tlow/Thigh = 2 */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3)); + } + else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/ + { + /* Fast mode speed calculate: Tlow/Thigh = 16/9 */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25)); + /* Set DUTY bit */ + result |= I2C_DutyCycle_16_9; + } + + /* Test if CCR value is under 0x1*/ + if ((result & CCR_CCR_Set) == 0) + { + /* Set minimum allowed value */ + result |= (uint16_t)0x0001; + } + /* Set speed value and set F/S bit for fast mode */ + tmpreg |= (uint16_t)(result | CCR_FS_Set); + /* Set Maximum Rise Time for fast mode */ + I2Cx->TRISE = (uint16_t)(((freqrange * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1); + } + + /* Write to I2Cx CCR */ + I2Cx->CCR = tmpreg; + /* Enable the selected I2C peripheral */ + I2Cx->CR1 |= CR1_PE_Set; + +/*---------------------------- I2Cx CR1 Configuration ------------------------*/ + /* Get the I2Cx CR1 value */ + tmpreg = I2Cx->CR1; + /* Clear ACK, SMBTYPE and SMBUS bits */ + tmpreg &= CR1_CLEAR_Mask; + /* Configure I2Cx: mode and acknowledgement */ + /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */ + /* Set ACK bit according to I2C_Ack value */ + tmpreg |= (uint16_t)((uint32_t)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack); + /* Write to I2Cx CR1 */ + I2Cx->CR1 = tmpreg; + +/*---------------------------- I2Cx OAR1 Configuration -----------------------*/ + /* Set I2Cx Own Address1 and acknowledged address */ + I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1); +} + +/** + * @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_ClockSpeed member */ + I2C_InitStruct->I2C_ClockSpeed = 5000; + /* Initialize the I2C_Mode member */ + I2C_InitStruct->I2C_Mode = I2C_Mode_I2C; + /* Initialize the I2C_DutyCycle member */ + I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2; + /* 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 |= CR1_PE_Set; + } + else + { + /* Disable the selected I2C peripheral */ + I2Cx->CR1 &= CR1_PE_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C DMA requests. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C DMA transfer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_DMACmd(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 DMA requests */ + I2Cx->CR2 |= CR2_DMAEN_Set; + } + else + { + /* Disable the selected I2C DMA requests */ + I2Cx->CR2 &= CR2_DMAEN_Reset; + } +} + +/** + * @brief Specifies if the next DMA transfer will be the last one. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C DMA last transfer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Next DMA transfer is the last transfer */ + I2Cx->CR2 |= CR2_LAST_Set; + } + else + { + /* Next DMA transfer is not the last transfer */ + I2Cx->CR2 &= CR2_LAST_Reset; + } +} + +/** + * @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->CR1 |= CR1_START_Set; + } + else + { + /* Disable the START condition generation */ + I2Cx->CR1 &= CR1_START_Reset; + } +} + +/** + * @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->CR1 |= CR1_STOP_Set; + } + else + { + /* Disable the STOP condition generation */ + I2Cx->CR1 &= CR1_STOP_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C acknowledge feature. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C Acknowledgement. + * 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 the acknowledgement */ + I2Cx->CR1 |= CR1_ACK_Set; + } + else + { + /* Disable the acknowledgement */ + I2Cx->CR1 &= CR1_ACK_Reset; + } +} + +/** + * @brief Configures the specified I2C own address2. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param Address: specifies the 7bit I2C own address2. + * @retval None. + */ +void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address) +{ + uint16_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + + /* Get the old register value */ + tmpreg = I2Cx->OAR2; + + /* Reset I2Cx Own address2 bit [7:1] */ + tmpreg &= OAR2_ADD2_Reset; + + /* Set I2Cx Own address2 */ + tmpreg |= (uint16_t)((uint16_t)Address & (uint16_t)0x00FE); + + /* Store the new register value */ + I2Cx->OAR2 = tmpreg; +} + +/** + * @brief Enables or disables the specified I2C dual addressing mode. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C dual addressing mode. + * 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 dual addressing mode */ + I2Cx->OAR2 |= OAR2_ENDUAL_Set; + } + else + { + /* Disable dual addressing mode */ + I2Cx->OAR2 &= OAR2_ENDUAL_Reset; + } +} + +/** + * @brief Enables or disables the specified I2C general call feature. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C General call. + * 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 generall call */ + I2Cx->CR1 |= CR1_ENGC_Set; + } + else + { + /* Disable generall call */ + I2Cx->CR1 &= CR1_ENGC_Reset; + } +} + +/** + * @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_BUF: Buffer interrupt mask + * @arg I2C_IT_EVT: Event interrupt mask + * @arg I2C_IT_ERR: Error 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, uint16_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->CR2 |= I2C_IT; + } + else + { + /* Disable the selected I2C interrupts */ + I2Cx->CR2 &= (uint16_t)~I2C_IT; + } +} + +/** + * @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->DR = 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->DR; +} + +/** + * @brief Transmits the address byte to select the slave device. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param Address: specifies the slave address which will be transmitted + * @param I2C_Direction: specifies whether the I2C device will be a + * Transmitter or a Receiver. This parameter can be one of the following values + * @arg I2C_Direction_Transmitter: Transmitter mode + * @arg I2C_Direction_Receiver: Receiver mode + * @retval None. + */ +void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_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) + { + /* Set the address bit0 for read */ + Address |= OAR1_ADD0_Set; + } + else + { + /* Reset the address bit0 for write */ + Address &= OAR1_ADD0_Reset; + } + /* Send the address */ + I2Cx->DR = Address; +} + +/** + * @brief Reads the specified I2C register and returns its value. + * @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_DR: DR register. + * @arg I2C_Register_SR1: SR1 register. + * @arg I2C_Register_SR2: SR2 register. + * @arg I2C_Register_CCR: CCR register. + * @arg I2C_Register_TRISE: TRISE register. + * @retval The value of the read register. + */ +uint16_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 uint16_t *) tmp); +} + +/** + * @brief Enables or disables the specified I2C software reset. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C software reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Peripheral under reset */ + I2Cx->CR1 |= CR1_SWRST_Set; + } + else + { + /* Peripheral not under reset */ + I2Cx->CR1 &= CR1_SWRST_Reset; + } +} + +/** + * @brief Drives the SMBusAlert pin high or low for the specified I2C. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_SMBusAlert: specifies SMBAlert pin level. + * This parameter can be one of the following values: + * @arg I2C_SMBusAlert_Low: SMBAlert pin driven low + * @arg I2C_SMBusAlert_High: SMBAlert pin driven high + * @retval None + */ +void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_SMBUS_ALERT(I2C_SMBusAlert)); + if (I2C_SMBusAlert == I2C_SMBusAlert_Low) + { + /* Drive the SMBusAlert pin Low */ + I2Cx->CR1 |= I2C_SMBusAlert_Low; + } + else + { + /* Drive the SMBusAlert pin High */ + I2Cx->CR1 &= I2C_SMBusAlert_High; + } +} + +/** + * @brief Enables or disables the specified I2C PEC transfer. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C PEC transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_TransmitPEC(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 PEC transmission */ + I2Cx->CR1 |= CR1_PEC_Set; + } + else + { + /* Disable the selected I2C PEC transmission */ + I2Cx->CR1 &= CR1_PEC_Reset; + } +} + +/** + * @brief Selects the specified I2C PEC position. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_PECPosition: specifies the PEC position. + * This parameter can be one of the following values: + * @arg I2C_PECPosition_Next: indicates that the next byte is PEC + * @arg I2C_PECPosition_Current: indicates that current byte is PEC + * @retval None + */ +void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_PEC_POSITION(I2C_PECPosition)); + if (I2C_PECPosition == I2C_PECPosition_Next) + { + /* Next byte in shift register is PEC */ + I2Cx->CR1 |= I2C_PECPosition_Next; + } + else + { + /* Current byte in shift register is PEC */ + I2Cx->CR1 &= I2C_PECPosition_Current; + } +} + +/** + * @brief Enables or disables the PEC value calculation of the transfered bytes. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx PEC value 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_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C PEC calculation */ + I2Cx->CR1 |= CR1_ENPEC_Set; + } + else + { + /* Disable the selected I2C PEC calculation */ + I2Cx->CR1 &= CR1_ENPEC_Reset; + } +} + +/** + * @brief Returns the PEC value for the specified I2C. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval The PEC value. + */ +uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + /* Return the selected I2C PEC value */ + return ((I2Cx->SR2) >> 8); +} + +/** + * @brief Enables or disables the specified I2C ARP. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx ARP. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_ARPCmd(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 ARP */ + I2Cx->CR1 |= CR1_ENARP_Set; + } + else + { + /* Disable the selected I2C ARP */ + I2Cx->CR1 &= CR1_ENARP_Reset; + } +} + +/** + * @brief Enables or disables the specified 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 the selected I2C Clock stretching */ + I2Cx->CR1 |= CR1_NOSTRETCH_Set; + } + else + { + /* Disable the selected I2C Clock stretching */ + I2Cx->CR1 &= CR1_NOSTRETCH_Reset; + } +} + +/** + * @brief Selects the specified I2C fast mode duty cycle. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_DutyCycle: specifies the fast mode duty cycle. + * This parameter can be one of the following values: + * @arg I2C_DutyCycle_2: I2C fast mode Tlow/Thigh = 2 + * @arg I2C_DutyCycle_16_9: I2C fast mode Tlow/Thigh = 16/9 + * @retval None + */ +void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_DUTY_CYCLE(I2C_DutyCycle)); + if (I2C_DutyCycle != I2C_DutyCycle_16_9) + { + /* I2C fast mode Tlow/Thigh=2 */ + I2Cx->CCR &= I2C_DutyCycle_2; + } + else + { + /* I2C fast mode Tlow/Thigh=16/9 */ + I2Cx->CCR |= I2C_DutyCycle_16_9; + } +} + + + +/** + * @brief + **************************************************************************************** + * + * I2C State Monitoring Functions + * + **************************************************************************************** + * This I2C driver provides three different ways for I2C state monitoring + * depending on the application requirements and constraints: + * + * + * 1) Basic state monitoring: + * Using I2C_CheckEvent() function: + * It compares the status registers (SR1 and SR2) content to a given event + * (can be the combination of one or more flags). + * It returns SUCCESS if the current status includes the given flags + * and returns ERROR if one or more flags are missing in the current status. + * - When to use: + * - This function is suitable for most applciations as well as for startup + * activity since the events are fully described in the product reference manual + * (RM0008). + * - It is also suitable for users who need to define their own events. + * - Limitations: + * - If an error occurs (ie. error flags are set besides to the monitored flags), + * the I2C_CheckEvent() function may return SUCCESS despite the communication + * hold or corrupted real state. + * In this case, it is advised to use error interrupts to monitor the error + * events and handle them in the interrupt IRQ handler. + * + * @note + * For error management, it is advised to use the following functions: + * - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR). + * - I2Cx_ER_IRQHandler() which is called when the error interurpt occurs. + * Where x is the peripheral instance (I2C1, I2C2 ...) + * - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into I2Cx_ER_IRQHandler() + * in order to determine which error occured. + * - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd() + * and/or I2C_GenerateStop() in order to clear the error flag and source, + * and return to correct communication status. + * + * + * 2) Advanced state monitoring: + * Using the function I2C_GetLastEvent() which returns the image of both status + * registers in a single word (uint32_t) (Status Register 2 value is shifted left + * by 16 bits and concatenated to Status Register 1). + * - When to use: + * - This function is suitable for the same applications above but it allows to + * overcome the mentionned limitation of I2C_GetFlagStatus() function. + * The returned value could be compared to events already defined in the + * library (stm32f10x_i2c.h) or to custom values defiend by user. + * - This function is suitable when multiple flags are monitored at the same time. + * - At the opposite of I2C_CheckEvent() function, this function allows user to + * choose when an event is accepted (when all events flags are set and no + * other flags are set or just when the needed flags are set like + * I2C_CheckEvent() function). + * - Limitations: + * - User may need to define his own events. + * - Same remark concerning the error management is applicable for this + * function if user decides to check only regular communication flags (and + * ignores error flags). + * + * + * 3) Flag-based state monitoring: + * Using the function I2C_GetFlagStatus() which simply returns the status of + * one single flag (ie. I2C_FLAG_RXNE ...). + * - When to use: + * - This function could be used for specific applications or in debug phase. + * - It is suitable when only one flag checking is needed (most I2C events + * are monitored through multiple flags). + * - Limitations: + * - When calling this function, the Status register is accessed. Some flags are + * cleared when the status register is accessed. So checking the status + * of one Flag, may clear other ones. + * - Function may need to be called twice or more in order to monitor one + * single event. + * + * For detailed description of Events, please refer to section I2C_Events in + * stm32f10x_i2c.h file. + * + */ + +/** + * + * 1) Basic state monitoring + ******************************************************************************* + */ + +/** + * @brief Checks whether the last I2Cx Event is equal to the one passed + * as parameter. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_EVENT: specifies the event to be checked. + * This parameter can be one of the following values: + * @arg I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2 + * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF) : EV2 + * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL) : EV2 + * @arg I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3 + * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF) : EV3 + * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) : EV3 + * @arg I2C_EVENT_SLAVE_ACK_FAILURE : EV3_2 + * @arg I2C_EVENT_SLAVE_STOP_DETECTED : EV4 + * @arg I2C_EVENT_MASTER_MODE_SELECT : EV5 + * @arg I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : EV6 + * @arg I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED : EV6 + * @arg I2C_EVENT_MASTER_BYTE_RECEIVED : EV7 + * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTING : EV8 + * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8_2 + * @arg I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9 + * + * @note: For detailed description of Events, please refer to section + * I2C_Events in stm32f10x_i2c.h file. + * + * @retval An ErrorStatus enumuration value: + * - SUCCESS: Last event is equal to the I2C_EVENT + * - ERROR: Last event is different from the I2C_EVENT + */ +ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_EVENT(I2C_EVENT)); + + /* Read the I2Cx status register */ + flag1 = I2Cx->SR1; + flag2 = I2Cx->SR2; + flag2 = flag2 << 16; + + /* Get the last event value from I2C status register */ + lastevent = (flag1 | flag2) & FLAG_Mask; + + /* Check whether the last event contains the I2C_EVENT */ + if ((lastevent & I2C_EVENT) == I2C_EVENT) + { + /* SUCCESS: last event is equal to I2C_EVENT */ + status = SUCCESS; + } + else + { + /* ERROR: last event is different from I2C_EVENT */ + status = ERROR; + } + /* Return status */ + return status; +} + +/** + * + * 2) Advanced state monitoring + ******************************************************************************* + */ + +/** + * @brief Returns the last I2Cx Event. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * + * @note: For detailed description of Events, please refer to section + * I2C_Events in stm32f10x_i2c.h file. + * + * @retval The last event + */ +uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + + /* Read the I2Cx status register */ + flag1 = I2Cx->SR1; + flag2 = I2Cx->SR2; + flag2 = flag2 << 16; + + /* Get the last event value from I2C status register */ + lastevent = (flag1 | flag2) & FLAG_Mask; + + /* Return status */ + return lastevent; +} + +/** + * + * 3) Flag-based state monitoring + ******************************************************************************* + */ + +/** + * @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_DUALF: Dual flag (Slave mode) + * @arg I2C_FLAG_SMBHOST: SMBus host header (Slave mode) + * @arg I2C_FLAG_SMBDEFAULT: SMBus default header (Slave mode) + * @arg I2C_FLAG_GENCALL: General call header flag (Slave mode) + * @arg I2C_FLAG_TRA: Transmitter/Receiver flag + * @arg I2C_FLAG_BUSY: Bus busy flag + * @arg I2C_FLAG_MSL: Master/Slave flag + * @arg I2C_FLAG_SMBALERT: SMBus Alert flag + * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_FLAG_PECERR: PEC error in reception flag + * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AF: Acknowledge failure flag + * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * @arg I2C_FLAG_TXE: Data register empty flag (Transmitter) + * @arg I2C_FLAG_RXNE: Data register not empty (Receiver) flag + * @arg I2C_FLAG_STOPF: Stop detection flag (Slave mode) + * @arg I2C_FLAG_ADD10: 10-bit header sent flag (Master mode) + * @arg I2C_FLAG_BTF: Byte transfer finished flag + * @arg I2C_FLAG_ADDR: Address sent flag (Master mode) “ADSL” + * Address matched flag (Slave mode)”ENDAD” + * @arg I2C_FLAG_SB: Start bit flag (Master mode) + * @retval The new state of I2C_FLAG (SET or RESET). + */ +FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) +{ + FlagStatus bitstatus = RESET; + __IO uint32_t i2creg = 0, i2cxbase = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_GET_FLAG(I2C_FLAG)); + + /* Get the I2Cx peripheral base address */ + i2cxbase = (uint32_t)I2Cx; + + /* Read flag register index */ + i2creg = I2C_FLAG >> 28; + + /* Get bit[23:0] of the flag */ + I2C_FLAG &= FLAG_Mask; + + if(i2creg != 0) + { + /* Get the I2Cx SR1 register address */ + i2cxbase += 0x14; + } + else + { + /* Flag in I2Cx SR2 Register */ + I2C_FLAG = (uint32_t)(I2C_FLAG >> 16); + /* Get the I2Cx SR2 register address */ + i2cxbase += 0x18; + } + + if(((*(__IO uint32_t *)i2cxbase) & I2C_FLAG) != (uint32_t)RESET) + { + /* I2C_FLAG is set */ + bitstatus = SET; + } + else + { + /* I2C_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the I2C_FLAG status */ + 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_SMBALERT: SMBus Alert flag + * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_FLAG_PECERR: PEC error in reception flag + * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AF: Acknowledge failure flag + * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * + * @note + * - STOPF (STOP detection) is cleared by software sequence: a read operation + * to I2C_SR1 register (I2C_GetFlagStatus()) followed by a write operation + * to I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). + * - ADD10 (10-bit header sent) is cleared by software sequence: a read + * operation to I2C_SR1 (I2C_GetFlagStatus()) followed by writing the + * second byte of the address in DR register. + * - BTF (Byte Transfer Finished) is cleared by software sequence: a read + * operation to I2C_SR1 register (I2C_GetFlagStatus()) followed by a + * read/write to I2C_DR register (I2C_SendData()). + * - ADDR (Address sent) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetFlagStatus()) followed by a read operation to + * I2C_SR2 register ((void)(I2Cx->SR2)). + * - SB (Start Bit) is cleared software sequence: a read operation to I2C_SR1 + * register (I2C_GetFlagStatus()) followed by a write operation to I2C_DR + * register (I2C_SendData()). + * @retval None + */ +void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) +{ + uint32_t flagpos = 0; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_CLEAR_FLAG(I2C_FLAG)); + /* Get the I2C flag position */ + flagpos = I2C_FLAG & FLAG_Mask; + /* Clear the selected I2C flag */ + I2Cx->SR1 = (uint16_t)~flagpos; +} + +/** + * @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_SMBALERT: SMBus Alert flag + * @arg I2C_IT_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_IT_PECERR: PEC error in reception flag + * @arg I2C_IT_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_IT_AF: Acknowledge failure flag + * @arg I2C_IT_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_IT_BERR: Bus error flag + * @arg I2C_IT_TXE: Data register empty flag (Transmitter) + * @arg I2C_IT_RXNE: Data register not empty (Receiver) flag + * @arg I2C_IT_STOPF: Stop detection flag (Slave mode) + * @arg I2C_IT_ADD10: 10-bit header sent flag (Master mode) + * @arg I2C_IT_BTF: Byte transfer finished flag + * @arg I2C_IT_ADDR: Address sent flag (Master mode) “ADSL” + * Address matched flag (Slave mode)”ENDAD” + * @arg I2C_IT_SB: Start bit flag (Master mode) + * @retval The new state of I2C_IT (SET or RESET). + */ +ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT) +{ + 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 */ + enablestatus = (uint32_t)(((I2C_IT & ITEN_Mask) >> 16) & (I2Cx->CR2)) ; + + /* Get bit[23:0] of the flag */ + I2C_IT &= FLAG_Mask; + + /* Check the status of the specified I2C flag */ + if (((I2Cx->SR1 & I2C_IT) != (uint32_t)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_SMBALERT: SMBus Alert interrupt + * @arg I2C_IT_TIMEOUT: Timeout or Tlow error interrupt + * @arg I2C_IT_PECERR: PEC error in reception interrupt + * @arg I2C_IT_OVR: Overrun/Underrun interrupt (Slave mode) + * @arg I2C_IT_AF: Acknowledge failure interrupt + * @arg I2C_IT_ARLO: Arbitration lost interrupt (Master mode) + * @arg I2C_IT_BERR: Bus error interrupt + * + * @note + * - STOPF (STOP detection) is cleared by software sequence: a read operation + * to I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to + * I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). + * - ADD10 (10-bit header sent) is cleared by software sequence: a read + * operation to I2C_SR1 (I2C_GetITStatus()) followed by writing the second + * byte of the address in I2C_DR register. + * - BTF (Byte Transfer Finished) is cleared by software sequence: a read + * operation to I2C_SR1 register (I2C_GetITStatus()) followed by a + * read/write to I2C_DR register (I2C_SendData()). + * - ADDR (Address sent) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetITStatus()) followed by a read operation to + * I2C_SR2 register ((void)(I2Cx->SR2)). + * - SB (Start Bit) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to + * I2C_DR register (I2C_SendData()). + * @retval None + */ +void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT) +{ + uint32_t flagpos = 0; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_CLEAR_IT(I2C_IT)); + /* Get the I2C flag position */ + flagpos = I2C_IT & FLAG_Mask; + /* Clear the selected I2C flag */ + I2Cx->SR1 = (uint16_t)~flagpos; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.h new file mode 100644 index 0000000..4726509 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_i2c.h @@ -0,0 +1,670 @@ +/** + ****************************************************************************** + * @file stm32f10x_i2c.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the I2C firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_I2C_H +#define __STM32F10x_I2C_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup I2C + * @{ + */ + +/** @defgroup I2C_Exported_Types + * @{ + */ + +/** + * @brief I2C Init structure definition + */ + +typedef struct +{ + uint32_t I2C_ClockSpeed; /*!< Specifies the clock frequency. + This parameter must be set to a value lower than 400kHz */ + + uint16_t I2C_Mode; /*!< Specifies the I2C mode. + This parameter can be a value of @ref I2C_mode */ + + uint16_t I2C_DutyCycle; /*!< Specifies the I2C fast mode duty cycle. + This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ + + uint16_t I2C_OwnAddress1; /*!< Specifies the first device own address. + This parameter can be a 7-bit or 10-bit address. */ + + uint16_t I2C_Ack; /*!< Enables or disables the acknowledgement. + This parameter can be a value of @ref I2C_acknowledgement */ + + uint16_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; + +/** + * @} + */ + + +/** @defgroup I2C_Exported_Constants + * @{ + */ + +#define IS_I2C_ALL_PERIPH(PERIPH) (((PERIPH) == I2C1) || \ + ((PERIPH) == I2C2)) +/** @defgroup I2C_mode + * @{ + */ + +#define I2C_Mode_I2C ((uint16_t)0x0000) +#define I2C_Mode_SMBusDevice ((uint16_t)0x0002) +#define I2C_Mode_SMBusHost ((uint16_t)0x000A) +#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \ + ((MODE) == I2C_Mode_SMBusDevice) || \ + ((MODE) == I2C_Mode_SMBusHost)) +/** + * @} + */ + +/** @defgroup I2C_duty_cycle_in_fast_mode + * @{ + */ + +#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /*!< I2C fast mode Tlow/Thigh = 16/9 */ +#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /*!< I2C fast mode Tlow/Thigh = 2 */ +#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DutyCycle_16_9) || \ + ((CYCLE) == I2C_DutyCycle_2)) +/** + * @} + */ + +/** @defgroup I2C_acknowledgement + * @{ + */ + +#define I2C_Ack_Enable ((uint16_t)0x0400) +#define I2C_Ack_Disable ((uint16_t)0x0000) +#define IS_I2C_ACK_STATE(STATE) (((STATE) == I2C_Ack_Enable) || \ + ((STATE) == I2C_Ack_Disable)) +/** + * @} + */ + +/** @defgroup I2C_transfer_direction + * @{ + */ + +#define I2C_Direction_Transmitter ((uint8_t)0x00) +#define I2C_Direction_Receiver ((uint8_t)0x01) +#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \ + ((DIRECTION) == I2C_Direction_Receiver)) +/** + * @} + */ + +/** @defgroup I2C_acknowledged_address + * @{ + */ + +#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000) +#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000) +#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \ + ((ADDRESS) == I2C_AcknowledgedAddress_10bit)) +/** + * @} + */ + +/** @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_DR ((uint8_t)0x10) +#define I2C_Register_SR1 ((uint8_t)0x14) +#define I2C_Register_SR2 ((uint8_t)0x18) +#define I2C_Register_CCR ((uint8_t)0x1C) +#define I2C_Register_TRISE ((uint8_t)0x20) +#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \ + ((REGISTER) == I2C_Register_CR2) || \ + ((REGISTER) == I2C_Register_OAR1) || \ + ((REGISTER) == I2C_Register_OAR2) || \ + ((REGISTER) == I2C_Register_DR) || \ + ((REGISTER) == I2C_Register_SR1) || \ + ((REGISTER) == I2C_Register_SR2) || \ + ((REGISTER) == I2C_Register_CCR) || \ + ((REGISTER) == I2C_Register_TRISE)) +/** + * @} + */ + +/** @defgroup I2C_SMBus_alert_pin_level + * @{ + */ + +#define I2C_SMBusAlert_Low ((uint16_t)0x2000) +#define I2C_SMBusAlert_High ((uint16_t)0xDFFF) +#define IS_I2C_SMBUS_ALERT(ALERT) (((ALERT) == I2C_SMBusAlert_Low) || \ + ((ALERT) == I2C_SMBusAlert_High)) +/** + * @} + */ + +/** @defgroup I2C_PEC_position + * @{ + */ + +#define I2C_PECPosition_Next ((uint16_t)0x0800) +#define I2C_PECPosition_Current ((uint16_t)0xF7FF) +#define IS_I2C_PEC_POSITION(POSITION) (((POSITION) == I2C_PECPosition_Next) || \ + ((POSITION) == I2C_PECPosition_Current)) +/** + * @} + */ + +/** @defgroup I2C_interrupts_definition + * @{ + */ + +#define I2C_IT_BUF ((uint16_t)0x0400) +#define I2C_IT_EVT ((uint16_t)0x0200) +#define I2C_IT_ERR ((uint16_t)0x0100) +#define IS_I2C_CONFIG_IT(IT) ((((IT) & (uint16_t)0xF8FF) == 0x00) && ((IT) != 0x00)) +/** + * @} + */ + +/** @defgroup I2C_interrupts_definition + * @{ + */ + +#define I2C_IT_SMBALERT ((uint32_t)0x01008000) +#define I2C_IT_TIMEOUT ((uint32_t)0x01004000) +#define I2C_IT_PECERR ((uint32_t)0x01001000) +#define I2C_IT_OVR ((uint32_t)0x01000800) +#define I2C_IT_AF ((uint32_t)0x01000400) +#define I2C_IT_ARLO ((uint32_t)0x01000200) +#define I2C_IT_BERR ((uint32_t)0x01000100) +#define I2C_IT_TXE ((uint32_t)0x06000080) +#define I2C_IT_RXNE ((uint32_t)0x06000040) +#define I2C_IT_STOPF ((uint32_t)0x02000010) +#define I2C_IT_ADD10 ((uint32_t)0x02000008) +#define I2C_IT_BTF ((uint32_t)0x02000004) +#define I2C_IT_ADDR ((uint32_t)0x02000002) +#define I2C_IT_SB ((uint32_t)0x02000001) + +#define IS_I2C_CLEAR_IT(IT) ((((IT) & (uint16_t)0x20FF) == 0x00) && ((IT) != (uint16_t)0x00)) + +#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \ + ((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \ + ((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \ + ((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_TXE) || \ + ((IT) == I2C_IT_RXNE) || ((IT) == I2C_IT_STOPF) || \ + ((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \ + ((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB)) +/** + * @} + */ + +/** @defgroup I2C_flags_definition + * @{ + */ + +/** + * @brief SR2 register flags + */ + +#define I2C_FLAG_DUALF ((uint32_t)0x00800000) +#define I2C_FLAG_SMBHOST ((uint32_t)0x00400000) +#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00200000) +#define I2C_FLAG_GENCALL ((uint32_t)0x00100000) +#define I2C_FLAG_TRA ((uint32_t)0x00040000) +#define I2C_FLAG_BUSY ((uint32_t)0x00020000) +#define I2C_FLAG_MSL ((uint32_t)0x00010000) + +/** + * @brief SR1 register flags + */ + +#define I2C_FLAG_SMBALERT ((uint32_t)0x10008000) +#define I2C_FLAG_TIMEOUT ((uint32_t)0x10004000) +#define I2C_FLAG_PECERR ((uint32_t)0x10001000) +#define I2C_FLAG_OVR ((uint32_t)0x10000800) +#define I2C_FLAG_AF ((uint32_t)0x10000400) +#define I2C_FLAG_ARLO ((uint32_t)0x10000200) +#define I2C_FLAG_BERR ((uint32_t)0x10000100) +#define I2C_FLAG_TXE ((uint32_t)0x10000080) +#define I2C_FLAG_RXNE ((uint32_t)0x10000040) +#define I2C_FLAG_STOPF ((uint32_t)0x10000010) +#define I2C_FLAG_ADD10 ((uint32_t)0x10000008) +#define I2C_FLAG_BTF ((uint32_t)0x10000004) +#define I2C_FLAG_ADDR ((uint32_t)0x10000002) +#define I2C_FLAG_SB ((uint32_t)0x10000001) + +#define IS_I2C_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0x20FF) == 0x00) && ((FLAG) != (uint16_t)0x00)) + +#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_DUALF) || ((FLAG) == I2C_FLAG_SMBHOST) || \ + ((FLAG) == I2C_FLAG_SMBDEFAULT) || ((FLAG) == I2C_FLAG_GENCALL) || \ + ((FLAG) == I2C_FLAG_TRA) || ((FLAG) == I2C_FLAG_BUSY) || \ + ((FLAG) == I2C_FLAG_MSL) || ((FLAG) == I2C_FLAG_SMBALERT) || \ + ((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_PECERR) || \ + ((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_AF) || \ + ((FLAG) == I2C_FLAG_ARLO) || ((FLAG) == I2C_FLAG_BERR) || \ + ((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_RXNE) || \ + ((FLAG) == I2C_FLAG_STOPF) || ((FLAG) == I2C_FLAG_ADD10) || \ + ((FLAG) == I2C_FLAG_BTF) || ((FLAG) == I2C_FLAG_ADDR) || \ + ((FLAG) == I2C_FLAG_SB)) +/** + * @} + */ + +/** @defgroup I2C_Events + * @{ + */ + +/*======================================== + + I2C Master Events (Events grouped in order of communication) + ==========================================*/ +/** + * @brief Communication start + * + * After sending the START condition (I2C_GenerateSTART() function) the master + * has to wait for this event. It means that the Start condition has been correctly + * released on the I2C bus (the bus is free, no other devices is communicating). + * + */ +/* --EV5 */ +#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */ + +/** + * @brief Address Acknowledge + * + * After checking on EV5 (start condition correctly released on the bus), the + * master sends the address of the slave(s) with which it will communicate + * (I2C_Send7bitAddress() function, it also determines the direction of the communication: + * Master transmitter or Receiver). Then the master has to wait that a slave acknowledges + * his address. If an acknowledge is sent on the bus, one of the following events will + * be set: + * + * 1) In case of Master Receiver (7-bit addressing): the I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED + * event is set. + * + * 2) In case of Master Transmitter (7-bit addressing): the I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED + * is set + * + * 3) In case of 10-Bit addressing mode, the master (just after generating the START + * and checking on EV5) has to send the header of 10-bit addressing mode (I2C_SendData() + * function). Then master should wait on EV9. It means that the 10-bit addressing + * header has been correctly sent on the bus. Then master should send the second part of + * the 10-bit address (LSB) using the function I2C_Send7bitAddress(). Then master + * should wait for event EV6. + * + */ + +/* --EV6 */ +#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */ +#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */ +/* --EV9 */ +#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */ + +/** + * @brief Communication events + * + * If a communication is established (START condition generated and slave address + * acknowledged) then the master has to check on one of the following events for + * communication procedures: + * + * 1) Master Receiver mode: The master has to wait on the event EV7 then to read + * the data received from the slave (I2C_ReceiveData() function). + * + * 2) Master Transmitter mode: The master has to send data (I2C_SendData() + * function) then to wait on event EV8 or EV8_2. + * These two events are similar: + * - EV8 means that the data has been written in the data register and is + * being shifted out. + * - EV8_2 means that the data has been physically shifted out and output + * on the bus. + * In most cases, using EV8 is sufficient for the application. + * Using EV8_2 leads to a slower communication but ensure more reliable test. + * EV8_2 is also more suitable than EV8 for testing on the last data transmission + * (before Stop condition generation). + * + * @note In case the user software does not guarantee that this event EV7 is + * managed before the current byte end of transfer, then user may check on EV7 + * and BTF flag at the same time (ie. (I2C_EVENT_MASTER_BYTE_RECEIVED | I2C_FLAG_BTF)). + * In this case the communication may be slower. + * + */ + +/* Master RECEIVER mode -----------------------------*/ +/* --EV7 */ +#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */ + +/* Master TRANSMITTER mode --------------------------*/ +/* --EV8 */ +#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */ +/* --EV8_2 */ +#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */ + + +/*======================================== + + I2C Slave Events (Events grouped in order of communication) + ==========================================*/ + +/** + * @brief Communication start events + * + * Wait on one of these events at the start of the communication. It means that + * the I2C peripheral detected a Start condition on the bus (generated by master + * device) followed by the peripheral address. The peripheral generates an ACK + * condition on the bus (if the acknowledge feature is enabled through function + * I2C_AcknowledgeConfig()) and the events listed above are set : + * + * 1) In normal case (only one address managed by the slave), when the address + * sent by the master matches the own address of the peripheral (configured by + * I2C_OwnAddress1 field) the I2C_EVENT_SLAVE_XXX_ADDRESS_MATCHED event is set + * (where XXX could be TRANSMITTER or RECEIVER). + * + * 2) In case the address sent by the master matches the second address of the + * peripheral (configured by the function I2C_OwnAddress2Config() and enabled + * by the function I2C_DualAddressCmd()) the events I2C_EVENT_SLAVE_XXX_SECONDADDRESS_MATCHED + * (where XXX could be TRANSMITTER or RECEIVER) are set. + * + * 3) In case the address sent by the master is General Call (address 0x00) and + * if the General Call is enabled for the peripheral (using function I2C_GeneralCallCmd()) + * the following event is set I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED. + * + */ + +/* --EV1 (all the events below are variants of EV1) */ +/* 1) Case of One Single Address managed by the slave */ +#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */ +#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */ + +/* 2) Case of Dual address managed by the slave */ +#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */ +#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */ + +/* 3) Case of General Call enabled for the slave */ +#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */ + +/** + * @brief Communication events + * + * Wait on one of these events when EV1 has already been checked and: + * + * - Slave RECEIVER mode: + * - EV2: When the application is expecting a data byte to be received. + * - EV4: When the application is expecting the end of the communication: master + * sends a stop condition and data transmission is stopped. + * + * - Slave Transmitter mode: + * - EV3: When a byte has been transmitted by the slave and the application is expecting + * the end of the byte transmission. The two events I2C_EVENT_SLAVE_BYTE_TRANSMITTED and + * I2C_EVENT_SLAVE_BYTE_TRANSMITTING are similar. The second one can optionally be + * used when the user software doesn't guarantee the EV3 is managed before the + * current byte end of tranfer. + * - EV3_2: When the master sends a NACK in order to tell slave that data transmission + * shall end (before sending the STOP condition). In this case slave has to stop sending + * data bytes and expect a Stop condition on the bus. + * + * @note In case the user software does not guarantee that the event EV2 is + * managed before the current byte end of transfer, then user may check on EV2 + * and BTF flag at the same time (ie. (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_BTF)). + * In this case the communication may be slower. + * + */ + +/* Slave RECEIVER mode --------------------------*/ +/* --EV2 */ +#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */ +/* --EV4 */ +#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */ + +/* Slave TRANSMITTER mode -----------------------*/ +/* --EV3 */ +#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */ +#define I2C_EVENT_SLAVE_BYTE_TRANSMITTING ((uint32_t)0x00060080) /* TRA, BUSY and TXE flags */ +/* --EV3_2 */ +#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */ + +/*=========================== End of Events Description ==========================================*/ + +#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_BYTE_RECEIVED) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \ + ((EVENT) == I2C_EVENT_SLAVE_BYTE_TRANSMITTED) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \ + ((EVENT) == I2C_EVENT_SLAVE_STOP_DETECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \ + ((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTING) || \ + ((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \ + ((EVENT) == I2C_EVENT_SLAVE_ACK_FAILURE)) +/** + * @} + */ + +/** @defgroup I2C_own_address1 + * @{ + */ + +#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x3FF) +/** + * @} + */ + +/** @defgroup I2C_clock_speed + * @{ + */ + +#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) >= 0x1) && ((SPEED) <= 400000)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup I2C_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup I2C_Exported_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_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address); +void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState); +void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data); +uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx); +void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction); +uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register); +void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert); +void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition); +void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState); +uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx); +void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle); + +/** + * @brief + **************************************************************************************** + * + * I2C State Monitoring Functions + * + **************************************************************************************** + * This I2C driver provides three different ways for I2C state monitoring + * depending on the application requirements and constraints: + * + * + * 1) Basic state monitoring: + * Using I2C_CheckEvent() function: + * It compares the status registers (SR1 and SR2) content to a given event + * (can be the combination of one or more flags). + * It returns SUCCESS if the current status includes the given flags + * and returns ERROR if one or more flags are missing in the current status. + * - When to use: + * - This function is suitable for most applications as well as for startup + * activity since the events are fully described in the product reference manual + * (RM0008). + * - It is also suitable for users who need to define their own events. + * - Limitations: + * - If an error occurs (ie. error flags are set besides to the monitored flags), + * the I2C_CheckEvent() function may return SUCCESS despite the communication + * hold or corrupted real state. + * In this case, it is advised to use error interrupts to monitor the error + * events and handle them in the interrupt IRQ handler. + * + * @note + * For error management, it is advised to use the following functions: + * - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR). + * - I2Cx_ER_IRQHandler() which is called when the error interurpt occurs. + * Where x is the peripheral instance (I2C1, I2C2 ...) + * - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into I2Cx_ER_IRQHandler() + * in order to determine which error occured. + * - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd() + * and/or I2C_GenerateStop() in order to clear the error flag and source, + * and return to correct communication status. + * + * + * 2) Advanced state monitoring: + * Using the function I2C_GetLastEvent() which returns the image of both status + * registers in a single word (uint32_t) (Status Register 2 value is shifted left + * by 16 bits and concatenated to Status Register 1). + * - When to use: + * - This function is suitable for the same applications above but it allows to + * overcome the limitations of I2C_GetFlagStatus() function (see below). + * The returned value could be compared to events already defined in the + * library (stm32f10x_i2c.h) or to custom values defined by user. + * - This function is suitable when multiple flags are monitored at the same time. + * - At the opposite of I2C_CheckEvent() function, this function allows user to + * choose when an event is accepted (when all events flags are set and no + * other flags are set or just when the needed flags are set like + * I2C_CheckEvent() function). + * - Limitations: + * - User may need to define his own events. + * - Same remark concerning the error management is applicable for this + * function if user decides to check only regular communication flags (and + * ignores error flags). + * + * + * 3) Flag-based state monitoring: + * Using the function I2C_GetFlagStatus() which simply returns the status of + * one single flag (ie. I2C_FLAG_RXNE ...). + * - When to use: + * - This function could be used for specific applications or in debug phase. + * - It is suitable when only one flag checking is needed (most I2C events + * are monitored through multiple flags). + * - Limitations: + * - When calling this function, the Status register is accessed. Some flags are + * cleared when the status register is accessed. So checking the status + * of one Flag, may clear other ones. + * - Function may need to be called twice or more in order to monitor one + * single event. + * + */ + +/** + * + * 1) Basic state monitoring + ******************************************************************************* + */ +ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT); +/** + * + * 2) Advanced state monitoring + ******************************************************************************* + */ +uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx); +/** + * + * 3) Flag-based state monitoring + ******************************************************************************* + */ +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 /*__STM32F10x_I2C_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.c new file mode 100644 index 0000000..7738cf3 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.c @@ -0,0 +1,189 @@ +/** + ****************************************************************************** + * @file stm32f10x_iwdg.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the IWDG firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_iwdg.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup IWDG + * @brief IWDG driver modules + * @{ + */ + +/** @defgroup IWDG_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_Defines + * @{ + */ + +/* ---------------------- IWDG registers bit mask ----------------------------*/ + +/* KR register bit mask */ +#define KR_KEY_Reload ((uint16_t)0xAAAA) +#define KR_KEY_Enable ((uint16_t)0xCCCC) + +/** + * @} + */ + +/** @defgroup IWDG_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Private_Functions + * @{ + */ + +/** + * @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 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; +} + +/** + * @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 + * @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 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.h new file mode 100644 index 0000000..4325ad4 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_iwdg.h @@ -0,0 +1,139 @@ +/** + ****************************************************************************** + * @file stm32f10x_iwdg.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the IWDG + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_IWDG_H +#define __STM32F10x_IWDG_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup IWDG + * @{ + */ + +/** @defgroup IWDG_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @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 ((uint16_t)0x0001) +#define IWDG_FLAG_RVU ((uint16_t)0x0002) +#define IS_IWDG_FLAG(FLAG) (((FLAG) == IWDG_FLAG_PVU) || ((FLAG) == IWDG_FLAG_RVU)) +#define IS_IWDG_RELOAD(RELOAD) ((RELOAD) <= 0xFFF) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup IWDG_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup IWDG_Exported_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_Enable(void); +FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_IWDG_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.c new file mode 100644 index 0000000..8eeeec2 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.c @@ -0,0 +1,306 @@ +/** + ****************************************************************************** + * @file stm32f10x_pwr.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the PWR firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_pwr.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup PWR + * @brief PWR driver modules + * @{ + */ + +/** @defgroup PWR_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_Defines + * @{ + */ + +/* --------- PWR registers bit address in the alias region ---------- */ +#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) + +/* --- CR Register ---*/ + +/* Alias word address of DBP bit */ +#define CR_OFFSET (PWR_OFFSET + 0x00) +#define DBP_BitNumber 0x08 +#define CR_DBP_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (DBP_BitNumber * 4)) + +/* Alias word address of PVDE bit */ +#define PVDE_BitNumber 0x04 +#define CR_PVDE_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PVDE_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of EWUP bit */ +#define CSR_OFFSET (PWR_OFFSET + 0x04) +#define EWUP_BitNumber 0x08 +#define CSR_EWUP_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (EWUP_BitNumber * 4)) + +/* ------------------ PWR registers bit mask ------------------------ */ + +/* CR register bit mask */ +#define CR_DS_MASK ((uint32_t)0xFFFFFFFC) +#define CR_PLS_MASK ((uint32_t)0xFFFFFF1F) + + +/** + * @} + */ + +/** @defgroup PWR_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Private_Functions + * @{ + */ + +/** + * @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 RTC and backup registers. + * @param NewState: new state of the access to the RTC and backup registers. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_BackupAccessCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Power Voltage Detector(PVD). + * @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)); + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). + * @param PWR_PVDLevel: specifies the PVD detection level + * This parameter can be one of the following values: + * @arg PWR_PVDLevel_2V2: PVD detection level set to 2.2V + * @arg PWR_PVDLevel_2V3: PVD detection level set to 2.3V + * @arg PWR_PVDLevel_2V4: PVD detection level set to 2.4V + * @arg PWR_PVDLevel_2V5: PVD detection level set to 2.5V + * @arg PWR_PVDLevel_2V6: PVD detection level set to 2.6V + * @arg PWR_PVDLevel_2V7: PVD detection level set to 2.7V + * @arg PWR_PVDLevel_2V8: PVD detection level set to 2.8V + * @arg PWR_PVDLevel_2V9: PVD detection level set to 2.9V + * @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 WakeUp Pin functionality. + * @param NewState: new state of the WakeUp Pin functionality. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_WakeUpPinCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CSR_EWUP_BB = (uint32_t)NewState; +} + +/** + * @brief Enters STOP mode. + * @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 + * @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 LPDS bits */ + tmpreg &= CR_DS_MASK; + /* Set LPDS bit according to PWR_Regulator value */ + tmpreg |= PWR_Regulator; + /* Store the new value */ + PWR->CR = tmpreg; + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP; + + /* Select STOP mode entry --------------------------------------------------*/ + if(PWR_STOPEntry == PWR_STOPEntry_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __WFE(); + } + + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP); +} + +/** + * @brief Enters STANDBY mode. + * @param None + * @retval None + */ +void PWR_EnterSTANDBYMode(void) +{ + /* Clear Wake-up flag */ + PWR->CR |= PWR_CR_CWUF; + /* Select STANDBY mode */ + PWR->CR |= PWR_CR_PDDS; + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP; +/* This option is used to ensure that store operations are completed */ +#if defined ( __CC_ARM ) + __force_stores(); +#endif + /* Request Wait For Interrupt */ + __WFI(); +} + +/** + * @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 + * @arg PWR_FLAG_SB: StandBy flag + * @arg PWR_FLAG_PVDO: PVD Output + * @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 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h new file mode 100644 index 0000000..ad93abd --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_pwr.h @@ -0,0 +1,155 @@ +/** + ****************************************************************************** + * @file stm32f10x_pwr.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the PWR firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_PWR_H +#define __STM32F10x_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup PWR + * @{ + */ + +/** @defgroup PWR_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Exported_Constants + * @{ + */ + +/** @defgroup PVD_detection_level + * @{ + */ + +#define PWR_PVDLevel_2V2 ((uint32_t)0x00000000) +#define PWR_PVDLevel_2V3 ((uint32_t)0x00000020) +#define PWR_PVDLevel_2V4 ((uint32_t)0x00000040) +#define PWR_PVDLevel_2V5 ((uint32_t)0x00000060) +#define PWR_PVDLevel_2V6 ((uint32_t)0x00000080) +#define PWR_PVDLevel_2V7 ((uint32_t)0x000000A0) +#define PWR_PVDLevel_2V8 ((uint32_t)0x000000C0) +#define PWR_PVDLevel_2V9 ((uint32_t)0x000000E0) +#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLevel_2V2) || ((LEVEL) == PWR_PVDLevel_2V3)|| \ + ((LEVEL) == PWR_PVDLevel_2V4) || ((LEVEL) == PWR_PVDLevel_2V5)|| \ + ((LEVEL) == PWR_PVDLevel_2V6) || ((LEVEL) == PWR_PVDLevel_2V7)|| \ + ((LEVEL) == PWR_PVDLevel_2V8) || ((LEVEL) == PWR_PVDLevel_2V9)) +/** + * @} + */ + +/** @defgroup Regulator_state_is_STOP_mode + * @{ + */ + +#define PWR_Regulator_ON ((uint32_t)0x00000000) +#define PWR_Regulator_LowPower ((uint32_t)0x00000001) +#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_Regulator_ON) || \ + ((REGULATOR) == PWR_Regulator_LowPower)) +/** + * @} + */ + +/** @defgroup STOP_mode_entry + * @{ + */ + +#define PWR_STOPEntry_WFI ((uint8_t)0x01) +#define PWR_STOPEntry_WFE ((uint8_t)0x02) +#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPEntry_WFI) || ((ENTRY) == PWR_STOPEntry_WFE)) + +/** + * @} + */ + +/** @defgroup PWR_Flag + * @{ + */ + +#define PWR_FLAG_WU ((uint32_t)0x00000001) +#define PWR_FLAG_SB ((uint32_t)0x00000002) +#define PWR_FLAG_PVDO ((uint32_t)0x00000004) +#define IS_PWR_GET_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB) || \ + ((FLAG) == PWR_FLAG_PVDO)) + +#define IS_PWR_CLEAR_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup PWR_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup PWR_Exported_Functions + * @{ + */ + +void PWR_DeInit(void); +void PWR_BackupAccessCmd(FunctionalState NewState); +void PWR_PVDCmd(FunctionalState NewState); +void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel); +void PWR_WakeUpPinCmd(FunctionalState NewState); +void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); +void PWR_EnterSTANDBYMode(void); +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); +void PWR_ClearFlag(uint32_t PWR_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_PWR_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.c new file mode 100644 index 0000000..9a0b7ca --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.c @@ -0,0 +1,1469 @@ +/** + ****************************************************************************** + * @file stm32f10x_rcc.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the RCC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup RCC + * @brief RCC driver modules + * @{ + */ + +/** @defgroup RCC_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Defines + * @{ + */ + +/* ------------ RCC registers bit address in the alias region ----------- */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) + +/* --- CR Register ---*/ + +/* Alias word address of HSION bit */ +#define CR_OFFSET (RCC_OFFSET + 0x00) +#define HSION_BitNumber 0x00 +#define CR_HSION_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (HSION_BitNumber * 4)) + +/* Alias word address of PLLON bit */ +#define PLLON_BitNumber 0x18 +#define CR_PLLON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLON_BitNumber * 4)) + +#ifdef STM32F10X_CL + /* Alias word address of PLL2ON bit */ + #define PLL2ON_BitNumber 0x1A + #define CR_PLL2ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL2ON_BitNumber * 4)) + + /* Alias word address of PLL3ON bit */ + #define PLL3ON_BitNumber 0x1C + #define CR_PLL3ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL3ON_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* Alias word address of CSSON bit */ +#define CSSON_BitNumber 0x13 +#define CR_CSSON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (CSSON_BitNumber * 4)) + +/* --- CFGR Register ---*/ + +/* Alias word address of USBPRE bit */ +#define CFGR_OFFSET (RCC_OFFSET + 0x04) + +#ifndef STM32F10X_CL + #define USBPRE_BitNumber 0x16 + #define CFGR_USBPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (USBPRE_BitNumber * 4)) +#else + #define OTGFSPRE_BitNumber 0x16 + #define CFGR_OTGFSPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (OTGFSPRE_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* --- BDCR Register ---*/ + +/* Alias word address of RTCEN bit */ +#define BDCR_OFFSET (RCC_OFFSET + 0x20) +#define RTCEN_BitNumber 0x0F +#define BDCR_RTCEN_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (RTCEN_BitNumber * 4)) + +/* Alias word address of BDRST bit */ +#define BDRST_BitNumber 0x10 +#define BDCR_BDRST_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (BDRST_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of LSION bit */ +#define CSR_OFFSET (RCC_OFFSET + 0x24) +#define LSION_BitNumber 0x00 +#define CSR_LSION_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSION_BitNumber * 4)) + +#ifdef STM32F10X_CL +/* --- CFGR2 Register ---*/ + + /* Alias word address of I2S2SRC bit */ + #define CFGR2_OFFSET (RCC_OFFSET + 0x2C) + #define I2S2SRC_BitNumber 0x11 + #define CFGR2_I2S2SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S2SRC_BitNumber * 4)) + + /* Alias word address of I2S3SRC bit */ + #define I2S3SRC_BitNumber 0x12 + #define CFGR2_I2S3SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S3SRC_BitNumber * 4)) +#endif /* STM32F10X_CL */ + +/* ---------------------- RCC registers bit mask ------------------------ */ + +/* CR register bit mask */ +#define CR_HSEBYP_Reset ((uint32_t)0xFFFBFFFF) +#define CR_HSEBYP_Set ((uint32_t)0x00040000) +#define CR_HSEON_Reset ((uint32_t)0xFFFEFFFF) +#define CR_HSEON_Set ((uint32_t)0x00010000) +#define CR_HSITRIM_Mask ((uint32_t)0xFFFFFF07) + +/* CFGR register bit mask */ +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) + #define CFGR_PLL_Mask ((uint32_t)0xFFC2FFFF) +#else + #define CFGR_PLL_Mask ((uint32_t)0xFFC0FFFF) +#endif /* STM32F10X_CL */ + +#define CFGR_PLLMull_Mask ((uint32_t)0x003C0000) +#define CFGR_PLLSRC_Mask ((uint32_t)0x00010000) +#define CFGR_PLLXTPRE_Mask ((uint32_t)0x00020000) +#define CFGR_SWS_Mask ((uint32_t)0x0000000C) +#define CFGR_SW_Mask ((uint32_t)0xFFFFFFFC) +#define CFGR_HPRE_Reset_Mask ((uint32_t)0xFFFFFF0F) +#define CFGR_HPRE_Set_Mask ((uint32_t)0x000000F0) +#define CFGR_PPRE1_Reset_Mask ((uint32_t)0xFFFFF8FF) +#define CFGR_PPRE1_Set_Mask ((uint32_t)0x00000700) +#define CFGR_PPRE2_Reset_Mask ((uint32_t)0xFFFFC7FF) +#define CFGR_PPRE2_Set_Mask ((uint32_t)0x00003800) +#define CFGR_ADCPRE_Reset_Mask ((uint32_t)0xFFFF3FFF) +#define CFGR_ADCPRE_Set_Mask ((uint32_t)0x0000C000) + +/* CSR register bit mask */ +#define CSR_RMVF_Set ((uint32_t)0x01000000) + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) +/* CFGR2 register bit mask */ + #define CFGR2_PREDIV1SRC ((uint32_t)0x00010000) + #define CFGR2_PREDIV1 ((uint32_t)0x0000000F) +#endif +#ifdef STM32F10X_CL + #define CFGR2_PREDIV2 ((uint32_t)0x000000F0) + #define CFGR2_PLL2MUL ((uint32_t)0x00000F00) + #define CFGR2_PLL3MUL ((uint32_t)0x0000F000) +#endif /* STM32F10X_CL */ + +/* RCC Flag Mask */ +#define FLAG_Mask ((uint8_t)0x1F) + +/* CIR register byte 2 (Bits[15:8]) base address */ +#define CIR_BYTE2_ADDRESS ((uint32_t)0x40021009) + +/* CIR register byte 3 (Bits[23:16]) base address */ +#define CIR_BYTE3_ADDRESS ((uint32_t)0x4002100A) + +/* CFGR register byte 4 (Bits[31:24]) base address */ +#define CFGR_BYTE4_ADDRESS ((uint32_t)0x40021007) + +/* BDCR register base address */ +#define BDCR_ADDRESS (PERIPH_BASE + BDCR_OFFSET) + +/** + * @} + */ + +/** @defgroup RCC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Variables + * @{ + */ + +static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; +static __I uint8_t ADCPrescTable[4] = {2, 4, 6, 8}; + +/** + * @} + */ + +/** @defgroup RCC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Private_Functions + * @{ + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @param None + * @retval None + */ +void RCC_DeInit(void) +{ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ +#ifndef STM32F10X_CL + RCC->CFGR &= (uint32_t)0xF8FF0000; +#else + RCC->CFGR &= (uint32_t)0xF0FF0000; +#endif /* STM32F10X_CL */ + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ + RCC->CFGR &= (uint32_t)0xFF80FFFF; + +#ifdef STM32F10X_CL + /* Reset PLL2ON and PLL3ON bits */ + RCC->CR &= (uint32_t)0xEBFFFFFF; + + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x00FF0000; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000; +#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000; +#else + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; +#endif /* STM32F10X_CL */ + +} + +/** + * @brief Configures the External High Speed oscillator (HSE). + * @note HSE can not be stopped if it is used directly or through the PLL as system clock. + * @param RCC_HSE: specifies the new state of the HSE. + * This parameter can be one of the following values: + * @arg RCC_HSE_OFF: HSE oscillator OFF + * @arg RCC_HSE_ON: HSE oscillator ON + * @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock + * @retval None + */ +void RCC_HSEConfig(uint32_t RCC_HSE) +{ + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_HSE)); + /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/ + /* Reset HSEON bit */ + RCC->CR &= CR_HSEON_Reset; + /* Reset HSEBYP bit */ + RCC->CR &= CR_HSEBYP_Reset; + /* Configure HSE (RCC_HSE_OFF is already covered by the code section above) */ + switch(RCC_HSE) + { + case RCC_HSE_ON: + /* Set HSEON bit */ + RCC->CR |= CR_HSEON_Set; + break; + + case RCC_HSE_Bypass: + /* Set HSEBYP and HSEON bits */ + RCC->CR |= CR_HSEBYP_Set | CR_HSEON_Set; + break; + + default: + break; + } +} + +/** + * @brief Waits for HSE start-up. + * @param None + * @retval An ErrorStatus enumuration 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 Time out 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. + * @param HSICalibrationValue: specifies the 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_CALIBRATION_VALUE(HSICalibrationValue)); + tmpreg = RCC->CR; + /* Clear HSITRIM[4:0] bits */ + tmpreg &= CR_HSITRIM_Mask; + /* 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 HSI can not be stopped if it is used directly or through the PLL as system clock. + * @param NewState: new state of the HSI. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_HSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_HSION_BB = (uint32_t)NewState; +} + +/** + * @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. + * For @b STM32_Connectivity_line_devices or @b STM32_Value_line_devices, + * this parameter can be one of the following values: + * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry + * @arg RCC_PLLSource_PREDIV1: PREDIV1 clock selected as PLL clock entry + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry + * @arg RCC_PLLSource_HSE_Div1: HSE oscillator clock selected as PLL clock entry + * @arg RCC_PLLSource_HSE_Div2: HSE oscillator clock divided by 2 selected as PLL clock entry + * @param RCC_PLLMul: specifies the PLL multiplication factor. + * For @b STM32_Connectivity_line_devices, this parameter can be RCC_PLLMul_x where x:{[4,9], 6_5} + * For @b other_STM32_devices, this parameter can be RCC_PLLMul_x where x:[2,16] + * @retval None + */ +void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource)); + assert_param(IS_RCC_PLL_MUL(RCC_PLLMul)); + + tmpreg = RCC->CFGR; + /* Clear PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */ + tmpreg &= CFGR_PLL_Mask; + /* Set the PLL configuration bits */ + tmpreg |= RCC_PLLSource | RCC_PLLMul; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Enables or disables the PLL. + * @note The PLL can not be disabled if it is used as system clock. + * @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)); + + *(__IO uint32_t *) CR_PLLON_BB = (uint32_t)NewState; +} + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) +/** + * @brief Configures the PREDIV1 division factor. + * @note + * - This function must be used only when the PLL is disabled. + * - This function applies only to STM32 Connectivity line and Value line + * devices. + * @param RCC_PREDIV1_Source: specifies the PREDIV1 clock source. + * This parameter can be one of the following values: + * @arg RCC_PREDIV1_Source_HSE: HSE selected as PREDIV1 clock + * @arg RCC_PREDIV1_Source_PLL2: PLL2 selected as PREDIV1 clock + * @note + * For @b STM32_Value_line_devices this parameter is always RCC_PREDIV1_Source_HSE + * @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_Source, uint32_t RCC_PREDIV1_Div) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PREDIV1_SOURCE(RCC_PREDIV1_Source)); + assert_param(IS_RCC_PREDIV1(RCC_PREDIV1_Div)); + + tmpreg = RCC->CFGR2; + /* Clear PREDIV1[3:0] and PREDIV1SRC bits */ + tmpreg &= ~(CFGR2_PREDIV1 | CFGR2_PREDIV1SRC); + /* Set the PREDIV1 clock source and division factor */ + tmpreg |= RCC_PREDIV1_Source | RCC_PREDIV1_Div ; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} +#endif + +#ifdef STM32F10X_CL +/** + * @brief Configures the PREDIV2 division factor. + * @note + * - This function must be used only when both PLL2 and PLL3 are disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PREDIV2_Div: specifies the PREDIV2 clock division factor. + * This parameter can be RCC_PREDIV2_Divx where x:[1,16] + * @retval None + */ +void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PREDIV2(RCC_PREDIV2_Div)); + + tmpreg = RCC->CFGR2; + /* Clear PREDIV2[3:0] bits */ + tmpreg &= ~CFGR2_PREDIV2; + /* Set the PREDIV2 division factor */ + tmpreg |= RCC_PREDIV2_Div; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + +/** + * @brief Configures the PLL2 multiplication factor. + * @note + * - This function must be used only when the PLL2 is disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PLL2Mul: specifies the PLL2 multiplication factor. + * This parameter can be RCC_PLL2Mul_x where x:{[8,14], 16, 20} + * @retval None + */ +void RCC_PLL2Config(uint32_t RCC_PLL2Mul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL2_MUL(RCC_PLL2Mul)); + + tmpreg = RCC->CFGR2; + /* Clear PLL2Mul[3:0] bits */ + tmpreg &= ~CFGR2_PLL2MUL; + /* Set the PLL2 configuration bits */ + tmpreg |= RCC_PLL2Mul; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + + +/** + * @brief Enables or disables the PLL2. + * @note + * - The PLL2 can not be disabled if it is used indirectly as system clock + * (i.e. it is used as PLL clock entry that is used as System clock). + * - This function applies only to STM32 Connectivity line devices. + * @param NewState: new state of the PLL2. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLL2Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_PLL2ON_BB = (uint32_t)NewState; +} + + +/** + * @brief Configures the PLL3 multiplication factor. + * @note + * - This function must be used only when the PLL3 is disabled. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_PLL3Mul: specifies the PLL3 multiplication factor. + * This parameter can be RCC_PLL3Mul_x where x:{[8,14], 16, 20} + * @retval None + */ +void RCC_PLL3Config(uint32_t RCC_PLL3Mul) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PLL3_MUL(RCC_PLL3Mul)); + + tmpreg = RCC->CFGR2; + /* Clear PLL3Mul[3:0] bits */ + tmpreg &= ~CFGR2_PLL3MUL; + /* Set the PLL3 configuration bits */ + tmpreg |= RCC_PLL3Mul; + /* Store the new value */ + RCC->CFGR2 = tmpreg; +} + + +/** + * @brief Enables or disables the PLL3. + * @note This function applies only to STM32 Connectivity line devices. + * @param NewState: new state of the PLL3. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLL3Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CR_PLL3ON_BB = (uint32_t)NewState; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the system clock (SYSCLK). + * @param RCC_SYSCLKSource: specifies the clock source used as system clock. + * This parameter can be one of the following values: + * @arg RCC_SYSCLKSource_HSI: HSI selected as system clock + * @arg RCC_SYSCLKSource_HSE: HSE selected as system clock + * @arg RCC_SYSCLKSource_PLLCLK: PLL selected as system clock + * @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 &= CFGR_SW_Mask; + /* 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: + * - 0x00: HSI used as system clock + * - 0x04: HSE used as system clock + * - 0x08: PLL used as system clock + */ +uint8_t RCC_GetSYSCLKSource(void) +{ + return ((uint8_t)(RCC->CFGR & CFGR_SWS_Mask)); +} + +/** + * @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 &= CFGR_HPRE_Reset_Mask; + /* Set HPRE[3:0] bits according to RCC_SYSCLK value */ + tmpreg |= RCC_SYSCLK; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Configures the Low Speed APB clock (PCLK1). + * @param RCC_HCLK: defines the APB1 clock divider. This clock is derived from + * the AHB clock (HCLK). + * This parameter can be one of the following values: + * @arg RCC_HCLK_Div1: APB1 clock = HCLK + * @arg RCC_HCLK_Div2: APB1 clock = HCLK/2 + * @arg RCC_HCLK_Div4: APB1 clock = HCLK/4 + * @arg RCC_HCLK_Div8: APB1 clock = HCLK/8 + * @arg RCC_HCLK_Div16: APB1 clock = HCLK/16 + * @retval None + */ +void RCC_PCLK1Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_PCLK(RCC_HCLK)); + tmpreg = RCC->CFGR; + /* Clear PPRE1[2:0] bits */ + tmpreg &= CFGR_PPRE1_Reset_Mask; + /* Set PPRE1[2:0] bits according to RCC_HCLK value */ + tmpreg |= RCC_HCLK; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Configures the High Speed APB clock (PCLK2). + * @param RCC_HCLK: defines the APB2 clock divider. This clock is derived from + * the AHB clock (HCLK). + * This parameter can be one of the following values: + * @arg RCC_HCLK_Div1: APB2 clock = HCLK + * @arg RCC_HCLK_Div2: APB2 clock = HCLK/2 + * @arg RCC_HCLK_Div4: APB2 clock = HCLK/4 + * @arg RCC_HCLK_Div8: APB2 clock = HCLK/8 + * @arg RCC_HCLK_Div16: APB2 clock = HCLK/16 + * @retval None + */ +void RCC_PCLK2Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_PCLK(RCC_HCLK)); + tmpreg = RCC->CFGR; + /* Clear PPRE2[2:0] bits */ + tmpreg &= CFGR_PPRE2_Reset_Mask; + /* Set PPRE2[2:0] bits according to RCC_HCLK value */ + tmpreg |= RCC_HCLK << 3; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Enables or disables the specified RCC interrupts. + * @param RCC_IT: specifies the RCC interrupt sources to be enabled or disabled. + * + * For @b STM32_Connectivity_line_devices, 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_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * + * For @b other_STM32_devices, 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 + * + * @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 bits to enable the selected interrupts */ + *(__IO uint8_t *) CIR_BYTE2_ADDRESS |= RCC_IT; + } + else + { + /* Perform Byte access to RCC_CIR bits to disable the selected interrupts */ + *(__IO uint8_t *) CIR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT; + } +} + +#ifndef STM32F10X_CL +/** + * @brief Configures the USB clock (USBCLK). + * @param RCC_USBCLKSource: specifies the USB clock source. This clock is + * derived from the PLL output. + * This parameter can be one of the following values: + * @arg RCC_USBCLKSource_PLLCLK_1Div5: PLL clock divided by 1,5 selected as USB + * clock source + * @arg RCC_USBCLKSource_PLLCLK_Div1: PLL clock selected as USB clock source + * @retval None + */ +void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_USBCLK_SOURCE(RCC_USBCLKSource)); + + *(__IO uint32_t *) CFGR_USBPRE_BB = RCC_USBCLKSource; +} +#else +/** + * @brief Configures the USB OTG FS clock (OTGFSCLK). + * This function applies only to STM32 Connectivity line devices. + * @param RCC_OTGFSCLKSource: specifies the USB OTG FS clock source. + * This clock is derived from the PLL output. + * This parameter can be one of the following values: + * @arg RCC_OTGFSCLKSource_PLLVCO_Div3: PLL VCO clock divided by 2 selected as USB OTG FS clock source + * @arg RCC_OTGFSCLKSource_PLLVCO_Div2: PLL VCO clock divided by 2 selected as USB OTG FS clock source + * @retval None + */ +void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_OTGFSCLK_SOURCE(RCC_OTGFSCLKSource)); + + *(__IO uint32_t *) CFGR_OTGFSPRE_BB = RCC_OTGFSCLKSource; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the ADC clock (ADCCLK). + * @param RCC_PCLK2: defines the ADC clock divider. This clock is derived from + * the APB2 clock (PCLK2). + * This parameter can be one of the following values: + * @arg RCC_PCLK2_Div2: ADC clock = PCLK2/2 + * @arg RCC_PCLK2_Div4: ADC clock = PCLK2/4 + * @arg RCC_PCLK2_Div6: ADC clock = PCLK2/6 + * @arg RCC_PCLK2_Div8: ADC clock = PCLK2/8 + * @retval None + */ +void RCC_ADCCLKConfig(uint32_t RCC_PCLK2) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_RCC_ADCCLK(RCC_PCLK2)); + tmpreg = RCC->CFGR; + /* Clear ADCPRE[1:0] bits */ + tmpreg &= CFGR_ADCPRE_Reset_Mask; + /* Set ADCPRE[1:0] bits according to RCC_PCLK2 value */ + tmpreg |= RCC_PCLK2; + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +#ifdef STM32F10X_CL +/** + * @brief Configures the I2S2 clock source(I2S2CLK). + * @note + * - This function must be called before enabling I2S2 APB clock. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_I2S2CLKSource: specifies the I2S2 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2S2CLKSource_SYSCLK: system clock selected as I2S2 clock entry + * @arg RCC_I2S2CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S2 clock entry + * @retval None + */ +void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_I2S2CLK_SOURCE(RCC_I2S2CLKSource)); + + *(__IO uint32_t *) CFGR2_I2S2SRC_BB = RCC_I2S2CLKSource; +} + +/** + * @brief Configures the I2S3 clock source(I2S2CLK). + * @note + * - This function must be called before enabling I2S3 APB clock. + * - This function applies only to STM32 Connectivity line devices. + * @param RCC_I2S3CLKSource: specifies the I2S3 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2S3CLKSource_SYSCLK: system clock selected as I2S3 clock entry + * @arg RCC_I2S3CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S3 clock entry + * @retval None + */ +void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_I2S3CLK_SOURCE(RCC_I2S3CLKSource)); + + *(__IO uint32_t *) CFGR2_I2S3SRC_BB = RCC_I2S3CLKSource; +} +#endif /* STM32F10X_CL */ + +/** + * @brief Configures the External Low Speed oscillator (LSE). + * @param RCC_LSE: specifies the new state of the LSE. + * This parameter can be one of the following values: + * @arg RCC_LSE_OFF: LSE oscillator OFF + * @arg RCC_LSE_ON: LSE oscillator ON + * @arg RCC_LSE_Bypass: LSE oscillator bypassed with external clock + * @retval None + */ +void RCC_LSEConfig(uint8_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 */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; + /* Reset LSEBYP bit */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; + /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */ + switch(RCC_LSE) + { + case RCC_LSE_ON: + /* Set LSEON bit */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_ON; + break; + + case RCC_LSE_Bypass: + /* Set LSEBYP and LSEON bits */ + *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON; + break; + + default: + break; + } +} + +/** + * @brief Enables or disables the Internal Low Speed oscillator (LSI). + * @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. + * @retval None + */ +void RCC_LSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the RTC clock (RTCCLK). + * @note Once the RTC clock is selected it can’t be changed unless the Backup domain is reset. + * @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_Div128: HSE clock divided by 128 selected as RTC clock + * @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 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)); + *(__IO uint32_t *) BDCR_RTCEN_BB = (uint32_t)NewState; +} + +/** + * @brief Returns the frequencies of different on chip clocks. + * @param RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which will hold + * the clocks frequencies. + * @note The result of this function could be not correct when using + * fractional value for HSE crystal. + * @retval None + */ +void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0, presc = 0; + +#ifdef STM32F10X_CL + uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0; +#endif /* STM32F10X_CL */ + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + uint32_t prediv1factor = 0; +#endif + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & CFGR_SWS_Mask; + + 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 & CFGR_PLLMull_Mask; + pllsource = RCC->CFGR & CFGR_PLLSRC_Mask; + +#ifndef STM32F10X_CL + pllmull = ( pllmull >> 18) + 2; + + if (pllsource == 0x00) + {/* HSI oscillator clock divided by 2 selected as PLL clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE >> 1) * pllmull; + } + else + { + #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1; + /* HSE oscillator clock selected as PREDIV1 clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE / prediv1factor) * pllmull; + #else + /* HSE selected as PLL clock entry */ + if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (uint32_t)RESET) + {/* HSE oscillator clock divided by 2 */ + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE >> 1) * pllmull; + } + else + { + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE * pllmull; + } + #endif + } +#else + pllmull = pllmull >> 18; + + if (pllmull != 0x0D) + { + pllmull += 2; + } + else + { /* PLL multiplication factor = PLL input clock * 6.5 */ + pllmull = 13 / 2; + } + + if (pllsource == 0x00) + {/* HSI oscillator clock divided by 2 selected as PLL clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE >> 1) * pllmull; + } + else + {/* PREDIV1 selected as PLL clock entry */ + + /* Get PREDIV1 clock source and division factor */ + prediv1source = RCC->CFGR2 & CFGR2_PREDIV1SRC; + prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1; + + if (prediv1source == 0) + { /* HSE oscillator clock selected as PREDIV1 clock entry */ + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE / prediv1factor) * pllmull; + } + else + {/* PLL2 clock selected as PREDIV1 clock entry */ + + /* Get PREDIV2 division factor and PLL2 multiplication factor */ + prediv2factor = ((RCC->CFGR2 & CFGR2_PREDIV2) >> 4) + 1; + pll2mull = ((RCC->CFGR2 & CFGR2_PLL2MUL) >> 8 ) + 2; + RCC_Clocks->SYSCLK_Frequency = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull; + } + } +#endif /* STM32F10X_CL */ + break; + + default: + RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; + break; + } + + /* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/ + /* Get HCLK prescaler */ + tmp = RCC->CFGR & CFGR_HPRE_Set_Mask; + tmp = tmp >> 4; + presc = APBAHBPrescTable[tmp]; + /* HCLK clock frequency */ + RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc; + /* Get PCLK1 prescaler */ + tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask; + tmp = tmp >> 8; + presc = APBAHBPrescTable[tmp]; + /* PCLK1 clock frequency */ + RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + /* Get PCLK2 prescaler */ + tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask; + tmp = tmp >> 11; + presc = APBAHBPrescTable[tmp]; + /* PCLK2 clock frequency */ + RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + /* Get ADCCLK prescaler */ + tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask; + tmp = tmp >> 14; + presc = ADCPrescTable[tmp]; + /* ADCCLK clock frequency */ + RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc; +} + +/** + * @brief Enables or disables the AHB peripheral clock. + * @param RCC_AHBPeriph: specifies the AHB peripheral to gates its clock. + * + * For @b STM32_Connectivity_line_devices, this parameter can be any combination + * of the following values: + * @arg RCC_AHBPeriph_DMA1 + * @arg RCC_AHBPeriph_DMA2 + * @arg RCC_AHBPeriph_SRAM + * @arg RCC_AHBPeriph_FLITF + * @arg RCC_AHBPeriph_CRC + * @arg RCC_AHBPeriph_OTG_FS + * @arg RCC_AHBPeriph_ETH_MAC + * @arg RCC_AHBPeriph_ETH_MAC_Tx + * @arg RCC_AHBPeriph_ETH_MAC_Rx + * + * For @b other_STM32_devices, this parameter can be any combination of the + * following values: + * @arg RCC_AHBPeriph_DMA1 + * @arg RCC_AHBPeriph_DMA2 + * @arg RCC_AHBPeriph_SRAM + * @arg RCC_AHBPeriph_FLITF + * @arg RCC_AHBPeriph_CRC + * @arg RCC_AHBPeriph_FSMC + * @arg RCC_AHBPeriph_SDIO + * + * @note SRAM and FLITF clock can be disabled only during sleep mode. + * @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. + * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, + * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, + * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, + * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, + * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3, + * RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17, + * RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11 + * @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. + * @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, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, + * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, + * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, + * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, + * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, + * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, + * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC, + * RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14 + * @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; + } +} + +#ifdef STM32F10X_CL +/** + * @brief Forces or releases AHB peripheral reset. + * @note This function applies only to STM32 Connectivity line devices. + * @param RCC_AHBPeriph: specifies the AHB peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_AHBPeriph_OTG_FS + * @arg RCC_AHBPeriph_ETH_MAC + * @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_PERIPH_RESET(RCC_AHBPeriph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->AHBRSTR |= RCC_AHBPeriph; + } + else + { + RCC->AHBRSTR &= ~RCC_AHBPeriph; + } +} +#endif /* STM32F10X_CL */ + +/** + * @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_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, + * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, + * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, + * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, + * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3, + * RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17, + * RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11 + * @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, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, + * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, + * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, + * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, + * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, + * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, + * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC, + * RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14 + * @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; + } +} + +/** + * @brief Forces or releases the Backup domain reset. + * @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)); + *(__IO uint32_t *) BDCR_BDRST_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Clock Security System. + * @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)); + *(__IO uint32_t *) CR_CSSON_BB = (uint32_t)NewState; +} + +/** + * @brief Selects the clock source to output on MCO pin. + * @param RCC_MCO: specifies the clock source to output. + * + * For @b STM32_Connectivity_line_devices, this parameter can be one of the + * following values: + * @arg RCC_MCO_NoClock: No clock selected + * @arg RCC_MCO_SYSCLK: System clock selected + * @arg RCC_MCO_HSI: HSI oscillator clock selected + * @arg RCC_MCO_HSE: HSE oscillator clock selected + * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected + * @arg RCC_MCO_PLL2CLK: PLL2 clock selected + * @arg RCC_MCO_PLL3CLK_Div2: PLL3 clock divided by 2 selected + * @arg RCC_MCO_XT1: External 3-25 MHz oscillator clock selected + * @arg RCC_MCO_PLL3CLK: PLL3 clock selected + * + * For @b other_STM32_devices, this parameter can be one of the following values: + * @arg RCC_MCO_NoClock: No clock selected + * @arg RCC_MCO_SYSCLK: System clock selected + * @arg RCC_MCO_HSI: HSI oscillator clock selected + * @arg RCC_MCO_HSE: HSE oscillator clock selected + * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected + * + * @retval None + */ +void RCC_MCOConfig(uint8_t RCC_MCO) +{ + /* Check the parameters */ + assert_param(IS_RCC_MCO(RCC_MCO)); + + /* Perform Byte access to MCO bits to select the MCO source */ + *(__IO uint8_t *) CFGR_BYTE4_ADDRESS = RCC_MCO; +} + +/** + * @brief Checks whether the specified RCC flag is set or not. + * @param RCC_FLAG: specifies the flag to check. + * + * For @b STM32_Connectivity_line_devices, 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_PLL2RDY: PLL2 clock ready + * @arg RCC_FLAG_PLL3RDY: PLL3 clock ready + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready + * @arg RCC_FLAG_PINRST: Pin 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 + * + * For @b other_STM32_devices, 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_PINRST: Pin 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 + * + * @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 == 1) /* The flag to check is in CR register */ + { + statusreg = RCC->CR; + } + else if (tmp == 2) /* The flag to check is in BDCR register */ + { + statusreg = RCC->BDCR; + } + else /* The flag to check is in CSR register */ + { + statusreg = RCC->CSR; + } + + /* 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. + * @note The reset flags are: RCC_FLAG_PINRST, 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 |= CSR_RMVF_Set; +} + +/** + * @brief Checks whether the specified RCC interrupt has occurred or not. + * @param RCC_IT: specifies the RCC interrupt source to check. + * + * For @b STM32_Connectivity_line_devices, 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_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * + * For @b other_STM32_devices, 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_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. + * + * For @b STM32_Connectivity_line_devices, 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_PLL2RDY: PLL2 ready interrupt + * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * + * For @b other_STM32_devices, 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_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_BYTE3_ADDRESS = RCC_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h new file mode 100644 index 0000000..8f1473f --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_rcc.h @@ -0,0 +1,726 @@ +/** + ****************************************************************************** + * @file stm32f10x_rcc.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the RCC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_RCC_H +#define __STM32F10x_RCC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup RCC + * @{ + */ + +/** @defgroup RCC_Exported_Types + * @{ + */ + +typedef struct +{ + uint32_t SYSCLK_Frequency; /*!< returns SYSCLK clock frequency expressed in Hz */ + uint32_t HCLK_Frequency; /*!< returns HCLK clock frequency expressed in Hz */ + uint32_t PCLK1_Frequency; /*!< returns PCLK1 clock frequency expressed in Hz */ + uint32_t PCLK2_Frequency; /*!< returns PCLK2 clock frequency expressed in Hz */ + uint32_t ADCCLK_Frequency; /*!< returns ADCCLK clock frequency expressed in Hz */ +}RCC_ClocksTypeDef; + +/** + * @} + */ + +/** @defgroup RCC_Exported_Constants + * @{ + */ + +/** @defgroup HSE_configuration + * @{ + */ + +#define RCC_HSE_OFF ((uint32_t)0x00000000) +#define RCC_HSE_ON ((uint32_t)0x00010000) +#define RCC_HSE_Bypass ((uint32_t)0x00040000) +#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ + ((HSE) == RCC_HSE_Bypass)) + +/** + * @} + */ + +/** @defgroup PLL_entry_clock_source + * @{ + */ + +#define RCC_PLLSource_HSI_Div2 ((uint32_t)0x00000000) + +#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_CL) + #define RCC_PLLSource_HSE_Div1 ((uint32_t)0x00010000) + #define RCC_PLLSource_HSE_Div2 ((uint32_t)0x00030000) + #define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI_Div2) || \ + ((SOURCE) == RCC_PLLSource_HSE_Div1) || \ + ((SOURCE) == RCC_PLLSource_HSE_Div2)) +#else + #define RCC_PLLSource_PREDIV1 ((uint32_t)0x00010000) + #define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI_Div2) || \ + ((SOURCE) == RCC_PLLSource_PREDIV1)) +#endif /* STM32F10X_CL */ + +/** + * @} + */ + +/** @defgroup PLL_multiplication_factor + * @{ + */ +#ifndef STM32F10X_CL + #define RCC_PLLMul_2 ((uint32_t)0x00000000) + #define RCC_PLLMul_3 ((uint32_t)0x00040000) + #define RCC_PLLMul_4 ((uint32_t)0x00080000) + #define RCC_PLLMul_5 ((uint32_t)0x000C0000) + #define RCC_PLLMul_6 ((uint32_t)0x00100000) + #define RCC_PLLMul_7 ((uint32_t)0x00140000) + #define RCC_PLLMul_8 ((uint32_t)0x00180000) + #define RCC_PLLMul_9 ((uint32_t)0x001C0000) + #define RCC_PLLMul_10 ((uint32_t)0x00200000) + #define RCC_PLLMul_11 ((uint32_t)0x00240000) + #define RCC_PLLMul_12 ((uint32_t)0x00280000) + #define RCC_PLLMul_13 ((uint32_t)0x002C0000) + #define RCC_PLLMul_14 ((uint32_t)0x00300000) + #define RCC_PLLMul_15 ((uint32_t)0x00340000) + #define RCC_PLLMul_16 ((uint32_t)0x00380000) + #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)) + +#else + #define RCC_PLLMul_4 ((uint32_t)0x00080000) + #define RCC_PLLMul_5 ((uint32_t)0x000C0000) + #define RCC_PLLMul_6 ((uint32_t)0x00100000) + #define RCC_PLLMul_7 ((uint32_t)0x00140000) + #define RCC_PLLMul_8 ((uint32_t)0x00180000) + #define RCC_PLLMul_9 ((uint32_t)0x001C0000) + #define RCC_PLLMul_6_5 ((uint32_t)0x00340000) + + #define IS_RCC_PLL_MUL(MUL) (((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_6_5)) +#endif /* STM32F10X_CL */ +/** + * @} + */ + +/** @defgroup PREDIV1_division_factor + * @{ + */ +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) + #define RCC_PREDIV1_Div1 ((uint32_t)0x00000000) + #define RCC_PREDIV1_Div2 ((uint32_t)0x00000001) + #define RCC_PREDIV1_Div3 ((uint32_t)0x00000002) + #define RCC_PREDIV1_Div4 ((uint32_t)0x00000003) + #define RCC_PREDIV1_Div5 ((uint32_t)0x00000004) + #define RCC_PREDIV1_Div6 ((uint32_t)0x00000005) + #define RCC_PREDIV1_Div7 ((uint32_t)0x00000006) + #define RCC_PREDIV1_Div8 ((uint32_t)0x00000007) + #define RCC_PREDIV1_Div9 ((uint32_t)0x00000008) + #define RCC_PREDIV1_Div10 ((uint32_t)0x00000009) + #define RCC_PREDIV1_Div11 ((uint32_t)0x0000000A) + #define RCC_PREDIV1_Div12 ((uint32_t)0x0000000B) + #define RCC_PREDIV1_Div13 ((uint32_t)0x0000000C) + #define RCC_PREDIV1_Div14 ((uint32_t)0x0000000D) + #define RCC_PREDIV1_Div15 ((uint32_t)0x0000000E) + #define RCC_PREDIV1_Div16 ((uint32_t)0x0000000F) + + #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)) +#endif +/** + * @} + */ + + +/** @defgroup PREDIV1_clock_source + * @{ + */ +#ifdef STM32F10X_CL +/* PREDIV1 clock source (for STM32 connectivity line devices) */ + #define RCC_PREDIV1_Source_HSE ((uint32_t)0x00000000) + #define RCC_PREDIV1_Source_PLL2 ((uint32_t)0x00010000) + + #define IS_RCC_PREDIV1_SOURCE(SOURCE) (((SOURCE) == RCC_PREDIV1_Source_HSE) || \ + ((SOURCE) == RCC_PREDIV1_Source_PLL2)) +#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) +/* PREDIV1 clock source (for STM32 Value line devices) */ + #define RCC_PREDIV1_Source_HSE ((uint32_t)0x00000000) + + #define IS_RCC_PREDIV1_SOURCE(SOURCE) (((SOURCE) == RCC_PREDIV1_Source_HSE)) +#endif +/** + * @} + */ + +#ifdef STM32F10X_CL +/** @defgroup PREDIV2_division_factor + * @{ + */ + + #define RCC_PREDIV2_Div1 ((uint32_t)0x00000000) + #define RCC_PREDIV2_Div2 ((uint32_t)0x00000010) + #define RCC_PREDIV2_Div3 ((uint32_t)0x00000020) + #define RCC_PREDIV2_Div4 ((uint32_t)0x00000030) + #define RCC_PREDIV2_Div5 ((uint32_t)0x00000040) + #define RCC_PREDIV2_Div6 ((uint32_t)0x00000050) + #define RCC_PREDIV2_Div7 ((uint32_t)0x00000060) + #define RCC_PREDIV2_Div8 ((uint32_t)0x00000070) + #define RCC_PREDIV2_Div9 ((uint32_t)0x00000080) + #define RCC_PREDIV2_Div10 ((uint32_t)0x00000090) + #define RCC_PREDIV2_Div11 ((uint32_t)0x000000A0) + #define RCC_PREDIV2_Div12 ((uint32_t)0x000000B0) + #define RCC_PREDIV2_Div13 ((uint32_t)0x000000C0) + #define RCC_PREDIV2_Div14 ((uint32_t)0x000000D0) + #define RCC_PREDIV2_Div15 ((uint32_t)0x000000E0) + #define RCC_PREDIV2_Div16 ((uint32_t)0x000000F0) + + #define IS_RCC_PREDIV2(PREDIV2) (((PREDIV2) == RCC_PREDIV2_Div1) || ((PREDIV2) == RCC_PREDIV2_Div2) || \ + ((PREDIV2) == RCC_PREDIV2_Div3) || ((PREDIV2) == RCC_PREDIV2_Div4) || \ + ((PREDIV2) == RCC_PREDIV2_Div5) || ((PREDIV2) == RCC_PREDIV2_Div6) || \ + ((PREDIV2) == RCC_PREDIV2_Div7) || ((PREDIV2) == RCC_PREDIV2_Div8) || \ + ((PREDIV2) == RCC_PREDIV2_Div9) || ((PREDIV2) == RCC_PREDIV2_Div10) || \ + ((PREDIV2) == RCC_PREDIV2_Div11) || ((PREDIV2) == RCC_PREDIV2_Div12) || \ + ((PREDIV2) == RCC_PREDIV2_Div13) || ((PREDIV2) == RCC_PREDIV2_Div14) || \ + ((PREDIV2) == RCC_PREDIV2_Div15) || ((PREDIV2) == RCC_PREDIV2_Div16)) +/** + * @} + */ + + +/** @defgroup PLL2_multiplication_factor + * @{ + */ + + #define RCC_PLL2Mul_8 ((uint32_t)0x00000600) + #define RCC_PLL2Mul_9 ((uint32_t)0x00000700) + #define RCC_PLL2Mul_10 ((uint32_t)0x00000800) + #define RCC_PLL2Mul_11 ((uint32_t)0x00000900) + #define RCC_PLL2Mul_12 ((uint32_t)0x00000A00) + #define RCC_PLL2Mul_13 ((uint32_t)0x00000B00) + #define RCC_PLL2Mul_14 ((uint32_t)0x00000C00) + #define RCC_PLL2Mul_16 ((uint32_t)0x00000E00) + #define RCC_PLL2Mul_20 ((uint32_t)0x00000F00) + + #define IS_RCC_PLL2_MUL(MUL) (((MUL) == RCC_PLL2Mul_8) || ((MUL) == RCC_PLL2Mul_9) || \ + ((MUL) == RCC_PLL2Mul_10) || ((MUL) == RCC_PLL2Mul_11) || \ + ((MUL) == RCC_PLL2Mul_12) || ((MUL) == RCC_PLL2Mul_13) || \ + ((MUL) == RCC_PLL2Mul_14) || ((MUL) == RCC_PLL2Mul_16) || \ + ((MUL) == RCC_PLL2Mul_20)) +/** + * @} + */ + + +/** @defgroup PLL3_multiplication_factor + * @{ + */ + + #define RCC_PLL3Mul_8 ((uint32_t)0x00006000) + #define RCC_PLL3Mul_9 ((uint32_t)0x00007000) + #define RCC_PLL3Mul_10 ((uint32_t)0x00008000) + #define RCC_PLL3Mul_11 ((uint32_t)0x00009000) + #define RCC_PLL3Mul_12 ((uint32_t)0x0000A000) + #define RCC_PLL3Mul_13 ((uint32_t)0x0000B000) + #define RCC_PLL3Mul_14 ((uint32_t)0x0000C000) + #define RCC_PLL3Mul_16 ((uint32_t)0x0000E000) + #define RCC_PLL3Mul_20 ((uint32_t)0x0000F000) + + #define IS_RCC_PLL3_MUL(MUL) (((MUL) == RCC_PLL3Mul_8) || ((MUL) == RCC_PLL3Mul_9) || \ + ((MUL) == RCC_PLL3Mul_10) || ((MUL) == RCC_PLL3Mul_11) || \ + ((MUL) == RCC_PLL3Mul_12) || ((MUL) == RCC_PLL3Mul_13) || \ + ((MUL) == RCC_PLL3Mul_14) || ((MUL) == RCC_PLL3Mul_16) || \ + ((MUL) == RCC_PLL3Mul_20)) +/** + * @} + */ + +#endif /* STM32F10X_CL */ + + +/** @defgroup System_clock_source + * @{ + */ + +#define RCC_SYSCLKSource_HSI ((uint32_t)0x00000000) +#define RCC_SYSCLKSource_HSE ((uint32_t)0x00000001) +#define RCC_SYSCLKSource_PLLCLK ((uint32_t)0x00000002) +#define IS_RCC_SYSCLK_SOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSource_HSI) || \ + ((SOURCE) == RCC_SYSCLKSource_HSE) || \ + ((SOURCE) == RCC_SYSCLKSource_PLLCLK)) +/** + * @} + */ + +/** @defgroup AHB_clock_source + * @{ + */ + +#define RCC_SYSCLK_Div1 ((uint32_t)0x00000000) +#define RCC_SYSCLK_Div2 ((uint32_t)0x00000080) +#define RCC_SYSCLK_Div4 ((uint32_t)0x00000090) +#define RCC_SYSCLK_Div8 ((uint32_t)0x000000A0) +#define RCC_SYSCLK_Div16 ((uint32_t)0x000000B0) +#define RCC_SYSCLK_Div64 ((uint32_t)0x000000C0) +#define RCC_SYSCLK_Div128 ((uint32_t)0x000000D0) +#define RCC_SYSCLK_Div256 ((uint32_t)0x000000E0) +#define RCC_SYSCLK_Div512 ((uint32_t)0x000000F0) +#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 APB1_APB2_clock_source + * @{ + */ + +#define RCC_HCLK_Div1 ((uint32_t)0x00000000) +#define RCC_HCLK_Div2 ((uint32_t)0x00000400) +#define RCC_HCLK_Div4 ((uint32_t)0x00000500) +#define RCC_HCLK_Div8 ((uint32_t)0x00000600) +#define RCC_HCLK_Div16 ((uint32_t)0x00000700) +#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_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_CSS ((uint8_t)0x80) + +#ifndef STM32F10X_CL + #define IS_RCC_IT(IT) ((((IT) & (uint8_t)0xE0) == 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_CSS)) + #define IS_RCC_CLEAR_IT(IT) ((((IT) & (uint8_t)0x60) == 0x00) && ((IT) != 0x00)) +#else + #define RCC_IT_PLL2RDY ((uint8_t)0x20) + #define RCC_IT_PLL3RDY ((uint8_t)0x40) + #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_CSS) || \ + ((IT) == RCC_IT_PLL2RDY) || ((IT) == RCC_IT_PLL3RDY)) + #define IS_RCC_CLEAR_IT(IT) ((IT) != 0x00) +#endif /* STM32F10X_CL */ + + +/** + * @} + */ + +#ifndef STM32F10X_CL +/** @defgroup USB_Device_clock_source + * @{ + */ + + #define RCC_USBCLKSource_PLLCLK_1Div5 ((uint8_t)0x00) + #define RCC_USBCLKSource_PLLCLK_Div1 ((uint8_t)0x01) + + #define IS_RCC_USBCLK_SOURCE(SOURCE) (((SOURCE) == RCC_USBCLKSource_PLLCLK_1Div5) || \ + ((SOURCE) == RCC_USBCLKSource_PLLCLK_Div1)) +/** + * @} + */ +#else +/** @defgroup USB_OTG_FS_clock_source + * @{ + */ + #define RCC_OTGFSCLKSource_PLLVCO_Div3 ((uint8_t)0x00) + #define RCC_OTGFSCLKSource_PLLVCO_Div2 ((uint8_t)0x01) + + #define IS_RCC_OTGFSCLK_SOURCE(SOURCE) (((SOURCE) == RCC_OTGFSCLKSource_PLLVCO_Div3) || \ + ((SOURCE) == RCC_OTGFSCLKSource_PLLVCO_Div2)) +/** + * @} + */ +#endif /* STM32F10X_CL */ + + +#ifdef STM32F10X_CL +/** @defgroup I2S2_clock_source + * @{ + */ + #define RCC_I2S2CLKSource_SYSCLK ((uint8_t)0x00) + #define RCC_I2S2CLKSource_PLL3_VCO ((uint8_t)0x01) + + #define IS_RCC_I2S2CLK_SOURCE(SOURCE) (((SOURCE) == RCC_I2S2CLKSource_SYSCLK) || \ + ((SOURCE) == RCC_I2S2CLKSource_PLL3_VCO)) +/** + * @} + */ + +/** @defgroup I2S3_clock_source + * @{ + */ + #define RCC_I2S3CLKSource_SYSCLK ((uint8_t)0x00) + #define RCC_I2S3CLKSource_PLL3_VCO ((uint8_t)0x01) + + #define IS_RCC_I2S3CLK_SOURCE(SOURCE) (((SOURCE) == RCC_I2S3CLKSource_SYSCLK) || \ + ((SOURCE) == RCC_I2S3CLKSource_PLL3_VCO)) +/** + * @} + */ +#endif /* STM32F10X_CL */ + + +/** @defgroup ADC_clock_source + * @{ + */ + +#define RCC_PCLK2_Div2 ((uint32_t)0x00000000) +#define RCC_PCLK2_Div4 ((uint32_t)0x00004000) +#define RCC_PCLK2_Div6 ((uint32_t)0x00008000) +#define RCC_PCLK2_Div8 ((uint32_t)0x0000C000) +#define IS_RCC_ADCCLK(ADCCLK) (((ADCCLK) == RCC_PCLK2_Div2) || ((ADCCLK) == RCC_PCLK2_Div4) || \ + ((ADCCLK) == RCC_PCLK2_Div6) || ((ADCCLK) == RCC_PCLK2_Div8)) +/** + * @} + */ + +/** @defgroup LSE_configuration + * @{ + */ + +#define RCC_LSE_OFF ((uint8_t)0x00) +#define RCC_LSE_ON ((uint8_t)0x01) +#define RCC_LSE_Bypass ((uint8_t)0x04) +#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ + ((LSE) == RCC_LSE_Bypass)) +/** + * @} + */ + +/** @defgroup RTC_clock_source + * @{ + */ + +#define RCC_RTCCLKSource_LSE ((uint32_t)0x00000100) +#define RCC_RTCCLKSource_LSI ((uint32_t)0x00000200) +#define RCC_RTCCLKSource_HSE_Div128 ((uint32_t)0x00000300) +#define IS_RCC_RTCCLK_SOURCE(SOURCE) (((SOURCE) == RCC_RTCCLKSource_LSE) || \ + ((SOURCE) == RCC_RTCCLKSource_LSI) || \ + ((SOURCE) == RCC_RTCCLKSource_HSE_Div128)) +/** + * @} + */ + +/** @defgroup AHB_peripheral + * @{ + */ + +#define RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) +#define RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002) +#define RCC_AHBPeriph_SRAM ((uint32_t)0x00000004) +#define RCC_AHBPeriph_FLITF ((uint32_t)0x00000010) +#define RCC_AHBPeriph_CRC ((uint32_t)0x00000040) + +#ifndef STM32F10X_CL + #define RCC_AHBPeriph_FSMC ((uint32_t)0x00000100) + #define RCC_AHBPeriph_SDIO ((uint32_t)0x00000400) + #define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFAA8) == 0x00) && ((PERIPH) != 0x00)) +#else + #define RCC_AHBPeriph_OTG_FS ((uint32_t)0x00001000) + #define RCC_AHBPeriph_ETH_MAC ((uint32_t)0x00004000) + #define RCC_AHBPeriph_ETH_MAC_Tx ((uint32_t)0x00008000) + #define RCC_AHBPeriph_ETH_MAC_Rx ((uint32_t)0x00010000) + + #define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xFFFE2FA8) == 0x00) && ((PERIPH) != 0x00)) + #define IS_RCC_AHB_PERIPH_RESET(PERIPH) ((((PERIPH) & 0xFFFFAFFF) == 0x00) && ((PERIPH) != 0x00)) +#endif /* STM32F10X_CL */ +/** + * @} + */ + +/** @defgroup APB2_peripheral + * @{ + */ + +#define RCC_APB2Periph_AFIO ((uint32_t)0x00000001) +#define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004) +#define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008) +#define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010) +#define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020) +#define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040) +#define RCC_APB2Periph_GPIOF ((uint32_t)0x00000080) +#define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100) +#define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200) +#define RCC_APB2Periph_ADC2 ((uint32_t)0x00000400) +#define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800) +#define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000) +#define RCC_APB2Periph_TIM8 ((uint32_t)0x00002000) +#define RCC_APB2Periph_USART1 ((uint32_t)0x00004000) +#define RCC_APB2Periph_ADC3 ((uint32_t)0x00008000) +#define RCC_APB2Periph_TIM15 ((uint32_t)0x00010000) +#define RCC_APB2Periph_TIM16 ((uint32_t)0x00020000) +#define RCC_APB2Periph_TIM17 ((uint32_t)0x00040000) +#define RCC_APB2Periph_TIM9 ((uint32_t)0x00080000) +#define RCC_APB2Periph_TIM10 ((uint32_t)0x00100000) +#define RCC_APB2Periph_TIM11 ((uint32_t)0x00200000) + +#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00)) +/** + * @} + */ + +/** @defgroup APB1_peripheral + * @{ + */ + +#define RCC_APB1Periph_TIM2 ((uint32_t)0x00000001) +#define RCC_APB1Periph_TIM3 ((uint32_t)0x00000002) +#define RCC_APB1Periph_TIM4 ((uint32_t)0x00000004) +#define RCC_APB1Periph_TIM5 ((uint32_t)0x00000008) +#define RCC_APB1Periph_TIM6 ((uint32_t)0x00000010) +#define RCC_APB1Periph_TIM7 ((uint32_t)0x00000020) +#define RCC_APB1Periph_TIM12 ((uint32_t)0x00000040) +#define RCC_APB1Periph_TIM13 ((uint32_t)0x00000080) +#define RCC_APB1Periph_TIM14 ((uint32_t)0x00000100) +#define RCC_APB1Periph_WWDG ((uint32_t)0x00000800) +#define RCC_APB1Periph_SPI2 ((uint32_t)0x00004000) +#define RCC_APB1Periph_SPI3 ((uint32_t)0x00008000) +#define RCC_APB1Periph_USART2 ((uint32_t)0x00020000) +#define RCC_APB1Periph_USART3 ((uint32_t)0x00040000) +#define RCC_APB1Periph_UART4 ((uint32_t)0x00080000) +#define RCC_APB1Periph_UART5 ((uint32_t)0x00100000) +#define RCC_APB1Periph_I2C1 ((uint32_t)0x00200000) +#define RCC_APB1Periph_I2C2 ((uint32_t)0x00400000) +#define RCC_APB1Periph_USB ((uint32_t)0x00800000) +#define RCC_APB1Periph_CAN1 ((uint32_t)0x02000000) +#define RCC_APB1Periph_CAN2 ((uint32_t)0x04000000) +#define RCC_APB1Periph_BKP ((uint32_t)0x08000000) +#define RCC_APB1Periph_PWR ((uint32_t)0x10000000) +#define RCC_APB1Periph_DAC ((uint32_t)0x20000000) +#define RCC_APB1Periph_CEC ((uint32_t)0x40000000) + +#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x81013600) == 0x00) && ((PERIPH) != 0x00)) + +/** + * @} + */ + +/** @defgroup Clock_source_to_output_on_MCO_pin + * @{ + */ + +#define RCC_MCO_NoClock ((uint8_t)0x00) +#define RCC_MCO_SYSCLK ((uint8_t)0x04) +#define RCC_MCO_HSI ((uint8_t)0x05) +#define RCC_MCO_HSE ((uint8_t)0x06) +#define RCC_MCO_PLLCLK_Div2 ((uint8_t)0x07) + +#ifndef STM32F10X_CL + #define IS_RCC_MCO(MCO) (((MCO) == RCC_MCO_NoClock) || ((MCO) == RCC_MCO_HSI) || \ + ((MCO) == RCC_MCO_SYSCLK) || ((MCO) == RCC_MCO_HSE) || \ + ((MCO) == RCC_MCO_PLLCLK_Div2)) +#else + #define RCC_MCO_PLL2CLK ((uint8_t)0x08) + #define RCC_MCO_PLL3CLK_Div2 ((uint8_t)0x09) + #define RCC_MCO_XT1 ((uint8_t)0x0A) + #define RCC_MCO_PLL3CLK ((uint8_t)0x0B) + + #define IS_RCC_MCO(MCO) (((MCO) == RCC_MCO_NoClock) || ((MCO) == RCC_MCO_HSI) || \ + ((MCO) == RCC_MCO_SYSCLK) || ((MCO) == RCC_MCO_HSE) || \ + ((MCO) == RCC_MCO_PLLCLK_Div2) || ((MCO) == RCC_MCO_PLL2CLK) || \ + ((MCO) == RCC_MCO_PLL3CLK_Div2) || ((MCO) == RCC_MCO_XT1) || \ + ((MCO) == RCC_MCO_PLL3CLK)) +#endif /* STM32F10X_CL */ + +/** + * @} + */ + +/** @defgroup RCC_Flag + * @{ + */ + +#define RCC_FLAG_HSIRDY ((uint8_t)0x21) +#define RCC_FLAG_HSERDY ((uint8_t)0x31) +#define RCC_FLAG_PLLRDY ((uint8_t)0x39) +#define RCC_FLAG_LSERDY ((uint8_t)0x41) +#define RCC_FLAG_LSIRDY ((uint8_t)0x61) +#define RCC_FLAG_PINRST ((uint8_t)0x7A) +#define RCC_FLAG_PORRST ((uint8_t)0x7B) +#define RCC_FLAG_SFTRST ((uint8_t)0x7C) +#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) +#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) +#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) + +#ifndef STM32F10X_CL + #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_PINRST) || \ + ((FLAG) == RCC_FLAG_PORRST) || ((FLAG) == RCC_FLAG_SFTRST) || \ + ((FLAG) == RCC_FLAG_IWDGRST)|| ((FLAG) == RCC_FLAG_WWDGRST)|| \ + ((FLAG) == RCC_FLAG_LPWRRST)) +#else + #define RCC_FLAG_PLL2RDY ((uint8_t)0x3B) + #define RCC_FLAG_PLL3RDY ((uint8_t)0x3D) + #define IS_RCC_FLAG(FLAG) (((FLAG) == RCC_FLAG_HSIRDY) || ((FLAG) == RCC_FLAG_HSERDY) || \ + ((FLAG) == RCC_FLAG_PLLRDY) || ((FLAG) == RCC_FLAG_LSERDY) || \ + ((FLAG) == RCC_FLAG_PLL2RDY) || ((FLAG) == RCC_FLAG_PLL3RDY) || \ + ((FLAG) == RCC_FLAG_LSIRDY) || ((FLAG) == RCC_FLAG_PINRST) || \ + ((FLAG) == RCC_FLAG_PORRST) || ((FLAG) == RCC_FLAG_SFTRST) || \ + ((FLAG) == RCC_FLAG_IWDGRST)|| ((FLAG) == RCC_FLAG_WWDGRST)|| \ + ((FLAG) == RCC_FLAG_LPWRRST)) +#endif /* STM32F10X_CL */ + +#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1F) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup RCC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RCC_Exported_Functions + * @{ + */ + +void RCC_DeInit(void); +void RCC_HSEConfig(uint32_t RCC_HSE); +ErrorStatus RCC_WaitForHSEStartUp(void); +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue); +void RCC_HSICmd(FunctionalState NewState); +void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul); +void RCC_PLLCmd(FunctionalState NewState); + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) + void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div); +#endif + +#ifdef STM32F10X_CL + void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div); + void RCC_PLL2Config(uint32_t RCC_PLL2Mul); + void RCC_PLL2Cmd(FunctionalState NewState); + void RCC_PLL3Config(uint32_t RCC_PLL3Mul); + void RCC_PLL3Cmd(FunctionalState NewState); +#endif /* STM32F10X_CL */ + +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); +uint8_t RCC_GetSYSCLKSource(void); +void RCC_HCLKConfig(uint32_t RCC_SYSCLK); +void RCC_PCLK1Config(uint32_t RCC_HCLK); +void RCC_PCLK2Config(uint32_t RCC_HCLK); +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState); + +#ifndef STM32F10X_CL + void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource); +#else + void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource); +#endif /* STM32F10X_CL */ + +void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); + +#ifdef STM32F10X_CL + void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource); + void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource); +#endif /* STM32F10X_CL */ + +void RCC_LSEConfig(uint8_t RCC_LSE); +void RCC_LSICmd(FunctionalState NewState); +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource); +void RCC_RTCCLKCmd(FunctionalState NewState); +void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks); +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); + +#ifdef STM32F10X_CL +void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); +#endif /* STM32F10X_CL */ + +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); +void RCC_BackupResetCmd(FunctionalState NewState); +void RCC_ClockSecuritySystemCmd(FunctionalState NewState); +void RCC_MCOConfig(uint8_t RCC_MCO); +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 /* __STM32F10x_RCC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.c new file mode 100644 index 0000000..dc69f64 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.c @@ -0,0 +1,338 @@ +/** + ****************************************************************************** + * @file stm32f10x_rtc.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the RTC firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_rtc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup RTC + * @brief RTC driver modules + * @{ + */ + +/** @defgroup RTC_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @defgroup RTC_Private_Defines + * @{ + */ +#define RTC_LSB_MASK ((uint32_t)0x0000FFFF) /*!< RTC LSB Mask */ +#define PRLH_MSB_MASK ((uint32_t)0x000F0000) /*!< RTC Prescaler MSB Mask */ + +/** + * @} + */ + +/** @defgroup RTC_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Private_Functions + * @{ + */ + +/** + * @brief Enables or disables the specified RTC interrupts. + * @param RTC_IT: specifies the RTC interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg RTC_IT_OW: Overflow interrupt + * @arg RTC_IT_ALR: Alarm interrupt + * @arg RTC_IT_SEC: Second interrupt + * @param NewState: new state of the specified RTC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RTC_IT(RTC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RTC->CRH |= RTC_IT; + } + else + { + RTC->CRH &= (uint16_t)~RTC_IT; + } +} + +/** + * @brief Enters the RTC configuration mode. + * @param None + * @retval None + */ +void RTC_EnterConfigMode(void) +{ + /* Set the CNF flag to enter in the Configuration Mode */ + RTC->CRL |= RTC_CRL_CNF; +} + +/** + * @brief Exits from the RTC configuration mode. + * @param None + * @retval None + */ +void RTC_ExitConfigMode(void) +{ + /* Reset the CNF flag to exit from the Configuration Mode */ + RTC->CRL &= (uint16_t)~((uint16_t)RTC_CRL_CNF); +} + +/** + * @brief Gets the RTC counter value. + * @param None + * @retval RTC counter value. + */ +uint32_t RTC_GetCounter(void) +{ + uint16_t tmp = 0; + tmp = RTC->CNTL; + return (((uint32_t)RTC->CNTH << 16 ) | tmp) ; +} + +/** + * @brief Sets the RTC counter value. + * @param CounterValue: RTC counter new value. + * @retval None + */ +void RTC_SetCounter(uint32_t CounterValue) +{ + RTC_EnterConfigMode(); + /* Set RTC COUNTER MSB word */ + RTC->CNTH = CounterValue >> 16; + /* Set RTC COUNTER LSB word */ + RTC->CNTL = (CounterValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/** + * @brief Sets the RTC prescaler value. + * @param PrescalerValue: RTC prescaler new value. + * @retval None + */ +void RTC_SetPrescaler(uint32_t PrescalerValue) +{ + /* Check the parameters */ + assert_param(IS_RTC_PRESCALER(PrescalerValue)); + + RTC_EnterConfigMode(); + /* Set RTC PRESCALER MSB word */ + RTC->PRLH = (PrescalerValue & PRLH_MSB_MASK) >> 16; + /* Set RTC PRESCALER LSB word */ + RTC->PRLL = (PrescalerValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/** + * @brief Sets the RTC alarm value. + * @param AlarmValue: RTC alarm new value. + * @retval None + */ +void RTC_SetAlarm(uint32_t AlarmValue) +{ + RTC_EnterConfigMode(); + /* Set the ALARM MSB word */ + RTC->ALRH = AlarmValue >> 16; + /* Set the ALARM LSB word */ + RTC->ALRL = (AlarmValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/** + * @brief Gets the RTC divider value. + * @param None + * @retval RTC Divider value. + */ +uint32_t RTC_GetDivider(void) +{ + uint32_t tmp = 0x00; + tmp = ((uint32_t)RTC->DIVH & (uint32_t)0x000F) << 16; + tmp |= RTC->DIVL; + return tmp; +} + +/** + * @brief Waits until last write operation on RTC registers has finished. + * @note This function must be called before any write to RTC registers. + * @param None + * @retval None + */ +void RTC_WaitForLastTask(void) +{ + /* Loop until RTOFF flag is set */ + while ((RTC->CRL & RTC_FLAG_RTOFF) == (uint16_t)RESET) + { + } +} + +/** + * @brief Waits until the RTC registers (RTC_CNT, RTC_ALR and RTC_PRL) + * are synchronized with RTC APB clock. + * @note This function must be called before any read operation after an APB reset + * or an APB clock stop. + * @param None + * @retval None + */ +void RTC_WaitForSynchro(void) +{ + /* Clear RSF flag */ + RTC->CRL &= (uint16_t)~RTC_FLAG_RSF; + /* Loop until RSF flag is set */ + while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET) + { + } +} + +/** + * @brief Checks whether the specified RTC flag is set or not. + * @param RTC_FLAG: specifies the flag to check. + * This parameter can be one the following values: + * @arg RTC_FLAG_RTOFF: RTC Operation OFF flag + * @arg RTC_FLAG_RSF: Registers Synchronized flag + * @arg RTC_FLAG_OW: Overflow flag + * @arg RTC_FLAG_ALR: Alarm flag + * @arg RTC_FLAG_SEC: Second flag + * @retval The new state of RTC_FLAG (SET or RESET). + */ +FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_RTC_GET_FLAG(RTC_FLAG)); + + if ((RTC->CRL & RTC_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the RTC’s pending flags. + * @param RTC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg RTC_FLAG_RSF: Registers Synchronized flag. This flag is cleared only after + * an APB reset or an APB Clock stop. + * @arg RTC_FLAG_OW: Overflow flag + * @arg RTC_FLAG_ALR: Alarm flag + * @arg RTC_FLAG_SEC: Second flag + * @retval None + */ +void RTC_ClearFlag(uint16_t RTC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_RTC_CLEAR_FLAG(RTC_FLAG)); + + /* Clear the coressponding RTC flag */ + RTC->CRL &= (uint16_t)~RTC_FLAG; +} + +/** + * @brief Checks whether the specified RTC interrupt has occured or not. + * @param RTC_IT: specifies the RTC interrupts sources to check. + * This parameter can be one of the following values: + * @arg RTC_IT_OW: Overflow interrupt + * @arg RTC_IT_ALR: Alarm interrupt + * @arg RTC_IT_SEC: Second interrupt + * @retval The new state of the RTC_IT (SET or RESET). + */ +ITStatus RTC_GetITStatus(uint16_t RTC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_RTC_GET_IT(RTC_IT)); + + bitstatus = (ITStatus)(RTC->CRL & RTC_IT); + if (((RTC->CRH & RTC_IT) != (uint16_t)RESET) && (bitstatus != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the RTC’s interrupt pending bits. + * @param RTC_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg RTC_IT_OW: Overflow interrupt + * @arg RTC_IT_ALR: Alarm interrupt + * @arg RTC_IT_SEC: Second interrupt + * @retval None + */ +void RTC_ClearITPendingBit(uint16_t RTC_IT) +{ + /* Check the parameters */ + assert_param(IS_RTC_IT(RTC_IT)); + + /* Clear the coressponding RTC pending bit */ + RTC->CRL &= (uint16_t)~RTC_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.h new file mode 100644 index 0000000..ac34ca9 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_rtc.h @@ -0,0 +1,134 @@ +/** + ****************************************************************************** + * @file stm32f10x_rtc.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the RTC firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_RTC_H +#define __STM32F10x_RTC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup RTC + * @{ + */ + +/** @defgroup RTC_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Exported_Constants + * @{ + */ + +/** @defgroup RTC_interrupts_define + * @{ + */ + +#define RTC_IT_OW ((uint16_t)0x0004) /*!< Overflow interrupt */ +#define RTC_IT_ALR ((uint16_t)0x0002) /*!< Alarm interrupt */ +#define RTC_IT_SEC ((uint16_t)0x0001) /*!< Second interrupt */ +#define IS_RTC_IT(IT) ((((IT) & (uint16_t)0xFFF8) == 0x00) && ((IT) != 0x00)) +#define IS_RTC_GET_IT(IT) (((IT) == RTC_IT_OW) || ((IT) == RTC_IT_ALR) || \ + ((IT) == RTC_IT_SEC)) +/** + * @} + */ + +/** @defgroup RTC_interrupts_flags + * @{ + */ + +#define RTC_FLAG_RTOFF ((uint16_t)0x0020) /*!< RTC Operation OFF flag */ +#define RTC_FLAG_RSF ((uint16_t)0x0008) /*!< Registers Synchronized flag */ +#define RTC_FLAG_OW ((uint16_t)0x0004) /*!< Overflow flag */ +#define RTC_FLAG_ALR ((uint16_t)0x0002) /*!< Alarm flag */ +#define RTC_FLAG_SEC ((uint16_t)0x0001) /*!< Second flag */ +#define IS_RTC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFFF0) == 0x00) && ((FLAG) != 0x00)) +#define IS_RTC_GET_FLAG(FLAG) (((FLAG) == RTC_FLAG_RTOFF) || ((FLAG) == RTC_FLAG_RSF) || \ + ((FLAG) == RTC_FLAG_OW) || ((FLAG) == RTC_FLAG_ALR) || \ + ((FLAG) == RTC_FLAG_SEC)) +#define IS_RTC_PRESCALER(PRESCALER) ((PRESCALER) <= 0xFFFFF) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup RTC_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup RTC_Exported_Functions + * @{ + */ + +void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState); +void RTC_EnterConfigMode(void); +void RTC_ExitConfigMode(void); +uint32_t RTC_GetCounter(void); +void RTC_SetCounter(uint32_t CounterValue); +void RTC_SetPrescaler(uint32_t PrescalerValue); +void RTC_SetAlarm(uint32_t AlarmValue); +uint32_t RTC_GetDivider(void); +void RTC_WaitForLastTask(void); +void RTC_WaitForSynchro(void); +FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG); +void RTC_ClearFlag(uint16_t RTC_FLAG); +ITStatus RTC_GetITStatus(uint16_t RTC_IT); +void RTC_ClearITPendingBit(uint16_t RTC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_RTC_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.c new file mode 100644 index 0000000..732cad5 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.c @@ -0,0 +1,798 @@ +/** + ****************************************************************************** + * @file stm32f10x_sdio.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the SDIO firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_sdio.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup SDIO + * @brief SDIO driver modules + * @{ + */ + +/** @defgroup SDIO_Private_TypesDefinitions + * @{ + */ + +/* ------------ SDIO registers bit address in the alias region ----------- */ +#define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE) + +/* --- CLKCR Register ---*/ + +/* Alias word address of CLKEN bit */ +#define CLKCR_OFFSET (SDIO_OFFSET + 0x04) +#define CLKEN_BitNumber 0x08 +#define CLKCR_CLKEN_BB (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BitNumber * 4)) + +/* --- CMD Register ---*/ + +/* Alias word address of SDIOSUSPEND bit */ +#define CMD_OFFSET (SDIO_OFFSET + 0x0C) +#define SDIOSUSPEND_BitNumber 0x0B +#define CMD_SDIOSUSPEND_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSUSPEND_BitNumber * 4)) + +/* Alias word address of ENCMDCOMPL bit */ +#define ENCMDCOMPL_BitNumber 0x0C +#define CMD_ENCMDCOMPL_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ENCMDCOMPL_BitNumber * 4)) + +/* Alias word address of NIEN bit */ +#define NIEN_BitNumber 0x0D +#define CMD_NIEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (NIEN_BitNumber * 4)) + +/* Alias word address of ATACMD bit */ +#define ATACMD_BitNumber 0x0E +#define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4)) + +/* --- DCTRL Register ---*/ + +/* Alias word address of DMAEN bit */ +#define DCTRL_OFFSET (SDIO_OFFSET + 0x2C) +#define DMAEN_BitNumber 0x03 +#define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4)) + +/* Alias word address of RWSTART bit */ +#define RWSTART_BitNumber 0x08 +#define DCTRL_RWSTART_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTART_BitNumber * 4)) + +/* Alias word address of RWSTOP bit */ +#define RWSTOP_BitNumber 0x09 +#define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4)) + +/* Alias word address of RWMOD bit */ +#define RWMOD_BitNumber 0x0A +#define DCTRL_RWMOD_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWMOD_BitNumber * 4)) + +/* Alias word address of SDIOEN bit */ +#define SDIOEN_BitNumber 0x0B +#define DCTRL_SDIOEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOEN_BitNumber * 4)) + +/* ---------------------- SDIO registers bit mask ------------------------ */ + +/* --- CLKCR Register ---*/ + +/* CLKCR register clear mask */ +#define CLKCR_CLEAR_MASK ((uint32_t)0xFFFF8100) + +/* --- PWRCTRL Register ---*/ + +/* SDIO PWRCTRL Mask */ +#define PWR_PWRCTRL_MASK ((uint32_t)0xFFFFFFFC) + +/* --- DCTRL Register ---*/ + +/* SDIO DCTRL Clear Mask */ +#define DCTRL_CLEAR_MASK ((uint32_t)0xFFFFFF08) + +/* --- CMD Register ---*/ + +/* CMD Register clear mask */ +#define CMD_CLEAR_MASK ((uint32_t)0xFFFFF800) + +/* SDIO RESP Registers Address */ +#define SDIO_RESP_ADDR ((uint32_t)(SDIO_BASE + 0x14)) + +/** + * @} + */ + +/** @defgroup SDIO_Private_Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the SDIO peripheral registers to their default reset values. + * @param None + * @retval None + */ +void SDIO_DeInit(void) +{ + SDIO->POWER = 0x00000000; + SDIO->CLKCR = 0x00000000; + SDIO->ARG = 0x00000000; + SDIO->CMD = 0x00000000; + SDIO->DTIMER = 0x00000000; + SDIO->DLEN = 0x00000000; + SDIO->DCTRL = 0x00000000; + SDIO->ICR = 0x00C007FF; + SDIO->MASK = 0x00000000; +} + +/** + * @brief Initializes the SDIO peripheral according to the specified + * parameters in the SDIO_InitStruct. + * @param SDIO_InitStruct : pointer to a SDIO_InitTypeDef structure + * that contains the configuration information for the SDIO peripheral. + * @retval None + */ +void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge)); + assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass)); + assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave)); + assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide)); + assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl)); + +/*---------------------------- SDIO CLKCR Configuration ------------------------*/ + /* Get the SDIO CLKCR value */ + tmpreg = SDIO->CLKCR; + + /* Clear CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN bits */ + tmpreg &= CLKCR_CLEAR_MASK; + + /* Set CLKDIV bits according to SDIO_ClockDiv value */ + /* Set PWRSAV bit according to SDIO_ClockPowerSave value */ + /* Set BYPASS bit according to SDIO_ClockBypass value */ + /* Set WIDBUS bits according to SDIO_BusWide value */ + /* Set NEGEDGE bits according to SDIO_ClockEdge value */ + /* Set HWFC_EN bits according to SDIO_HardwareFlowControl value */ + tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv | SDIO_InitStruct->SDIO_ClockPowerSave | + SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide | + SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl); + + /* Write to SDIO CLKCR */ + SDIO->CLKCR = tmpreg; +} + +/** + * @brief Fills each SDIO_InitStruct member with its default value. + * @param SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which + * will be initialized. + * @retval None + */ +void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct) +{ + /* SDIO_InitStruct members default value */ + SDIO_InitStruct->SDIO_ClockDiv = 0x00; + SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising; + SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable; + SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; + SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b; + SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; +} + +/** + * @brief Enables or disables the SDIO Clock. + * @param NewState: new state of the SDIO Clock. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_ClockCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState; +} + +/** + * @brief Sets the power status of the controller. + * @param SDIO_PowerState: new state of the Power state. + * This parameter can be one of the following values: + * @arg SDIO_PowerState_OFF + * @arg SDIO_PowerState_ON + * @retval None + */ +void SDIO_SetPowerState(uint32_t SDIO_PowerState) +{ + /* Check the parameters */ + assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState)); + + SDIO->POWER &= PWR_PWRCTRL_MASK; + SDIO->POWER |= SDIO_PowerState; +} + +/** + * @brief Gets the power status of the controller. + * @param None + * @retval Power status of the controller. The returned value can + * be one of the following: + * - 0x00: Power OFF + * - 0x02: Power UP + * - 0x03: Power ON + */ +uint32_t SDIO_GetPowerState(void) +{ + return (SDIO->POWER & (~PWR_PWRCTRL_MASK)); +} + +/** + * @brief Enables or disables the SDIO interrupts. + * @param SDIO_IT: specifies the SDIO interrupt sources to be enabled or disabled. + * This parameter can be one or a combination of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide + * bus mode interrupt + * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_IT_TXACT: Data transmit in progress interrupt + * @arg SDIO_IT_RXACT: Data receive in progress interrupt + * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt + * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt + * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt + * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt + * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt + * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt + * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt + * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt + * @param NewState: new state of the specified SDIO interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SDIO_IT(SDIO_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the SDIO interrupts */ + SDIO->MASK |= SDIO_IT; + } + else + { + /* Disable the SDIO interrupts */ + SDIO->MASK &= ~SDIO_IT; + } +} + +/** + * @brief Enables or disables the SDIO DMA request. + * @param NewState: new state of the selected SDIO DMA request. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_DMACmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)NewState; +} + +/** + * @brief Initializes the SDIO Command according to the specified + * parameters in the SDIO_CmdInitStruct and send the command. + * @param SDIO_CmdInitStruct : pointer to a SDIO_CmdInitTypeDef + * structure that contains the configuration information for the SDIO command. + * @retval None + */ +void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex)); + assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response)); + assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait)); + assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM)); + +/*---------------------------- SDIO ARG Configuration ------------------------*/ + /* Set the SDIO Argument value */ + SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument; + +/*---------------------------- SDIO CMD Configuration ------------------------*/ + /* Get the SDIO CMD value */ + tmpreg = SDIO->CMD; + /* Clear CMDINDEX, WAITRESP, WAITINT, WAITPEND, CPSMEN bits */ + tmpreg &= CMD_CLEAR_MASK; + /* Set CMDINDEX bits according to SDIO_CmdIndex value */ + /* Set WAITRESP bits according to SDIO_Response value */ + /* Set WAITINT and WAITPEND bits according to SDIO_Wait value */ + /* Set CPSMEN bits according to SDIO_CPSM value */ + tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response + | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM; + + /* Write to SDIO CMD */ + SDIO->CMD = tmpreg; +} + +/** + * @brief Fills each SDIO_CmdInitStruct member with its default value. + * @param SDIO_CmdInitStruct: pointer to an SDIO_CmdInitTypeDef + * structure which will be initialized. + * @retval None + */ +void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct) +{ + /* SDIO_CmdInitStruct members default value */ + SDIO_CmdInitStruct->SDIO_Argument = 0x00; + SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00; + SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No; + SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No; + SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable; +} + +/** + * @brief Returns command index of last command for which response received. + * @param None + * @retval Returns the command index of the last command response received. + */ +uint8_t SDIO_GetCommandResponse(void) +{ + return (uint8_t)(SDIO->RESPCMD); +} + +/** + * @brief Returns response received from the card for the last command. + * @param SDIO_RESP: Specifies the SDIO response register. + * This parameter can be one of the following values: + * @arg SDIO_RESP1: Response Register 1 + * @arg SDIO_RESP2: Response Register 2 + * @arg SDIO_RESP3: Response Register 3 + * @arg SDIO_RESP4: Response Register 4 + * @retval The Corresponding response register value. + */ +uint32_t SDIO_GetResponse(uint32_t SDIO_RESP) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_RESP(SDIO_RESP)); + + tmp = SDIO_RESP_ADDR + SDIO_RESP; + + return (*(__IO uint32_t *) tmp); +} + +/** + * @brief Initializes the SDIO data path according to the specified + * parameters in the SDIO_DataInitStruct. + * @param SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef structure that + * contains the configuration information for the SDIO command. + * @retval None + */ +void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength)); + assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSize)); + assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferDir)); + assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_TransferMode)); + assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM)); + +/*---------------------------- SDIO DTIMER Configuration ---------------------*/ + /* Set the SDIO Data TimeOut value */ + SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut; + +/*---------------------------- SDIO DLEN Configuration -----------------------*/ + /* Set the SDIO DataLength value */ + SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength; + +/*---------------------------- SDIO DCTRL Configuration ----------------------*/ + /* Get the SDIO DCTRL value */ + tmpreg = SDIO->DCTRL; + /* Clear DEN, DTMODE, DTDIR and DBCKSIZE bits */ + tmpreg &= DCTRL_CLEAR_MASK; + /* Set DEN bit according to SDIO_DPSM value */ + /* Set DTMODE bit according to SDIO_TransferMode value */ + /* Set DTDIR bit according to SDIO_TransferDir value */ + /* Set DBCKSIZE bits according to SDIO_DataBlockSize value */ + tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir + | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM; + + /* Write to SDIO DCTRL */ + SDIO->DCTRL = tmpreg; +} + +/** + * @brief Fills each SDIO_DataInitStruct member with its default value. + * @param SDIO_DataInitStruct: pointer to an SDIO_DataInitTypeDef structure which + * will be initialized. + * @retval None + */ +void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct) +{ + /* SDIO_DataInitStruct members default value */ + SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF; + SDIO_DataInitStruct->SDIO_DataLength = 0x00; + SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b; + SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard; + SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block; + SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable; +} + +/** + * @brief Returns number of remaining data bytes to be transferred. + * @param None + * @retval Number of remaining data bytes to be transferred + */ +uint32_t SDIO_GetDataCounter(void) +{ + return SDIO->DCOUNT; +} + +/** + * @brief Read one data word from Rx FIFO. + * @param None + * @retval Data received + */ +uint32_t SDIO_ReadData(void) +{ + return SDIO->FIFO; +} + +/** + * @brief Write one data word to Tx FIFO. + * @param Data: 32-bit data word to write. + * @retval None + */ +void SDIO_WriteData(uint32_t Data) +{ + SDIO->FIFO = Data; +} + +/** + * @brief Returns the number of words left to be written to or read from FIFO. + * @param None + * @retval Remaining number of words. + */ +uint32_t SDIO_GetFIFOCount(void) +{ + return SDIO->FIFOCNT; +} + +/** + * @brief Starts the SD I/O Read Wait operation. + * @param NewState: new state of the Start SDIO Read Wait operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_StartSDIOReadWait(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_RWSTART_BB = (uint32_t) NewState; +} + +/** + * @brief Stops the SD I/O Read Wait operation. + * @param NewState: new state of the Stop SDIO Read Wait operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_StopSDIOReadWait(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_RWSTOP_BB = (uint32_t) NewState; +} + +/** + * @brief Sets one of the two options of inserting read wait interval. + * @param SDIO_ReadWaitMode: SD I/O Read Wait operation mode. + * This parametre can be: + * @arg SDIO_ReadWaitMode_CLK: Read Wait control by stopping SDIOCLK + * @arg SDIO_ReadWaitMode_DATA2: Read Wait control using SDIO_DATA2 + * @retval None + */ +void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode) +{ + /* Check the parameters */ + assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode)); + + *(__IO uint32_t *) DCTRL_RWMOD_BB = SDIO_ReadWaitMode; +} + +/** + * @brief Enables or disables the SD I/O Mode Operation. + * @param NewState: new state of SDIO specific operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SetSDIOOperation(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_SDIOEN_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the SD I/O Mode suspend command sending. + * @param NewState: new state of the SD I/O Mode suspend command. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SendSDIOSuspendCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_SDIOSUSPEND_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the command completion signal. + * @param NewState: new state of command completion signal. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_CommandCompletionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_ENCMDCOMPL_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the CE-ATA interrupt. + * @param NewState: new state of CE-ATA interrupt. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_CEATAITCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_NIEN_BB = (uint32_t)((~((uint32_t)NewState)) & ((uint32_t)0x1)); +} + +/** + * @brief Sends CE-ATA command (CMD61). + * @param NewState: new state of CE-ATA command. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SendCEATACmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_ATACMD_BB = (uint32_t)NewState; +} + +/** + * @brief Checks whether the specified SDIO flag is set or not. + * @param SDIO_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) + * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) + * @arg SDIO_FLAG_CTIMEOUT: Command response timeout + * @arg SDIO_FLAG_DTIMEOUT: Data timeout + * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error + * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error + * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) + * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) + * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) + * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide + * bus mode. + * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) + * @arg SDIO_FLAG_CMDACT: Command transfer in progress + * @arg SDIO_FLAG_TXACT: Data transmit in progress + * @arg SDIO_FLAG_RXACT: Data receive in progress + * @arg SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty + * @arg SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full + * @arg SDIO_FLAG_TXFIFOF: Transmit FIFO full + * @arg SDIO_FLAG_RXFIFOF: Receive FIFO full + * @arg SDIO_FLAG_TXFIFOE: Transmit FIFO empty + * @arg SDIO_FLAG_RXFIFOE: Receive FIFO empty + * @arg SDIO_FLAG_TXDAVL: Data available in transmit FIFO + * @arg SDIO_FLAG_RXDAVL: Data available in receive FIFO + * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received + * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 + * @retval The new state of SDIO_FLAG (SET or RESET). + */ +FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_SDIO_FLAG(SDIO_FLAG)); + + if ((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the SDIO's pending flags. + * @param SDIO_FLAG: specifies the flag to clear. + * This parameter can be one or a combination of the following values: + * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) + * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) + * @arg SDIO_FLAG_CTIMEOUT: Command response timeout + * @arg SDIO_FLAG_DTIMEOUT: Data timeout + * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error + * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error + * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) + * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) + * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) + * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide + * bus mode + * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) + * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received + * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 + * @retval None + */ +void SDIO_ClearFlag(uint32_t SDIO_FLAG) +{ + /* Check the parameters */ + assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG)); + + SDIO->ICR = SDIO_FLAG; +} + +/** + * @brief Checks whether the specified SDIO interrupt has occurred or not. + * @param SDIO_IT: specifies the SDIO interrupt source to check. + * This parameter can be one of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide + * bus mode interrupt + * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_IT_TXACT: Data transmit in progress interrupt + * @arg SDIO_IT_RXACT: Data receive in progress interrupt + * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt + * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt + * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt + * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt + * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt + * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt + * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt + * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt + * @retval The new state of SDIO_IT (SET or RESET). + */ +ITStatus SDIO_GetITStatus(uint32_t SDIO_IT) +{ + ITStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_SDIO_GET_IT(SDIO_IT)); + if ((SDIO->STA & SDIO_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the SDIO’s interrupt pending bits. + * @param SDIO_IT: specifies the interrupt pending bit to clear. + * This parameter can be one or a combination of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide + * bus mode interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 + * @retval None + */ +void SDIO_ClearITPendingBit(uint32_t SDIO_IT) +{ + /* Check the parameters */ + assert_param(IS_SDIO_CLEAR_IT(SDIO_IT)); + + SDIO->ICR = SDIO_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.h new file mode 100644 index 0000000..d15556c --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_sdio.h @@ -0,0 +1,530 @@ +/** + ****************************************************************************** + * @file stm32f10x_sdio.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the SDIO firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_SDIO_H +#define __STM32F10x_SDIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup SDIO + * @{ + */ + +/** @defgroup SDIO_Exported_Types + * @{ + */ + +typedef struct +{ + uint32_t SDIO_ClockEdge; /*!< Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref SDIO_Clock_Edge */ + + uint32_t SDIO_ClockBypass; /*!< Specifies whether the SDIO Clock divider bypass is + enabled or disabled. + This parameter can be a value of @ref SDIO_Clock_Bypass */ + + uint32_t SDIO_ClockPowerSave; /*!< Specifies whether SDIO Clock output is enabled or + disabled when the bus is idle. + This parameter can be a value of @ref SDIO_Clock_Power_Save */ + + uint32_t SDIO_BusWide; /*!< Specifies the SDIO bus width. + This parameter can be a value of @ref SDIO_Bus_Wide */ + + uint32_t SDIO_HardwareFlowControl; /*!< Specifies whether the SDIO hardware flow control is enabled or disabled. + This parameter can be a value of @ref SDIO_Hardware_Flow_Control */ + + uint8_t SDIO_ClockDiv; /*!< Specifies the clock frequency of the SDIO controller. + This parameter can be a value between 0x00 and 0xFF. */ + +} SDIO_InitTypeDef; + +typedef struct +{ + uint32_t SDIO_Argument; /*!< Specifies the SDIO command argument which is sent + to a card as part of a command message. If a command + contains an argument, it must be loaded into this register + before writing the command to the command register */ + + uint32_t SDIO_CmdIndex; /*!< Specifies the SDIO command index. It must be lower than 0x40. */ + + uint32_t SDIO_Response; /*!< Specifies the SDIO response type. + This parameter can be a value of @ref SDIO_Response_Type */ + + uint32_t SDIO_Wait; /*!< Specifies whether SDIO wait-for-interrupt request is enabled or disabled. + This parameter can be a value of @ref SDIO_Wait_Interrupt_State */ + + uint32_t SDIO_CPSM; /*!< Specifies whether SDIO Command path state machine (CPSM) + is enabled or disabled. + This parameter can be a value of @ref SDIO_CPSM_State */ +} SDIO_CmdInitTypeDef; + +typedef struct +{ + uint32_t SDIO_DataTimeOut; /*!< Specifies the data timeout period in card bus clock periods. */ + + uint32_t SDIO_DataLength; /*!< Specifies the number of data bytes to be transferred. */ + + uint32_t SDIO_DataBlockSize; /*!< Specifies the data block size for block transfer. + This parameter can be a value of @ref SDIO_Data_Block_Size */ + + uint32_t SDIO_TransferDir; /*!< Specifies the data transfer direction, whether the transfer + is a read or write. + This parameter can be a value of @ref SDIO_Transfer_Direction */ + + uint32_t SDIO_TransferMode; /*!< Specifies whether data transfer is in stream or block mode. + This parameter can be a value of @ref SDIO_Transfer_Type */ + + uint32_t SDIO_DPSM; /*!< Specifies whether SDIO Data path state machine (DPSM) + is enabled or disabled. + This parameter can be a value of @ref SDIO_DPSM_State */ +} SDIO_DataInitTypeDef; + +/** + * @} + */ + +/** @defgroup SDIO_Exported_Constants + * @{ + */ + +/** @defgroup SDIO_Clock_Edge + * @{ + */ + +#define SDIO_ClockEdge_Rising ((uint32_t)0x00000000) +#define SDIO_ClockEdge_Falling ((uint32_t)0x00002000) +#define IS_SDIO_CLOCK_EDGE(EDGE) (((EDGE) == SDIO_ClockEdge_Rising) || \ + ((EDGE) == SDIO_ClockEdge_Falling)) +/** + * @} + */ + +/** @defgroup SDIO_Clock_Bypass + * @{ + */ + +#define SDIO_ClockBypass_Disable ((uint32_t)0x00000000) +#define SDIO_ClockBypass_Enable ((uint32_t)0x00000400) +#define IS_SDIO_CLOCK_BYPASS(BYPASS) (((BYPASS) == SDIO_ClockBypass_Disable) || \ + ((BYPASS) == SDIO_ClockBypass_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Clock_Power_Save + * @{ + */ + +#define SDIO_ClockPowerSave_Disable ((uint32_t)0x00000000) +#define SDIO_ClockPowerSave_Enable ((uint32_t)0x00000200) +#define IS_SDIO_CLOCK_POWER_SAVE(SAVE) (((SAVE) == SDIO_ClockPowerSave_Disable) || \ + ((SAVE) == SDIO_ClockPowerSave_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Bus_Wide + * @{ + */ + +#define SDIO_BusWide_1b ((uint32_t)0x00000000) +#define SDIO_BusWide_4b ((uint32_t)0x00000800) +#define SDIO_BusWide_8b ((uint32_t)0x00001000) +#define IS_SDIO_BUS_WIDE(WIDE) (((WIDE) == SDIO_BusWide_1b) || ((WIDE) == SDIO_BusWide_4b) || \ + ((WIDE) == SDIO_BusWide_8b)) + +/** + * @} + */ + +/** @defgroup SDIO_Hardware_Flow_Control + * @{ + */ + +#define SDIO_HardwareFlowControl_Disable ((uint32_t)0x00000000) +#define SDIO_HardwareFlowControl_Enable ((uint32_t)0x00004000) +#define IS_SDIO_HARDWARE_FLOW_CONTROL(CONTROL) (((CONTROL) == SDIO_HardwareFlowControl_Disable) || \ + ((CONTROL) == SDIO_HardwareFlowControl_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Power_State + * @{ + */ + +#define SDIO_PowerState_OFF ((uint32_t)0x00000000) +#define SDIO_PowerState_ON ((uint32_t)0x00000003) +#define IS_SDIO_POWER_STATE(STATE) (((STATE) == SDIO_PowerState_OFF) || ((STATE) == SDIO_PowerState_ON)) +/** + * @} + */ + + +/** @defgroup SDIO_Interrupt_soucres + * @{ + */ + +#define SDIO_IT_CCRCFAIL ((uint32_t)0x00000001) +#define SDIO_IT_DCRCFAIL ((uint32_t)0x00000002) +#define SDIO_IT_CTIMEOUT ((uint32_t)0x00000004) +#define SDIO_IT_DTIMEOUT ((uint32_t)0x00000008) +#define SDIO_IT_TXUNDERR ((uint32_t)0x00000010) +#define SDIO_IT_RXOVERR ((uint32_t)0x00000020) +#define SDIO_IT_CMDREND ((uint32_t)0x00000040) +#define SDIO_IT_CMDSENT ((uint32_t)0x00000080) +#define SDIO_IT_DATAEND ((uint32_t)0x00000100) +#define SDIO_IT_STBITERR ((uint32_t)0x00000200) +#define SDIO_IT_DBCKEND ((uint32_t)0x00000400) +#define SDIO_IT_CMDACT ((uint32_t)0x00000800) +#define SDIO_IT_TXACT ((uint32_t)0x00001000) +#define SDIO_IT_RXACT ((uint32_t)0x00002000) +#define SDIO_IT_TXFIFOHE ((uint32_t)0x00004000) +#define SDIO_IT_RXFIFOHF ((uint32_t)0x00008000) +#define SDIO_IT_TXFIFOF ((uint32_t)0x00010000) +#define SDIO_IT_RXFIFOF ((uint32_t)0x00020000) +#define SDIO_IT_TXFIFOE ((uint32_t)0x00040000) +#define SDIO_IT_RXFIFOE ((uint32_t)0x00080000) +#define SDIO_IT_TXDAVL ((uint32_t)0x00100000) +#define SDIO_IT_RXDAVL ((uint32_t)0x00200000) +#define SDIO_IT_SDIOIT ((uint32_t)0x00400000) +#define SDIO_IT_CEATAEND ((uint32_t)0x00800000) +#define IS_SDIO_IT(IT) ((((IT) & (uint32_t)0xFF000000) == 0x00) && ((IT) != (uint32_t)0x00)) +/** + * @} + */ + +/** @defgroup SDIO_Command_Index + * @{ + */ + +#define IS_SDIO_CMD_INDEX(INDEX) ((INDEX) < 0x40) +/** + * @} + */ + +/** @defgroup SDIO_Response_Type + * @{ + */ + +#define SDIO_Response_No ((uint32_t)0x00000000) +#define SDIO_Response_Short ((uint32_t)0x00000040) +#define SDIO_Response_Long ((uint32_t)0x000000C0) +#define IS_SDIO_RESPONSE(RESPONSE) (((RESPONSE) == SDIO_Response_No) || \ + ((RESPONSE) == SDIO_Response_Short) || \ + ((RESPONSE) == SDIO_Response_Long)) +/** + * @} + */ + +/** @defgroup SDIO_Wait_Interrupt_State + * @{ + */ + +#define SDIO_Wait_No ((uint32_t)0x00000000) /*!< SDIO No Wait, TimeOut is enabled */ +#define SDIO_Wait_IT ((uint32_t)0x00000100) /*!< SDIO Wait Interrupt Request */ +#define SDIO_Wait_Pend ((uint32_t)0x00000200) /*!< SDIO Wait End of transfer */ +#define IS_SDIO_WAIT(WAIT) (((WAIT) == SDIO_Wait_No) || ((WAIT) == SDIO_Wait_IT) || \ + ((WAIT) == SDIO_Wait_Pend)) +/** + * @} + */ + +/** @defgroup SDIO_CPSM_State + * @{ + */ + +#define SDIO_CPSM_Disable ((uint32_t)0x00000000) +#define SDIO_CPSM_Enable ((uint32_t)0x00000400) +#define IS_SDIO_CPSM(CPSM) (((CPSM) == SDIO_CPSM_Enable) || ((CPSM) == SDIO_CPSM_Disable)) +/** + * @} + */ + +/** @defgroup SDIO_Response_Registers + * @{ + */ + +#define SDIO_RESP1 ((uint32_t)0x00000000) +#define SDIO_RESP2 ((uint32_t)0x00000004) +#define SDIO_RESP3 ((uint32_t)0x00000008) +#define SDIO_RESP4 ((uint32_t)0x0000000C) +#define IS_SDIO_RESP(RESP) (((RESP) == SDIO_RESP1) || ((RESP) == SDIO_RESP2) || \ + ((RESP) == SDIO_RESP3) || ((RESP) == SDIO_RESP4)) +/** + * @} + */ + +/** @defgroup SDIO_Data_Length + * @{ + */ + +#define IS_SDIO_DATA_LENGTH(LENGTH) ((LENGTH) <= 0x01FFFFFF) +/** + * @} + */ + +/** @defgroup SDIO_Data_Block_Size + * @{ + */ + +#define SDIO_DataBlockSize_1b ((uint32_t)0x00000000) +#define SDIO_DataBlockSize_2b ((uint32_t)0x00000010) +#define SDIO_DataBlockSize_4b ((uint32_t)0x00000020) +#define SDIO_DataBlockSize_8b ((uint32_t)0x00000030) +#define SDIO_DataBlockSize_16b ((uint32_t)0x00000040) +#define SDIO_DataBlockSize_32b ((uint32_t)0x00000050) +#define SDIO_DataBlockSize_64b ((uint32_t)0x00000060) +#define SDIO_DataBlockSize_128b ((uint32_t)0x00000070) +#define SDIO_DataBlockSize_256b ((uint32_t)0x00000080) +#define SDIO_DataBlockSize_512b ((uint32_t)0x00000090) +#define SDIO_DataBlockSize_1024b ((uint32_t)0x000000A0) +#define SDIO_DataBlockSize_2048b ((uint32_t)0x000000B0) +#define SDIO_DataBlockSize_4096b ((uint32_t)0x000000C0) +#define SDIO_DataBlockSize_8192b ((uint32_t)0x000000D0) +#define SDIO_DataBlockSize_16384b ((uint32_t)0x000000E0) +#define IS_SDIO_BLOCK_SIZE(SIZE) (((SIZE) == SDIO_DataBlockSize_1b) || \ + ((SIZE) == SDIO_DataBlockSize_2b) || \ + ((SIZE) == SDIO_DataBlockSize_4b) || \ + ((SIZE) == SDIO_DataBlockSize_8b) || \ + ((SIZE) == SDIO_DataBlockSize_16b) || \ + ((SIZE) == SDIO_DataBlockSize_32b) || \ + ((SIZE) == SDIO_DataBlockSize_64b) || \ + ((SIZE) == SDIO_DataBlockSize_128b) || \ + ((SIZE) == SDIO_DataBlockSize_256b) || \ + ((SIZE) == SDIO_DataBlockSize_512b) || \ + ((SIZE) == SDIO_DataBlockSize_1024b) || \ + ((SIZE) == SDIO_DataBlockSize_2048b) || \ + ((SIZE) == SDIO_DataBlockSize_4096b) || \ + ((SIZE) == SDIO_DataBlockSize_8192b) || \ + ((SIZE) == SDIO_DataBlockSize_16384b)) +/** + * @} + */ + +/** @defgroup SDIO_Transfer_Direction + * @{ + */ + +#define SDIO_TransferDir_ToCard ((uint32_t)0x00000000) +#define SDIO_TransferDir_ToSDIO ((uint32_t)0x00000002) +#define IS_SDIO_TRANSFER_DIR(DIR) (((DIR) == SDIO_TransferDir_ToCard) || \ + ((DIR) == SDIO_TransferDir_ToSDIO)) +/** + * @} + */ + +/** @defgroup SDIO_Transfer_Type + * @{ + */ + +#define SDIO_TransferMode_Block ((uint32_t)0x00000000) +#define SDIO_TransferMode_Stream ((uint32_t)0x00000004) +#define IS_SDIO_TRANSFER_MODE(MODE) (((MODE) == SDIO_TransferMode_Stream) || \ + ((MODE) == SDIO_TransferMode_Block)) +/** + * @} + */ + +/** @defgroup SDIO_DPSM_State + * @{ + */ + +#define SDIO_DPSM_Disable ((uint32_t)0x00000000) +#define SDIO_DPSM_Enable ((uint32_t)0x00000001) +#define IS_SDIO_DPSM(DPSM) (((DPSM) == SDIO_DPSM_Enable) || ((DPSM) == SDIO_DPSM_Disable)) +/** + * @} + */ + +/** @defgroup SDIO_Flags + * @{ + */ + +#define SDIO_FLAG_CCRCFAIL ((uint32_t)0x00000001) +#define SDIO_FLAG_DCRCFAIL ((uint32_t)0x00000002) +#define SDIO_FLAG_CTIMEOUT ((uint32_t)0x00000004) +#define SDIO_FLAG_DTIMEOUT ((uint32_t)0x00000008) +#define SDIO_FLAG_TXUNDERR ((uint32_t)0x00000010) +#define SDIO_FLAG_RXOVERR ((uint32_t)0x00000020) +#define SDIO_FLAG_CMDREND ((uint32_t)0x00000040) +#define SDIO_FLAG_CMDSENT ((uint32_t)0x00000080) +#define SDIO_FLAG_DATAEND ((uint32_t)0x00000100) +#define SDIO_FLAG_STBITERR ((uint32_t)0x00000200) +#define SDIO_FLAG_DBCKEND ((uint32_t)0x00000400) +#define SDIO_FLAG_CMDACT ((uint32_t)0x00000800) +#define SDIO_FLAG_TXACT ((uint32_t)0x00001000) +#define SDIO_FLAG_RXACT ((uint32_t)0x00002000) +#define SDIO_FLAG_TXFIFOHE ((uint32_t)0x00004000) +#define SDIO_FLAG_RXFIFOHF ((uint32_t)0x00008000) +#define SDIO_FLAG_TXFIFOF ((uint32_t)0x00010000) +#define SDIO_FLAG_RXFIFOF ((uint32_t)0x00020000) +#define SDIO_FLAG_TXFIFOE ((uint32_t)0x00040000) +#define SDIO_FLAG_RXFIFOE ((uint32_t)0x00080000) +#define SDIO_FLAG_TXDAVL ((uint32_t)0x00100000) +#define SDIO_FLAG_RXDAVL ((uint32_t)0x00200000) +#define SDIO_FLAG_SDIOIT ((uint32_t)0x00400000) +#define SDIO_FLAG_CEATAEND ((uint32_t)0x00800000) +#define IS_SDIO_FLAG(FLAG) (((FLAG) == SDIO_FLAG_CCRCFAIL) || \ + ((FLAG) == SDIO_FLAG_DCRCFAIL) || \ + ((FLAG) == SDIO_FLAG_CTIMEOUT) || \ + ((FLAG) == SDIO_FLAG_DTIMEOUT) || \ + ((FLAG) == SDIO_FLAG_TXUNDERR) || \ + ((FLAG) == SDIO_FLAG_RXOVERR) || \ + ((FLAG) == SDIO_FLAG_CMDREND) || \ + ((FLAG) == SDIO_FLAG_CMDSENT) || \ + ((FLAG) == SDIO_FLAG_DATAEND) || \ + ((FLAG) == SDIO_FLAG_STBITERR) || \ + ((FLAG) == SDIO_FLAG_DBCKEND) || \ + ((FLAG) == SDIO_FLAG_CMDACT) || \ + ((FLAG) == SDIO_FLAG_TXACT) || \ + ((FLAG) == SDIO_FLAG_RXACT) || \ + ((FLAG) == SDIO_FLAG_TXFIFOHE) || \ + ((FLAG) == SDIO_FLAG_RXFIFOHF) || \ + ((FLAG) == SDIO_FLAG_TXFIFOF) || \ + ((FLAG) == SDIO_FLAG_RXFIFOF) || \ + ((FLAG) == SDIO_FLAG_TXFIFOE) || \ + ((FLAG) == SDIO_FLAG_RXFIFOE) || \ + ((FLAG) == SDIO_FLAG_TXDAVL) || \ + ((FLAG) == SDIO_FLAG_RXDAVL) || \ + ((FLAG) == SDIO_FLAG_SDIOIT) || \ + ((FLAG) == SDIO_FLAG_CEATAEND)) + +#define IS_SDIO_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFF3FF800) == 0x00) && ((FLAG) != (uint32_t)0x00)) + +#define IS_SDIO_GET_IT(IT) (((IT) == SDIO_IT_CCRCFAIL) || \ + ((IT) == SDIO_IT_DCRCFAIL) || \ + ((IT) == SDIO_IT_CTIMEOUT) || \ + ((IT) == SDIO_IT_DTIMEOUT) || \ + ((IT) == SDIO_IT_TXUNDERR) || \ + ((IT) == SDIO_IT_RXOVERR) || \ + ((IT) == SDIO_IT_CMDREND) || \ + ((IT) == SDIO_IT_CMDSENT) || \ + ((IT) == SDIO_IT_DATAEND) || \ + ((IT) == SDIO_IT_STBITERR) || \ + ((IT) == SDIO_IT_DBCKEND) || \ + ((IT) == SDIO_IT_CMDACT) || \ + ((IT) == SDIO_IT_TXACT) || \ + ((IT) == SDIO_IT_RXACT) || \ + ((IT) == SDIO_IT_TXFIFOHE) || \ + ((IT) == SDIO_IT_RXFIFOHF) || \ + ((IT) == SDIO_IT_TXFIFOF) || \ + ((IT) == SDIO_IT_RXFIFOF) || \ + ((IT) == SDIO_IT_TXFIFOE) || \ + ((IT) == SDIO_IT_RXFIFOE) || \ + ((IT) == SDIO_IT_TXDAVL) || \ + ((IT) == SDIO_IT_RXDAVL) || \ + ((IT) == SDIO_IT_SDIOIT) || \ + ((IT) == SDIO_IT_CEATAEND)) + +#define IS_SDIO_CLEAR_IT(IT) ((((IT) & (uint32_t)0xFF3FF800) == 0x00) && ((IT) != (uint32_t)0x00)) + +/** + * @} + */ + +/** @defgroup SDIO_Read_Wait_Mode + * @{ + */ + +#define SDIO_ReadWaitMode_CLK ((uint32_t)0x00000001) +#define SDIO_ReadWaitMode_DATA2 ((uint32_t)0x00000000) +#define IS_SDIO_READWAIT_MODE(MODE) (((MODE) == SDIO_ReadWaitMode_CLK) || \ + ((MODE) == SDIO_ReadWaitMode_DATA2)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup SDIO_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SDIO_Exported_Functions + * @{ + */ + +void SDIO_DeInit(void); +void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct); +void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct); +void SDIO_ClockCmd(FunctionalState NewState); +void SDIO_SetPowerState(uint32_t SDIO_PowerState); +uint32_t SDIO_GetPowerState(void); +void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState); +void SDIO_DMACmd(FunctionalState NewState); +void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct); +void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct); +uint8_t SDIO_GetCommandResponse(void); +uint32_t SDIO_GetResponse(uint32_t SDIO_RESP); +void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct); +void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct); +uint32_t SDIO_GetDataCounter(void); +uint32_t SDIO_ReadData(void); +void SDIO_WriteData(uint32_t Data); +uint32_t SDIO_GetFIFOCount(void); +void SDIO_StartSDIOReadWait(FunctionalState NewState); +void SDIO_StopSDIOReadWait(FunctionalState NewState); +void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode); +void SDIO_SetSDIOOperation(FunctionalState NewState); +void SDIO_SendSDIOSuspendCmd(FunctionalState NewState); +void SDIO_CommandCompletionCmd(FunctionalState NewState); +void SDIO_CEATAITCmd(FunctionalState NewState); +void SDIO_SendCEATACmd(FunctionalState NewState); +FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG); +void SDIO_ClearFlag(uint32_t SDIO_FLAG); +ITStatus SDIO_GetITStatus(uint32_t SDIO_IT); +void SDIO_ClearITPendingBit(uint32_t SDIO_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_SDIO_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.c new file mode 100644 index 0000000..badd23d --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.c @@ -0,0 +1,907 @@ +/** + ****************************************************************************** + * @file stm32f10x_spi.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the SPI firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_spi.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup SPI + * @brief SPI driver modules + * @{ + */ + +/** @defgroup SPI_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + + +/** @defgroup SPI_Private_Defines + * @{ + */ + +/* SPI SPE mask */ +#define CR1_SPE_Set ((uint16_t)0x0040) +#define CR1_SPE_Reset ((uint16_t)0xFFBF) + +/* I2S I2SE mask */ +#define I2SCFGR_I2SE_Set ((uint16_t)0x0400) +#define I2SCFGR_I2SE_Reset ((uint16_t)0xFBFF) + +/* SPI CRCNext mask */ +#define CR1_CRCNext_Set ((uint16_t)0x1000) + +/* SPI CRCEN mask */ +#define CR1_CRCEN_Set ((uint16_t)0x2000) +#define CR1_CRCEN_Reset ((uint16_t)0xDFFF) + +/* SPI SSOE mask */ +#define CR2_SSOE_Set ((uint16_t)0x0004) +#define CR2_SSOE_Reset ((uint16_t)0xFFFB) + +/* SPI registers Masks */ +#define CR1_CLEAR_Mask ((uint16_t)0x3040) +#define I2SCFGR_CLEAR_Mask ((uint16_t)0xF040) + +/* SPI or I2S mode selection masks */ +#define SPI_Mode_Select ((uint16_t)0xF7FF) +#define I2S_Mode_Select ((uint16_t)0x0800) + +/* I2S clock source selection masks */ +#define I2S2_CLOCK_SRC ((uint32_t)(0x00020000)) +#define I2S3_CLOCK_SRC ((uint32_t)(0x00040000)) +#define I2S_MUL_MASK ((uint32_t)(0x0000F000)) +#define I2S_DIV_MASK ((uint32_t)(0x000000F0)) + +/** + * @} + */ + +/** @defgroup SPI_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the SPIx peripheral registers to their default + * reset values (Affects also the I2Ss). + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @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); + } + else + { + if (SPIx == SPI3) + { + /* Enable SPI3 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE); + /* Release SPI3 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE); + } + } +} + +/** + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the SPI_InitStruct. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @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_DATASIZE(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, MSTR, CPOL and CPHA bits */ + tmpreg &= CR1_CLEAR_Mask; + /* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler + master/salve mode, CPOL and CPHA */ + /* Set BIDImode, BIDIOE and RxONLY bits according to SPI_Direction value */ + /* Set SSM, SSI and MSTR bits according to SPI_Mode and 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_Mode | + SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL | + SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS | + SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit); + /* Write to SPIx CR1 */ + SPIx->CR1 = tmpreg; + + /* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */ + SPIx->I2SCFGR &= SPI_Mode_Select; + +/*---------------------------- SPIx CRCPOLY Configuration --------------------*/ + /* Write to SPIx CRCPOLY */ + SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial; +} + +/** + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the I2S_InitStruct. + * @param SPIx: where x can be 2 or 3 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 + * The 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_23_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; + } + + /* Get the I2S clock source mask depending on the peripheral number */ + if(((uint32_t)SPIx) == SPI2_BASE) + { + /* The mask is relative to I2S2 */ + tmp = I2S2_CLOCK_SRC; + } + else + { + /* The mask is relative to I2S3 */ + tmp = I2S3_CLOCK_SRC; + } + + /* Check the I2S clock source configuration depending on the Device: + Only Connectivity line devices have the PLL3 VCO clock */ +#ifdef STM32F10X_CL + if((RCC->CFGR2 & tmp) != 0) + { + /* Get the configuration bits of RCC PLL3 multiplier */ + tmp = (uint32_t)((RCC->CFGR2 & I2S_MUL_MASK) >> 12); + + /* Get the value of the PLL3 multiplier */ + if((tmp > 5) && (tmp < 15)) + { + /* Multplier is between 8 and 14 (value 15 is forbidden) */ + tmp += 2; + } + else + { + if (tmp == 15) + { + /* Multiplier is 20 */ + tmp = 20; + } + } + /* Get the PREDIV2 value */ + sourceclock = (uint32_t)(((RCC->CFGR2 & I2S_DIV_MASK) >> 4) + 1); + + /* Calculate the Source Clock frequency based on PLL3 and PREDIV2 values */ + sourceclock = (uint32_t) ((HSE_Value / sourceclock) * tmp * 2); + } + else + { + /* 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; + } +#else /* STM32F10X_HD */ + /* 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; +#endif /* STM32F10X_CL */ + + /* Compute the Real divider depending on the MCLK output state with a flaoting 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 flaoting 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)(I2S_Mode_Select | (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 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 Fills each I2S_InitStruct member with its default value. + * @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 Enables or disables the specified SPI peripheral. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @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 |= CR1_SPE_Set; + } + else + { + /* Disable the selected SPI peripheral */ + SPIx->CR1 &= CR1_SPE_Reset; + } +} + +/** + * @brief Enables or disables the specified SPI peripheral (in I2S mode). + * @param SPIx: where x can be 2 or 3 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_23_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI peripheral (in I2S mode) */ + SPIx->I2SCFGR |= I2SCFGR_I2SE_Set; + } + else + { + /* Disable the selected SPI peripheral (in I2S mode) */ + SPIx->I2SCFGR &= I2SCFGR_I2SE_Reset; + } +} + +/** + * @brief Enables or disables the specified SPI/I2S interrupts. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_IT: specifies the SPI/I2S 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/I2S 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/I2S 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/I2S interrupt */ + SPIx->CR2 |= itmask; + } + else + { + /* Disable the selected SPI/I2S interrupt */ + SPIx->CR2 &= (uint16_t)~itmask; + } +} + +/** + * @brief Enables or disables the SPIx/I2Sx DMA interface. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_DMAReq: specifies the SPI/I2S 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/I2S 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_DMAREQ(SPI_I2S_DMAReq)); + if (NewState != DISABLE) + { + /* Enable the selected SPI/I2S DMA requests */ + SPIx->CR2 |= SPI_I2S_DMAReq; + } + else + { + /* Disable the selected SPI/I2S DMA requests */ + SPIx->CR2 &= (uint16_t)~SPI_I2S_DMAReq; + } +} + +/** + * @brief Transmits a Data through the SPIx/I2Sx peripheral. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param Data : Data to be transmitted. + * @retval None + */ +void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Write in the DR register the data to be sent */ + SPIx->DR = Data; +} + +/** + * @brief Returns the most recent received data by the SPIx/I2Sx peripheral. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @retval The value of the received data. + */ +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Return the data in the DR register */ + return SPIx->DR; +} + +/** + * @brief Configures internally by software the NSS pin for the selected SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @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. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @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 |= CR2_SSOE_Set; + } + else + { + /* Disable the selected SPI SS output */ + SPIx->CR2 &= CR2_SSOE_Reset; + } +} + +/** + * @brief Configures the data size for the selected SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_DataSize: specifies the SPI data size. + * This parameter can be one of the following values: + * @arg SPI_DataSize_16b: Set data frame format to 16bit + * @arg SPI_DataSize_8b: Set data frame format to 8bit + * @retval None + */ +void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_DATASIZE(SPI_DataSize)); + /* Clear DFF bit */ + SPIx->CR1 &= (uint16_t)~SPI_DataSize_16b; + /* Set new DFF bit value */ + SPIx->CR1 |= SPI_DataSize; +} + +/** + * @brief Transmit the SPIx CRC value. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @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 |= CR1_CRCNext_Set; +} + +/** + * @brief Enables or disables the CRC value calculation of the transfered bytes. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @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 |= CR1_CRCEN_Set; + } + else + { + /* Disable the selected SPI CRC calculation */ + SPIx->CR1 &= CR1_CRCEN_Reset; + } +} + +/** + * @brief Returns the transmit or the receive CRC register value for the specified SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @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, 2 or 3 to select the SPI peripheral. + * @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; +} + +/** + * @brief Selects the data transfer direction in bi-directional mode for the specified SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_Direction: specifies the data transfer direction in bi-directional 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 Checks whether the specified SPI/I2S flag is set or not. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_FLAG: specifies the SPI/I2S 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 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/I2S 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, 2 or 3 in SPI mode + * @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()). + * - UDR (UnderRun error) flag is cleared by a read operation to + * SPI_SR register (SPI_I2S_GetFlagStatus()). + * - 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_I2S_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, 2 or 3 in SPI mode + * - 2 or 3 in I2S mode + * @param SPI_I2S_IT: specifies the SPI/I2S 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_I2S_IT_OVR: Overrun interrupt. + * @arg SPI_IT_MODF: Mode Fault interrupt. + * @arg SPI_IT_CRCERR: CRC Error interrupt. + * @arg I2S_IT_UDR: Underrun 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 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/I2S 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; +} + +/** + * @brief Clears the SPIx CRC Error (CRCERR) interrupt pending bit. + * @param SPIx: where x can be + * - 1, 2 or 3 in SPI mode + * @param SPI_I2S_IT: specifies the SPI interrupt pending bit to clear. + * This function clears only CRCERR intetrrupt pending bit. + * @note + * - OVR (OverRun Error) interrupt pending bit 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_GetITStatus()). + * - UDR (UnderRun Error) interrupt pending bit is cleared by a read + * operation to SPI_SR register (SPI_I2S_GetITStatus()). + * - MODF (Mode Fault) interrupt pending bit is cleared by software sequence: + * a read/write operation to SPI_SR register (SPI_I2S_GetITStatus()) + * followed by a write operation to SPI_CR1 register (SPI_Cmd() to enable + * the SPI). + * @retval None + */ +void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) +{ + uint16_t itpos = 0; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_CLEAR_IT(SPI_I2S_IT)); + + /* Get the SPI IT index */ + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + + /* Clear the selected SPI CRC Error (CRCERR) interrupt pending bit */ + SPIx->SR = (uint16_t)~itpos; +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h new file mode 100644 index 0000000..30b558b --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_spi.h @@ -0,0 +1,486 @@ +/** + ****************************************************************************** + * @file stm32f10x_spi.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the SPI firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_SPI_H +#define __STM32F10x_SPI_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup SPI + * @{ + */ + +/** @defgroup 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 operating mode. + 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 + */ + +typedef struct +{ + + uint16_t I2S_Mode; /*!< Specifies the I2S operating mode. + This parameter can be a value of @ref I2S_Mode */ + + uint16_t I2S_Standard; /*!< Specifies the standard used for the I2S communication. + This parameter can be a value of @ref I2S_Standard */ + + uint16_t I2S_DataFormat; /*!< Specifies the data format for the I2S communication. + This parameter can be a value of @ref 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 I2S_MCLK_Output */ + + uint32_t I2S_AudioFreq; /*!< Specifies the frequency selected for the I2S communication. + This parameter can be a value of @ref I2S_Audio_Frequency */ + + uint16_t I2S_CPOL; /*!< Specifies the idle state of the I2S clock. + This parameter can be a value of @ref I2S_Clock_Polarity */ +}I2S_InitTypeDef; + +/** + * @} + */ + +/** @defgroup SPI_Exported_Constants + * @{ + */ + +#define IS_SPI_ALL_PERIPH(PERIPH) (((PERIPH) == SPI1) || \ + ((PERIPH) == SPI2) || \ + ((PERIPH) == SPI3)) + +#define IS_SPI_23_PERIPH(PERIPH) (((PERIPH) == SPI2) || \ + ((PERIPH) == SPI3)) + +/** @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_16b ((uint16_t)0x0800) +#define SPI_DataSize_8b ((uint16_t)0x0000) +#define IS_SPI_DATASIZE(DATASIZE) (((DATASIZE) == SPI_DataSize_16b) || \ + ((DATASIZE) == SPI_DataSize_8b)) +/** + * @} + */ + +/** @defgroup SPI_Clock_Polarity + * @{ + */ + +#define SPI_CPOL_Low ((uint16_t)0x0000) +#define SPI_CPOL_High ((uint16_t)0x0002) +#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 ((uint16_t)0x0001) +#define IS_SPI_CPHA(CPHA) (((CPHA) == SPI_CPHA_1Edge) || \ + ((CPHA) == SPI_CPHA_2Edge)) +/** + * @} + */ + +/** @defgroup SPI_Slave_Select_management + * @{ + */ + +#define SPI_NSS_Soft ((uint16_t)0x0200) +#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 ((uint16_t)0x0080) +#define IS_SPI_FIRST_BIT(BIT) (((BIT) == SPI_FirstBit_MSB) || \ + ((BIT) == SPI_FirstBit_LSB)) +/** + * @} + */ + +/** @defgroup 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 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 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 I2S_MCLK_Output + * @{ + */ + +#define I2S_MCLKOutput_Enable ((uint16_t)0x0200) +#define I2S_MCLKOutput_Disable ((uint16_t)0x0000) +#define IS_I2S_MCLK_OUTPUT(OUTPUT) (((OUTPUT) == I2S_MCLKOutput_Enable) || \ + ((OUTPUT) == I2S_MCLKOutput_Disable)) +/** + * @} + */ + +/** @defgroup 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 I2S_Clock_Polarity + * @{ + */ + +#define I2S_CPOL_Low ((uint16_t)0x0000) +#define I2S_CPOL_High ((uint16_t)0x0008) +#define IS_I2S_CPOL(CPOL) (((CPOL) == I2S_CPOL_Low) || \ + ((CPOL) == I2S_CPOL_High)) +/** + * @} + */ + +/** @defgroup SPI_I2S_DMA_transfer_requests + * @{ + */ + +#define SPI_I2S_DMAReq_Tx ((uint16_t)0x0002) +#define SPI_I2S_DMAReq_Rx ((uint16_t)0x0001) +#define IS_SPI_I2S_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFFFC) == 0x00) && ((DMAREQ) != 0x00)) +/** + * @} + */ + +/** @defgroup SPI_NSS_internal_software_mangement + * @{ + */ + +#define SPI_NSSInternalSoft_Set ((uint16_t)0x0100) +#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 SPI_I2S_IT_OVR ((uint8_t)0x56) +#define SPI_IT_MODF ((uint8_t)0x55) +#define SPI_IT_CRCERR ((uint8_t)0x54) +#define I2S_IT_UDR ((uint8_t)0x53) +#define IS_SPI_I2S_CLEAR_IT(IT) (((IT) == SPI_IT_CRCERR)) +#define IS_SPI_I2S_GET_IT(IT) (((IT) == SPI_I2S_IT_RXNE) || ((IT) == SPI_I2S_IT_TXE) || \ + ((IT) == I2S_IT_UDR) || ((IT) == SPI_IT_CRCERR) || \ + ((IT) == SPI_IT_MODF) || ((IT) == SPI_I2S_IT_OVR)) +/** + * @} + */ + +/** @defgroup SPI_I2S_flags_definition + * @{ + */ + +#define SPI_I2S_FLAG_RXNE ((uint16_t)0x0001) +#define SPI_I2S_FLAG_TXE ((uint16_t)0x0002) +#define I2S_FLAG_CHSIDE ((uint16_t)0x0004) +#define I2S_FLAG_UDR ((uint16_t)0x0008) +#define SPI_FLAG_CRCERR ((uint16_t)0x0010) +#define SPI_FLAG_MODF ((uint16_t)0x0020) +#define SPI_I2S_FLAG_OVR ((uint16_t)0x0040) +#define SPI_I2S_FLAG_BSY ((uint16_t)0x0080) +#define IS_SPI_I2S_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) == I2S_FLAG_UDR) || ((FLAG) == I2S_FLAG_CHSIDE) || \ + ((FLAG) == SPI_I2S_FLAG_TXE) || ((FLAG) == SPI_I2S_FLAG_RXNE)) +/** + * @} + */ + +/** @defgroup SPI_CRC_polynomial + * @{ + */ + +#define IS_SPI_CRC_POLYNOMIAL(POLYNOMIAL) ((POLYNOMIAL) >= 0x1) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup SPI_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup SPI_Exported_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); +void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct); +void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct); +void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); +void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState); +void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); +void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft); +void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize); +void SPI_TransmitCRC(SPI_TypeDef* SPIx); +void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState); +uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC); +uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx); +void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction); +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); +void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_SPI_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.c new file mode 100644 index 0000000..7801055 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.c @@ -0,0 +1,2888 @@ +/** + ****************************************************************************** + * @file stm32f10x_tim.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the TIM firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_tim.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup TIM + * @brief TIM driver modules + * @{ + */ + +/** @defgroup TIM_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Defines + * @{ + */ + +/* ---------------------- 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) + +/** + * @} + */ + +/** @defgroup TIM_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_FunctionPrototypes + * @{ + */ + +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); +/** + * @} + */ + +/** @defgroup TIM_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the TIMx peripheral registers to their default reset values. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @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 == TIM4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE); + } + else if (TIMx == TIM5) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, 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 == TIM8) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE); + } + else if (TIMx == TIM9) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, DISABLE); + } + else if (TIMx == TIM10) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, DISABLE); + } + else if (TIMx == TIM11) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, DISABLE); + } + else if (TIMx == TIM12) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM12, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM12, DISABLE); + } + else if (TIMx == TIM13) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM13, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM13, 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 to 17 to select the TIM peripheral. + * @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 == TIM8)|| (TIMx == TIM2) || (TIMx == TIM3)|| + (TIMx == TIM4) || (TIMx == TIM5)) + { + /* 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) && (TIMx != TIM7)) + { + /* 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 == TIM8)|| (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 Initializes the TIMx Channel1 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @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_LIST8_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 == TIM8)|| (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, 4, 5, 8, 9, 12 or 15 to select + * the TIM peripheral. + * @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 == TIM8)) + { + 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_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 Ouput Compare and Output Compare N IDLE State */ + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS2)); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS2N)); + + /* Set the Output Idle state */ + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 2); + /* 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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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) || (TIMx == TIM8)) + { + 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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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) || (TIMx == TIM8)) + { + 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 Initializes the TIM peripheral according to the specified + * parameters in the TIM_ICInitStruct. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @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_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)); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || + (TIMx == TIM4) ||(TIMx == TIM5)) + { + assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity)); + } + else + { + assert_param(IS_TIM_IC_POLARITY_LITE(TIM_ICInitStruct->TIM_ICPolarity)); + } + if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) + { + assert_param(IS_TIM_LIST8_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 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, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @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 Configures the: Break feature, dead time, Lock level, the OSSI, + * the OSSR State and the AOE(automatic output enable). + * @param TIMx: where x can be 1 or 8 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_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 = 0xFFFF; + 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 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 = 0x0000; + 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 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 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 specified TIM peripheral. + * @param TIMx: where x can be 1 to 17 to select the TIMx peripheral. + * @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)); + } +} + +/** + * @brief Enables or disables the TIM peripheral Main Outputs. + * @param TIMx: where x can be 1, 8, 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)); + } +} + +/** + * @brief Enables or disables the specified TIM interrupts. + * @param TIMx: where x can be 1 to 17 to select the TIMx peripheral. + * @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. + * - TIM9, TIM12 and TIM15 can have only TIM_IT_Update, TIM_IT_CC1, + * TIM_IT_CC2 or TIM_IT_Trigger. + * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1. + * - TIM_IT_Break is used only with TIM1, TIM8 and TIM15. + * - TIM_IT_COM is used only with TIM1, TIM8, 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 to 17 to select the TIM peripheral. + * @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. + * - TIM_EventSource_COM and TIM_EventSource_Break are used only with TIM1 and TIM8. + * @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 Configures the TIMx’s DMA interface. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 15, 16 or 17 to select + * the TIM peripheral. + * @param TIM_DMABase: DMA Base address. + * This parameter can be one of the following values: + * @arg TIM_DMABase_CR, TIM_DMABase_CR2, TIM_DMABase_SMCR, + * TIM_DMABase_DIER, TIM1_DMABase_SR, TIM_DMABase_EGR, + * TIM_DMABase_CCMR1, TIM_DMABase_CCMR2, TIM_DMABase_CCER, + * TIM_DMABase_CNT, TIM_DMABase_PSC, TIM_DMABase_ARR, + * TIM_DMABase_RCR, TIM_DMABase_CCR1, TIM_DMABase_CCR2, + * TIM_DMABase_CCR3, TIM_DMABase_CCR4, TIM_DMABase_BDTR, + * TIM_DMABase_DCR. + * @param TIM_DMABurstLength: DMA Burst length. + * This parameter can be one value between: + * TIM_DMABurstLength_1Byte and TIM_DMABurstLength_18Bytes. + * @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, 4, 5, 6, 7, 8, 15, 16 or 17 + * to select the TIM peripheral. + * @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_LIST9_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 Configures the TIMx interrnal Clock + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 + * to select the TIM peripheral. + * @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, 4, 5, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_ITRSource: Trigger source. + * This parameter can be one of the following values: + * @param TIM_TS_ITR0: Internal Trigger 0 + * @param TIM_TS_ITR1: Internal Trigger 1 + * @param TIM_TS_ITR2: Internal Trigger 2 + * @param 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, 4, 5, 9, 12 or 15 to select the TIM peripheral. + * @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_TIXCLK_SOURCE(TIM_TIxExternalCLKSource)); + 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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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; +} + +/** + * @brief Configures the TIMx External Trigger (ETR). + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @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; +} + +/** + * @brief Configures the TIMx Prescaler. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @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 immediately. + * @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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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 Selects the Input Trigger source + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @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 Configures the TIMx Encoder Interface. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @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_LIST5_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)~((uint16_t)TIM_CCER_CC1P)) & ((uint16_t)~((uint16_t)TIM_CCER_CC2P))); + 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 Forces the TIMx output 1 waveform to active or inactive level. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @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_LIST8_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, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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 Enables or disables TIMx peripheral Preload register on ARR. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @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 TIM peripheral Commutation event. + * @param TIMx: where x can be 1, 8, 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); + } +} + +/** + * @brief Selects the TIMx peripheral Capture Compare DMA source. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 15, 16 or 17 to select + * the TIM peripheral. + * @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_LIST4_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); + } +} + +/** + * @brief Sets or Resets the TIM peripheral Capture Compare Preload Control bit. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 8 or 15 + * to select the TIMx peripheral + * @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_LIST5_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 to 17 except 6 and 7 to select the TIM peripheral. + * @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_LIST8_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, 4, 5, 8, 9, 12 or 15 to select + * the TIM peripheral. + * @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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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 to 17 except 6 and 7 to select the TIM peripheral. + * @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_LIST8_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, 4, 5, 8, 9, 12 or 15 to select + * the TIM peripheral. + * @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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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, 4, 5 or 8 to select the TIM peripheral. + * @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_LIST3_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, 4, 5 or 8 to select the TIM peripheral. + * @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_LIST3_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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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 to 17 except 6 and 7 to select the TIM peripheral. + * @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_LIST8_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, 8, 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, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @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 or 8 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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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 or 8 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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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 Enables or disables the TIM Capture Compare Channel x. + * @param TIMx: where x can be 1 to 17 except 6 and 7 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 + * @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_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_CHANNEL(TIM_Channel)); + 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, 8, 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 Ouput Compare Mode. + * @note This function disables the selected channel before changing the Ouput + * Compare Mode. + * User has to enable this channel using TIM_CCxCmd and TIM_CCxNCmd functions. + * @param TIMx: where x can be 1 to 17 except 6 and 7 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 + * @arg TIM_Channel_4: TIM Channel 4 + * @param TIM_OCMode: specifies the TIM Output Compare Mode. + * This paramter 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_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_CHANNEL(TIM_Channel)); + 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 Enables or Disables the TIMx Update event. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @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 to 17 to select the TIM peripheral. + * @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 the TIMx’s Hall sensor interface. + * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. + * @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_LIST6_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); + } +} + +/** + * @brief Selects the TIMx’s One Pulse Mode. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @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 Selects the TIMx Trigger Output Mode. + * @param TIMx: where x can be 1, 2, 3, 4, 5, 6, 7, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_TRGOSource: specifies the Trigger Output source. + * This paramter 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_LIST7_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, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_SlaveMode: specifies the Timer Slave Mode. + * This paramter 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, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param TIM_MasterSlaveMode: specifies the Timer Master Slave Mode. + * This paramter 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 Sets the TIMx Counter Register value + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @param Counter: specifies the Counter register new value. + * @retval None + */ +void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_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 to 17 to select the TIM peripheral. + * @param Autoreload: specifies the Autoreload register new value. + * @retval None + */ +void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + /* Set the Autoreload Register value */ + TIMx->ARR = Autoreload; +} + +/** + * @brief Sets the TIMx Capture Compare1 Register value + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @param Compare1: specifies the Capture Compare1 register new value. + * @retval None + */ +void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST8_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, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @param Compare2: specifies the Capture Compare2 register new value. + * @retval None + */ +void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_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, 3, 4, 5 or 8 to select the TIM peripheral. + * @param Compare3: specifies the Capture Compare3 register new value. + * @retval None + */ +void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_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, 3, 4, 5 or 8 to select the TIM peripheral. + * @param Compare4: specifies the Capture Compare4 register new value. + * @retval None + */ +void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + /* Set the Capture Compare4 Register value */ + TIMx->CCR4 = Compare4; +} + +/** + * @brief Sets the TIMx Input Capture 1 prescaler. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @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_LIST8_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, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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); +} + +/** + * @brief Sets the TIMx Clock Division value. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select + * the TIM peripheral. + * @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_LIST8_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 Gets the TIMx Input Capture 1 value. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @retval Capture Compare 1 Register value. + */ +uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST8_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, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @retval Capture Compare 2 Register value. + */ +uint16_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, 3, 4, 5 or 8 to select the TIM peripheral. + * @retval Capture Compare 3 Register value. + */ +uint16_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, 3, 4, 5 or 8 to select the TIM peripheral. + * @retval Capture Compare 4 Register value. + */ +uint16_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 Gets the TIMx Counter value. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @retval Counter Register value. + */ +uint16_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 to 17 to select the TIM peripheral. + * @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 Checks whether the specified TIM flag is set or not. + * @param TIMx: where x can be 1 to 17 to select the TIM peripheral. + * @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. + * - TIM9, TIM12 and TIM15 can have only TIM_FLAG_Update, TIM_FLAG_CC1, + * TIM_FLAG_CC2 or TIM_FLAG_Trigger. + * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_FLAG_Update or TIM_FLAG_CC1. + * - TIM_FLAG_Break is used only with TIM1, TIM8 and TIM15. + * - TIM_FLAG_COM is used only with TIM1, TIM8, 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 to 17 to select the TIM peripheral. + * @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. + * - TIM9, TIM12 and TIM15 can have only TIM_FLAG_Update, TIM_FLAG_CC1, + * TIM_FLAG_CC2 or TIM_FLAG_Trigger. + * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_FLAG_Update or TIM_FLAG_CC1. + * - TIM_FLAG_Break is used only with TIM1, TIM8 and TIM15. + * - TIM_FLAG_COM is used only with TIM1, TIM8, 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 to 17 to select the TIM peripheral. + * @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. + * - TIM9, TIM12 and TIM15 can have only TIM_IT_Update, TIM_IT_CC1, + * TIM_IT_CC2 or TIM_IT_Trigger. + * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1. + * - TIM_IT_Break is used only with TIM1, TIM8 and TIM15. + * - TIM_IT_COM is used only with TIM1, TIM8, 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 to 17 to select the TIM peripheral. + * @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. + * - TIM9, TIM12 and TIM15 can have only TIM_IT_Update, TIM_IT_CC1, + * TIM_IT_CC2 or TIM_IT_Trigger. + * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1. + * - TIM_IT_Break is used only with TIM1, TIM8 and TIM15. + * - TIM_IT_COM is used only with TIM1, TIM8, 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 Configure the TI1 as Input. + * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. + * @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)); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || + (TIMx == TIM4) ||(TIMx == TIM5)) + { + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC1P)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC1E); + } + else + { + /* 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, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. + * @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); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || + (TIMx == TIM4) ||(TIMx == TIM5)) + { + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC2P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC2E); + } + else + { + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC2P | TIM_CCER_CC2NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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)); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || + (TIMx == TIM4) ||(TIMx == TIM5)) + { + /* Select the Polarity and set the CC3E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC3E); + } + else + { + /* Select the Polarity and set the CC3E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P | TIM_CCER_CC3NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (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, 3, 4, 5 or 8 to select the TIM peripheral. + * @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); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || + (TIMx == TIM4) ||(TIMx == TIM5)) + { + /* Select the Polarity and set the CC4E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC4P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC4E); + } + else + { + /* Select the Polarity and set the CC4E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P | TIM_CCER_CC4NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC4E); + } + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h new file mode 100644 index 0000000..6529c0b --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_tim.h @@ -0,0 +1,1137 @@ +/** + ****************************************************************************** + * @file stm32f10x_tim.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the TIM firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_TIM_H +#define __STM32F10x_TIM_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup TIM + * @{ + */ + +/** @defgroup TIM_Exported_Types + * @{ + */ + +/** + * @brief TIM Time Base Init structure definition + * @note This sturcture is used with all TIMx except for TIM6 and TIM7. + */ + +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 */ + + uint16_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 and TIM8. */ +} 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 and TIM8. */ + + uint16_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 */ + + 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 and TIM8. */ + + 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 and TIM8. */ + + 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 and TIM8. */ +} 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 BDTR structure definition + * @note This sturcture is used only with TIM1 and TIM8. + */ + +typedef struct +{ + + uint16_t TIM_OSSRState; /*!< Specifies the Off-State selection used in Run mode. + This parameter can be a value of @ref 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 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 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 Break_Input_enable_disable */ + + uint16_t TIM_BreakPolarity; /*!< Specifies the TIM Break Input pin polarity. + This parameter can be a value of @ref 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; + +/** @defgroup TIM_Exported_constants + * @{ + */ + +#define IS_TIM_ALL_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM6) || \ + ((PERIPH) == TIM7) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM9) || \ + ((PERIPH) == TIM10)|| \ + ((PERIPH) == TIM11)|| \ + ((PERIPH) == TIM12)|| \ + ((PERIPH) == TIM13)|| \ + ((PERIPH) == TIM14)|| \ + ((PERIPH) == TIM15)|| \ + ((PERIPH) == TIM16)|| \ + ((PERIPH) == TIM17)) + +/* LIST1: TIM 1 and 8 */ +#define IS_TIM_LIST1_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM8)) + +/* LIST2: TIM 1, 8, 15 16 and 17 */ +#define IS_TIM_LIST2_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM15)|| \ + ((PERIPH) == TIM16)|| \ + ((PERIPH) == TIM17)) + +/* LIST3: TIM 1, 2, 3, 4, 5 and 8 */ +#define IS_TIM_LIST3_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM8)) + +/* LIST4: TIM 1, 2, 3, 4, 5, 8, 15, 16 and 17 */ +#define IS_TIM_LIST4_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM15)|| \ + ((PERIPH) == TIM16)|| \ + ((PERIPH) == TIM17)) + +/* LIST5: TIM 1, 2, 3, 4, 5, 8 and 15 */ +#define IS_TIM_LIST5_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM15)) + +/* LIST6: TIM 1, 2, 3, 4, 5, 8, 9, 12 and 15 */ +#define IS_TIM_LIST6_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM9) || \ + ((PERIPH) == TIM12)|| \ + ((PERIPH) == TIM15)) + +/* LIST7: TIM 1, 2, 3, 4, 5, 6, 7, 8, 9, 12 and 15 */ +#define IS_TIM_LIST7_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM6) || \ + ((PERIPH) == TIM7) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM9) || \ + ((PERIPH) == TIM12)|| \ + ((PERIPH) == TIM15)) + +/* LIST8: TIM 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16 and 17 */ +#define IS_TIM_LIST8_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM9) || \ + ((PERIPH) == TIM10)|| \ + ((PERIPH) == TIM11)|| \ + ((PERIPH) == TIM12)|| \ + ((PERIPH) == TIM13)|| \ + ((PERIPH) == TIM14)|| \ + ((PERIPH) == TIM15)|| \ + ((PERIPH) == TIM16)|| \ + ((PERIPH) == TIM17)) + +/* LIST9: TIM 1, 2, 3, 4, 5, 6, 7, 8, 15, 16, and 17 */ +#define IS_TIM_LIST9_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ + ((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM6) || \ + ((PERIPH) == TIM7) || \ + ((PERIPH) == TIM8) || \ + ((PERIPH) == TIM15)|| \ + ((PERIPH) == TIM16)|| \ + ((PERIPH) == TIM17)) + +/** + * @} + */ + +/** @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_PWMI_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ + ((CHANNEL) == TIM_Channel_2)) +#define IS_TIM_COMPLEMENTARY_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ + ((CHANNEL) == TIM_Channel_2) || \ + ((CHANNEL) == TIM_Channel_3)) +/** + * @} + */ + +/** @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 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 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 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 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 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)) +#define IS_TIM_IC_POLARITY_LITE(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 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)) +/** + * @} + */ + +/** @defgroup TIM_DMA_Burst_Length + * @{ + */ + +#define TIM_DMABurstLength_1Byte ((uint16_t)0x0000) +#define TIM_DMABurstLength_2Bytes ((uint16_t)0x0100) +#define TIM_DMABurstLength_3Bytes ((uint16_t)0x0200) +#define TIM_DMABurstLength_4Bytes ((uint16_t)0x0300) +#define TIM_DMABurstLength_5Bytes ((uint16_t)0x0400) +#define TIM_DMABurstLength_6Bytes ((uint16_t)0x0500) +#define TIM_DMABurstLength_7Bytes ((uint16_t)0x0600) +#define TIM_DMABurstLength_8Bytes ((uint16_t)0x0700) +#define TIM_DMABurstLength_9Bytes ((uint16_t)0x0800) +#define TIM_DMABurstLength_10Bytes ((uint16_t)0x0900) +#define TIM_DMABurstLength_11Bytes ((uint16_t)0x0A00) +#define TIM_DMABurstLength_12Bytes ((uint16_t)0x0B00) +#define TIM_DMABurstLength_13Bytes ((uint16_t)0x0C00) +#define TIM_DMABurstLength_14Bytes ((uint16_t)0x0D00) +#define TIM_DMABurstLength_15Bytes ((uint16_t)0x0E00) +#define TIM_DMABurstLength_16Bytes ((uint16_t)0x0F00) +#define TIM_DMABurstLength_17Bytes ((uint16_t)0x1000) +#define TIM_DMABurstLength_18Bytes ((uint16_t)0x1100) +#define IS_TIM_DMA_LENGTH(LENGTH) (((LENGTH) == TIM_DMABurstLength_1Byte) || \ + ((LENGTH) == TIM_DMABurstLength_2Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_3Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_4Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_5Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_6Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_7Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_8Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_9Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_10Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_11Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_12Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_13Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_14Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_15Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_16Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_17Bytes) || \ + ((LENGTH) == TIM_DMABurstLength_18Bytes)) +/** + * @} + */ + +/** @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) +#define IS_TIM_TIXCLK_SOURCE(SOURCE) (((SOURCE) == TIM_TIxExternalCLK1Source_TI1) || \ + ((SOURCE) == TIM_TIxExternalCLK1Source_TI2) || \ + ((SOURCE) == TIM_TIxExternalCLK1Source_TI1ED)) +/** + * @} + */ + +/** @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_Ouput_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_Ouput_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_Ouput_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_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions + * @{ + */ + +void TIM_DeInit(TIM_TypeDef* TIMx); +void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); +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_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct); +void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); +void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct); +void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); +void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource); +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_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); +void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter); +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_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); +void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, + uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity); +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_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState); +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_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_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode); +void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource); +void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode); +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_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter); +void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload); +void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); +void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); +void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3); +void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4); +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); +void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD); +uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx); +uint16_t TIM_GetCounter(TIM_TypeDef* TIMx); +uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx); +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); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F10x_TIM_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.c new file mode 100644 index 0000000..eb84d97 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.c @@ -0,0 +1,1055 @@ +/** + ****************************************************************************** + * @file stm32f10x_usart.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the USART firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_usart.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup USART + * @brief USART driver modules + * @{ + */ + +/** @defgroup USART_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_Defines + * @{ + */ + +#define CR1_UE_Set ((uint16_t)0x2000) /*!< USART Enable Mask */ +#define CR1_UE_Reset ((uint16_t)0xDFFF) /*!< USART Disable Mask */ + +#define CR1_WAKE_Mask ((uint16_t)0xF7FF) /*!< USART WakeUp Method Mask */ + +#define CR1_RWU_Set ((uint16_t)0x0002) /*!< USART mute mode Enable Mask */ +#define CR1_RWU_Reset ((uint16_t)0xFFFD) /*!< USART mute mode Enable Mask */ +#define CR1_SBK_Set ((uint16_t)0x0001) /*!< USART Break Character send Mask */ +#define CR1_CLEAR_Mask ((uint16_t)0xE9F3) /*!< USART CR1 Mask */ +#define CR2_Address_Mask ((uint16_t)0xFFF0) /*!< USART address Mask */ + +#define CR2_LINEN_Set ((uint16_t)0x4000) /*!< USART LIN Enable Mask */ +#define CR2_LINEN_Reset ((uint16_t)0xBFFF) /*!< USART LIN Disable Mask */ + +#define CR2_LBDL_Mask ((uint16_t)0xFFDF) /*!< USART LIN Break detection Mask */ +#define CR2_STOP_CLEAR_Mask ((uint16_t)0xCFFF) /*!< USART CR2 STOP Bits Mask */ +#define CR2_CLOCK_CLEAR_Mask ((uint16_t)0xF0FF) /*!< USART CR2 Clock Mask */ + +#define CR3_SCEN_Set ((uint16_t)0x0020) /*!< USART SC Enable Mask */ +#define CR3_SCEN_Reset ((uint16_t)0xFFDF) /*!< USART SC Disable Mask */ + +#define CR3_NACK_Set ((uint16_t)0x0010) /*!< USART SC NACK Enable Mask */ +#define CR3_NACK_Reset ((uint16_t)0xFFEF) /*!< USART SC NACK Disable Mask */ + +#define CR3_HDSEL_Set ((uint16_t)0x0008) /*!< USART Half-Duplex Enable Mask */ +#define CR3_HDSEL_Reset ((uint16_t)0xFFF7) /*!< USART Half-Duplex Disable Mask */ + +#define CR3_IRLP_Mask ((uint16_t)0xFFFB) /*!< USART IrDA LowPower mode Mask */ +#define CR3_CLEAR_Mask ((uint16_t)0xFCFF) /*!< USART CR3 Mask */ + +#define CR3_IREN_Set ((uint16_t)0x0002) /*!< USART IrDA Enable Mask */ +#define CR3_IREN_Reset ((uint16_t)0xFFFD) /*!< USART IrDA Disable Mask */ +#define GTPR_LSB_Mask ((uint16_t)0x00FF) /*!< Guard Time Register LSB Mask */ +#define GTPR_MSB_Mask ((uint16_t)0xFF00) /*!< Guard Time Register MSB Mask */ +#define IT_Mask ((uint16_t)0x001F) /*!< USART Interrupt Mask */ + +/* USART OverSampling-8 Mask */ +#define CR1_OVER8_Set ((u16)0x8000) /* USART OVER8 mode Enable Mask */ +#define CR1_OVER8_Reset ((u16)0x7FFF) /* USART OVER8 mode Disable Mask */ + +/* USART One Bit Sampling Mask */ +#define CR3_ONEBITE_Set ((u16)0x0800) /* USART ONEBITE mode Enable Mask */ +#define CR3_ONEBITE_Reset ((u16)0xF7FF) /* USART ONEBITE mode Disable Mask */ + +/** + * @} + */ + +/** @defgroup USART_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the USARTx peripheral registers to their default reset values. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: USART1, USART2, USART3, UART4 or UART5. + * @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 == UART4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE); + } + else + { + if (USARTx == UART5) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE); + } + } +} + +/** + * @brief Initializes the USARTx peripheral according to the specified + * parameters in the USART_InitStruct . + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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 tmpreg = 0x00, apbclock = 0x00; + uint32_t integerdivider = 0x00; + uint32_t fractionaldivider = 0x00; + uint32_t usartxbase = 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)); + /* The hardware flow control is available only for USART1, USART2 and USART3 */ + if (USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + usartxbase = (uint32_t)USARTx; + +/*---------------------------- USART CR2 Configuration -----------------------*/ + tmpreg = USARTx->CR2; + /* Clear STOP[13:12] bits */ + tmpreg &= CR2_STOP_CLEAR_Mask; + /* 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 = (uint16_t)tmpreg; + +/*---------------------------- USART CR1 Configuration -----------------------*/ + tmpreg = USARTx->CR1; + /* Clear M, PCE, PS, TE and RE bits */ + tmpreg &= 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 = (uint16_t)tmpreg; + +/*---------------------------- USART CR3 Configuration -----------------------*/ + tmpreg = USARTx->CR3; + /* Clear CTSE and RTSE bits */ + tmpreg &= 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 = (uint16_t)tmpreg; + +/*---------------------------- USART BRR Configuration -----------------------*/ + /* Configure the USART Baud Rate -------------------------------------------*/ + RCC_GetClocksFreq(&RCC_ClocksStatus); + if (usartxbase == USART1_BASE) + { + apbclock = RCC_ClocksStatus.PCLK2_Frequency; + } + else + { + apbclock = RCC_ClocksStatus.PCLK1_Frequency; + } + + /* Determine the integer part */ + if ((USARTx->CR1 & CR1_OVER8_Set) != 0) + { + /* Integer part computing in case Oversampling mode is 8 Samples */ + integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate))); + } + else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ + { + /* Integer part computing in case Oversampling mode is 16 Samples */ + integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate))); + } + tmpreg = (integerdivider / 100) << 4; + + /* Determine the fractional part */ + fractionaldivider = integerdivider - (100 * (tmpreg >> 4)); + + /* Implement the fractional part in the register */ + if ((USARTx->CR1 & CR1_OVER8_Set) != 0) + { + tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07); + } + else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ + { + tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F); + } + + /* Write to USART BRR */ + USARTx->BRR = (uint16_t)tmpreg; +} + +/** + * @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 to select the USART peripheral. + * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef + * structure that contains the configuration information for the specified + * USART peripheral. + * @note The Smart Card mode is not available for UART4 and UART5. + * @retval None + */ +void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct) +{ + uint32_t tmpreg = 0x00; + /* Check the parameters */ + assert_param(IS_USART_123_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 and LBCL bits */ + tmpreg &= CR2_CLOCK_CLEAR_Mask; + /* Configure the USART Clock, CPOL, CPHA and LastBit ------------*/ + /* 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 = (uint16_t)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: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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 |= CR1_UE_Set; + } + else + { + /* Disable the selected USART by clearing the UE bit in the CR1 register */ + USARTx->CR1 &= CR1_UE_Reset; + } +} + +/** + * @brief Enables or disables the specified USART interrupts. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg USART_IT_LBD: LIN Break detection interrupt + * @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, uint16_t USART_IT, FunctionalState NewState) +{ + uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00; + uint32_t usartxbase = 0x00; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CONFIG_IT(USART_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + usartxbase = (uint32_t)USARTx; + + /* Get the USART register index */ + usartreg = (((uint8_t)USART_IT) >> 0x05); + + /* Get the interrupt position */ + itpos = USART_IT & IT_Mask; + itmask = (((uint32_t)0x01) << itpos); + + if (usartreg == 0x01) /* The IT is in CR1 register */ + { + usartxbase += 0x0C; + } + else if (usartreg == 0x02) /* The IT is in CR2 register */ + { + usartxbase += 0x10; + } + else /* The IT is in CR3 register */ + { + usartxbase += 0x14; + } + if (NewState != DISABLE) + { + *(__IO uint32_t*)usartxbase |= itmask; + } + else + { + *(__IO uint32_t*)usartxbase &= ~itmask; + } +} + +/** + * @brief Enables or disables the USART’s DMA interface. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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. + * @note The DMA mode is not available for UART5 except in the STM32 + * High density value line devices(STM32F10X_HD_VL). + * @retval None + */ +void USART_DMACmd(USART_TypeDef* USARTx, uint16_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 &= (uint16_t)~USART_DMAReq; + } +} + +/** + * @brief Sets the address of the USART node. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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)); + assert_param(IS_USART_ADDRESS(USART_Address)); + + /* Clear the USART address */ + USARTx->CR2 &= CR2_Address_Mask; + /* Set the USART address node */ + USARTx->CR2 |= USART_Address; +} + +/** + * @brief Selects the USART WakeUp method. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_WAKEUP(USART_WakeUp)); + + USARTx->CR1 &= CR1_WAKE_Mask; + USARTx->CR1 |= USART_WakeUp; +} + +/** + * @brief Determines if the USART is in mute mode or not. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART mute mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_ReceiverWakeUpCmd(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 RWU bit in the CR1 register */ + USARTx->CR1 |= CR1_RWU_Set; + } + else + { + /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */ + USARTx->CR1 &= CR1_RWU_Reset; + } +} + +/** + * @brief Sets the USART LIN Break detection length. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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, uint16_t USART_LINBreakDetectLength) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_LIN_BREAK_DETECT_LENGTH(USART_LINBreakDetectLength)); + + USARTx->CR2 &= CR2_LBDL_Mask; + USARTx->CR2 |= USART_LINBreakDetectLength; +} + +/** + * @brief Enables or disables the USART’s LIN mode. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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_ALL_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 |= CR2_LINEN_Set; + } + else + { + /* Disable the LIN mode by clearing the LINEN bit in the CR2 register */ + USARTx->CR2 &= CR2_LINEN_Reset; + } +} + +/** + * @brief Transmits single data through the USARTx peripheral. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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->DR = (Data & (uint16_t)0x01FF); +} + +/** + * @brief Returns the most recent received data by the USARTx peripheral. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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->DR & (uint16_t)0x01FF); +} + +/** + * @brief Transmits break characters. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @retval None + */ +void USART_SendBreak(USART_TypeDef* USARTx) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + /* Send break characters */ + USARTx->CR1 |= CR1_SBK_Set; +} + +/** + * @brief Sets the specified USART guard time. + * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. + * @param USART_GuardTime: specifies the guard time. + * @note The guard time bits are not available for UART4 and UART5. + * @retval None + */ +void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime) +{ + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + + /* Clear the USART Guard time */ + USARTx->GTPR &= GTPR_LSB_Mask; + /* Set the USART guard time */ + USARTx->GTPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08); +} + +/** + * @brief Sets the system clock prescaler. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_Prescaler: specifies the prescaler clock. + * @note The function is used for IrDA mode with UART4 and UART5. + * @retval None + */ +void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + /* Clear the USART prescaler */ + USARTx->GTPR &= GTPR_MSB_Mask; + /* Set the USART prescaler */ + USARTx->GTPR |= USART_Prescaler; +} + +/** + * @brief Enables or disables the USART’s Smart Card mode. + * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. + * @param NewState: new state of the Smart Card mode. + * This parameter can be: ENABLE or DISABLE. + * @note The Smart Card mode is not available for UART4 and UART5. + * @retval None + */ +void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_123_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 |= CR3_SCEN_Set; + } + else + { + /* Disable the SC mode by clearing the SCEN bit in the CR3 register */ + USARTx->CR3 &= CR3_SCEN_Reset; + } +} + +/** + * @brief Enables or disables NACK transmission. + * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. + * @param NewState: new state of the NACK transmission. + * This parameter can be: ENABLE or DISABLE. + * @note The Smart Card mode is not available for UART4 and UART5. + * @retval None + */ +void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_123_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 |= CR3_NACK_Set; + } + else + { + /* Disable the NACK transmission by clearing the NACK bit in the CR3 register */ + USARTx->CR3 &= CR3_NACK_Reset; + } +} + +/** + * @brief Enables or disables the USART’s Half Duplex communication. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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 |= CR3_HDSEL_Set; + } + else + { + /* Disable the Half-Duplex mode by clearing the HDSEL bit in the CR3 register */ + USARTx->CR3 &= CR3_HDSEL_Reset; + } +} + + +/** + * @brief Enables or disables the USART's 8x oversampling mode. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART one bit sampling methode. + * 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 |= CR1_OVER8_Set; + } + else + { + /* Disable the 8x Oversampling mode by clearing the OVER8 bit in the CR1 register */ + USARTx->CR1 &= CR1_OVER8_Reset; + } +} + +/** + * @brief Enables or disables the USART's one bit sampling methode. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART one bit sampling methode. + * This parameter can be: ENABLE or DISABLE. + * @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 |= CR3_ONEBITE_Set; + } + else + { + /* Disable tthe one bit method by clearing the ONEBITE bit in the CR3 register */ + USARTx->CR3 &= CR3_ONEBITE_Reset; + } +} + +/** + * @brief Configures the USART’s IrDA interface. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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, uint16_t USART_IrDAMode) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_IRDA_MODE(USART_IrDAMode)); + + USARTx->CR3 &= CR3_IRLP_Mask; + USARTx->CR3 |= USART_IrDAMode; +} + +/** + * @brief Enables or disables the USART’s IrDA interface. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @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_ALL_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 |= CR3_IREN_Set; + } + else + { + /* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ + USARTx->CR3 &= CR3_IREN_Reset; + } +} + +/** + * @brief Checks whether the specified USART flag is set or not. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5) + * @arg USART_FLAG_LBD: LIN Break detection flag + * @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, uint16_t USART_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_FLAG(USART_FLAG)); + /* The CTS flag is not available for UART4 and UART5 */ + if (USART_FLAG == USART_FLAG_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the USARTx's pending flags. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5). + * @arg USART_FLAG_LBD: LIN Break detection flag. + * @arg USART_FLAG_TC: Transmission Complete flag. + * @arg USART_FLAG_RXNE: Receive data register not empty flag. + * + * @note + * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun + * error) and IDLE (Idle line detected) flags are cleared by software + * sequence: a read operation to USART_SR register (USART_GetFlagStatus()) + * followed by a read operation to USART_DR register (USART_ReceiveData()). + * - RXNE flag can be also cleared by a read to the USART_DR register + * (USART_ReceiveData()). + * - 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_DR register (USART_SendData()). + * - TXE flag is cleared only by a write to the USART_DR register + * (USART_SendData()). + * @retval None + */ +void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CLEAR_FLAG(USART_FLAG)); + /* The CTS flag is not available for UART4 and UART5 */ + if ((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + USARTx->SR = (uint16_t)~USART_FLAG; +} + +/** + * @brief Checks whether the specified USART interrupt has occurred or not. + * @param USARTx: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IT: specifies the USART interrupt source to check. + * This parameter can be one of the following values: + * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg USART_IT_LBD: LIN Break detection interrupt + * @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, uint16_t USART_IT) +{ + uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00; + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_GET_IT(USART_IT)); + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + /* Get the USART register index */ + usartreg = (((uint8_t)USART_IT) >> 0x05); + /* 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 >> 0x08; + bitpos = (uint32_t)0x01 << bitpos; + bitpos &= USARTx->SR; + 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: Select the USART or the UART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IT: specifies the interrupt pending bit to clear. + * This parameter can be one of the following values: + * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg USART_IT_LBD: LIN Break detection interrupt + * @arg USART_IT_TC: Transmission complete interrupt. + * @arg USART_IT_RXNE: Receive Data register not empty interrupt. + * + * @note + * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun + * error) and IDLE (Idle line detected) pending bits are cleared by + * software sequence: a read operation to USART_SR register + * (USART_GetITStatus()) followed by a read operation to USART_DR register + * (USART_ReceiveData()). + * - RXNE pending bit can be also cleared by a read to the USART_DR register + * (USART_ReceiveData()). + * - 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_DR register (USART_SendData()). + * - TXE pending bit is cleared only by a write to the USART_DR register + * (USART_SendData()). + * @retval None + */ +void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT) +{ + uint16_t bitpos = 0x00, itmask = 0x00; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CLEAR_IT(USART_IT)); + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + bitpos = USART_IT >> 0x08; + itmask = ((uint16_t)0x01 << (uint16_t)bitpos); + USARTx->SR = (uint16_t)~itmask; +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h new file mode 100644 index 0000000..8d3c381 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_usart.h @@ -0,0 +1,411 @@ +/** + ****************************************************************************** + * @file stm32f10x_usart.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the USART + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_USART_H +#define __STM32F10x_USART_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup USART + * @{ + */ + +/** @defgroup 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 - ((u32) IntegerDivider)) * 16) + 0.5 */ + + uint16_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 */ + + uint16_t USART_StopBits; /*!< Specifies the number of stop bits transmitted. + This parameter can be a value of @ref USART_Stop_Bits */ + + uint16_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). */ + + uint16_t USART_Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref USART_Mode */ + + uint16_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 +{ + + uint16_t USART_Clock; /*!< Specifies whether the USART clock is enabled or disabled. + This parameter can be a value of @ref USART_Clock */ + + uint16_t USART_CPOL; /*!< Specifies the steady state value of the serial clock. + This parameter can be a value of @ref USART_Clock_Polarity */ + + uint16_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 */ + + uint16_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; + +/** + * @} + */ + +/** @defgroup USART_Exported_Constants + * @{ + */ + +#define IS_USART_ALL_PERIPH(PERIPH) (((PERIPH) == USART1) || \ + ((PERIPH) == USART2) || \ + ((PERIPH) == USART3) || \ + ((PERIPH) == UART4) || \ + ((PERIPH) == UART5)) + +#define IS_USART_123_PERIPH(PERIPH) (((PERIPH) == USART1) || \ + ((PERIPH) == USART2) || \ + ((PERIPH) == USART3)) + +#define IS_USART_1234_PERIPH(PERIPH) (((PERIPH) == USART1) || \ + ((PERIPH) == USART2) || \ + ((PERIPH) == USART3) || \ + ((PERIPH) == UART4)) +/** @defgroup USART_Word_Length + * @{ + */ + +#define USART_WordLength_8b ((uint16_t)0x0000) +#define USART_WordLength_9b ((uint16_t)0x1000) + +#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == USART_WordLength_8b) || \ + ((LENGTH) == USART_WordLength_9b)) +/** + * @} + */ + +/** @defgroup USART_Stop_Bits + * @{ + */ + +#define USART_StopBits_1 ((uint16_t)0x0000) +#define USART_StopBits_0_5 ((uint16_t)0x1000) +#define USART_StopBits_2 ((uint16_t)0x2000) +#define USART_StopBits_1_5 ((uint16_t)0x3000) +#define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == USART_StopBits_1) || \ + ((STOPBITS) == USART_StopBits_0_5) || \ + ((STOPBITS) == USART_StopBits_2) || \ + ((STOPBITS) == USART_StopBits_1_5)) +/** + * @} + */ + +/** @defgroup USART_Parity + * @{ + */ + +#define USART_Parity_No ((uint16_t)0x0000) +#define USART_Parity_Even ((uint16_t)0x0400) +#define USART_Parity_Odd ((uint16_t)0x0600) +#define IS_USART_PARITY(PARITY) (((PARITY) == USART_Parity_No) || \ + ((PARITY) == USART_Parity_Even) || \ + ((PARITY) == USART_Parity_Odd)) +/** + * @} + */ + +/** @defgroup USART_Mode + * @{ + */ + +#define USART_Mode_Rx ((uint16_t)0x0004) +#define USART_Mode_Tx ((uint16_t)0x0008) +#define IS_USART_MODE(MODE) ((((MODE) & (uint16_t)0xFFF3) == 0x00) && ((MODE) != (uint16_t)0x00)) +/** + * @} + */ + +/** @defgroup USART_Hardware_Flow_Control + * @{ + */ +#define USART_HardwareFlowControl_None ((uint16_t)0x0000) +#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) +#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) +#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) +#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 ((uint16_t)0x0000) +#define USART_Clock_Enable ((uint16_t)0x0800) +#define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_Clock_Disable) || \ + ((CLOCK) == USART_Clock_Enable)) +/** + * @} + */ + +/** @defgroup USART_Clock_Polarity + * @{ + */ + +#define USART_CPOL_Low ((uint16_t)0x0000) +#define USART_CPOL_High ((uint16_t)0x0400) +#define IS_USART_CPOL(CPOL) (((CPOL) == USART_CPOL_Low) || ((CPOL) == USART_CPOL_High)) + +/** + * @} + */ + +/** @defgroup USART_Clock_Phase + * @{ + */ + +#define USART_CPHA_1Edge ((uint16_t)0x0000) +#define USART_CPHA_2Edge ((uint16_t)0x0200) +#define IS_USART_CPHA(CPHA) (((CPHA) == USART_CPHA_1Edge) || ((CPHA) == USART_CPHA_2Edge)) + +/** + * @} + */ + +/** @defgroup USART_Last_Bit + * @{ + */ + +#define USART_LastBit_Disable ((uint16_t)0x0000) +#define USART_LastBit_Enable ((uint16_t)0x0100) +#define IS_USART_LASTBIT(LASTBIT) (((LASTBIT) == USART_LastBit_Disable) || \ + ((LASTBIT) == USART_LastBit_Enable)) +/** + * @} + */ + +/** @defgroup USART_Interrupt_definition + * @{ + */ + +#define USART_IT_PE ((uint16_t)0x0028) +#define USART_IT_TXE ((uint16_t)0x0727) +#define USART_IT_TC ((uint16_t)0x0626) +#define USART_IT_RXNE ((uint16_t)0x0525) +#define USART_IT_IDLE ((uint16_t)0x0424) +#define USART_IT_LBD ((uint16_t)0x0846) +#define USART_IT_CTS ((uint16_t)0x096A) +#define USART_IT_ERR ((uint16_t)0x0060) +#define USART_IT_ORE ((uint16_t)0x0360) +#define USART_IT_NE ((uint16_t)0x0260) +#define USART_IT_FE ((uint16_t)0x0160) +#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)) +#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)) +#define IS_USART_CLEAR_IT(IT) (((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ + ((IT) == USART_IT_LBD) || ((IT) == USART_IT_CTS)) +/** + * @} + */ + +/** @defgroup USART_DMA_Requests + * @{ + */ + +#define USART_DMAReq_Tx ((uint16_t)0x0080) +#define USART_DMAReq_Rx ((uint16_t)0x0040) +#define IS_USART_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFF3F) == 0x00) && ((DMAREQ) != (uint16_t)0x00)) + +/** + * @} + */ + +/** @defgroup USART_WakeUp_methods + * @{ + */ + +#define USART_WakeUp_IdleLine ((uint16_t)0x0000) +#define USART_WakeUp_AddressMark ((uint16_t)0x0800) +#define IS_USART_WAKEUP(WAKEUP) (((WAKEUP) == USART_WakeUp_IdleLine) || \ + ((WAKEUP) == USART_WakeUp_AddressMark)) +/** + * @} + */ + +/** @defgroup USART_LIN_Break_Detection_Length + * @{ + */ + +#define USART_LINBreakDetectLength_10b ((uint16_t)0x0000) +#define USART_LINBreakDetectLength_11b ((uint16_t)0x0020) +#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 ((uint16_t)0x0004) +#define USART_IrDAMode_Normal ((uint16_t)0x0000) +#define IS_USART_IRDA_MODE(MODE) (((MODE) == USART_IrDAMode_LowPower) || \ + ((MODE) == USART_IrDAMode_Normal)) +/** + * @} + */ + +/** @defgroup USART_Flags + * @{ + */ + +#define USART_FLAG_CTS ((uint16_t)0x0200) +#define USART_FLAG_LBD ((uint16_t)0x0100) +#define USART_FLAG_TXE ((uint16_t)0x0080) +#define USART_FLAG_TC ((uint16_t)0x0040) +#define USART_FLAG_RXNE ((uint16_t)0x0020) +#define USART_FLAG_IDLE ((uint16_t)0x0010) +#define USART_FLAG_ORE ((uint16_t)0x0008) +#define USART_FLAG_NE ((uint16_t)0x0004) +#define USART_FLAG_FE ((uint16_t)0x0002) +#define USART_FLAG_PE ((uint16_t)0x0001) +#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)) + +#define IS_USART_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFC9F) == 0x00) && ((FLAG) != (uint16_t)0x00)) +#define IS_USART_PERIPH_FLAG(PERIPH, USART_FLAG) ((((*(uint32_t*)&(PERIPH)) != UART4_BASE) &&\ + ((*(uint32_t*)&(PERIPH)) != UART5_BASE)) \ + || ((USART_FLAG) != USART_FLAG_CTS)) +#define IS_USART_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0) && ((BAUDRATE) < 0x0044AA21)) +#define IS_USART_ADDRESS(ADDRESS) ((ADDRESS) <= 0xF) +#define IS_USART_DATA(DATA) ((DATA) <= 0x1FF) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup USART_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USART_Exported_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_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); +void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState); +void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address); +void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp); +void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength); +void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); +uint16_t USART_ReceiveData(USART_TypeDef* USARTx); +void USART_SendBreak(USART_TypeDef* USARTx); +void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime); +void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler); +void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode); +void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState); +FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); +void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); +ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); +void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_USART_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_wwdg.c b/Soft/Suwmiarka_CrossWorks/stm32f10x_wwdg.c new file mode 100644 index 0000000..753a710 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_wwdg.c @@ -0,0 +1,223 @@ +/** + ****************************************************************************** + * @file stm32f10x_wwdg.c + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file provides all the WWDG firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x_wwdg.h" +#include "stm32f10x_rcc.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @defgroup WWDG + * @brief WWDG driver modules + * @{ + */ + +/** @defgroup WWDG_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_Defines + * @{ + */ + +/* ----------- WWDG registers bit address in the alias region ----------- */ +#define WWDG_OFFSET (WWDG_BASE - PERIPH_BASE) + +/* Alias word address of EWI bit */ +#define CFR_OFFSET (WWDG_OFFSET + 0x04) +#define EWI_BitNumber 0x09 +#define CFR_EWI_BB (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4)) + +/* --------------------- WWDG registers bit mask ------------------------ */ + +/* CR register bit mask */ +#define CR_WDGA_Set ((uint32_t)0x00000080) + +/* CFR register bit mask */ +#define CFR_WDGTB_Mask ((uint32_t)0xFFFFFE7F) +#define CFR_W_Mask ((uint32_t)0xFFFFFF80) +#define BIT_Mask ((uint8_t)0x7F) + +/** + * @} + */ + +/** @defgroup WWDG_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup WWDG_Private_Functions + * @{ + */ + +/** + * @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). + * @param None + * @retval None + */ +void WWDG_EnableIT(void) +{ + *(__IO uint32_t *) CFR_EWI_BB = (uint32_t)ENABLE; +} + +/** + * @brief Sets the WWDG counter value. + * @param Counter: specifies the watchdog counter value. + * This parameter must be a number between 0x40 and 0x7F. + * @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; +} + +/** + * @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. + * @retval None + */ +void WWDG_Enable(uint8_t Counter) +{ + /* Check the parameters */ + assert_param(IS_WWDG_COUNTER(Counter)); + WWDG->CR = CR_WDGA_Set | Counter; +} + +/** + * @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) +{ + return (FlagStatus)(WWDG->SR); +} + +/** + * @brief Clears Early Wakeup interrupt flag. + * @param None + * @retval None + */ +void WWDG_ClearFlag(void) +{ + WWDG->SR = (uint32_t)RESET; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/stm32f10x_wwdg.h b/Soft/Suwmiarka_CrossWorks/stm32f10x_wwdg.h new file mode 100644 index 0000000..8595698 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/stm32f10x_wwdg.h @@ -0,0 +1,114 @@ +/** + ****************************************************************************** + * @file stm32f10x_wwdg.h + * @author MCD Application Team + * @version V3.4.0 + * @date 10/15/2010 + * @brief This file contains all the functions prototypes for the WWDG firmware + * library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2010 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F10x_WWDG_H +#define __STM32F10x_WWDG_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup STM32F10x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup WWDG + * @{ + */ + +/** @defgroup WWDG_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @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)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup WWDG_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup WWDG_Exported_Functions + * @{ + */ + +void WWDG_DeInit(void); +void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); +void WWDG_SetWindowValue(uint8_t WindowValue); +void WWDG_EnableIT(void); +void WWDG_SetCounter(uint8_t Counter); +void WWDG_Enable(uint8_t Counter); +FlagStatus WWDG_GetFlagStatus(void); +void WWDG_ClearFlag(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F10x_WWDG_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/system_stm32f10x.c b/Soft/Suwmiarka_CrossWorks/system_stm32f10x.c new file mode 100644 index 0000000..bf480d7 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/system_stm32f10x.c @@ -0,0 +1,916 @@ +/** + ****************************************************************************** + * @file system_stm32f10x.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File. + * + * 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 + * factors, AHB/APBx prescalers and Flash settings). + * This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f10x_xx.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) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32f10x_xx.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 8 MHz (or 25 MHz, depedning on + * the product used), refer to "HSE_VALUE" define in "stm32f10x.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 2013 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 stm32f10x_system + * @{ + */ + +/** @addtogroup STM32F10x_System_Private_Includes + * @{ + */ + +#include "stm32f10x.h" + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Defines + * @{ + */ + +/*!< Uncomment the line corresponding to the desired System clock (SYSCLK) + frequency (after reset the HSI is used as SYSCLK source) + + IMPORTANT NOTE: + ============== + 1. After each device reset the HSI is used as System clock source. + + 2. Please make sure that the selected System clock doesn't exceed your device's + maximum frequency. + + 3. If none of the define below is enabled, the HSI is used as System clock + source. + + 4. The System clock configuration functions provided within this file assume that: + - For Low, Medium and High density Value line devices an external 8MHz + crystal is used to drive the System clock. + - For Low, Medium and High density devices an external 8MHz crystal is + used to drive the System clock. + - For Connectivity line devices an external 25MHz crystal is used to drive + the System clock. + If you are using different crystal you have to adapt those functions accordingly. + */ + +#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) +/* #define SYSCLK_FREQ_HSE HSE_VALUE */ + #define SYSCLK_FREQ_24MHz 24000000 +#else +/* #define SYSCLK_FREQ_HSE HSE_VALUE */ +/* #define SYSCLK_FREQ_24MHz 24000000 */ +/* #define SYSCLK_FREQ_36MHz 36000000 */ +/* #define SYSCLK_FREQ_48MHz 48000000 */ +/* #define SYSCLK_FREQ_56MHz 56000000 */ +#define SYSCLK_FREQ_72MHz 72000000 +#endif + +/*!< Uncomment the following line if you need to use external SRAM mounted + on STM3210E-EVAL board (STM32 High density and XL-density devices) or on + STM32100E-EVAL board (STM32 High-density value line devices) as data memory */ +#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL) +/* #define DATA_IN_ExtSRAM */ +#endif + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ + + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Variables + * @{ + */ + +/******************************************************************************* +* Clock Definitions +*******************************************************************************/ +#ifdef SYSCLK_FREQ_HSE + uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_24MHz + uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_36MHz + uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_48MHz + uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz; /*!< System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_56MHz + uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz; /*!< System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_72MHz + uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /*!< System Clock Frequency (Core Clock) */ +#else /*!< HSI Selected as System Clock source */ + uint32_t SystemCoreClock = HSI_VALUE; /*!< System Clock Frequency (Core Clock) */ +#endif + +__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_FunctionPrototypes + * @{ + */ + +static void SetSysClock(void); + +#ifdef SYSCLK_FREQ_HSE + static void SetSysClockToHSE(void); +#elif defined SYSCLK_FREQ_24MHz + static void SetSysClockTo24(void); +#elif defined SYSCLK_FREQ_36MHz + static void SetSysClockTo36(void); +#elif defined SYSCLK_FREQ_48MHz + static void SetSysClockTo48(void); +#elif defined SYSCLK_FREQ_56MHz + static void SetSysClockTo56(void); +#elif defined SYSCLK_FREQ_72MHz + static void SetSysClockTo72(void); +#endif + +#ifdef DATA_IN_ExtSRAM + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F10x_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemCoreClock variable. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +void SystemInit (void) +{ + /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ + + RCC->CFGR &= (uint32_t)0xF8FF0000; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ + RCC->CFGR &= (uint32_t)0xFF80FFFF; + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000; +#else + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000; +#endif /* STM32F10X_XX */ + +#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL) + #ifdef DATA_IN_ExtSRAM + SystemInit_ExtMemCtl(); + #endif /* DATA_IN_ExtSRAM */ +#endif + + /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */ + /* Configure the Flash Latency cycles and enable prefetch buffer */ + SetSysClock(); + +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ +#endif +} +/** + * @brief Update SystemCoreClock variable 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 by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f1xx.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 stm32f1xx.h file (default value + * 8 MHz or 25 MHz, depending on the product used), 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; + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) + uint32_t prediv1factor = 0; +#endif /* STM32F10X_LD_VL or STM32F10X_MD_VL or STM32F10X_HD_VL */ + + /* 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 + { + #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) + prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1; + /* HSE oscillator clock selected as PREDIV1 clock entry */ + SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; + #else + /* HSE selected as PLL clock entry */ + if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET) + {/* HSE oscillator clock divided by 2 */ + SystemCoreClock = (HSE_VALUE >> 1) * pllmull; + } + else + { + SystemCoreClock = HSE_VALUE * pllmull; + } + #endif + } + + break; + + default: + 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, HCLK, PCLK2 and PCLK1 prescalers. + * @param None + * @retval None + */ +static void SetSysClock(void) +{ +#ifdef SYSCLK_FREQ_HSE + SetSysClockToHSE(); +#elif defined SYSCLK_FREQ_24MHz + SetSysClockTo24(); +#elif defined SYSCLK_FREQ_36MHz + SetSysClockTo36(); +#elif defined SYSCLK_FREQ_48MHz + SetSysClockTo48(); +#elif defined SYSCLK_FREQ_56MHz + SetSysClockTo56(); +#elif defined SYSCLK_FREQ_72MHz + SetSysClockTo72(); +#endif + + /* If none of the define above is enabled, the HSI is used as System clock + source (default after reset) */ +} + +/** + * @brief Setup the external memory controller. Called in startup_stm32f10x.s + * before jump to __main + * @param None + * @retval None + */ +#ifdef DATA_IN_ExtSRAM +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f10x_xx.s/.c before jump to main. + * This function configures the external SRAM mounted on STM3210E-EVAL + * board (STM32 High density devices). This SRAM will be used as program + * data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ +/*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is + required, then adjust the Register Addresses */ + + /* Enable FSMC clock */ + RCC->AHBENR = 0x00000114; + + /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */ + RCC->APB2ENR = 0x000001E0; + +/* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/ +/*---------------- SRAM Address lines configuration -------------------------*/ +/*---------------- NOE and NWE configuration --------------------------------*/ +/*---------------- NE3 configuration ----------------------------------------*/ +/*---------------- NBL0, NBL1 configuration ---------------------------------*/ + + GPIOD->CRL = 0x44BB44BB; + GPIOD->CRH = 0xBBBBBBBB; + + GPIOE->CRL = 0xB44444BB; + GPIOE->CRH = 0xBBBBBBBB; + + GPIOF->CRL = 0x44BBBBBB; + GPIOF->CRH = 0xBBBB4444; + + GPIOG->CRL = 0x44BBBBBB; + GPIOG->CRH = 0x44444B44; + +/*---------------- FSMC Configuration ---------------------------------------*/ +/*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/ + + FSMC_Bank1->BTCR[4] = 0x00001011; + FSMC_Bank1->BTCR[5] = 0x00000200; +} +#endif /* DATA_IN_ExtSRAM */ + +#ifdef SYSCLK_FREQ_HSE +/** + * @brief Selects HSE as System clock source and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockToHSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + +#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 0 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; +#endif + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; + + /* Select HSE as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSE; + + /* Wait till HSE is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x04) + { + } + } + 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 */ + } +} +#elif defined SYSCLK_FREQ_24MHz +/** + * @brief Sets System clock frequency to 24MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo24(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { +#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 0 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; +#endif + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; + +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + /* PLL configuration: = (HSE / 2) * 6 = 24 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_Div2 | RCC_CFGR_PLLMULL6); +#else + /* PLL configuration: = (HSE / 2) * 6 = 24 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL6); +#endif /* STM32F10X_XX */ + + /* 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)0x08) + { + } + } + 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 */ + } +} +#elif defined SYSCLK_FREQ_36MHz +/** + * @brief Sets System clock frequency to 36MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo36(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 1 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; + + /* PLL configuration: PLLCLK = (HSE / 2) * 9 = 36 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL9); + + /* 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)0x08) + { + } + } + 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 */ + } +} +#elif defined SYSCLK_FREQ_48MHz +/** + * @brief Sets System clock frequency to 48MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo48(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 1 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = 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_HSE | 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)0x08) + { + } + } + 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 */ + } +} + +#elif defined SYSCLK_FREQ_56MHz +/** + * @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo56(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 2 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; + + + /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL7); + + /* 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)0x08) + { + } + } + 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 */ + } +} + +#elif defined SYSCLK_FREQ_72MHz +/** + * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 + * and PCLK1 prescalers. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +static void SetSysClockTo72(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + + /* Flash 2 wait state */ + FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; + + + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | + RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); + + /* 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)0x08) + { + } + } + 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 + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/systick.h b/Soft/Suwmiarka_CrossWorks/systick.h new file mode 100644 index 0000000..3d00ccd --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/systick.h @@ -0,0 +1,12 @@ + +#ifndef __SYSTICK_H +#define __SYSTICK_H + +#include "stm32f10x.h" + +//------makra---------// +#define SYSTICK_Init(X) (SysTick_Config(SystemCoreClock / 1000*(X))) + + + +#endif diff --git a/Soft/Suwmiarka_CrossWorks/usb_conf.h b/Soft/Suwmiarka_CrossWorks/usb_conf.h new file mode 100644 index 0000000..35b58ff --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_conf.h @@ -0,0 +1,93 @@ +/** + ****************************************************************************** + * @file usb_conf.h + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Custom HID demo configuration file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 __USB_CONF_H +#define __USB_CONF_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/* External variables --------------------------------------------------------*/ +/*-------------------------------------------------------------*/ +/* EP_NUM */ +/* defines how many endpoints are used by the device */ +/*-------------------------------------------------------------*/ +#define EP_NUM (2) + +/*-------------------------------------------------------------*/ +/* -------------- Buffer Description Table -----------------*/ +/*-------------------------------------------------------------*/ +/* buffer table base address */ +/* buffer table base address */ +#define BTABLE_ADDRESS (0x00) + +/* EP0 */ +/* rx/tx buffer base address */ +#define ENDP0_RXADDR (0x18) +#define ENDP0_TXADDR (0x58) + +/* EP1 */ +/* tx buffer base address */ +#define ENDP1_TXADDR (0x100) +#define ENDP1_RXADDR (0x140) + +/*-------------------------------------------------------------*/ +/* ------------------- ISTR events -------------------------*/ +/*-------------------------------------------------------------*/ +/* IMR_MSK */ +/* mask defining which events has to be handled */ +/* by the device application software */ + +#define IMR_MSK (CNTR_CTRM | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM | CNTR_SOFM \ + | CNTR_ESOFM | CNTR_RESETM ) + +/* CTR service routines */ +/* associated to defined endpoints */ +/* #define EP1_IN_Callback NOP_Process */ +#define EP2_IN_Callback NOP_Process +#define EP3_IN_Callback NOP_Process +#define EP4_IN_Callback NOP_Process +#define EP5_IN_Callback NOP_Process +#define EP6_IN_Callback NOP_Process +#define EP7_IN_Callback NOP_Process + +//#define EP1_OUT_Callback NOP_Process +#define EP2_OUT_Callback NOP_Process +#define EP3_OUT_Callback NOP_Process +#define EP4_OUT_Callback NOP_Process +#define EP5_OUT_Callback NOP_Process +#define EP6_OUT_Callback NOP_Process +#define EP7_OUT_Callback NOP_Process + +#endif /*__USB_CONF_H*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Soft/Suwmiarka_CrossWorks/usb_core.c b/Soft/Suwmiarka_CrossWorks/usb_core.c new file mode 100644 index 0000000..a0c6805 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_core.c @@ -0,0 +1,1033 @@ +/** + ****************************************************************************** + * @file usb_core.c + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Standard protocol processing (USB v2.0) + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Includes ------------------------------------------------------------------*/ +#include "usb_lib.h" +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define ValBit(VAR,Place) (VAR & (1 << Place)) +#define SetBit(VAR,Place) (VAR |= (1 << Place)) +#define ClrBit(VAR,Place) (VAR &= ((1 << Place) ^ 255)) +#define Send0LengthData() { _SetEPTxCount(ENDP0, 0); \ + vSetEPTxStatus(EP_TX_VALID); \ + } + +#define vSetEPRxStatus(st) (SaveRState = st) +#define vSetEPTxStatus(st) (SaveTState = st) + +#define USB_StatusIn() Send0LengthData() +#define USB_StatusOut() vSetEPRxStatus(EP_RX_VALID) + +#define StatusInfo0 StatusInfo.bw.bb1 /* Reverse bb0 & bb1 */ +#define StatusInfo1 StatusInfo.bw.bb0 + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint16_t_uint8_t StatusInfo; + +bool Data_Mul_MaxPacketSize = FALSE; +/* Private function prototypes -----------------------------------------------*/ +static void DataStageOut(void); +static void DataStageIn(void); +static void NoData_Setup0(void); +static void Data_Setup0(void); +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : Standard_GetConfiguration. +* Description : Return the current configuration variable address. +* Input : Length - How many bytes are needed. +* Output : None. +* Return : Return 1 , if the request is invalid when "Length" is 0. +* Return "Buffer" if the "Length" is not 0. +*******************************************************************************/ +uint8_t *Standard_GetConfiguration(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = + sizeof(pInformation->Current_Configuration); + return 0; + } + pUser_Standard_Requests->User_GetConfiguration(); + return (uint8_t *)&pInformation->Current_Configuration; +} + +/******************************************************************************* +* Function Name : Standard_SetConfiguration. +* Description : This routine is called to set the configuration value +* Then each class should configure device itself. +* Input : None. +* Output : None. +* Return : Return USB_SUCCESS, if the request is performed. +* Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetConfiguration(void) +{ + + if ((pInformation->USBwValue0 <= + Device_Table.Total_Configuration) && (pInformation->USBwValue1 == 0) + && (pInformation->USBwIndex == 0)) /*call Back usb spec 2.0*/ + { + pInformation->Current_Configuration = pInformation->USBwValue0; + pUser_Standard_Requests->User_SetConfiguration(); + return USB_SUCCESS; + } + else + { + return USB_UNSUPPORT; + } +} + +/******************************************************************************* +* Function Name : Standard_GetInterface. +* Description : Return the Alternate Setting of the current interface. +* Input : Length - How many bytes are needed. +* Output : None. +* Return : Return 0, if the request is invalid when "Length" is 0. +* Return "Buffer" if the "Length" is not 0. +*******************************************************************************/ +uint8_t *Standard_GetInterface(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = + sizeof(pInformation->Current_AlternateSetting); + return 0; + } + pUser_Standard_Requests->User_GetInterface(); + return (uint8_t *)&pInformation->Current_AlternateSetting; +} + +/******************************************************************************* +* Function Name : Standard_SetInterface. +* Description : This routine is called to set the interface. +* Then each class should configure the interface them self. +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetInterface(void) +{ + RESULT Re; + /*Test if the specified Interface and Alternate Setting are supported by + the application Firmware*/ + Re = (*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, pInformation->USBwValue0); + + if (pInformation->Current_Configuration != 0) + { + if ((Re != USB_SUCCESS) || (pInformation->USBwIndex1 != 0) + || (pInformation->USBwValue1 != 0)) + { + return USB_UNSUPPORT; + } + else if (Re == USB_SUCCESS) + { + pUser_Standard_Requests->User_SetInterface(); + pInformation->Current_Interface = pInformation->USBwIndex0; + pInformation->Current_AlternateSetting = pInformation->USBwValue0; + return USB_SUCCESS; + } + + } + + return USB_UNSUPPORT; +} + +/******************************************************************************* +* Function Name : Standard_GetStatus. +* Description : Copy the device request data to "StatusInfo buffer". +* Input : - Length - How many bytes are needed. +* Output : None. +* Return : Return 0, if the request is at end of data block, +* or is invalid when "Length" is 0. +*******************************************************************************/ +uint8_t *Standard_GetStatus(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = 2; + return 0; + } + + /* Reset Status Information */ + StatusInfo.w = 0; + + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + /*Get Device Status */ + uint8_t Feature = pInformation->Current_Feature; + + /* Remote Wakeup enabled */ + if (ValBit(Feature, 5)) + { + SetBit(StatusInfo0, 1); + } + else + { + ClrBit(StatusInfo0, 1); + } + + /* Bus-powered */ + if (ValBit(Feature, 6)) + { + SetBit(StatusInfo0, 0); + } + else /* Self-powered */ + { + ClrBit(StatusInfo0, 0); + } + } + /*Interface Status*/ + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + return (uint8_t *)&StatusInfo; + } + /*Get EndPoint Status*/ + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + uint8_t Related_Endpoint; + uint8_t wIndex0 = pInformation->USBwIndex0; + + Related_Endpoint = (wIndex0 & 0x0f); + if (ValBit(wIndex0, 7)) + { + /* IN endpoint */ + if (_GetTxStallStatus(Related_Endpoint)) + { + SetBit(StatusInfo0, 0); /* IN Endpoint stalled */ + } + } + else + { + /* OUT endpoint */ + if (_GetRxStallStatus(Related_Endpoint)) + { + SetBit(StatusInfo0, 0); /* OUT Endpoint stalled */ + } + } + + } + else + { + return NULL; + } + pUser_Standard_Requests->User_GetStatus(); + return (uint8_t *)&StatusInfo; +} + +/******************************************************************************* +* Function Name : Standard_ClearFeature. +* Description : Clear or disable a specific feature. +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_ClearFeature(void) +{ + uint32_t Type_Rec = Type_Recipient; + uint32_t Status; + + + if (Type_Rec == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + {/*Device Clear Feature*/ + ClrBit(pInformation->Current_Feature, 5); + return USB_SUCCESS; + } + else if (Type_Rec == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + {/*EndPoint Clear Feature*/ + DEVICE* pDev; + uint32_t Related_Endpoint; + uint32_t wIndex0; + uint32_t rEP; + + if ((pInformation->USBwValue != ENDPOINT_STALL) + || (pInformation->USBwIndex1 != 0)) + { + return USB_UNSUPPORT; + } + + pDev = &Device_Table; + wIndex0 = pInformation->USBwIndex0; + rEP = wIndex0 & ~0x80; + Related_Endpoint = ENDP0 + rEP; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + /*Get Status of endpoint & stall the request if the related_ENdpoint + is Disabled*/ + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if ((rEP >= pDev->Total_Endpoint) || (Status == 0) + || (pInformation->Current_Configuration == 0)) + { + return USB_UNSUPPORT; + } + + + if (wIndex0 & 0x80) + { + /* IN endpoint */ + if (_GetTxStallStatus(Related_Endpoint )) + { + ClearDTOG_TX(Related_Endpoint); + SetEPTxStatus(Related_Endpoint, EP_TX_VALID); + } + } + else + { + /* OUT endpoint */ + if (_GetRxStallStatus(Related_Endpoint)) + { + if (Related_Endpoint == ENDP0) + { + /* After clear the STALL, enable the default endpoint receiver */ + SetEPRxCount(Related_Endpoint, Device_Property.MaxPacketSize); + _SetEPRxStatus(Related_Endpoint, EP_RX_VALID); + } + else + { + ClearDTOG_RX(Related_Endpoint); + _SetEPRxStatus(Related_Endpoint, EP_RX_VALID); + } + } + } + pUser_Standard_Requests->User_ClearFeature(); + return USB_SUCCESS; + } + + return USB_UNSUPPORT; +} + +/******************************************************************************* +* Function Name : Standard_SetEndPointFeature +* Description : Set or enable a specific feature of EndPoint +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetEndPointFeature(void) +{ + uint32_t wIndex0; + uint32_t Related_Endpoint; + uint32_t rEP; + uint32_t Status; + + wIndex0 = pInformation->USBwIndex0; + rEP = wIndex0 & ~0x80; + Related_Endpoint = ENDP0 + rEP; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + /* get Status of endpoint & stall the request if the related_ENdpoint + is Disabled*/ + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if (Related_Endpoint >= Device_Table.Total_Endpoint + || pInformation->USBwValue != 0 || Status == 0 + || pInformation->Current_Configuration == 0) + { + return USB_UNSUPPORT; + } + else + { + if (wIndex0 & 0x80) + { + /* IN endpoint */ + _SetEPTxStatus(Related_Endpoint, EP_TX_STALL); + } + + else + { + /* OUT endpoint */ + _SetEPRxStatus(Related_Endpoint, EP_RX_STALL); + } + } + pUser_Standard_Requests->User_SetEndPointFeature(); + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : Standard_SetDeviceFeature. +* Description : Set or enable a specific feature of Device. +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetDeviceFeature(void) +{ + SetBit(pInformation->Current_Feature, 5); + pUser_Standard_Requests->User_SetDeviceFeature(); + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : Standard_GetDescriptorData. +* Description : Standard_GetDescriptorData is used for descriptors transfer. +* : This routine is used for the descriptors resident in Flash +* or RAM +* pDesc can be in either Flash or RAM +* The purpose of this routine is to have a versatile way to +* response descriptors request. It allows user to generate +* certain descriptors with software or read descriptors from +* external storage part by part. +* Input : - Length - Length of the data in this transfer. +* - pDesc - A pointer points to descriptor struct. +* The structure gives the initial address of the descriptor and +* its original size. +* Output : None. +* Return : Address of a part of the descriptor pointed by the Usb_ +* wOffset The buffer pointed by this address contains at least +* Length bytes. +*******************************************************************************/ +uint8_t *Standard_GetDescriptorData(uint16_t Length, ONE_DESCRIPTOR *pDesc) +{ + uint32_t wOffset; + + wOffset = pInformation->Ctrl_Info.Usb_wOffset; + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = pDesc->Descriptor_Size - wOffset; + return 0; + } + + return pDesc->Descriptor + wOffset; +} + +/******************************************************************************* +* Function Name : DataStageOut. +* Description : Data stage of a Control Write Transfer. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void DataStageOut(void) +{ + ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; + uint32_t save_rLength; + + save_rLength = pEPinfo->Usb_rLength; + + if (pEPinfo->CopyData && save_rLength) + { + uint8_t *Buffer; + uint32_t Length; + + Length = pEPinfo->PacketSize; + if (Length > save_rLength) + { + Length = save_rLength; + } + + Buffer = (*pEPinfo->CopyData)(Length); + pEPinfo->Usb_rLength -= Length; + pEPinfo->Usb_rOffset += Length; + PMAToUserBufferCopy(Buffer, GetEPRxAddr(ENDP0), Length); + + } + + if (pEPinfo->Usb_rLength != 0) + { + vSetEPRxStatus(EP_RX_VALID);/* re-enable for next data reception */ + SetEPTxCount(ENDP0, 0); + vSetEPTxStatus(EP_TX_VALID);/* Expect the host to abort the data OUT stage */ + } + /* Set the next State*/ + if (pEPinfo->Usb_rLength >= pEPinfo->PacketSize) + { + pInformation->ControlState = OUT_DATA; + } + else + { + if (pEPinfo->Usb_rLength > 0) + { + pInformation->ControlState = LAST_OUT_DATA; + } + else if (pEPinfo->Usb_rLength == 0) + { + pInformation->ControlState = WAIT_STATUS_IN; + USB_StatusIn(); + } + } +} + +/******************************************************************************* +* Function Name : DataStageIn. +* Description : Data stage of a Control Read Transfer. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void DataStageIn(void) +{ + ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; + uint32_t save_wLength = pEPinfo->Usb_wLength; + uint32_t ControlState = pInformation->ControlState; + + uint8_t *DataBuffer; + uint32_t Length; + + if ((save_wLength == 0) && (ControlState == LAST_IN_DATA)) + { + if(Data_Mul_MaxPacketSize == TRUE) + { + /* No more data to send and empty packet */ + Send0LengthData(); + ControlState = LAST_IN_DATA; + Data_Mul_MaxPacketSize = FALSE; + } + else + { + /* No more data to send so STALL the TX Status*/ + ControlState = WAIT_STATUS_OUT; + vSetEPTxStatus(EP_TX_STALL); + + } + + goto Expect_Status_Out; + } + + Length = pEPinfo->PacketSize; + ControlState = (save_wLength <= Length) ? LAST_IN_DATA : IN_DATA; + + if (Length > save_wLength) + { + Length = save_wLength; + } + + DataBuffer = (*pEPinfo->CopyData)(Length); + + UserToPMABufferCopy(DataBuffer, GetEPTxAddr(ENDP0), Length); + + SetEPTxCount(ENDP0, Length); + + pEPinfo->Usb_wLength -= Length; + pEPinfo->Usb_wOffset += Length; + vSetEPTxStatus(EP_TX_VALID); + + USB_StatusOut();/* Expect the host to abort the data IN stage */ + +Expect_Status_Out: + pInformation->ControlState = ControlState; +} + +/******************************************************************************* +* Function Name : NoData_Setup0. +* Description : Proceed the processing of setup request without data stage. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void NoData_Setup0(void) +{ + RESULT Result = USB_UNSUPPORT; + uint32_t RequestNo = pInformation->USBbRequest; + uint32_t ControlState; + + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + /* Device Request*/ + /* SET_CONFIGURATION*/ + if (RequestNo == SET_CONFIGURATION) + { + Result = Standard_SetConfiguration(); + } + + /*SET ADDRESS*/ + else if (RequestNo == SET_ADDRESS) + { + if ((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0) + || (pInformation->USBwIndex != 0) + || (pInformation->Current_Configuration != 0)) + /* Device Address should be 127 or less*/ + { + ControlState = STALLED; + goto exit_NoData_Setup0; + } + else + { + Result = USB_SUCCESS; + } + } + /*SET FEATURE for Device*/ + else if (RequestNo == SET_FEATURE) + { + if ((pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP) \ + && (pInformation->USBwIndex == 0)) + { + Result = Standard_SetDeviceFeature(); + } + else + { + Result = USB_UNSUPPORT; + } + } + /*Clear FEATURE for Device */ + else if (RequestNo == CLEAR_FEATURE) + { + if (pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP + && pInformation->USBwIndex == 0 + && ValBit(pInformation->Current_Feature, 5)) + { + Result = Standard_ClearFeature(); + } + else + { + Result = USB_UNSUPPORT; + } + } + + } + + /* Interface Request*/ + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + /*SET INTERFACE*/ + if (RequestNo == SET_INTERFACE) + { + Result = Standard_SetInterface(); + } + } + + /* EndPoint Request*/ + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + /*CLEAR FEATURE for EndPoint*/ + if (RequestNo == CLEAR_FEATURE) + { + Result = Standard_ClearFeature(); + } + /* SET FEATURE for EndPoint*/ + else if (RequestNo == SET_FEATURE) + { + Result = Standard_SetEndPointFeature(); + } + } + else + { + Result = USB_UNSUPPORT; + } + + + if (Result != USB_SUCCESS) + { + Result = (*pProperty->Class_NoData_Setup)(RequestNo); + if (Result == USB_NOT_READY) + { + ControlState = PAUSE; + goto exit_NoData_Setup0; + } + } + + if (Result != USB_SUCCESS) + { + ControlState = STALLED; + goto exit_NoData_Setup0; + } + + ControlState = WAIT_STATUS_IN;/* After no data stage SETUP */ + + USB_StatusIn(); + +exit_NoData_Setup0: + pInformation->ControlState = ControlState; + return; +} + +/******************************************************************************* +* Function Name : Data_Setup0. +* Description : Proceed the processing of setup request with data stage. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Data_Setup0(void) +{ + uint8_t *(*CopyRoutine)(uint16_t); + RESULT Result; + uint32_t Request_No = pInformation->USBbRequest; + + uint32_t Related_Endpoint, Reserved; + uint32_t wOffset, Status; + + + + CopyRoutine = NULL; + wOffset = 0; + + /*GET DESCRIPTOR*/ + if (Request_No == GET_DESCRIPTOR) + { + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + uint8_t wValue1 = pInformation->USBwValue1; + if (wValue1 == DEVICE_DESCRIPTOR) + { + CopyRoutine = pProperty->GetDeviceDescriptor; + } + else if (wValue1 == CONFIG_DESCRIPTOR) + { + CopyRoutine = pProperty->GetConfigDescriptor; + } + else if (wValue1 == STRING_DESCRIPTOR) + { + CopyRoutine = pProperty->GetStringDescriptor; + } /* End of GET_DESCRIPTOR */ + } + } + + /*GET STATUS*/ + else if ((Request_No == GET_STATUS) && (pInformation->USBwValue == 0) + && (pInformation->USBwLength == 0x0002) + && (pInformation->USBwIndex1 == 0)) + { + /* GET STATUS for Device*/ + if ((Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + && (pInformation->USBwIndex == 0)) + { + CopyRoutine = Standard_GetStatus; + } + + /* GET STATUS for Interface*/ + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + if (((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS) + && (pInformation->Current_Configuration != 0)) + { + CopyRoutine = Standard_GetStatus; + } + } + + /* GET STATUS for EndPoint*/ + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + Related_Endpoint = (pInformation->USBwIndex0 & 0x0f); + Reserved = pInformation->USBwIndex0 & 0x70; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + /*Get Status of endpoint & stall the request if the related_ENdpoint + is Disabled*/ + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if ((Related_Endpoint < Device_Table.Total_Endpoint) && (Reserved == 0) + && (Status != 0)) + { + CopyRoutine = Standard_GetStatus; + } + } + + } + + /*GET CONFIGURATION*/ + else if (Request_No == GET_CONFIGURATION) + { + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + CopyRoutine = Standard_GetConfiguration; + } + } + /*GET INTERFACE*/ + else if (Request_No == GET_INTERFACE) + { + if ((Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + && (pInformation->Current_Configuration != 0) && (pInformation->USBwValue == 0) + && (pInformation->USBwIndex1 == 0) && (pInformation->USBwLength == 0x0001) + && ((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS)) + { + CopyRoutine = Standard_GetInterface; + } + + } + + if (CopyRoutine) + { + pInformation->Ctrl_Info.Usb_wOffset = wOffset; + pInformation->Ctrl_Info.CopyData = CopyRoutine; + /* sb in the original the cast to word was directly */ + /* now the cast is made step by step */ + (*CopyRoutine)(0); + Result = USB_SUCCESS; + } + else + { + Result = (*pProperty->Class_Data_Setup)(pInformation->USBbRequest); + if (Result == USB_NOT_READY) + { + pInformation->ControlState = PAUSE; + return; + } + } + + if (pInformation->Ctrl_Info.Usb_wLength == 0xFFFF) + { + /* Data is not ready, wait it */ + pInformation->ControlState = PAUSE; + return; + } + if ((Result == USB_UNSUPPORT) || (pInformation->Ctrl_Info.Usb_wLength == 0)) + { + /* Unsupported request */ + pInformation->ControlState = STALLED; + return; + } + + + if (ValBit(pInformation->USBbmRequestType, 7)) + { + /* Device ==> Host */ + __IO uint32_t wLength = pInformation->USBwLength; + + /* Restrict the data length to be the one host asks for */ + if (pInformation->Ctrl_Info.Usb_wLength > wLength) + { + pInformation->Ctrl_Info.Usb_wLength = wLength; + } + + else if (pInformation->Ctrl_Info.Usb_wLength < pInformation->USBwLength) + { + if (pInformation->Ctrl_Info.Usb_wLength < pProperty->MaxPacketSize) + { + Data_Mul_MaxPacketSize = FALSE; + } + else if ((pInformation->Ctrl_Info.Usb_wLength % pProperty->MaxPacketSize) == 0) + { + Data_Mul_MaxPacketSize = TRUE; + } + } + + pInformation->Ctrl_Info.PacketSize = pProperty->MaxPacketSize; + DataStageIn(); + } + else + { + pInformation->ControlState = OUT_DATA; + vSetEPRxStatus(EP_RX_VALID); /* enable for next data reception */ + } + + return; +} + +/******************************************************************************* +* Function Name : Setup0_Process +* Description : Get the device request data and dispatch to individual process. +* Input : None. +* Output : None. +* Return : Post0_Process. +*******************************************************************************/ +uint8_t Setup0_Process(void) +{ + + union + { + uint8_t* b; + uint16_t* w; + } pBuf; + uint16_t offset = 1; + + pBuf.b = PMAAddr + (uint8_t *)(_GetEPRxAddr(ENDP0) * 2); /* *2 for 32 bits addr */ + + if (pInformation->ControlState != PAUSE) + { + pInformation->USBbmRequestType = *pBuf.b++; /* bmRequestType */ + pInformation->USBbRequest = *pBuf.b++; /* bRequest */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwValue = ByteSwap(*pBuf.w++); /* wValue */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwIndex = ByteSwap(*pBuf.w++); /* wIndex */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwLength = *pBuf.w; /* wLength */ + } + + pInformation->ControlState = SETTING_UP; + if (pInformation->USBwLength == 0) + { + /* Setup with no data stage */ + NoData_Setup0(); + } + else + { + /* Setup with data stage */ + Data_Setup0(); + } + return Post0_Process(); +} + +/******************************************************************************* +* Function Name : In0_Process +* Description : Process the IN token on all default endpoint. +* Input : None. +* Output : None. +* Return : Post0_Process. +*******************************************************************************/ +uint8_t In0_Process(void) +{ + uint32_t ControlState = pInformation->ControlState; + + if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) + { + DataStageIn(); + /* ControlState may be changed outside the function */ + ControlState = pInformation->ControlState; + } + + else if (ControlState == WAIT_STATUS_IN) + { + if ((pInformation->USBbRequest == SET_ADDRESS) && + (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))) + { + SetDeviceAddress(pInformation->USBwValue0); + pUser_Standard_Requests->User_SetDeviceAddress(); + } + (*pProperty->Process_Status_IN)(); + ControlState = STALLED; + } + + else + { + ControlState = STALLED; + } + + pInformation->ControlState = ControlState; + + return Post0_Process(); +} + +/******************************************************************************* +* Function Name : Out0_Process +* Description : Process the OUT token on all default endpoint. +* Input : None. +* Output : None. +* Return : Post0_Process. +*******************************************************************************/ +uint8_t Out0_Process(void) +{ + uint32_t ControlState = pInformation->ControlState; + + if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) + { + /* host aborts the transfer before finish */ + ControlState = STALLED; + } + else if ((ControlState == OUT_DATA) || (ControlState == LAST_OUT_DATA)) + { + DataStageOut(); + ControlState = pInformation->ControlState; /* may be changed outside the function */ + } + + else if (ControlState == WAIT_STATUS_OUT) + { + (*pProperty->Process_Status_OUT)(); + ControlState = STALLED; + } + + + /* Unexpect state, STALL the endpoint */ + else + { + ControlState = STALLED; + } + + pInformation->ControlState = ControlState; + + return Post0_Process(); +} + +/******************************************************************************* +* Function Name : Post0_Process +* Description : Stall the Endpoint 0 in case of error. +* Input : None. +* Output : None. +* Return : - 0 if the control State is in PAUSE +* - 1 if not. +*******************************************************************************/ +uint8_t Post0_Process(void) +{ + + SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); + + if (pInformation->ControlState == STALLED) + { + vSetEPRxStatus(EP_RX_STALL); + vSetEPTxStatus(EP_TX_STALL); + } + + return (pInformation->ControlState == PAUSE); +} + +/******************************************************************************* +* Function Name : SetDeviceAddress. +* Description : Set the device and all the used Endpoints addresses. +* Input : - Val: device address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetDeviceAddress(uint8_t Val) +{ + uint32_t i; + uint32_t nEP = Device_Table.Total_Endpoint; + + /* set address in every used endpoint */ + for (i = 0; i < nEP; i++) + { + _SetEPAddress((uint8_t)i, (uint8_t)i); + } /* for */ + _SetDADDR(Val | DADDR_EF); /* set device address and enable function */ +} + +/******************************************************************************* +* Function Name : NOP_Process +* Description : No operation function. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void NOP_Process(void) +{ +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_core.h b/Soft/Suwmiarka_CrossWorks/usb_core.h new file mode 100644 index 0000000..44dc327 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_core.h @@ -0,0 +1,259 @@ +/** + ****************************************************************************** + * @file usb_core.h + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Standard protocol processing functions prototypes + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_CORE_H +#define __USB_CORE_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +typedef enum _CONTROL_STATE +{ + WAIT_SETUP, /* 0 */ + SETTING_UP, /* 1 */ + IN_DATA, /* 2 */ + OUT_DATA, /* 3 */ + LAST_IN_DATA, /* 4 */ + LAST_OUT_DATA, /* 5 */ + WAIT_STATUS_IN, /* 7 */ + WAIT_STATUS_OUT, /* 8 */ + STALLED, /* 9 */ + PAUSE /* 10 */ +} CONTROL_STATE; /* The state machine states of a control pipe */ + +typedef struct OneDescriptor +{ + uint8_t *Descriptor; + uint16_t Descriptor_Size; +} +ONE_DESCRIPTOR, *PONE_DESCRIPTOR; +/* All the request process routines return a value of this type + If the return value is not SUCCESS or NOT_READY, + the software will STALL the correspond endpoint */ +typedef enum _RESULT +{ + USB_SUCCESS = 0, /* Process successfully */ + USB_ERROR, + USB_UNSUPPORT, + USB_NOT_READY /* The process has not been finished, endpoint will be + NAK to further request */ +} RESULT; + + +/*-*-*-*-*-*-*-*-*-*-* Definitions for endpoint level -*-*-*-*-*-*-*-*-*-*-*-*/ +typedef struct _ENDPOINT_INFO +{ + /* When send data out of the device, + CopyData() is used to get data buffer 'Length' bytes data + if Length is 0, + CopyData() returns the total length of the data + if the request is not supported, returns 0 + (NEW Feature ) + if CopyData() returns -1, the calling routine should not proceed + further and will resume the SETUP process by the class device + if Length is not 0, + CopyData() returns a pointer to indicate the data location + Usb_wLength is the data remain to be sent, + Usb_wOffset is the Offset of original data + When receive data from the host, + CopyData() is used to get user data buffer which is capable + of Length bytes data to copy data from the endpoint buffer. + if Length is 0, + CopyData() returns the available data length, + if Length is not 0, + CopyData() returns user buffer address + Usb_rLength is the data remain to be received, + Usb_rPointer is the Offset of data buffer + */ + uint16_t Usb_wLength; + uint16_t Usb_wOffset; + uint16_t PacketSize; + uint8_t *(*CopyData)(uint16_t Length); +}ENDPOINT_INFO; + +/*-*-*-*-*-*-*-*-*-*-*-* Definitions for device level -*-*-*-*-*-*-*-*-*-*-*-*/ + +typedef struct _DEVICE +{ + uint8_t Total_Endpoint; /* Number of endpoints that are used */ + uint8_t Total_Configuration;/* Number of configuration available */ +} +DEVICE; + +typedef union +{ + uint16_t w; + struct BW + { + uint8_t bb1; + uint8_t bb0; + } + bw; +} uint16_t_uint8_t; + +typedef struct _DEVICE_INFO +{ + uint8_t USBbmRequestType; /* bmRequestType */ + uint8_t USBbRequest; /* bRequest */ + uint16_t_uint8_t USBwValues; /* wValue */ + uint16_t_uint8_t USBwIndexs; /* wIndex */ + uint16_t_uint8_t USBwLengths; /* wLength */ + + uint8_t ControlState; /* of type CONTROL_STATE */ + uint8_t Current_Feature; + uint8_t Current_Configuration; /* Selected configuration */ + uint8_t Current_Interface; /* Selected interface of current configuration */ + uint8_t Current_AlternateSetting;/* Selected Alternate Setting of current + interface*/ + + ENDPOINT_INFO Ctrl_Info; +}DEVICE_INFO; + +typedef struct _DEVICE_PROP +{ + void (*Init)(void); /* Initialize the device */ + void (*Reset)(void); /* Reset routine of this device */ + + /* Device dependent process after the status stage */ + void (*Process_Status_IN)(void); + void (*Process_Status_OUT)(void); + + /* Procedure of process on setup stage of a class specified request with data stage */ + /* All class specified requests with data stage are processed in Class_Data_Setup + Class_Data_Setup() + responses to check all special requests and fills ENDPOINT_INFO + according to the request + If IN tokens are expected, then wLength & wOffset will be filled + with the total transferring bytes and the starting position + If OUT tokens are expected, then rLength & rOffset will be filled + with the total expected bytes and the starting position in the buffer + + If the request is valid, Class_Data_Setup returns SUCCESS, else UNSUPPORT + + CAUTION: + Since GET_CONFIGURATION & GET_INTERFACE are highly related to + the individual classes, they will be checked and processed here. + */ + RESULT (*Class_Data_Setup)(uint8_t RequestNo); + + /* Procedure of process on setup stage of a class specified request without data stage */ + /* All class specified requests without data stage are processed in Class_NoData_Setup + Class_NoData_Setup + responses to check all special requests and perform the request + + CAUTION: + Since SET_CONFIGURATION & SET_INTERFACE are highly related to + the individual classes, they will be checked and processed here. + */ + RESULT (*Class_NoData_Setup)(uint8_t RequestNo); + + /*Class_Get_Interface_Setting + This function is used by the file usb_core.c to test if the selected Interface + and Alternate Setting (uint8_t Interface, uint8_t AlternateSetting) are supported by + the application. + This function is writing by user. It should return "SUCCESS" if the Interface + and Alternate Setting are supported by the application or "UNSUPPORT" if they + are not supported. */ + + RESULT (*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting); + + uint8_t* (*GetDeviceDescriptor)(uint16_t Length); + uint8_t* (*GetConfigDescriptor)(uint16_t Length); + uint8_t* (*GetStringDescriptor)(uint16_t Length); + + /* This field is not used in current library version. It is kept only for + compatibility with previous versions */ + void* RxEP_buffer; + + uint8_t MaxPacketSize; + +}DEVICE_PROP; + +typedef struct _USER_STANDARD_REQUESTS +{ + void (*User_GetConfiguration)(void); /* Get Configuration */ + void (*User_SetConfiguration)(void); /* Set Configuration */ + void (*User_GetInterface)(void); /* Get Interface */ + void (*User_SetInterface)(void); /* Set Interface */ + void (*User_GetStatus)(void); /* Get Status */ + void (*User_ClearFeature)(void); /* Clear Feature */ + void (*User_SetEndPointFeature)(void); /* Set Endpoint Feature */ + void (*User_SetDeviceFeature)(void); /* Set Device Feature */ + void (*User_SetDeviceAddress)(void); /* Set Device Address */ +} +USER_STANDARD_REQUESTS; + +/* Exported constants --------------------------------------------------------*/ +#define Type_Recipient (pInformation->USBbmRequestType & (REQUEST_TYPE | RECIPIENT)) + +#define Usb_rLength Usb_wLength +#define Usb_rOffset Usb_wOffset + +#define USBwValue USBwValues.w +#define USBwValue0 USBwValues.bw.bb0 +#define USBwValue1 USBwValues.bw.bb1 +#define USBwIndex USBwIndexs.w +#define USBwIndex0 USBwIndexs.bw.bb0 +#define USBwIndex1 USBwIndexs.bw.bb1 +#define USBwLength USBwLengths.w +#define USBwLength0 USBwLengths.bw.bb0 +#define USBwLength1 USBwLengths.bw.bb1 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +uint8_t Setup0_Process(void); +uint8_t Post0_Process(void); +uint8_t Out0_Process(void); +uint8_t In0_Process(void); + +RESULT Standard_SetEndPointFeature(void); +RESULT Standard_SetDeviceFeature(void); + +uint8_t *Standard_GetConfiguration(uint16_t Length); +RESULT Standard_SetConfiguration(void); +uint8_t *Standard_GetInterface(uint16_t Length); +RESULT Standard_SetInterface(void); +uint8_t *Standard_GetDescriptorData(uint16_t Length, PONE_DESCRIPTOR pDesc); + +uint8_t *Standard_GetStatus(uint16_t Length); +RESULT Standard_ClearFeature(void); +void SetDeviceAddress(uint8_t); +void NOP_Process(void); + +extern DEVICE_PROP Device_Property; +extern USER_STANDARD_REQUESTS User_Standard_Requests; +extern DEVICE Device_Table; +extern DEVICE_INFO Device_Info; + +/* cells saving status during interrupt servicing */ +extern __IO uint16_t SaveRState; +extern __IO uint16_t SaveTState; + +#endif /* __USB_CORE_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_def.h b/Soft/Suwmiarka_CrossWorks/usb_def.h new file mode 100644 index 0000000..9c5c53f --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_def.h @@ -0,0 +1,92 @@ +/** + ****************************************************************************** + * @file usb_def.h + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Definitions related to USB Core + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_DEF_H +#define __USB_DEF_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +typedef enum _RECIPIENT_TYPE +{ + DEVICE_RECIPIENT, /* Recipient device */ + INTERFACE_RECIPIENT, /* Recipient interface */ + ENDPOINT_RECIPIENT, /* Recipient endpoint */ + OTHER_RECIPIENT +} RECIPIENT_TYPE; + + +typedef enum _STANDARD_REQUESTS +{ + GET_STATUS = 0, + CLEAR_FEATURE, + RESERVED1, + SET_FEATURE, + RESERVED2, + SET_ADDRESS, + GET_DESCRIPTOR, + SET_DESCRIPTOR, + GET_CONFIGURATION, + SET_CONFIGURATION, + GET_INTERFACE, + SET_INTERFACE, + TOTAL_sREQUEST, /* Total number of Standard request */ + SYNCH_FRAME = 12 +} STANDARD_REQUESTS; + +/* Definition of "USBwValue" */ +typedef enum _DESCRIPTOR_TYPE +{ + DEVICE_DESCRIPTOR = 1, + CONFIG_DESCRIPTOR, + STRING_DESCRIPTOR, + INTERFACE_DESCRIPTOR, + ENDPOINT_DESCRIPTOR +} DESCRIPTOR_TYPE; + +/* Feature selector of a SET_FEATURE or CLEAR_FEATURE */ +typedef enum _FEATURE_SELECTOR +{ + ENDPOINT_STALL, + DEVICE_REMOTE_WAKEUP +} FEATURE_SELECTOR; + +/* Exported constants --------------------------------------------------------*/ +/* Definition of "USBbmRequestType" */ +#define REQUEST_TYPE 0x60 /* Mask to get request type */ +#define STANDARD_REQUEST 0x00 /* Standard request */ +#define CLASS_REQUEST 0x20 /* Class request */ +#define VENDOR_REQUEST 0x40 /* Vendor request */ + +#define RECIPIENT 0x1F /* Mask to get recipient */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +#endif /* __USB_DEF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_desc.c b/Soft/Suwmiarka_CrossWorks/usb_desc.c new file mode 100644 index 0000000..aaee2ea --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_desc.c @@ -0,0 +1,317 @@ +/** + ****************************************************************************** + * @file usb_desc.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Descriptors for Custom HID Demo + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "usb_lib.h" +#include "usb_desc.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/* USB Standard Device Descriptor */ +const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] = + { + 0x12, /*bLength */ + USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ + 0x00, /*bcdUSB */ + 0x02, + 0x00, /*bDeviceClass*/ + 0x00, /*bDeviceSubClass*/ + 0x00, /*bDeviceProtocol*/ + 0x40, /*bMaxPacketSize40*/ + 0x83, /*idVendor (0x0483)*/ + 0x04, + 0x50, /*idProduct = 0x5750*/ + 0x57, + 0x00, /*bcdDevice rel. 2.00*/ + 0x02, + 1, /*Index of string descriptor describing + manufacturer */ + 2, /*Index of string descriptor describing + product*/ + 3, /*Index of string descriptor describing the + device serial number */ + 0x01 /*bNumConfigurations*/ + } + ; /* CustomHID_DeviceDescriptor */ + + +/* USB Configuration Descriptor */ +/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ +const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] = + { + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ + CUSTOMHID_SIZ_CONFIG_DESC, + /* wTotalLength: Bytes returned */ + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing + the configuration*/ + 0x80, /* bmAttributes: Self powered */ + 0x32, /* MaxPower 100 mA: this current is used for detecting Vbus */ + + /************** Descriptor of Custom HID interface ****************/ + /* 09 */ + 0x09, /* bLength: Interface Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints */ + 0x03, /* bInterfaceClass: HID */ + 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ + 0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ + 0, /* iInterface: Index of string descriptor */ + /******************** Descriptor of Custom HID HID ********************/ + /* 18 */ + 0x09, /* bLength: HID Descriptor size */ + HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */ + 0x10, /* bcdHID: HID Class Spec release number */ + 0x01, + 0x00, /* bCountryCode: Hardware target country */ + 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ + 0x22, /* bDescriptorType */ + CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */ + 0x00, + /******************** Descriptor of Custom HID endpoints ******************/ + /* 27 */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ + + 0x81, /* bEndpointAddress: Endpoint Address (IN) */ + 0x03, /* bmAttributes: Interrupt endpoint */ + 0x08, /* wMaxPacketSize: 2 Bytes max */ + 0x00, + 0x10, /* bInterval: Polling Interval (32 ms) */ + /* 34 */ + + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ + /* Endpoint descriptor type */ + 0x01, /* bEndpointAddress: */ + /* Endpoint Address (OUT) */ + 0x03, /* bmAttributes: Interrupt endpoint */ + 0x08, /* wMaxPacketSize: 2 Bytes max */ + 0x00, + 0x10, /* bInterval: Polling Interval (20 ms) */ + /* 41 */ + } + ; /* CustomHID_ConfigDescriptor */ + +/* CustomHID_ReportDescriptor */ +const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = + { + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x06, // USAGE (Keyboard) + 0xa1, 0x01, // COLLECTION (Application) + 0x75, 0x01, // REPORT_SIZE (1) + 0x95, 0x08, // REPORT_COUNT (8) + 0x05, 0x07, // USAGE_PAGE (Keyboard)(Key Codes) + 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)(224) + 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)(231) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x81, 0x02, // INPUT (Data,Var,Abs) ; Modifier byte + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x08, // REPORT_SIZE (8) + 0x81, 0x03, // INPUT (Cnst,Var,Abs) ; Reserved byte + 0x95, 0x05, // REPORT_COUNT (5) + 0x75, 0x01, // REPORT_SIZE (1) + 0x05, 0x08, // USAGE_PAGE (LEDs) + 0x19, 0x01, // USAGE_MINIMUM (Num Lock) + 0x29, 0x05, // USAGE_MAXIMUM (Kana) + 0x91, 0x02, // OUTPUT (Data,Var,Abs) ; LED report + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x03, // REPORT_SIZE (3) + 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) ; LED report padding + 0x95, 0x06, // REPORT_COUNT (6) + 0x75, 0x08, // REPORT_SIZE (8) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x65, // LOGICAL_MAXIMUM (101) + 0x05, 0x07, // USAGE_PAGE (Keyboard)(Key Codes) + 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))(0) + 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)(101) + 0x81, 0x00, // INPUT (Data,Ary,Abs) + 0xc0 // END_COLLECTION + +// 0x06, 0xFF, 0x00, /* USAGE_PAGE (Vendor Page: 0xFF00) */ +// 0x09, 0x01, /* USAGE (Demo Kit) */ +// 0xa1, 0x01, /* COLLECTION (Application) */ +// /* 6 */ +// +// /* Led 1 */ +// 0x85, 0x01, /* REPORT_ID (1) */ +// 0x09, 0x01, /* USAGE (LED 1) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x08, /* REPORT_SIZE (8) */ +// 0x95, 0x01, /* REPORT_COUNT (1) */ +// 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ +// +// 0x85, 0x01, /* REPORT_ID (1) */ +// 0x09, 0x01, /* USAGE (LED 1) */ +// 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ +// /* 26 */ +// +// /* Led 2 */ +// 0x85, 0x02, /* REPORT_ID 2 */ +// 0x09, 0x02, /* USAGE (LED 2) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x08, /* REPORT_SIZE (8) */ +// 0x95, 0x01, /* REPORT_COUNT (1) */ +// 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ +// +// 0x85, 0x02, /* REPORT_ID (2) */ +// 0x09, 0x02, /* USAGE (LED 2) */ +// 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ +// /* 46 */ +// +// /* Led 3 */ +// 0x85, 0x03, /* REPORT_ID (3) */ +// 0x09, 0x03, /* USAGE (LED 3) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x08, /* REPORT_SIZE (8) */ +// 0x95, 0x01, /* REPORT_COUNT (1) */ +// 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ +// +// 0x85, 0x03, /* REPORT_ID (3) */ +// 0x09, 0x03, /* USAGE (LED 3) */ +// 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ +// /* 66 */ +// +// /* Led 4 */ +// 0x85, 0x04, /* REPORT_ID 4) */ +// 0x09, 0x04, /* USAGE (LED 4) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x08, /* REPORT_SIZE (8) */ +// 0x95, 0x01, /* REPORT_COUNT (1) */ +// 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ +// +// 0x85, 0x04, /* REPORT_ID (4) */ +// 0x09, 0x04, /* USAGE (LED 4) */ +// 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ +// /* 86 */ +// +// /* key Push Button */ +// 0x85, 0x05, /* REPORT_ID (5) */ +// 0x09, 0x05, /* USAGE (Push Button) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x01, /* REPORT_SIZE (1) */ +// 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ +// +// 0x09, 0x05, /* USAGE (Push Button) */ +// 0x75, 0x01, /* REPORT_SIZE (1) */ +// 0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ +// +// 0x75, 0x07, /* REPORT_SIZE (7) */ +// 0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol) */ +// 0x85, 0x05, /* REPORT_ID (2) */ +// +// 0x75, 0x07, /* REPORT_SIZE (7) */ +// 0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol) */ +// /* 114 */ +// +// /* Tamper Push Button */ +// 0x85, 0x06, /* REPORT_ID (6) */ +// 0x09, 0x06, /* USAGE (Tamper Push Button) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x01, /* REPORT_SIZE (1) */ +// 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ +// +// 0x09, 0x06, /* USAGE (Tamper Push Button) */ +// 0x75, 0x01, /* REPORT_SIZE (1) */ +// 0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ +// +// 0x75, 0x07, /* REPORT_SIZE (7) */ +// 0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol) */ +// 0x85, 0x06, /* REPORT_ID (6) */ +// +// 0x75, 0x07, /* REPORT_SIZE (7) */ +// 0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol) */ +// /* 142 */ +// +// /* ADC IN */ +// 0x85, 0x07, /* REPORT_ID (7) */ +// 0x09, 0x07, /* USAGE (ADC IN) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x26, 0xff, 0x00, /* LOGICAL_MAXIMUM (255) */ +// 0x75, 0x08, /* REPORT_SIZE (8) */ +// 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ +// 0x85, 0x07, /* REPORT_ID (7) */ +// 0x09, 0x07, /* USAGE (ADC in) */ +// 0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ +// /* 161 */ +// +// 0xc0 /* END_COLLECTION */ + }; /* CustomHID_ReportDescriptor */ + +/* USB String Descriptors (optional) */ +const uint8_t CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID] = + { + CUSTOMHID_SIZ_STRING_LANGID, + USB_STRING_DESCRIPTOR_TYPE, + 0x09, + 0x04 + } + ; /* LangID = 0x0409: U.S. English */ + +const uint8_t CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR] = + { + CUSTOMHID_SIZ_STRING_VENDOR, /* Size of Vendor string */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType*/ + /* Manufacturer: "STMicroelectronics" */ + 'F', 0, 'i', 0, 'x', 0, 'x', 0, 'e', 0, 'r', 0, '\'', 0, 's', 0 + }; + +const uint8_t CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT] = + { + CUSTOMHID_SIZ_STRING_PRODUCT, /* bLength */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + 'S', 0, 'u', 0, 'w', 0, 'm', 0, 'i', 0, 'a', 0, 'r', 0, + 'k', 0, 'a', 0, 't', 0, 'o', 0, 'r', 0 + }; +uint8_t CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL] = + { + CUSTOMHID_SIZ_STRING_SERIAL, /* bLength */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + 'S', 0, 'T', 0, 'M', 0,'3', 0,'2', 0 + }; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Soft/Suwmiarka_CrossWorks/usb_desc.h b/Soft/Suwmiarka_CrossWorks/usb_desc.h new file mode 100644 index 0000000..fb63319 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_desc.h @@ -0,0 +1,70 @@ +/** + ****************************************************************************** + * @file usb_desc.h + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Descriptor Header for Custom HID Demo + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 __USB_DESC_H +#define __USB_DESC_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported define -----------------------------------------------------------*/ +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 + +#define HID_DESCRIPTOR_TYPE 0x21 +#define CUSTOMHID_SIZ_HID_DESC 0x09 +#define CUSTOMHID_OFF_HID_DESC 0x12 + +#define CUSTOMHID_SIZ_DEVICE_DESC 18 +#define CUSTOMHID_SIZ_CONFIG_DESC 41 +//#define CUSTOMHID_SIZ_REPORT_DESC 163 //z exampla stm32 +#define CUSTOMHID_SIZ_REPORT_DESC 63 //z exampla rfid keyboard +#define CUSTOMHID_SIZ_STRING_LANGID 4 +#define CUSTOMHID_SIZ_STRING_VENDOR 38 +#define CUSTOMHID_SIZ_STRING_PRODUCT 32 +#define CUSTOMHID_SIZ_STRING_SERIAL 26 + +#define STANDARD_ENDPOINT_DESC_SIZE 0x09 + +/* Exported functions ------------------------------------------------------- */ +extern const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC]; +extern const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC]; +extern const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC]; +extern const uint8_t CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID]; +extern const uint8_t CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR]; +extern const uint8_t CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT]; +extern uint8_t CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL]; + +#endif /* __USB_DESC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_endp.c b/Soft/Suwmiarka_CrossWorks/usb_endp.c new file mode 100644 index 0000000..cbb7a5a --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_endp.c @@ -0,0 +1,97 @@ +/** + ****************************************************************************** + * @file usb_endp.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Endpoint routines + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "hw_config.h" +#include "usb_lib.h" +#include "usb_istr.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint8_t Receive_Buffer[2]; +extern __IO uint8_t PrevXferComplete; +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/******************************************************************************* +* Function Name : EP1_OUT_Callback. +* Description : EP1 OUT Callback Routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void EP1_OUT_Callback(void) +{ + BitAction Led_State; + + /* Read received data (2 bytes) */ + USB_SIL_Read(EP1_OUT, Receive_Buffer); + + if (Receive_Buffer[1] == 0) + { + Led_State = Bit_RESET; + } + else + { + Led_State = Bit_SET; + } + + + switch (Receive_Buffer[0]) + { + case 1: /* Led 1 */ + break; + case 2: /* Led 2 */ + break; + case 3: /* Led 3 */ + break; + case 4: /* Led 4 */ + break; + default: + break; + } + + SetEPRxStatus(ENDP1, EP_RX_VALID); + +} + +/******************************************************************************* +* Function Name : EP1_IN_Callback. +* Description : EP1 IN Callback Routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void EP1_IN_Callback(void) +{ + PrevXferComplete = 1; +} +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Soft/Suwmiarka_CrossWorks/usb_init.c b/Soft/Suwmiarka_CrossWorks/usb_init.c new file mode 100644 index 0000000..f9af798 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_init.c @@ -0,0 +1,76 @@ +/** + ****************************************************************************** + * @file usb_init.c + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Initialization routines & global variables + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Includes ------------------------------------------------------------------*/ +#include "usb_lib.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* The number of current endpoint, it will be used to specify an endpoint */ + uint8_t EPindex; +/* The number of current device, it is an index to the Device_Table */ +/* uint8_t Device_no; */ +/* Points to the DEVICE_INFO structure of current device */ +/* The purpose of this register is to speed up the execution */ +DEVICE_INFO *pInformation; +/* Points to the DEVICE_PROP structure of current device */ +/* The purpose of this register is to speed up the execution */ +DEVICE_PROP *pProperty; +/* Temporary save the state of Rx & Tx status. */ +/* Whenever the Rx or Tx state is changed, its value is saved */ +/* in this variable first and will be set to the EPRB or EPRA */ +/* at the end of interrupt process */ +uint16_t SaveState ; +uint16_t wInterrupt_Mask; +DEVICE_INFO Device_Info; +USER_STANDARD_REQUESTS *pUser_Standard_Requests; + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : USB_Init +* Description : USB system initialization +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void USB_Init(void) +{ + pInformation = &Device_Info; + pInformation->ControlState = 2; + pProperty = &Device_Property; + pUser_Standard_Requests = &User_Standard_Requests; + /* Initialize devices one by one */ + pProperty->Init(); +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_init.h b/Soft/Suwmiarka_CrossWorks/usb_init.h new file mode 100644 index 0000000..2c11fa6 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_init.h @@ -0,0 +1,62 @@ +/** + ****************************************************************************** + * @file usb_init.h + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Initialization routines & global variables + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_INIT_H +#define __USB_INIT_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void USB_Init(void); + +/* External variables --------------------------------------------------------*/ +/* The number of current endpoint, it will be used to specify an endpoint */ +extern uint8_t EPindex; +/* The number of current device, it is an index to the Device_Table */ +/*extern uint8_t Device_no; */ +/* Points to the DEVICE_INFO structure of current device */ +/* The purpose of this register is to speed up the execution */ +extern DEVICE_INFO* pInformation; +/* Points to the DEVICE_PROP structure of current device */ +/* The purpose of this register is to speed up the execution */ +extern DEVICE_PROP* pProperty; +/* Temporary save the state of Rx & Tx status. */ +/* Whenever the Rx or Tx state is changed, its value is saved */ +/* in this variable first and will be set to the EPRB or EPRA */ +/* at the end of interrupt process */ +extern USER_STANDARD_REQUESTS *pUser_Standard_Requests; + +extern uint16_t SaveState ; +extern uint16_t wInterrupt_Mask; + +#endif /* __USB_INIT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_int.c b/Soft/Suwmiarka_CrossWorks/usb_int.c new file mode 100644 index 0000000..1c4065d --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_int.c @@ -0,0 +1,195 @@ +/** + ****************************************************************************** + * @file usb_int.c + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Endpoint CTR (Low and High) interrupt's service routines + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_lib.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +__IO uint16_t SaveRState; +__IO uint16_t SaveTState; + +/* Extern variables ----------------------------------------------------------*/ +extern void (*pEpInt_IN[7])(void); /* Handles IN interrupts */ +extern void (*pEpInt_OUT[7])(void); /* Handles OUT interrupts */ + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : CTR_LP. +* Description : Low priority Endpoint Correct Transfer interrupt's service +* routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CTR_LP(void) +{ + __IO uint16_t wEPVal = 0; + /* stay in loop while pending interrupts */ + while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) + { + /* extract highest priority endpoint number */ + EPindex = (uint8_t)(wIstr & ISTR_EP_ID); + if (EPindex == 0) + { + /* Decode and service control endpoint interrupt */ + /* calling related service routine */ + /* (Setup0_Process, In0_Process, Out0_Process) */ + + /* save RX & TX status */ + /* and set both to NAK */ + + SaveRState = _GetENDPOINT(ENDP0); + SaveTState = SaveRState & EPTX_STAT; + SaveRState &= EPRX_STAT; + + _SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK); + + /* DIR bit = origin of the interrupt */ + + if ((wIstr & ISTR_DIR) == 0) + { + /* DIR = 0 */ + + /* DIR = 0 => IN int */ + /* DIR = 0 implies that (EP_CTR_TX = 1) always */ + + _ClearEP_CTR_TX(ENDP0); + In0_Process(); + + /* before terminate set Tx & Rx status */ + + _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); + return; + } + else + { + /* DIR = 1 */ + + /* DIR = 1 & CTR_RX => SETUP or OUT int */ + /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */ + + wEPVal = _GetENDPOINT(ENDP0); + + if ((wEPVal &EP_SETUP) != 0) + { + _ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */ + Setup0_Process(); + /* before terminate set Tx & Rx status */ + + _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); + return; + } + + else if ((wEPVal & EP_CTR_RX) != 0) + { + _ClearEP_CTR_RX(ENDP0); + Out0_Process(); + /* before terminate set Tx & Rx status */ + + _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); + return; + } + } + }/* if(EPindex == 0) */ + else + { + /* Decode and service non control endpoints interrupt */ + + /* process related endpoint register */ + wEPVal = _GetENDPOINT(EPindex); + if ((wEPVal & EP_CTR_RX) != 0) + { + /* clear int flag */ + _ClearEP_CTR_RX(EPindex); + + /* call OUT service function */ + (*pEpInt_OUT[EPindex-1])(); + + } /* if((wEPVal & EP_CTR_RX) */ + + if ((wEPVal & EP_CTR_TX) != 0) + { + /* clear int flag */ + _ClearEP_CTR_TX(EPindex); + + /* call IN service function */ + (*pEpInt_IN[EPindex-1])(); + } /* if((wEPVal & EP_CTR_TX) != 0) */ + + }/* if(EPindex == 0) else */ + + }/* while(...) */ +} + +/******************************************************************************* +* Function Name : CTR_HP. +* Description : High Priority Endpoint Correct Transfer interrupt's service +* routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CTR_HP(void) +{ + uint32_t wEPVal = 0; + + while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) + { + _SetISTR((uint16_t)CLR_CTR); /* clear CTR flag */ + /* extract highest priority endpoint number */ + EPindex = (uint8_t)(wIstr & ISTR_EP_ID); + /* process related endpoint register */ + wEPVal = _GetENDPOINT(EPindex); + if ((wEPVal & EP_CTR_RX) != 0) + { + /* clear int flag */ + _ClearEP_CTR_RX(EPindex); + + /* call OUT service function */ + (*pEpInt_OUT[EPindex-1])(); + + } /* if((wEPVal & EP_CTR_RX) */ + else if ((wEPVal & EP_CTR_TX) != 0) + { + /* clear int flag */ + _ClearEP_CTR_TX(EPindex); + + /* call IN service function */ + (*pEpInt_IN[EPindex-1])(); + + + } /* if((wEPVal & EP_CTR_TX) != 0) */ + + }/* while(...) */ +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_int.h b/Soft/Suwmiarka_CrossWorks/usb_int.h new file mode 100644 index 0000000..5aea123 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_int.h @@ -0,0 +1,45 @@ +/** + ****************************************************************************** + * @file usb_int.h + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Endpoint CTR (Low and High) interrupt's service routines prototypes + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_INT_H +#define __USB_INT_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void CTR_LP(void); +void CTR_HP(void); + +/* External variables --------------------------------------------------------*/ + +#endif /* __USB_INT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_istr.c b/Soft/Suwmiarka_CrossWorks/usb_istr.c new file mode 100644 index 0000000..cfdb40f --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_istr.c @@ -0,0 +1,237 @@ +/** + ****************************************************************************** + * @file usb_istr.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief ISTR events interrupt service routines + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "usb_lib.h" +#include "usb_prop.h" +#include "usb_pwr.h" +#include "usb_istr.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +__IO uint16_t wIstr; /* ISTR register last read value */ +__IO uint8_t bIntPackSOF = 0; /* SOFs received between 2 consecutive packets */ +__IO uint32_t esof_counter =0; /* expected SOF counter */ +__IO uint32_t wCNTR=0; + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* function pointers to non-control endpoints service routines */ +void (*pEpInt_IN[7])(void) = + { + EP1_IN_Callback, + EP2_IN_Callback, + EP3_IN_Callback, + EP4_IN_Callback, + EP5_IN_Callback, + EP6_IN_Callback, + EP7_IN_Callback, + }; + +void (*pEpInt_OUT[7])(void) = + { + EP1_OUT_Callback, + EP2_OUT_Callback, + EP3_OUT_Callback, + EP4_OUT_Callback, + EP5_OUT_Callback, + EP6_OUT_Callback, + EP7_OUT_Callback, + }; + +/******************************************************************************* +* Function Name : USB_Istr +* Description : ISTR events interrupt service routine +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void USB_Istr(void) +{ + uint32_t i=0; + __IO uint32_t EP[8]; + + wIstr = _GetISTR(); + +#if (IMR_MSK & ISTR_CTR) + if (wIstr & ISTR_CTR & wInterrupt_Mask) + { + /* servicing of the endpoint correct transfer interrupt */ + /* clear of the CTR flag into the sub */ + CTR_LP(); +#ifdef CTR_CALLBACK + CTR_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_RESET) + if (wIstr & ISTR_RESET & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_RESET); + Device_Property.Reset(); +#ifdef RESET_CALLBACK + RESET_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_DOVR) + if (wIstr & ISTR_DOVR & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_DOVR); +#ifdef DOVR_CALLBACK + DOVR_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_ERR) + if (wIstr & ISTR_ERR & wInterrupt_Mask) + { + for(i=0;i<1000000;i++); + _SetISTR((uint16_t)CLR_ERR); +#ifdef ERR_CALLBACK + ERR_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_WKUP) + if (wIstr & ISTR_WKUP & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_WKUP); + Resume(RESUME_EXTERNAL); +#ifdef WKUP_CALLBACK + WKUP_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_SUSP) + if (wIstr & ISTR_SUSP & wInterrupt_Mask) + { + + /* check if SUSPEND is possible */ + if (fSuspendEnabled) + { + Suspend(); + } + else + { + /* if not possible then resume after xx ms */ + Resume(RESUME_LATER); + } + /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ + _SetISTR((uint16_t)CLR_SUSP); +#ifdef SUSP_CALLBACK + SUSP_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_SOF) + if (wIstr & ISTR_SOF & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_SOF); + bIntPackSOF++; + +#ifdef SOF_CALLBACK + SOF_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_ESOF) + if (wIstr & ISTR_ESOF & wInterrupt_Mask) + { + /* clear ESOF flag in ISTR */ + _SetISTR((uint16_t)CLR_ESOF); + + if ((_GetFNR()&FNR_RXDP)!=0) + { + /* increment ESOF counter */ + esof_counter ++; + + /* test if we enter in ESOF more than 3 times with FSUSP =0 and RXDP =1=>> possible missing SUSP flag*/ + if ((esof_counter >3)&&((_GetCNTR()&CNTR_FSUSP)==0)) + { + /* this a sequence to apply a force RESET*/ + + /*Store CNTR value */ + wCNTR = _GetCNTR(); + + /*Store endpoints registers status */ + for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i); + + /*apply FRES */ + wCNTR|=CNTR_FRES; + _SetCNTR(wCNTR); + + /*clear FRES*/ + wCNTR&=~CNTR_FRES; + _SetCNTR(wCNTR); + + /*poll for RESET flag in ISTR*/ + while((_GetISTR()&ISTR_RESET) == 0); + + /* clear RESET flag in ISTR */ + _SetISTR((uint16_t)CLR_RESET); + + /*restore Enpoints*/ + for (i=0;i<8;i++) + _SetENDPOINT(i, EP[i]); + + esof_counter = 0; + } + } + else + { + esof_counter = 0; + } + + /* resume handling timing is made with ESOFs */ + Resume(RESUME_ESOF); /* request without change of the machine state */ + +#ifdef ESOF_CALLBACK + ESOF_Callback(); +#endif + } +#endif +} /* USB_Istr */ + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Soft/Suwmiarka_CrossWorks/usb_istr.c.bak b/Soft/Suwmiarka_CrossWorks/usb_istr.c.bak new file mode 100644 index 0000000..a0da2d2 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_istr.c.bak @@ -0,0 +1,237 @@ +/** + ****************************************************************************** + * @file usb_istr.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief ISTR events interrupt service routines + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "usb_lib.h" +#include "usb_prop.h" +#include "usb_pwr.h" +#include "usb_istr.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +__IO uint16_t wIstr; /* ISTR register last read value */ +__IO uint8_t bIntPackSOF = 0; /* SOFs received between 2 consecutive packets */ +__IO uint32_t esof_counter =0; /* expected SOF counter */ +__IO uint32_t wCNTR=0; + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* function pointers to non-control endpoints service routines */ +void (*pEpInt_IN[7])(void) = + { + EP1_IN_Callback, + EP2_IN_Callback, + EP3_IN_Callback, + EP4_IN_Callback, + EP5_IN_Callback, + EP6_IN_Callback, + EP7_IN_Callback, + }; + +void (*pEpInt_OUT[7])(void) = + { + EP1_OUT_Callback, + EP2_OUT_Callback, + EP3_OUT_Callback, + EP4_OUT_Callback, + EP5_OUT_Callback, + EP6_OUT_Callback, + EP7_OUT_Callback, + }; + +/******************************************************************************* +* Function Name : USB_Istr +* Description : ISTR events interrupt service routine +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void USB_Istr(void) +{ + uint32_t i=0; + __IO uint32_t EP[8]; + + wIstr = _GetISTR(); + +#if (IMR_MSK & ISTR_CTR) + if (wIstr & ISTR_CTR & wInterrupt_Mask) + { + /* servicing of the endpoint correct transfer interrupt */ + /* clear of the CTR flag into the sub */ + CTR_LP(); +#ifdef CTR_CALLBACK + CTR_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_RESET) + if (wIstr & ISTR_RESET & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_RESET); + Device_Property.Reset(); +#ifdef RESET_CALLBACK + RESET_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_DOVR) + if (wIstr & ISTR_DOVR & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_DOVR); +#ifdef DOVR_CALLBACK + DOVR_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_ERR) + if (wIstr & ISTR_ERR & wInterrupt_Mask) + { + for(i=0;i<100000;i++); + _SetISTR((uint16_t)CLR_ERR); +#ifdef ERR_CALLBACK + ERR_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_WKUP) + if (wIstr & ISTR_WKUP & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_WKUP); + Resume(RESUME_EXTERNAL); +#ifdef WKUP_CALLBACK + WKUP_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_SUSP) + if (wIstr & ISTR_SUSP & wInterrupt_Mask) + { + + /* check if SUSPEND is possible */ + if (fSuspendEnabled) + { + Suspend(); + } + else + { + /* if not possible then resume after xx ms */ + Resume(RESUME_LATER); + } + /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ + _SetISTR((uint16_t)CLR_SUSP); +#ifdef SUSP_CALLBACK + SUSP_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_SOF) + if (wIstr & ISTR_SOF & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_SOF); + bIntPackSOF++; + +#ifdef SOF_CALLBACK + SOF_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (IMR_MSK & ISTR_ESOF) + if (wIstr & ISTR_ESOF & wInterrupt_Mask) + { + /* clear ESOF flag in ISTR */ + _SetISTR((uint16_t)CLR_ESOF); + + if ((_GetFNR()&FNR_RXDP)!=0) + { + /* increment ESOF counter */ + esof_counter ++; + + /* test if we enter in ESOF more than 3 times with FSUSP =0 and RXDP =1=>> possible missing SUSP flag*/ + if ((esof_counter >3)&&((_GetCNTR()&CNTR_FSUSP)==0)) + { + /* this a sequence to apply a force RESET*/ + + /*Store CNTR value */ + wCNTR = _GetCNTR(); + + /*Store endpoints registers status */ + for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i); + + /*apply FRES */ + wCNTR|=CNTR_FRES; + _SetCNTR(wCNTR); + + /*clear FRES*/ + wCNTR&=~CNTR_FRES; + _SetCNTR(wCNTR); + + /*poll for RESET flag in ISTR*/ + while((_GetISTR()&ISTR_RESET) == 0); + + /* clear RESET flag in ISTR */ + _SetISTR((uint16_t)CLR_RESET); + + /*restore Enpoints*/ + for (i=0;i<8;i++) + _SetENDPOINT(i, EP[i]); + + esof_counter = 0; + } + } + else + { + esof_counter = 0; + } + + /* resume handling timing is made with ESOFs */ + Resume(RESUME_ESOF); /* request without change of the machine state */ + +#ifdef ESOF_CALLBACK + ESOF_Callback(); +#endif + } +#endif +} /* USB_Istr */ + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Soft/Suwmiarka_CrossWorks/usb_istr.h b/Soft/Suwmiarka_CrossWorks/usb_istr.h new file mode 100644 index 0000000..66eb9d9 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_istr.h @@ -0,0 +1,95 @@ +/** + ****************************************************************************** + * @file usb_istr.h + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief This file includes the peripherals header files in the user application. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 __USB_ISTR_H +#define __USB_ISTR_H + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + + void USB_Istr(void); + +/* function prototypes Automatically built defining related macros */ + +void EP1_IN_Callback(void); +void EP2_IN_Callback(void); +void EP3_IN_Callback(void); +void EP4_IN_Callback(void); +void EP5_IN_Callback(void); +void EP6_IN_Callback(void); +void EP7_IN_Callback(void); + +void EP1_OUT_Callback(void); +void EP2_OUT_Callback(void); +void EP3_OUT_Callback(void); +void EP4_OUT_Callback(void); +void EP5_OUT_Callback(void); +void EP6_OUT_Callback(void); +void EP7_OUT_Callback(void); + + +#ifdef CTR_CALLBACK +void CTR_Callback(void); +#endif + +#ifdef DOVR_CALLBACK +void DOVR_Callback(void); +#endif + +#ifdef ERR_CALLBACK +void ERR_Callback(void); +#endif + +#ifdef WKUP_CALLBACK +void WKUP_Callback(void); +#endif + +#ifdef SUSP_CALLBACK +void SUSP_Callback(void); +#endif + +#ifdef RESET_CALLBACK +void RESET_Callback(void); +#endif + +#ifdef SOF_CALLBACK +void SOF_Callback(void); +#endif + +#ifdef ESOF_CALLBACK +void ESOF_Callback(void); +#endif + +#endif /*__USB_ISTR_H*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_lib.h b/Soft/Suwmiarka_CrossWorks/usb_lib.h new file mode 100644 index 0000000..2a9469a --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_lib.h @@ -0,0 +1,52 @@ +/** + ****************************************************************************** + * @file usb_lib.h + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief USB library include files + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_LIB_H +#define __USB_LIB_H + +/* Includes ------------------------------------------------------------------*/ +#include "hw_config.h" +#include "usb_type.h" +#include "usb_regs.h" +#include "usb_def.h" +#include "usb_core.h" +#include "usb_init.h" +#include "usb_sil.h" +#include "usb_mem.h" +#include "usb_int.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/* External variables --------------------------------------------------------*/ + +#endif /* __USB_LIB_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_mem.c b/Soft/Suwmiarka_CrossWorks/usb_mem.c new file mode 100644 index 0000000..1e34961 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_mem.c @@ -0,0 +1,87 @@ +/** + ****************************************************************************** + * @file usb_mem.c + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Utility functions for memory transfers to/from PMA + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_lib.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : UserToPMABufferCopy +* Description : Copy a buffer from user memory area to packet memory area (PMA) +* Input : - pbUsrBuf: pointer to user memory area. +* - wPMABufAddr: address into PMA. +* - wNBytes: no. of bytes to be copied. +* Output : None. +* Return : None . +*******************************************************************************/ +void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + uint32_t n = (wNBytes + 1) >> 1; /* n = (wNBytes + 1) / 2 */ + uint32_t i, temp1, temp2; + uint16_t *pdwVal; + pdwVal = (uint16_t *)(wPMABufAddr * 2 + PMAAddr); + for (i = n; i != 0; i--) + { + temp1 = (uint16_t) * pbUsrBuf; + pbUsrBuf++; + temp2 = temp1 | (uint16_t) * pbUsrBuf << 8; + *pdwVal++ = temp2; + pdwVal++; + pbUsrBuf++; + } +} + +/******************************************************************************* +* Function Name : PMAToUserBufferCopy +* Description : Copy a buffer from user memory area to packet memory area (PMA) +* Input : - pbUsrBuf = pointer to user memory area. +* - wPMABufAddr = address into PMA. +* - wNBytes = no. of bytes to be copied. +* Output : None. +* Return : None. +*******************************************************************************/ +void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + uint32_t n = (wNBytes + 1) >> 1;/* /2*/ + uint32_t i; + uint32_t *pdwVal; + pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr); + for (i = n; i != 0; i--) + { + *(uint16_t*)pbUsrBuf++ = *pdwVal++; + pbUsrBuf++; + } +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_mem.h b/Soft/Suwmiarka_CrossWorks/usb_mem.h new file mode 100644 index 0000000..aeb8635 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_mem.h @@ -0,0 +1,45 @@ +/** + ****************************************************************************** + * @file usb_mem.h + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Utility prototypes functions for memory/PMA transfers + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_MEM_H +#define __USB_MEM_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); +void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); + +/* External variables --------------------------------------------------------*/ + +#endif /*__USB_MEM_H*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_prop.c b/Soft/Suwmiarka_CrossWorks/usb_prop.c new file mode 100644 index 0000000..e2817db --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_prop.c @@ -0,0 +1,492 @@ +/** + ****************************************************************************** + * @file usb_prop.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief All processings related to Custom HID Demo + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "hw_config.h" +#include "usb_lib.h" +#include "usb_conf.h" +#include "usb_prop.h" +#include "usb_desc.h" +#include "usb_pwr.h" + + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint32_t ProtocolValue; +__IO uint8_t EXTI_Enable; +__IO uint8_t Request = 0; +uint8_t Report_Buf[2]; +/* -------------------------------------------------------------------------- */ +/* Structures initializations */ +/* -------------------------------------------------------------------------- */ + +DEVICE Device_Table = + { + EP_NUM, + 1 + }; + +DEVICE_PROP Device_Property = + { + CustomHID_init, + CustomHID_Reset, + CustomHID_Status_In, + CustomHID_Status_Out, + CustomHID_Data_Setup, + CustomHID_NoData_Setup, + CustomHID_Get_Interface_Setting, + CustomHID_GetDeviceDescriptor, + CustomHID_GetConfigDescriptor, + CustomHID_GetStringDescriptor, + 0, + 0x40 /*MAX PACKET SIZE*/ + }; +USER_STANDARD_REQUESTS User_Standard_Requests = + { + CustomHID_GetConfiguration, + CustomHID_SetConfiguration, + CustomHID_GetInterface, + CustomHID_SetInterface, + CustomHID_GetStatus, + CustomHID_ClearFeature, + CustomHID_SetEndPointFeature, + CustomHID_SetDeviceFeature, + CustomHID_SetDeviceAddress + }; + +ONE_DESCRIPTOR Device_Descriptor = + { + (uint8_t*)CustomHID_DeviceDescriptor, + CUSTOMHID_SIZ_DEVICE_DESC + }; + +ONE_DESCRIPTOR Config_Descriptor = + { + (uint8_t*)CustomHID_ConfigDescriptor, + CUSTOMHID_SIZ_CONFIG_DESC + }; + +ONE_DESCRIPTOR CustomHID_Report_Descriptor = + { + (uint8_t *)CustomHID_ReportDescriptor, + CUSTOMHID_SIZ_REPORT_DESC + }; + +ONE_DESCRIPTOR CustomHID_Hid_Descriptor = + { + (uint8_t*)CustomHID_ConfigDescriptor + CUSTOMHID_OFF_HID_DESC, + CUSTOMHID_SIZ_HID_DESC + }; + +ONE_DESCRIPTOR String_Descriptor[4] = + { + {(uint8_t*)CustomHID_StringLangID, CUSTOMHID_SIZ_STRING_LANGID}, + {(uint8_t*)CustomHID_StringVendor, CUSTOMHID_SIZ_STRING_VENDOR}, + {(uint8_t*)CustomHID_StringProduct, CUSTOMHID_SIZ_STRING_PRODUCT}, + {(uint8_t*)CustomHID_StringSerial, CUSTOMHID_SIZ_STRING_SERIAL} + }; + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/*CustomHID_SetReport_Feature function prototypes*/ +uint8_t *CustomHID_SetReport_Feature(uint16_t Length); + +/* Extern function prototypes ------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : CustomHID_init. +* Description : Custom HID init routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_init(void) +{ + /* Update the serial number string descriptor with the data from the unique + ID*/ + Get_SerialNum(); + + pInformation->Current_Configuration = 0; + + //czekaj na podpiecie kabla + /* Connect the device */ + PowerOn(); + + /* Perform basic device initialization operations */ + USB_SIL_Init(); + + bDeviceState = UNCONNECTED; +} + +/******************************************************************************* +* Function Name : CustomHID_Reset. +* Description : Custom HID reset routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_Reset(void) +{ + /* Set CustomHID_DEVICE as not configured */ + pInformation->Current_Configuration = 0; + pInformation->Current_Interface = 0;/*the default Interface*/ + + /* Current Feature initialization */ + pInformation->Current_Feature = CustomHID_ConfigDescriptor[7]; + + SetBTABLE(BTABLE_ADDRESS); + + /* Initialize Endpoint 0 */ + SetEPType(ENDP0, EP_CONTROL); + SetEPTxStatus(ENDP0, EP_TX_STALL); + SetEPRxAddr(ENDP0, ENDP0_RXADDR); + SetEPTxAddr(ENDP0, ENDP0_TXADDR); + Clear_Status_Out(ENDP0); + SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); + SetEPRxValid(ENDP0); + + /* Initialize Endpoint 1 */ + SetEPType(ENDP1, EP_INTERRUPT); + SetEPTxAddr(ENDP1, ENDP1_TXADDR); + SetEPRxAddr(ENDP1, ENDP1_RXADDR); + SetEPTxCount(ENDP1, 2); + SetEPRxCount(ENDP1, 2); + SetEPRxStatus(ENDP1, EP_RX_VALID); + SetEPTxStatus(ENDP1, EP_TX_NAK); + + /* Set this device to response on default address */ + SetDeviceAddress(0); + bDeviceState = ATTACHED; +} +/******************************************************************************* +* Function Name : CustomHID_SetConfiguration. +* Description : Update the device state to configured and command the ADC +* conversion. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_SetConfiguration(void) +{ + if (pInformation->Current_Configuration != 0) + { + /* Device configured */ + bDeviceState = CONFIGURED; + + } +} +/******************************************************************************* +* Function Name : CustomHID_SetConfiguration. +* Description : Update the device state to addressed. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_SetDeviceAddress (void) +{ + bDeviceState = ADDRESSED; +} +/******************************************************************************* +* Function Name : CustomHID_Status_In. +* Description : Joystick status IN routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_Status_In(void) +{ + BitAction Led_State; + + if (Report_Buf[1] == 0) + { + Led_State = Bit_RESET; + } + else + { + Led_State = Bit_SET; + } + + switch (Report_Buf[0]) + { + /*Change LED's status according to the host report*/ + + case 1: /* Led 1 */ + break; + case 2: /* Led 2 */ + break; + case 3:/* Led 3 */ + break; + case 4:/* Led 4 */ + break; + default: + break; + } +} + +/******************************************************************************* +* Function Name : CustomHID_Status_Out +* Description : Joystick status OUT routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_Status_Out (void) +{ +} + +/******************************************************************************* +* Function Name : CustomHID_Data_Setup +* Description : Handle the data class specific requests. +* Input : Request Nb. +* Output : None. +* Return : USB_UNSUPPORT or USB_SUCCESS. +*******************************************************************************/ +RESULT CustomHID_Data_Setup(uint8_t RequestNo) +{ + uint8_t *(*CopyRoutine)(uint16_t); + + if (pInformation->USBwIndex != 0) + return USB_UNSUPPORT; + + CopyRoutine = NULL; + + if ((RequestNo == GET_DESCRIPTOR) + && (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + ) + { + + if (pInformation->USBwValue1 == REPORT_DESCRIPTOR) + { + CopyRoutine = CustomHID_GetReportDescriptor; + } + else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE) + { + CopyRoutine = CustomHID_GetHIDDescriptor; + } + + } /* End of GET_DESCRIPTOR */ + + /*** GET_PROTOCOL, GET_REPORT, SET_REPORT ***/ + else if ( (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) ) + { + switch( RequestNo ) + { + case GET_PROTOCOL: + CopyRoutine = CustomHID_GetProtocolValue; + break; + case SET_REPORT: + CopyRoutine = CustomHID_SetReport_Feature; + Request = SET_REPORT; + break; + default: + break; + } + } + + if (CopyRoutine == NULL) + { + return USB_UNSUPPORT; + } + + pInformation->Ctrl_Info.CopyData = CopyRoutine; + pInformation->Ctrl_Info.Usb_wOffset = 0; + (*CopyRoutine)(0); + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : CustomHID_SetReport_Feature +* Description : Set Feature request handling +* Input : Length. +* Output : None. +* Return : Buffer +*******************************************************************************/ +uint8_t *CustomHID_SetReport_Feature(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = 2; + return NULL; + } + else + { + return Report_Buf; + } +} + +/******************************************************************************* +* Function Name : CustomHID_NoData_Setup +* Description : handle the no data class specific requests +* Input : Request Nb. +* Output : None. +* Return : USB_UNSUPPORT or USB_SUCCESS. +*******************************************************************************/ +RESULT CustomHID_NoData_Setup(uint8_t RequestNo) +{ + if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) + && (RequestNo == SET_PROTOCOL)) + { + return CustomHID_SetProtocol(); + } + + else + { + return USB_UNSUPPORT; + } +} + +/******************************************************************************* +* Function Name : CustomHID_GetDeviceDescriptor. +* Description : Gets the device descriptor. +* Input : Length +* Output : None. +* Return : The address of the device descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetDeviceDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Device_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_GetConfigDescriptor. +* Description : Gets the configuration descriptor. +* Input : Length +* Output : None. +* Return : The address of the configuration descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetConfigDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Config_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_GetStringDescriptor +* Description : Gets the string descriptors according to the needed index +* Input : Length +* Output : None. +* Return : The address of the string descriptors. +*******************************************************************************/ +uint8_t *CustomHID_GetStringDescriptor(uint16_t Length) +{ + uint8_t wValue0 = pInformation->USBwValue0; + if (wValue0 > 4) + { + return NULL; + } + else + { + return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]); + } +} + +/******************************************************************************* +* Function Name : CustomHID_GetReportDescriptor. +* Description : Gets the HID report descriptor. +* Input : Length +* Output : None. +* Return : The address of the configuration descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetReportDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &CustomHID_Report_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_GetHIDDescriptor. +* Description : Gets the HID descriptor. +* Input : Length +* Output : None. +* Return : The address of the configuration descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetHIDDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &CustomHID_Hid_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_Get_Interface_Setting. +* Description : tests the interface and the alternate setting according to the +* supported one. +* Input : - Interface : interface number. +* - AlternateSetting : Alternate Setting number. +* Output : None. +* Return : USB_SUCCESS or USB_UNSUPPORT. +*******************************************************************************/ +RESULT CustomHID_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting) +{ + if (AlternateSetting > 0) + { + return USB_UNSUPPORT; + } + else if (Interface > 0) + { + return USB_UNSUPPORT; + } + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : CustomHID_SetProtocol +* Description : Joystick Set Protocol request routine. +* Input : None. +* Output : None. +* Return : USB SUCCESS. +*******************************************************************************/ +RESULT CustomHID_SetProtocol(void) +{ + uint8_t wValue0 = pInformation->USBwValue0; + ProtocolValue = wValue0; + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : CustomHID_GetProtocolValue +* Description : get the protocol value +* Input : Length. +* Output : None. +* Return : address of the protocol value. +*******************************************************************************/ +uint8_t *CustomHID_GetProtocolValue(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = 1; + return NULL; + } + else + { + return (uint8_t *)(&ProtocolValue); + } +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_prop.c.bak b/Soft/Suwmiarka_CrossWorks/usb_prop.c.bak new file mode 100644 index 0000000..1a83f4b --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_prop.c.bak @@ -0,0 +1,492 @@ +/** + ****************************************************************************** + * @file usb_prop.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief All processings related to Custom HID Demo + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "hw_config.h" +#include "usb_lib.h" +#include "usb_conf.h" +#include "usb_prop.h" +#include "usb_desc.h" +#include "usb_pwr.h" + + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint32_t ProtocolValue; +__IO uint8_t EXTI_Enable; +__IO uint8_t Request = 0; +uint8_t Report_Buf[2]; +/* -------------------------------------------------------------------------- */ +/* Structures initializations */ +/* -------------------------------------------------------------------------- */ + +DEVICE Device_Table = + { + EP_NUM, + 1 + }; + +DEVICE_PROP Device_Property = + { + CustomHID_init, + CustomHID_Reset, + CustomHID_Status_In, + CustomHID_Status_Out, + CustomHID_Data_Setup, + CustomHID_NoData_Setup, + CustomHID_Get_Interface_Setting, + CustomHID_GetDeviceDescriptor, + CustomHID_GetConfigDescriptor, + CustomHID_GetStringDescriptor, + 0, + 0x40 /*MAX PACKET SIZE*/ + }; +USER_STANDARD_REQUESTS User_Standard_Requests = + { + CustomHID_GetConfiguration, + CustomHID_SetConfiguration, + CustomHID_GetInterface, + CustomHID_SetInterface, + CustomHID_GetStatus, + CustomHID_ClearFeature, + CustomHID_SetEndPointFeature, + CustomHID_SetDeviceFeature, + CustomHID_SetDeviceAddress + }; + +ONE_DESCRIPTOR Device_Descriptor = + { + (uint8_t*)CustomHID_DeviceDescriptor, + CUSTOMHID_SIZ_DEVICE_DESC + }; + +ONE_DESCRIPTOR Config_Descriptor = + { + (uint8_t*)CustomHID_ConfigDescriptor, + CUSTOMHID_SIZ_CONFIG_DESC + }; + +ONE_DESCRIPTOR CustomHID_Report_Descriptor = + { + (uint8_t *)CustomHID_ReportDescriptor, + CUSTOMHID_SIZ_REPORT_DESC + }; + +ONE_DESCRIPTOR CustomHID_Hid_Descriptor = + { + (uint8_t*)CustomHID_ConfigDescriptor + CUSTOMHID_OFF_HID_DESC, + CUSTOMHID_SIZ_HID_DESC + }; + +ONE_DESCRIPTOR String_Descriptor[4] = + { + {(uint8_t*)CustomHID_StringLangID, CUSTOMHID_SIZ_STRING_LANGID}, + {(uint8_t*)CustomHID_StringVendor, CUSTOMHID_SIZ_STRING_VENDOR}, + {(uint8_t*)CustomHID_StringProduct, CUSTOMHID_SIZ_STRING_PRODUCT}, + {(uint8_t*)CustomHID_StringSerial, CUSTOMHID_SIZ_STRING_SERIAL} + }; + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/*CustomHID_SetReport_Feature function prototypes*/ +uint8_t *CustomHID_SetReport_Feature(uint16_t Length); + +/* Extern function prototypes ------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : CustomHID_init. +* Description : Custom HID init routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_init(void) +{ + /* Update the serial number string descriptor with the data from the unique + ID*/ + Get_SerialNum(); + + pInformation->Current_Configuration = 0; + + //czekaj na podpiecie kabla + /* Connect the device */ + PowerOn(); + + /* Perform basic device initialization operations */ + USB_SIL_Init(); + + bDeviceState = UNCONNECTED; +} + +/******************************************************************************* +* Function Name : CustomHID_Reset. +* Description : Custom HID reset routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_Reset(void) +{ + /* Set CustomHID_DEVICE as not configured */ + pInformation->Current_Configuration = 0; + pInformation->Current_Interface = 0;/*the default Interface*/ + + /* Current Feature initialization */ + pInformation->Current_Feature = CustomHID_ConfigDescriptor[7]; + + SetBTABLE(BTABLE_ADDRESS); + + /* Initialize Endpoint 0 */ + SetEPType(ENDP0, EP_CONTROL); + SetEPTxStatus(ENDP0, EP_TX_STALL); + SetEPRxAddr(ENDP0, ENDP0_RXADDR); + SetEPTxAddr(ENDP0, ENDP0_TXADDR); + Clear_Status_Out(ENDP0); + SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); + SetEPRxValid(ENDP0); + + /* Initialize Endpoint 1 */ + SetEPType(ENDP1, EP_INTERRUPT); + SetEPTxAddr(ENDP1, ENDP1_TXADDR); + SetEPRxAddr(ENDP1, ENDP1_RXADDR); + SetEPTxCount(ENDP1, 2); + SetEPRxCount(ENDP1, 2); + SetEPRxStatus(ENDP1, EP_RX_VALID); + SetEPTxStatus(ENDP1, EP_TX_NAK); + + /* Set this device to response on default address */ + SetDeviceAddress(0); + bDeviceState = ATTACHED; +} +/******************************************************************************* +* Function Name : CustomHID_SetConfiguration. +* Description : Update the device state to configured and command the ADC +* conversion. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_SetConfiguration(void) +{ + if (pInformation->Current_Configuration != 0) + { + /* Device configured */ + bDeviceState = CONFIGURED; + + } +} +/******************************************************************************* +* Function Name : CustomHID_SetConfiguration. +* Description : Update the device state to addressed. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_SetDeviceAddress (void) +{ + bDeviceState = ADDRESSED; +} +/******************************************************************************* +* Function Name : CustomHID_Status_In. +* Description : Joystick status IN routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_Status_In(void) +{ + BitAction Led_State; + + if (Report_Buf[1] == 0) + { + Led_State = Bit_RESET; + } + else + { + Led_State = Bit_SET; + } + + switch (Report_Buf[0]) + { + /*Change LED's status according to the host report*/ + + case 1: /* Led 1 */ + break; + case 2: /* Led 2 */ + break; + case 3:/* Led 3 */ + break; + case 4:/* Led 4 */ + break; + default: + break; + } +} + +/******************************************************************************* +* Function Name : CustomHID_Status_Out +* Description : Joystick status OUT routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CustomHID_Status_Out (void) +{ +} + +/******************************************************************************* +* Function Name : CustomHID_Data_Setup +* Description : Handle the data class specific requests. +* Input : Request Nb. +* Output : None. +* Return : USB_UNSUPPORT or USB_SUCCESS. +*******************************************************************************/ +RESULT CustomHID_Data_Setup(uint8_t RequestNo) +{ + uint8_t *(*CopyRoutine)(uint16_t); + + if (pInformation->USBwIndex != 0) + return USB_UNSUPPORT; + + CopyRoutine = NULL; + + if ((RequestNo == GET_DESCRIPTOR) + && (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + ) + { + + if (pInformation->USBwValue1 == REPORT_DESCRIPTOR) + { + CopyRoutine = CustomHID_GetReportDescriptor; + } + else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE) + { + CopyRoutine = CustomHID_GetHIDDescriptor; + } + + } /* End of GET_DESCRIPTOR */ + + /*** GET_PROTOCOL, GET_REPORT, SET_REPORT ***/ + else if ( (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) ) + { + switch( RequestNo ) + { + case GET_PROTOCOL: + CopyRoutine = CustomHID_GetProtocolValue; + break; + case SET_REPORT: + CopyRoutine = CustomHID_SetReport_Feature; + Request = SET_REPORT; + break; + default: + break; + } + } + + if (CopyRoutine == NULL) + { + return USB_UNSUPPORT; + } + + pInformation->Ctrl_Info.CopyData = CopyRoutine; + pInformation->Ctrl_Info.Usb_wOffset = 0; + (*CopyRoutine)(0); + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : CustomHID_SetReport_Feature +* Description : Set Feature request handling +* Input : Length. +* Output : None. +* Return : Buffer +*******************************************************************************/ +uint8_t *CustomHID_SetReport_Feature(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = 2; + return NULL; + } + else + { + return Report_Buf; + } +} + +/******************************************************************************* +* Function Name : CustomHID_NoData_Setup +* Description : handle the no data class specific requests +* Input : Request Nb. +* Output : None. +* Return : USB_UNSUPPORT or USB_SUCCESS. +*******************************************************************************/ +RESULT CustomHID_NoData_Setup(uint8_t RequestNo) +{ + if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) + && (RequestNo == SET_PROTOCOL)) + { + return CustomHID_SetProtocol(); + } + + else + { + return USB_UNSUPPORT; + } +} + +/******************************************************************************* +* Function Name : CustomHID_GetDeviceDescriptor. +* Description : Gets the device descriptor. +* Input : Length +* Output : None. +* Return : The address of the device descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetDeviceDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Device_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_GetConfigDescriptor. +* Description : Gets the configuration descriptor. +* Input : Length +* Output : None. +* Return : The address of the configuration descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetConfigDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Config_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_GetStringDescriptor +* Description : Gets the string descriptors according to the needed index +* Input : Length +* Output : None. +* Return : The address of the string descriptors. +*******************************************************************************/ +uint8_t *CustomHID_GetStringDescriptor(uint16_t Length) +{ + uint8_t wValue0 = pInformation->USBwValue0; + if (wValue0 > 4) + { + return NULL; + } + else + { + return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]); + } +} + +/******************************************************************************* +* Function Name : CustomHID_GetReportDescriptor. +* Description : Gets the HID report descriptor. +* Input : Length +* Output : None. +* Return : The address of the configuration descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetReportDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &CustomHID_Report_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_GetHIDDescriptor. +* Description : Gets the HID descriptor. +* Input : Length +* Output : None. +* Return : The address of the configuration descriptor. +*******************************************************************************/ +uint8_t *CustomHID_GetHIDDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &CustomHID_Hid_Descriptor); +} + +/******************************************************************************* +* Function Name : CustomHID_Get_Interface_Setting. +* Description : tests the interface and the alternate setting according to the +* supported one. +* Input : - Interface : interface number. +* - AlternateSetting : Alternate Setting number. +* Output : None. +* Return : USB_SUCCESS or USB_UNSUPPORT. +*******************************************************************************/ +RESULT CustomHID_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting) +{ + if (AlternateSetting > 0) + { + return USB_UNSUPPORT; + } + else if (Interface > 0) + { + return USB_UNSUPPORT; + } + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : CustomHID_SetProtocol +* Description : Joystick Set Protocol request routine. +* Input : None. +* Output : None. +* Return : USB SUCCESS. +*******************************************************************************/ +RESULT CustomHID_SetProtocol(void) +{ + uint8_t wValue0 = pInformation->USBwValue0; + ProtocolValue = wValue0; + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : CustomHID_GetProtocolValue +* Description : get the protocol value +* Input : Length. +* Output : None. +* Return : address of the protocol value. +*******************************************************************************/ +uint8_t *CustomHID_GetProtocolValue(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = 1; + return NULL; + } + else + { + return (uint8_t *)(&ProtocolValue); + } +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_prop.h b/Soft/Suwmiarka_CrossWorks/usb_prop.h new file mode 100644 index 0000000..c378fd5 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_prop.h @@ -0,0 +1,83 @@ +/** + ****************************************************************************** + * @file usb_prop.h + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief All processing related to Custom HID demo + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 __USB_PROP_H +#define __USB_PROP_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +typedef enum _HID_REQUESTS +{ + GET_REPORT = 1, + GET_IDLE, + GET_PROTOCOL, + + SET_REPORT = 9, + SET_IDLE, + SET_PROTOCOL +} HID_REQUESTS; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void CustomHID_init(void); +void CustomHID_Reset(void); +void CustomHID_SetConfiguration(void); +void CustomHID_SetDeviceAddress (void); +void CustomHID_Status_In (void); +void CustomHID_Status_Out (void); +RESULT CustomHID_Data_Setup(uint8_t); +RESULT CustomHID_NoData_Setup(uint8_t); +RESULT CustomHID_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting); +uint8_t *CustomHID_GetDeviceDescriptor(uint16_t ); +uint8_t *CustomHID_GetConfigDescriptor(uint16_t); +uint8_t *CustomHID_GetStringDescriptor(uint16_t); +RESULT CustomHID_SetProtocol(void); +uint8_t *CustomHID_GetProtocolValue(uint16_t Length); +RESULT CustomHID_SetProtocol(void); +uint8_t *CustomHID_GetReportDescriptor(uint16_t Length); +uint8_t *CustomHID_GetHIDDescriptor(uint16_t Length); + + +/* Exported define -----------------------------------------------------------*/ +#define CustomHID_GetConfiguration NOP_Process +//#define CustomHID_SetConfiguration NOP_Process +#define CustomHID_GetInterface NOP_Process +#define CustomHID_SetInterface NOP_Process +#define CustomHID_GetStatus NOP_Process +#define CustomHID_ClearFeature NOP_Process +#define CustomHID_SetEndPointFeature NOP_Process +#define CustomHID_SetDeviceFeature NOP_Process +//#define CustomHID_SetDeviceAddress NOP_Process + +#define REPORT_DESCRIPTOR 0x22 + +#endif /* __USB_PROP_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_pwr.c b/Soft/Suwmiarka_CrossWorks/usb_pwr.c new file mode 100644 index 0000000..a72bd5c --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_pwr.c @@ -0,0 +1,318 @@ +/** + ****************************************************************************** + * @file usb_pwr.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Connection/disconnection & power management + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 "usb_lib.h" +#include "usb_conf.h" +#include "usb_pwr.h" +#include "hw_config.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +__IO uint32_t bDeviceState = UNCONNECTED; /* USB device status */ +__IO bool fSuspendEnabled = FALSE; /* true when suspend is possible */ +__IO uint32_t EP[8]; + +struct +{ + __IO RESUME_STATE eState; + __IO uint8_t bESOFcnt; +} +ResumeS; + +__IO uint32_t remotewakeupon=0; + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Extern function prototypes ------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : PowerOn +* Description : +* Input : None. +* Output : None. +* Return : USB_SUCCESS. +*******************************************************************************/ +RESULT PowerOn(void) +{ + uint16_t wRegVal; + + /*** cable plugged-in ? ***/ + USB_Cable_Config(ENABLE); + + /*** CNTR_PWDN = 0 ***/ + wRegVal = CNTR_FRES; + _SetCNTR(wRegVal); + + /*** CNTR_FRES = 0 ***/ + wInterrupt_Mask = 0; + _SetCNTR(wInterrupt_Mask); + /*** Clear pending interrupts ***/ + _SetISTR(0); + /*** Set interrupt mask ***/ + wInterrupt_Mask = CNTR_RESETM | CNTR_SUSPM | CNTR_WKUPM; + _SetCNTR(wInterrupt_Mask); + + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : PowerOff +* Description : handles switch-off conditions +* Input : None. +* Output : None. +* Return : USB_SUCCESS. +*******************************************************************************/ +RESULT PowerOff() +{ + /* disable all interrupts and force USB reset */ + _SetCNTR(CNTR_FRES); + /* clear interrupt status register */ + _SetISTR(0); + /* Disable the Pull-Up*/ + USB_Cable_Config(DISABLE); + /* switch-off device */ + _SetCNTR(CNTR_FRES + CNTR_PDWN); + /* sw variables reset */ + /* ... */ + + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : Suspend +* Description : sets suspend mode operating conditions +* Input : None. +* Output : None. +* Return : USB_SUCCESS. +*******************************************************************************/ +void Suspend(void) +{ + uint32_t i =0; + uint16_t wCNTR; + uint32_t tmpreg = 0; + __IO uint32_t savePWR_CR=0; + /* suspend preparation */ + /* ... */ + + /*Store CNTR value */ + wCNTR = _GetCNTR(); + + /* This a sequence to apply a force RESET to handle a robustness case */ + + /*Store endpoints registers status */ + for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i); + + /* unmask RESET flag */ + wCNTR|=CNTR_RESETM; + _SetCNTR(wCNTR); + + /*apply FRES */ + wCNTR|=CNTR_FRES; + _SetCNTR(wCNTR); + + /*clear FRES*/ + wCNTR&=~CNTR_FRES; + _SetCNTR(wCNTR); + + /*poll for RESET flag in ISTR*/ + while((_GetISTR()&ISTR_RESET) == 0); + + /* clear RESET flag in ISTR */ + _SetISTR((uint16_t)CLR_RESET); + + /*restore Enpoints*/ + for (i=0;i<8;i++) + _SetENDPOINT(i, EP[i]); + + /* Now it is safe to enter macrocell in suspend mode */ + wCNTR |= CNTR_FSUSP; + _SetCNTR(wCNTR); + + /* force low-power mode in the macrocell */ + wCNTR = _GetCNTR(); + wCNTR |= CNTR_LPMODE; + _SetCNTR(wCNTR); + + /*prepare entry in low power mode (STOP mode)*/ + /* Select the regulator state in STOP mode*/ + savePWR_CR = PWR->CR; + tmpreg = PWR->CR; + /* Clear PDDS and LPDS bits */ + tmpreg &= ((uint32_t)0xFFFFFFFC); + /* Set LPDS bit according to PWR_Regulator value */ + tmpreg |= PWR_Regulator_LowPower; + /* Store the new value */ + PWR->CR = tmpreg; + /* Set SLEEPDEEP bit of Cortex System Control Register */ +#if defined (STM32F30X) || defined (STM32F37X) + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; +#else + SCB->SCR |= SCB_SCR_SLEEPDEEP; +#endif + + /* enter system in STOP mode, only when wakeup flag in not set */ + if((_GetISTR()&ISTR_WKUP)==0) + { + __WFI(); + /* Reset SLEEPDEEP bit of Cortex System Control Register */ +#if defined (STM32F30X) || defined (STM32F37X) + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); +#else + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP); +#endif + } + else + { + /* Clear Wakeup flag */ + _SetISTR(CLR_WKUP); + /* clear FSUSP to abort entry in suspend mode */ + wCNTR = _GetCNTR(); + wCNTR&=~CNTR_FSUSP; + _SetCNTR(wCNTR); + + /*restore sleep mode configuration */ + /* restore Power regulator config in sleep mode*/ + PWR->CR = savePWR_CR; + + /* Reset SLEEPDEEP bit of Cortex System Control Register */ +#if defined (STM32F30X) || defined (STM32F37X) + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); +#else + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP); +#endif + } +} + +/******************************************************************************* +* Function Name : Resume_Init +* Description : Handles wake-up restoring normal operations +* Input : None. +* Output : None. +* Return : USB_SUCCESS. +*******************************************************************************/ +void Resume_Init(void) +{ + uint16_t wCNTR; + + /* ------------------ ONLY WITH BUS-POWERED DEVICES ---------------------- */ + /* restart the clocks */ + /* ... */ + + /* CNTR_LPMODE = 0 */ + wCNTR = _GetCNTR(); + wCNTR &= (~CNTR_LPMODE); + _SetCNTR(wCNTR); + + /* restore full power */ + /* ... on connected devices */ + Leave_LowPowerMode(); + + /* reset FSUSP bit */ + _SetCNTR(IMR_MSK); + + /* reverse suspend preparation */ + /* ... */ + +} + +/******************************************************************************* +* Function Name : Resume +* Description : This is the state machine handling resume operations and +* timing sequence. The control is based on the Resume structure +* variables and on the ESOF interrupt calling this subroutine +* without changing machine state. +* Input : a state machine value (RESUME_STATE) +* RESUME_ESOF doesn't change ResumeS.eState allowing +* decrementing of the ESOF counter in different states. +* Output : None. +* Return : None. +*******************************************************************************/ +void Resume(RESUME_STATE eResumeSetVal) +{ + uint16_t wCNTR; + + if (eResumeSetVal != RESUME_ESOF) + ResumeS.eState = eResumeSetVal; + switch (ResumeS.eState) + { + case RESUME_EXTERNAL: + if (remotewakeupon ==0) + { + Resume_Init(); + ResumeS.eState = RESUME_OFF; + } + else /* RESUME detected during the RemoteWAkeup signalling => keep RemoteWakeup handling*/ + { + ResumeS.eState = RESUME_ON; + } + break; + case RESUME_INTERNAL: + Resume_Init(); + ResumeS.eState = RESUME_START; + remotewakeupon = 1; + break; + case RESUME_LATER: + ResumeS.bESOFcnt = 2; + ResumeS.eState = RESUME_WAIT; + break; + case RESUME_WAIT: + ResumeS.bESOFcnt--; + if (ResumeS.bESOFcnt == 0) + ResumeS.eState = RESUME_START; + break; + case RESUME_START: + wCNTR = _GetCNTR(); + wCNTR |= CNTR_RESUME; + _SetCNTR(wCNTR); + ResumeS.eState = RESUME_ON; + ResumeS.bESOFcnt = 10; + break; + case RESUME_ON: + ResumeS.bESOFcnt--; + if (ResumeS.bESOFcnt == 0) + { + wCNTR = _GetCNTR(); + wCNTR &= (~CNTR_RESUME); + _SetCNTR(wCNTR); + ResumeS.eState = RESUME_OFF; + remotewakeupon = 0; + } + break; + case RESUME_OFF: + case RESUME_ESOF: + default: + ResumeS.eState = RESUME_OFF; + break; + } +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_pwr.h b/Soft/Suwmiarka_CrossWorks/usb_pwr.h new file mode 100644 index 0000000..212c98f --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_pwr.h @@ -0,0 +1,70 @@ +/** + ****************************************************************************** + * @file usb_pwr.h + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Connection/disconnection & power management header + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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 __USB_PWR_H +#define __USB_PWR_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +typedef enum _RESUME_STATE +{ + RESUME_EXTERNAL, + RESUME_INTERNAL, + RESUME_LATER, + RESUME_WAIT, + RESUME_START, + RESUME_ON, + RESUME_OFF, + RESUME_ESOF +} RESUME_STATE; + +typedef enum _DEVICE_STATE +{ + UNCONNECTED, + ATTACHED, + POWERED, + SUSPENDED, + ADDRESSED, + CONFIGURED +} DEVICE_STATE; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void Suspend(void); +void Resume_Init(void); +void Resume(RESUME_STATE eResumeSetVal); +RESULT PowerOn(void); +RESULT PowerOff(void); +/* External variables --------------------------------------------------------*/ +extern __IO uint32_t bDeviceState; /* USB device status */ +extern __IO bool fSuspendEnabled; /* true when suspend is possible */ + +#endif /*__USB_PWR_H*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_regs.c b/Soft/Suwmiarka_CrossWorks/usb_regs.c new file mode 100644 index 0000000..b1dabda --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_regs.c @@ -0,0 +1,760 @@ +/** + ****************************************************************************** + * @file usb_regs.c + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Interface functions to USB cell registers + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_lib.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : SetCNTR. +* Description : Set the CNTR register value. +* Input : wRegValue: new register value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetCNTR(uint16_t wRegValue) +{ + _SetCNTR(wRegValue); +} + +/******************************************************************************* +* Function Name : GetCNTR. +* Description : returns the CNTR register value. +* Input : None. +* Output : None. +* Return : CNTR register Value. +*******************************************************************************/ +uint16_t GetCNTR(void) +{ + return(_GetCNTR()); +} + +/******************************************************************************* +* Function Name : SetISTR. +* Description : Set the ISTR register value. +* Input : wRegValue: new register value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetISTR(uint16_t wRegValue) +{ + _SetISTR(wRegValue); +} + +/******************************************************************************* +* Function Name : GetISTR +* Description : Returns the ISTR register value. +* Input : None. +* Output : None. +* Return : ISTR register Value +*******************************************************************************/ +uint16_t GetISTR(void) +{ + return(_GetISTR()); +} + +/******************************************************************************* +* Function Name : GetFNR +* Description : Returns the FNR register value. +* Input : None. +* Output : None. +* Return : FNR register Value +*******************************************************************************/ +uint16_t GetFNR(void) +{ + return(_GetFNR()); +} + +/******************************************************************************* +* Function Name : SetDADDR +* Description : Set the DADDR register value. +* Input : wRegValue: new register value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetDADDR(uint16_t wRegValue) +{ + _SetDADDR(wRegValue); +} + +/******************************************************************************* +* Function Name : GetDADDR +* Description : Returns the DADDR register value. +* Input : None. +* Output : None. +* Return : DADDR register Value +*******************************************************************************/ +uint16_t GetDADDR(void) +{ + return(_GetDADDR()); +} + +/******************************************************************************* +* Function Name : SetBTABLE +* Description : Set the BTABLE. +* Input : wRegValue: New register value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetBTABLE(uint16_t wRegValue) +{ + _SetBTABLE(wRegValue); +} + +/******************************************************************************* +* Function Name : GetBTABLE. +* Description : Returns the BTABLE register value. +* Input : None. +* Output : None. +* Return : BTABLE address. +*******************************************************************************/ +uint16_t GetBTABLE(void) +{ + return(_GetBTABLE()); +} + +/******************************************************************************* +* Function Name : SetENDPOINT +* Description : Set the Endpoint register value. +* Input : bEpNum: Endpoint Number. +* wRegValue. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetENDPOINT(uint8_t bEpNum, uint16_t wRegValue) +{ + _SetENDPOINT(bEpNum, wRegValue); +} + +/******************************************************************************* +* Function Name : GetENDPOINT +* Description : Return the Endpoint register value. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint register value. +*******************************************************************************/ +uint16_t GetENDPOINT(uint8_t bEpNum) +{ + return(_GetENDPOINT(bEpNum)); +} + +/******************************************************************************* +* Function Name : SetEPType +* Description : sets the type in the endpoint register. +* Input : bEpNum: Endpoint Number. +* wType: type definition. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPType(uint8_t bEpNum, uint16_t wType) +{ + _SetEPType(bEpNum, wType); +} + +/******************************************************************************* +* Function Name : GetEPType +* Description : Returns the endpoint type. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint Type +*******************************************************************************/ +uint16_t GetEPType(uint8_t bEpNum) +{ + return(_GetEPType(bEpNum)); +} + +/******************************************************************************* +* Function Name : SetEPTxStatus +* Description : Set the status of Tx endpoint. +* Input : bEpNum: Endpoint Number. +* wState: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPTxStatus(uint8_t bEpNum, uint16_t wState) +{ + _SetEPTxStatus(bEpNum, wState); +} + +/******************************************************************************* +* Function Name : SetEPRxStatus +* Description : Set the status of Rx endpoint. +* Input : bEpNum: Endpoint Number. +* wState: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPRxStatus(uint8_t bEpNum, uint16_t wState) +{ + _SetEPRxStatus(bEpNum, wState); +} + +/******************************************************************************* +* Function Name : SetDouBleBuffEPStall +* Description : sets the status for Double Buffer Endpoint to STALL +* Input : bEpNum: Endpoint Number. +* bDir: Endpoint direction. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetDouBleBuffEPStall(uint8_t bEpNum, uint8_t bDir) +{ + uint16_t Endpoint_DTOG_Status; + Endpoint_DTOG_Status = GetENDPOINT(bEpNum); + if (bDir == EP_DBUF_OUT) + { /* OUT double buffered endpoint */ + _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPRX_DTOG1); + } + else if (bDir == EP_DBUF_IN) + { /* IN double buffered endpoint */ + _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPTX_DTOG1); + } +} + +/******************************************************************************* +* Function Name : GetEPTxStatus +* Description : Returns the endpoint Tx status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint TX Status +*******************************************************************************/ +uint16_t GetEPTxStatus(uint8_t bEpNum) +{ + return(_GetEPTxStatus(bEpNum)); +} + +/******************************************************************************* +* Function Name : GetEPRxStatus +* Description : Returns the endpoint Rx status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint RX Status +*******************************************************************************/ +uint16_t GetEPRxStatus(uint8_t bEpNum) +{ + return(_GetEPRxStatus(bEpNum)); +} + +/******************************************************************************* +* Function Name : SetEPTxValid +* Description : Valid the endpoint Tx Status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPTxValid(uint8_t bEpNum) +{ + _SetEPTxStatus(bEpNum, EP_TX_VALID); +} + +/******************************************************************************* +* Function Name : SetEPRxValid +* Description : Valid the endpoint Rx Status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPRxValid(uint8_t bEpNum) +{ + _SetEPRxStatus(bEpNum, EP_RX_VALID); +} + +/******************************************************************************* +* Function Name : SetEP_KIND +* Description : Clear the EP_KIND bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEP_KIND(uint8_t bEpNum) +{ + _SetEP_KIND(bEpNum); +} + +/******************************************************************************* +* Function Name : ClearEP_KIND +* Description : set the EP_KIND bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearEP_KIND(uint8_t bEpNum) +{ + _ClearEP_KIND(bEpNum); +} +/******************************************************************************* +* Function Name : Clear_Status_Out +* Description : Clear the Status Out of the related Endpoint +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void Clear_Status_Out(uint8_t bEpNum) +{ + _ClearEP_KIND(bEpNum); +} +/******************************************************************************* +* Function Name : Set_Status_Out +* Description : Set the Status Out of the related Endpoint +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void Set_Status_Out(uint8_t bEpNum) +{ + _SetEP_KIND(bEpNum); +} +/******************************************************************************* +* Function Name : SetEPDoubleBuff +* Description : Enable the double buffer feature for the endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDoubleBuff(uint8_t bEpNum) +{ + _SetEP_KIND(bEpNum); +} +/******************************************************************************* +* Function Name : ClearEPDoubleBuff +* Description : Disable the double buffer feature for the endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearEPDoubleBuff(uint8_t bEpNum) +{ + _ClearEP_KIND(bEpNum); +} +/******************************************************************************* +* Function Name : GetTxStallStatus +* Description : Returns the Stall status of the Tx endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Tx Stall status. +*******************************************************************************/ +uint16_t GetTxStallStatus(uint8_t bEpNum) +{ + return(_GetTxStallStatus(bEpNum)); +} +/******************************************************************************* +* Function Name : GetRxStallStatus +* Description : Returns the Stall status of the Rx endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Rx Stall status. +*******************************************************************************/ +uint16_t GetRxStallStatus(uint8_t bEpNum) +{ + return(_GetRxStallStatus(bEpNum)); +} +/******************************************************************************* +* Function Name : ClearEP_CTR_RX +* Description : Clear the CTR_RX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearEP_CTR_RX(uint8_t bEpNum) +{ + _ClearEP_CTR_RX(bEpNum); +} +/******************************************************************************* +* Function Name : ClearEP_CTR_TX +* Description : Clear the CTR_TX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearEP_CTR_TX(uint8_t bEpNum) +{ + _ClearEP_CTR_TX(bEpNum); +} +/******************************************************************************* +* Function Name : ToggleDTOG_RX +* Description : Toggle the DTOG_RX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ToggleDTOG_RX(uint8_t bEpNum) +{ + _ToggleDTOG_RX(bEpNum); +} +/******************************************************************************* +* Function Name : ToggleDTOG_TX +* Description : Toggle the DTOG_TX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ToggleDTOG_TX(uint8_t bEpNum) +{ + _ToggleDTOG_TX(bEpNum); +} +/******************************************************************************* +* Function Name : ClearDTOG_RX. +* Description : Clear the DTOG_RX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearDTOG_RX(uint8_t bEpNum) +{ + _ClearDTOG_RX(bEpNum); +} +/******************************************************************************* +* Function Name : ClearDTOG_TX. +* Description : Clear the DTOG_TX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearDTOG_TX(uint8_t bEpNum) +{ + _ClearDTOG_TX(bEpNum); +} +/******************************************************************************* +* Function Name : SetEPAddress +* Description : Set the endpoint address. +* Input : bEpNum: Endpoint Number. +* bAddr: New endpoint address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPAddress(uint8_t bEpNum, uint8_t bAddr) +{ + _SetEPAddress(bEpNum, bAddr); +} +/******************************************************************************* +* Function Name : GetEPAddress +* Description : Get the endpoint address. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint address. +*******************************************************************************/ +uint8_t GetEPAddress(uint8_t bEpNum) +{ + return(_GetEPAddress(bEpNum)); +} +/******************************************************************************* +* Function Name : SetEPTxAddr +* Description : Set the endpoint Tx buffer address. +* Input : bEpNum: Endpoint Number. +* wAddr: new address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPTxAddr(uint8_t bEpNum, uint16_t wAddr) +{ + _SetEPTxAddr(bEpNum, wAddr); +} +/******************************************************************************* +* Function Name : SetEPRxAddr +* Description : Set the endpoint Rx buffer address. +* Input : bEpNum: Endpoint Number. +* wAddr: new address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPRxAddr(uint8_t bEpNum, uint16_t wAddr) +{ + _SetEPRxAddr(bEpNum, wAddr); +} +/******************************************************************************* +* Function Name : GetEPTxAddr +* Description : Returns the endpoint Tx buffer address. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Rx buffer address. +*******************************************************************************/ +uint16_t GetEPTxAddr(uint8_t bEpNum) +{ + return(_GetEPTxAddr(bEpNum)); +} +/******************************************************************************* +* Function Name : GetEPRxAddr. +* Description : Returns the endpoint Rx buffer address. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Rx buffer address. +*******************************************************************************/ +uint16_t GetEPRxAddr(uint8_t bEpNum) +{ + return(_GetEPRxAddr(bEpNum)); +} +/******************************************************************************* +* Function Name : SetEPTxCount. +* Description : Set the Tx count. +* Input : bEpNum: Endpoint Number. +* wCount: new count value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPTxCount(uint8_t bEpNum, uint16_t wCount) +{ + _SetEPTxCount(bEpNum, wCount); +} +/******************************************************************************* +* Function Name : SetEPCountRxReg. +* Description : Set the Count Rx Register value. +* Input : *pdwReg: point to the register. +* wCount: the new register value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPCountRxReg(uint32_t *pdwReg, uint16_t wCount) +{ + _SetEPCountRxReg(dwReg, wCount); +} +/******************************************************************************* +* Function Name : SetEPRxCount +* Description : Set the Rx count. +* Input : bEpNum: Endpoint Number. +* wCount: the new count value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPRxCount(uint8_t bEpNum, uint16_t wCount) +{ + _SetEPRxCount(bEpNum, wCount); +} +/******************************************************************************* +* Function Name : GetEPTxCount +* Description : Get the Tx count. +* Input : bEpNum: Endpoint Number. +* Output : None +* Return : Tx count value. +*******************************************************************************/ +uint16_t GetEPTxCount(uint8_t bEpNum) +{ + return(_GetEPTxCount(bEpNum)); +} +/******************************************************************************* +* Function Name : GetEPRxCount +* Description : Get the Rx count. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Rx count value. +*******************************************************************************/ +uint16_t GetEPRxCount(uint8_t bEpNum) +{ + return(_GetEPRxCount(bEpNum)); +} +/******************************************************************************* +* Function Name : SetEPDblBuffAddr +* Description : Set the addresses of the buffer 0 and 1. +* Input : bEpNum: Endpoint Number. +* wBuf0Addr: new address of buffer 0. +* wBuf1Addr: new address of buffer 1. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuffAddr(uint8_t bEpNum, uint16_t wBuf0Addr, uint16_t wBuf1Addr) +{ + _SetEPDblBuffAddr(bEpNum, wBuf0Addr, wBuf1Addr); +} +/******************************************************************************* +* Function Name : SetEPDblBuf0Addr +* Description : Set the Buffer 1 address. +* Input : bEpNum: Endpoint Number +* wBuf0Addr: new address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuf0Addr(uint8_t bEpNum, uint16_t wBuf0Addr) +{ + _SetEPDblBuf0Addr(bEpNum, wBuf0Addr); +} +/******************************************************************************* +* Function Name : SetEPDblBuf1Addr +* Description : Set the Buffer 1 address. +* Input : bEpNum: Endpoint Number +* wBuf1Addr: new address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuf1Addr(uint8_t bEpNum, uint16_t wBuf1Addr) +{ + _SetEPDblBuf1Addr(bEpNum, wBuf1Addr); +} +/******************************************************************************* +* Function Name : GetEPDblBuf0Addr +* Description : Returns the address of the Buffer 0. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +uint16_t GetEPDblBuf0Addr(uint8_t bEpNum) +{ + return(_GetEPDblBuf0Addr(bEpNum)); +} +/******************************************************************************* +* Function Name : GetEPDblBuf1Addr +* Description : Returns the address of the Buffer 1. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Address of the Buffer 1. +*******************************************************************************/ +uint16_t GetEPDblBuf1Addr(uint8_t bEpNum) +{ + return(_GetEPDblBuf1Addr(bEpNum)); +} +/******************************************************************************* +* Function Name : SetEPDblBuffCount +* Description : Set the number of bytes for a double Buffer +* endpoint. +* Input : bEpNum,bDir, wCount +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuffCount(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) +{ + _SetEPDblBuffCount(bEpNum, bDir, wCount); +} +/******************************************************************************* +* Function Name : SetEPDblBuf0Count +* Description : Set the number of bytes in the buffer 0 of a double Buffer +* endpoint. +* Input : bEpNum, bDir, wCount +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuf0Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) +{ + _SetEPDblBuf0Count(bEpNum, bDir, wCount); +} +/******************************************************************************* +* Function Name : SetEPDblBuf1Count +* Description : Set the number of bytes in the buffer 0 of a double Buffer +* endpoint. +* Input : bEpNum, bDir, wCount +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuf1Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) +{ + _SetEPDblBuf1Count(bEpNum, bDir, wCount); +} +/******************************************************************************* +* Function Name : GetEPDblBuf0Count +* Description : Returns the number of byte received in the buffer 0 of a double +* Buffer endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint Buffer 0 count +*******************************************************************************/ +uint16_t GetEPDblBuf0Count(uint8_t bEpNum) +{ + return(_GetEPDblBuf0Count(bEpNum)); +} +/******************************************************************************* +* Function Name : GetEPDblBuf1Count +* Description : Returns the number of data received in the buffer 1 of a double +* Buffer endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint Buffer 1 count. +*******************************************************************************/ +uint16_t GetEPDblBuf1Count(uint8_t bEpNum) +{ + return(_GetEPDblBuf1Count(bEpNum)); +} +/******************************************************************************* +* Function Name : GetEPDblBufDir +* Description : gets direction of the double buffered endpoint +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : EP_DBUF_OUT, EP_DBUF_IN, +* EP_DBUF_ERR if the endpoint counter not yet programmed. +*******************************************************************************/ +EP_DBUF_DIR GetEPDblBufDir(uint8_t bEpNum) +{ + if ((uint16_t)(*_pEPRxCount(bEpNum) & 0xFC00) != 0) + return(EP_DBUF_OUT); + else if (((uint16_t)(*_pEPTxCount(bEpNum)) & 0x03FF) != 0) + return(EP_DBUF_IN); + else + return(EP_DBUF_ERR); +} +/******************************************************************************* +* Function Name : FreeUserBuffer +* Description : free buffer used from the application realizing it to the line + toggles bit SW_BUF in the double buffered endpoint register +* Input : bEpNum, bDir +* Output : None. +* Return : None. +*******************************************************************************/ +void FreeUserBuffer(uint8_t bEpNum, uint8_t bDir) +{ + if (bDir == EP_DBUF_OUT) + { /* OUT double buffered endpoint */ + _ToggleDTOG_TX(bEpNum); + } + else if (bDir == EP_DBUF_IN) + { /* IN double buffered endpoint */ + _ToggleDTOG_RX(bEpNum); + } +} + +/******************************************************************************* +* Function Name : ToWord +* Description : merge two byte in a word. +* Input : bh: byte high, bl: bytes low. +* Output : None. +* Return : resulted word. +*******************************************************************************/ +uint16_t ToWord(uint8_t bh, uint8_t bl) +{ + uint16_t wRet; + wRet = (uint16_t)bl | ((uint16_t)bh << 8); + return(wRet); +} +/******************************************************************************* +* Function Name : ByteSwap +* Description : Swap two byte in a word. +* Input : wSwW: word to Swap. +* Output : None. +* Return : resulted word. +*******************************************************************************/ +uint16_t ByteSwap(uint16_t wSwW) +{ + uint8_t bTemp; + uint16_t wRet; + bTemp = (uint8_t)(wSwW & 0xff); + wRet = (wSwW >> 8) | ((uint16_t)bTemp << 8); + return(wRet); +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_regs.h b/Soft/Suwmiarka_CrossWorks/usb_regs.h new file mode 100644 index 0000000..36ef623 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_regs.h @@ -0,0 +1,680 @@ +/** + ****************************************************************************** + * @file usb_regs.h + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Interface prototype functions to USB cell registers + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_REGS_H +#define __USB_REGS_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +typedef enum _EP_DBUF_DIR +{ + /* double buffered endpoint direction */ + EP_DBUF_ERR, + EP_DBUF_OUT, + EP_DBUF_IN +}EP_DBUF_DIR; + +/* endpoint buffer number */ +enum EP_BUF_NUM +{ + EP_NOBUF, + EP_BUF0, + EP_BUF1 +}; + +/* Exported constants --------------------------------------------------------*/ +#define RegBase (0x40005C00L) /* USB_IP Peripheral Registers base address */ +#define PMAAddr (0x40006000L) /* USB_IP Packet Memory Area base address */ + +/******************************************************************************/ +/* General registers */ +/******************************************************************************/ + +/* Control register */ +#define CNTR ((__IO unsigned *)(RegBase + 0x40)) +/* Interrupt status register */ +#define ISTR ((__IO unsigned *)(RegBase + 0x44)) +/* Frame number register */ +#define FNR ((__IO unsigned *)(RegBase + 0x48)) +/* Device address register */ +#define DADDR ((__IO unsigned *)(RegBase + 0x4C)) +/* Buffer Table address register */ +#define BTABLE ((__IO unsigned *)(RegBase + 0x50)) +/******************************************************************************/ +/* Endpoint registers */ +/******************************************************************************/ +#define EP0REG ((__IO unsigned *)(RegBase)) /* endpoint 0 register address */ + +/* Endpoint Addresses (w/direction) */ +#define EP0_OUT ((uint8_t)0x00) +#define EP0_IN ((uint8_t)0x80) +#define EP1_OUT ((uint8_t)0x01) +#define EP1_IN ((uint8_t)0x81) +#define EP2_OUT ((uint8_t)0x02) +#define EP2_IN ((uint8_t)0x82) +#define EP3_OUT ((uint8_t)0x03) +#define EP3_IN ((uint8_t)0x83) +#define EP4_OUT ((uint8_t)0x04) +#define EP4_IN ((uint8_t)0x84) +#define EP5_OUT ((uint8_t)0x05) +#define EP5_IN ((uint8_t)0x85) +#define EP6_OUT ((uint8_t)0x06) +#define EP6_IN ((uint8_t)0x86) +#define EP7_OUT ((uint8_t)0x07) +#define EP7_IN ((uint8_t)0x87) + +/* endpoints enumeration */ +#define ENDP0 ((uint8_t)0) +#define ENDP1 ((uint8_t)1) +#define ENDP2 ((uint8_t)2) +#define ENDP3 ((uint8_t)3) +#define ENDP4 ((uint8_t)4) +#define ENDP5 ((uint8_t)5) +#define ENDP6 ((uint8_t)6) +#define ENDP7 ((uint8_t)7) + +/******************************************************************************/ +/* ISTR interrupt events */ +/******************************************************************************/ +#define ISTR_CTR (0x8000) /* Correct TRansfer (clear-only bit) */ +#define ISTR_DOVR (0x4000) /* DMA OVeR/underrun (clear-only bit) */ +#define ISTR_ERR (0x2000) /* ERRor (clear-only bit) */ +#define ISTR_WKUP (0x1000) /* WaKe UP (clear-only bit) */ +#define ISTR_SUSP (0x0800) /* SUSPend (clear-only bit) */ +#define ISTR_RESET (0x0400) /* RESET (clear-only bit) */ +#define ISTR_SOF (0x0200) /* Start Of Frame (clear-only bit) */ +#define ISTR_ESOF (0x0100) /* Expected Start Of Frame (clear-only bit) */ + + +#define ISTR_DIR (0x0010) /* DIRection of transaction (read-only bit) */ +#define ISTR_EP_ID (0x000F) /* EndPoint IDentifier (read-only bit) */ + +#define CLR_CTR (~ISTR_CTR) /* clear Correct TRansfer bit */ +#define CLR_DOVR (~ISTR_DOVR) /* clear DMA OVeR/underrun bit*/ +#define CLR_ERR (~ISTR_ERR) /* clear ERRor bit */ +#define CLR_WKUP (~ISTR_WKUP) /* clear WaKe UP bit */ +#define CLR_SUSP (~ISTR_SUSP) /* clear SUSPend bit */ +#define CLR_RESET (~ISTR_RESET) /* clear RESET bit */ +#define CLR_SOF (~ISTR_SOF) /* clear Start Of Frame bit */ +#define CLR_ESOF (~ISTR_ESOF) /* clear Expected Start Of Frame bit */ + +/******************************************************************************/ +/* CNTR control register bits definitions */ +/******************************************************************************/ +#define CNTR_CTRM (0x8000) /* Correct TRansfer Mask */ +#define CNTR_DOVRM (0x4000) /* DMA OVeR/underrun Mask */ +#define CNTR_ERRM (0x2000) /* ERRor Mask */ +#define CNTR_WKUPM (0x1000) /* WaKe UP Mask */ +#define CNTR_SUSPM (0x0800) /* SUSPend Mask */ +#define CNTR_RESETM (0x0400) /* RESET Mask */ +#define CNTR_SOFM (0x0200) /* Start Of Frame Mask */ +#define CNTR_ESOFM (0x0100) /* Expected Start Of Frame Mask */ + + +#define CNTR_RESUME (0x0010) /* RESUME request */ +#define CNTR_FSUSP (0x0008) /* Force SUSPend */ +#define CNTR_LPMODE (0x0004) /* Low-power MODE */ +#define CNTR_PDWN (0x0002) /* Power DoWN */ +#define CNTR_FRES (0x0001) /* Force USB RESet */ + +/******************************************************************************/ +/* FNR Frame Number Register bit definitions */ +/******************************************************************************/ +#define FNR_RXDP (0x8000) /* status of D+ data line */ +#define FNR_RXDM (0x4000) /* status of D- data line */ +#define FNR_LCK (0x2000) /* LoCKed */ +#define FNR_LSOF (0x1800) /* Lost SOF */ +#define FNR_FN (0x07FF) /* Frame Number */ +/******************************************************************************/ +/* DADDR Device ADDRess bit definitions */ +/******************************************************************************/ +#define DADDR_EF (0x80) +#define DADDR_ADD (0x7F) +/******************************************************************************/ +/* Endpoint register */ +/******************************************************************************/ +/* bit positions */ +#define EP_CTR_RX (0x8000) /* EndPoint Correct TRansfer RX */ +#define EP_DTOG_RX (0x4000) /* EndPoint Data TOGGLE RX */ +#define EPRX_STAT (0x3000) /* EndPoint RX STATus bit field */ +#define EP_SETUP (0x0800) /* EndPoint SETUP */ +#define EP_T_FIELD (0x0600) /* EndPoint TYPE */ +#define EP_KIND (0x0100) /* EndPoint KIND */ +#define EP_CTR_TX (0x0080) /* EndPoint Correct TRansfer TX */ +#define EP_DTOG_TX (0x0040) /* EndPoint Data TOGGLE TX */ +#define EPTX_STAT (0x0030) /* EndPoint TX STATus bit field */ +#define EPADDR_FIELD (0x000F) /* EndPoint ADDRess FIELD */ + +/* EndPoint REGister MASK (no toggle fields) */ +#define EPREG_MASK (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD) + +/* EP_TYPE[1:0] EndPoint TYPE */ +#define EP_TYPE_MASK (0x0600) /* EndPoint TYPE Mask */ +#define EP_BULK (0x0000) /* EndPoint BULK */ +#define EP_CONTROL (0x0200) /* EndPoint CONTROL */ +#define EP_ISOCHRONOUS (0x0400) /* EndPoint ISOCHRONOUS */ +#define EP_INTERRUPT (0x0600) /* EndPoint INTERRUPT */ +#define EP_T_MASK (~EP_T_FIELD & EPREG_MASK) + + +/* EP_KIND EndPoint KIND */ +#define EPKIND_MASK (~EP_KIND & EPREG_MASK) + +/* STAT_TX[1:0] STATus for TX transfer */ +#define EP_TX_DIS (0x0000) /* EndPoint TX DISabled */ +#define EP_TX_STALL (0x0010) /* EndPoint TX STALLed */ +#define EP_TX_NAK (0x0020) /* EndPoint TX NAKed */ +#define EP_TX_VALID (0x0030) /* EndPoint TX VALID */ +#define EPTX_DTOG1 (0x0010) /* EndPoint TX Data TOGgle bit1 */ +#define EPTX_DTOG2 (0x0020) /* EndPoint TX Data TOGgle bit2 */ +#define EPTX_DTOGMASK (EPTX_STAT|EPREG_MASK) + +/* STAT_RX[1:0] STATus for RX transfer */ +#define EP_RX_DIS (0x0000) /* EndPoint RX DISabled */ +#define EP_RX_STALL (0x1000) /* EndPoint RX STALLed */ +#define EP_RX_NAK (0x2000) /* EndPoint RX NAKed */ +#define EP_RX_VALID (0x3000) /* EndPoint RX VALID */ +#define EPRX_DTOG1 (0x1000) /* EndPoint RX Data TOGgle bit1 */ +#define EPRX_DTOG2 (0x2000) /* EndPoint RX Data TOGgle bit1 */ +#define EPRX_DTOGMASK (EPRX_STAT|EPREG_MASK) +/* Exported macro ------------------------------------------------------------*/ +/* SetCNTR */ +#define _SetCNTR(wRegValue) (*CNTR = (uint16_t)wRegValue) + +/* SetISTR */ +#define _SetISTR(wRegValue) (*ISTR = (uint16_t)wRegValue) + +/* SetDADDR */ +#define _SetDADDR(wRegValue) (*DADDR = (uint16_t)wRegValue) + +/* SetBTABLE */ +#define _SetBTABLE(wRegValue)(*BTABLE = (uint16_t)(wRegValue & 0xFFF8)) + +/* GetCNTR */ +#define _GetCNTR() ((uint16_t) *CNTR) + +/* GetISTR */ +#define _GetISTR() ((uint16_t) *ISTR) + +/* GetFNR */ +#define _GetFNR() ((uint16_t) *FNR) + +/* GetDADDR */ +#define _GetDADDR() ((uint16_t) *DADDR) + +/* GetBTABLE */ +#define _GetBTABLE() ((uint16_t) *BTABLE) + +/* SetENDPOINT */ +#define _SetENDPOINT(bEpNum,wRegValue) (*(EP0REG + bEpNum)= \ + (uint16_t)wRegValue) + +/* GetENDPOINT */ +#define _GetENDPOINT(bEpNum) ((uint16_t)(*(EP0REG + bEpNum))) + +/******************************************************************************* +* Macro Name : SetEPType +* Description : sets the type in the endpoint register(bits EP_TYPE[1:0]) +* Input : bEpNum: Endpoint Number. +* wType +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPType(bEpNum,wType) (_SetENDPOINT(bEpNum,\ + ((_GetENDPOINT(bEpNum) & EP_T_MASK) | wType ))) + +/******************************************************************************* +* Macro Name : GetEPType +* Description : gets the type in the endpoint register(bits EP_TYPE[1:0]) +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint Type +*******************************************************************************/ +#define _GetEPType(bEpNum) (_GetENDPOINT(bEpNum) & EP_T_FIELD) + +/******************************************************************************* +* Macro Name : SetEPTxStatus +* Description : sets the status for tx transfer (bits STAT_TX[1:0]). +* Input : bEpNum: Endpoint Number. +* wState: new state +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPTxStatus(bEpNum,wState) {\ + register uint16_t _wRegVal; \ + _wRegVal = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK;\ + /* toggle first bit ? */ \ + if((EPTX_DTOG1 & wState)!= 0) \ + _wRegVal ^= EPTX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPTX_DTOG2 & wState)!= 0) \ + _wRegVal ^= EPTX_DTOG2; \ + _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ + } /* _SetEPTxStatus */ + +/******************************************************************************* +* Macro Name : SetEPRxStatus +* Description : sets the status for rx transfer (bits STAT_TX[1:0]) +* Input : bEpNum: Endpoint Number. +* wState: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPRxStatus(bEpNum,wState) {\ + register uint16_t _wRegVal; \ + \ + _wRegVal = _GetENDPOINT(bEpNum) & EPRX_DTOGMASK;\ + /* toggle first bit ? */ \ + if((EPRX_DTOG1 & wState)!= 0) \ + _wRegVal ^= EPRX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPRX_DTOG2 & wState)!= 0) \ + _wRegVal ^= EPRX_DTOG2; \ + _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ + } /* _SetEPRxStatus */ + +/******************************************************************************* +* Macro Name : SetEPRxTxStatus +* Description : sets the status for rx & tx (bits STAT_TX[1:0] & STAT_RX[1:0]) +* Input : bEpNum: Endpoint Number. +* wStaterx: new state. +* wStatetx: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPRxTxStatus(bEpNum,wStaterx,wStatetx) {\ + register uint32_t _wRegVal; \ + \ + _wRegVal = _GetENDPOINT(bEpNum) & (EPRX_DTOGMASK |EPTX_STAT) ;\ + /* toggle first bit ? */ \ + if((EPRX_DTOG1 & wStaterx)!= 0) \ + _wRegVal ^= EPRX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPRX_DTOG2 & wStaterx)!= 0) \ + _wRegVal ^= EPRX_DTOG2; \ + /* toggle first bit ? */ \ + if((EPTX_DTOG1 & wStatetx)!= 0) \ + _wRegVal ^= EPTX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPTX_DTOG2 & wStatetx)!= 0) \ + _wRegVal ^= EPTX_DTOG2; \ + _SetENDPOINT(bEpNum, _wRegVal | EP_CTR_RX|EP_CTR_TX); \ + } /* _SetEPRxTxStatus */ +/******************************************************************************* +* Macro Name : GetEPTxStatus / GetEPRxStatus +* Description : gets the status for tx/rx transfer (bits STAT_TX[1:0] +* /STAT_RX[1:0]) +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : status . +*******************************************************************************/ +#define _GetEPTxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPTX_STAT) + +#define _GetEPRxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPRX_STAT) + +/******************************************************************************* +* Macro Name : SetEPTxValid / SetEPRxValid +* Description : sets directly the VALID tx/rx-status into the enpoint register +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPTxValid(bEpNum) (_SetEPTxStatus(bEpNum, EP_TX_VALID)) + +#define _SetEPRxValid(bEpNum) (_SetEPRxStatus(bEpNum, EP_RX_VALID)) + +/******************************************************************************* +* Macro Name : GetTxStallStatus / GetRxStallStatus. +* Description : checks stall condition in an endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : TRUE = endpoint in stall condition. +*******************************************************************************/ +#define _GetTxStallStatus(bEpNum) (_GetEPTxStatus(bEpNum) \ + == EP_TX_STALL) +#define _GetRxStallStatus(bEpNum) (_GetEPRxStatus(bEpNum) \ + == EP_RX_STALL) + +/******************************************************************************* +* Macro Name : SetEP_KIND / ClearEP_KIND. +* Description : set & clear EP_KIND bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \ + (EP_CTR_RX|EP_CTR_TX|((_GetENDPOINT(bEpNum) | EP_KIND) & EPREG_MASK)))) +#define _ClearEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \ + (EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPKIND_MASK)))) + +/******************************************************************************* +* Macro Name : Set_Status_Out / Clear_Status_Out. +* Description : Sets/clears directly STATUS_OUT bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _Set_Status_Out(bEpNum) _SetEP_KIND(bEpNum) +#define _Clear_Status_Out(bEpNum) _ClearEP_KIND(bEpNum) + +/******************************************************************************* +* Macro Name : SetEPDoubleBuff / ClearEPDoubleBuff. +* Description : Sets/clears directly EP_KIND bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPDoubleBuff(bEpNum) _SetEP_KIND(bEpNum) +#define _ClearEPDoubleBuff(bEpNum) _ClearEP_KIND(bEpNum) + +/******************************************************************************* +* Macro Name : ClearEP_CTR_RX / ClearEP_CTR_TX. +* Description : Clears bit CTR_RX / CTR_TX in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _ClearEP_CTR_RX(bEpNum) (_SetENDPOINT(bEpNum,\ + _GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK)) +#define _ClearEP_CTR_TX(bEpNum) (_SetENDPOINT(bEpNum,\ + _GetENDPOINT(bEpNum) & 0xFF7F & EPREG_MASK)) + +/******************************************************************************* +* Macro Name : ToggleDTOG_RX / ToggleDTOG_TX . +* Description : Toggles DTOG_RX / DTOG_TX bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _ToggleDTOG_RX(bEpNum) (_SetENDPOINT(bEpNum, \ + EP_CTR_RX|EP_CTR_TX|EP_DTOG_RX | (_GetENDPOINT(bEpNum) & EPREG_MASK))) +#define _ToggleDTOG_TX(bEpNum) (_SetENDPOINT(bEpNum, \ + EP_CTR_RX|EP_CTR_TX|EP_DTOG_TX | (_GetENDPOINT(bEpNum) & EPREG_MASK))) + +/******************************************************************************* +* Macro Name : ClearDTOG_RX / ClearDTOG_TX. +* Description : Clears DTOG_RX / DTOG_TX bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _ClearDTOG_RX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_RX) != 0)\ + _ToggleDTOG_RX(bEpNum) +#define _ClearDTOG_TX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_TX) != 0)\ + _ToggleDTOG_TX(bEpNum) +/******************************************************************************* +* Macro Name : SetEPAddress. +* Description : Sets address in an endpoint register. +* Input : bEpNum: Endpoint Number. +* bAddr: Address. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPAddress(bEpNum,bAddr) _SetENDPOINT(bEpNum,\ + EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPREG_MASK) | bAddr) + +/******************************************************************************* +* Macro Name : GetEPAddress. +* Description : Gets address in an endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _GetEPAddress(bEpNum) ((uint8_t)(_GetENDPOINT(bEpNum) & EPADDR_FIELD)) + +#define _pEPTxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8 )*2 + PMAAddr)) +#define _pEPTxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+2)*2 + PMAAddr)) +#define _pEPRxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+4)*2 + PMAAddr)) +#define _pEPRxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+6)*2 + PMAAddr)) + +/******************************************************************************* +* Macro Name : SetEPTxAddr / SetEPRxAddr. +* Description : sets address of the tx/rx buffer. +* Input : bEpNum: Endpoint Number. +* wAddr: address to be set (must be word aligned). +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPTxAddr(bEpNum,wAddr) (*_pEPTxAddr(bEpNum) = ((wAddr >> 1) << 1)) +#define _SetEPRxAddr(bEpNum,wAddr) (*_pEPRxAddr(bEpNum) = ((wAddr >> 1) << 1)) + +/******************************************************************************* +* Macro Name : GetEPTxAddr / GetEPRxAddr. +* Description : Gets address of the tx/rx buffer. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : address of the buffer. +*******************************************************************************/ +#define _GetEPTxAddr(bEpNum) ((uint16_t)*_pEPTxAddr(bEpNum)) +#define _GetEPRxAddr(bEpNum) ((uint16_t)*_pEPRxAddr(bEpNum)) + +/******************************************************************************* +* Macro Name : SetEPCountRxReg. +* Description : Sets counter of rx buffer with no. of blocks. +* Input : pdwReg: pointer to counter. +* wCount: Counter. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _BlocksOf32(dwReg,wCount,wNBlocks) {\ + wNBlocks = wCount >> 5;\ + if((wCount & 0x1f) == 0)\ + wNBlocks--;\ + *pdwReg = (uint32_t)((wNBlocks << 10) | 0x8000);\ + }/* _BlocksOf32 */ + +#define _BlocksOf2(dwReg,wCount,wNBlocks) {\ + wNBlocks = wCount >> 1;\ + if((wCount & 0x1) != 0)\ + wNBlocks++;\ + *pdwReg = (uint32_t)(wNBlocks << 10);\ + }/* _BlocksOf2 */ + +#define _SetEPCountRxReg(dwReg,wCount) {\ + uint16_t wNBlocks;\ + if(wCount > 62){_BlocksOf32(dwReg,wCount,wNBlocks);}\ + else {_BlocksOf2(dwReg,wCount,wNBlocks);}\ + }/* _SetEPCountRxReg */ + + + +#define _SetEPRxDblBuf0Count(bEpNum,wCount) {\ + uint32_t *pdwReg = _pEPTxCount(bEpNum); \ + _SetEPCountRxReg(pdwReg, wCount);\ + } +/******************************************************************************* +* Macro Name : SetEPTxCount / SetEPRxCount. +* Description : sets counter for the tx/rx buffer. +* Input : bEpNum: endpoint number. +* wCount: Counter value. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPTxCount(bEpNum,wCount) (*_pEPTxCount(bEpNum) = wCount) +#define _SetEPRxCount(bEpNum,wCount) {\ + uint32_t *pdwReg = _pEPRxCount(bEpNum); \ + _SetEPCountRxReg(pdwReg, wCount);\ + } +/******************************************************************************* +* Macro Name : GetEPTxCount / GetEPRxCount. +* Description : gets counter of the tx buffer. +* Input : bEpNum: endpoint number. +* Output : None. +* Return : Counter value. +*******************************************************************************/ +#define _GetEPTxCount(bEpNum)((uint16_t)(*_pEPTxCount(bEpNum)) & 0x3ff) +#define _GetEPRxCount(bEpNum)((uint16_t)(*_pEPRxCount(bEpNum)) & 0x3ff) + +/******************************************************************************* +* Macro Name : SetEPDblBuf0Addr / SetEPDblBuf1Addr. +* Description : Sets buffer 0/1 address in a double buffer endpoint. +* Input : bEpNum: endpoint number. +* : wBuf0Addr: buffer 0 address. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPDblBuf0Addr(bEpNum,wBuf0Addr) {_SetEPTxAddr(bEpNum, wBuf0Addr);} +#define _SetEPDblBuf1Addr(bEpNum,wBuf1Addr) {_SetEPRxAddr(bEpNum, wBuf1Addr);} + +/******************************************************************************* +* Macro Name : SetEPDblBuffAddr. +* Description : Sets addresses in a double buffer endpoint. +* Input : bEpNum: endpoint number. +* : wBuf0Addr: buffer 0 address. +* : wBuf1Addr = buffer 1 address. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPDblBuffAddr(bEpNum,wBuf0Addr,wBuf1Addr) { \ + _SetEPDblBuf0Addr(bEpNum, wBuf0Addr);\ + _SetEPDblBuf1Addr(bEpNum, wBuf1Addr);\ + } /* _SetEPDblBuffAddr */ + +/******************************************************************************* +* Macro Name : GetEPDblBuf0Addr / GetEPDblBuf1Addr. +* Description : Gets buffer 0/1 address of a double buffer endpoint. +* Input : bEpNum: endpoint number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _GetEPDblBuf0Addr(bEpNum) (_GetEPTxAddr(bEpNum)) +#define _GetEPDblBuf1Addr(bEpNum) (_GetEPRxAddr(bEpNum)) + +/******************************************************************************* +* Macro Name : SetEPDblBuffCount / SetEPDblBuf0Count / SetEPDblBuf1Count. +* Description : Gets buffer 0/1 address of a double buffer endpoint. +* Input : bEpNum: endpoint number. +* : bDir: endpoint dir EP_DBUF_OUT = OUT +* EP_DBUF_IN = IN +* : wCount: Counter value +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPDblBuf0Count(bEpNum, bDir, wCount) { \ + if(bDir == EP_DBUF_OUT)\ + /* OUT endpoint */ \ + {_SetEPRxDblBuf0Count(bEpNum,wCount);} \ + else if(bDir == EP_DBUF_IN)\ + /* IN endpoint */ \ + *_pEPTxCount(bEpNum) = (uint32_t)wCount; \ + } /* SetEPDblBuf0Count*/ + +#define _SetEPDblBuf1Count(bEpNum, bDir, wCount) { \ + if(bDir == EP_DBUF_OUT)\ + /* OUT endpoint */ \ + {_SetEPRxCount(bEpNum,wCount);}\ + else if(bDir == EP_DBUF_IN)\ + /* IN endpoint */\ + *_pEPRxCount(bEpNum) = (uint32_t)wCount; \ + } /* SetEPDblBuf1Count */ + +#define _SetEPDblBuffCount(bEpNum, bDir, wCount) {\ + _SetEPDblBuf0Count(bEpNum, bDir, wCount); \ + _SetEPDblBuf1Count(bEpNum, bDir, wCount); \ + } /* _SetEPDblBuffCount */ + +/******************************************************************************* +* Macro Name : GetEPDblBuf0Count / GetEPDblBuf1Count. +* Description : Gets buffer 0/1 rx/tx counter for double buffering. +* Input : bEpNum: endpoint number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _GetEPDblBuf0Count(bEpNum) (_GetEPTxCount(bEpNum)) +#define _GetEPDblBuf1Count(bEpNum) (_GetEPRxCount(bEpNum)) + + +/* External variables --------------------------------------------------------*/ +extern __IO uint16_t wIstr; /* ISTR register last read value */ + +/* Exported functions ------------------------------------------------------- */ +void SetCNTR(uint16_t /*wRegValue*/); +void SetISTR(uint16_t /*wRegValue*/); +void SetDADDR(uint16_t /*wRegValue*/); +void SetBTABLE(uint16_t /*wRegValue*/); +void SetBTABLE(uint16_t /*wRegValue*/); +uint16_t GetCNTR(void); +uint16_t GetISTR(void); +uint16_t GetFNR(void); +uint16_t GetDADDR(void); +uint16_t GetBTABLE(void); +void SetENDPOINT(uint8_t /*bEpNum*/, uint16_t /*wRegValue*/); +uint16_t GetENDPOINT(uint8_t /*bEpNum*/); +void SetEPType(uint8_t /*bEpNum*/, uint16_t /*wType*/); +uint16_t GetEPType(uint8_t /*bEpNum*/); +void SetEPTxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/); +void SetEPRxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/); +void SetDouBleBuffEPStall(uint8_t /*bEpNum*/, uint8_t bDir); +uint16_t GetEPTxStatus(uint8_t /*bEpNum*/); +uint16_t GetEPRxStatus(uint8_t /*bEpNum*/); +void SetEPTxValid(uint8_t /*bEpNum*/); +void SetEPRxValid(uint8_t /*bEpNum*/); +uint16_t GetTxStallStatus(uint8_t /*bEpNum*/); +uint16_t GetRxStallStatus(uint8_t /*bEpNum*/); +void SetEP_KIND(uint8_t /*bEpNum*/); +void ClearEP_KIND(uint8_t /*bEpNum*/); +void Set_Status_Out(uint8_t /*bEpNum*/); +void Clear_Status_Out(uint8_t /*bEpNum*/); +void SetEPDoubleBuff(uint8_t /*bEpNum*/); +void ClearEPDoubleBuff(uint8_t /*bEpNum*/); +void ClearEP_CTR_RX(uint8_t /*bEpNum*/); +void ClearEP_CTR_TX(uint8_t /*bEpNum*/); +void ToggleDTOG_RX(uint8_t /*bEpNum*/); +void ToggleDTOG_TX(uint8_t /*bEpNum*/); +void ClearDTOG_RX(uint8_t /*bEpNum*/); +void ClearDTOG_TX(uint8_t /*bEpNum*/); +void SetEPAddress(uint8_t /*bEpNum*/, uint8_t /*bAddr*/); +uint8_t GetEPAddress(uint8_t /*bEpNum*/); +void SetEPTxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/); +void SetEPRxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/); +uint16_t GetEPTxAddr(uint8_t /*bEpNum*/); +uint16_t GetEPRxAddr(uint8_t /*bEpNum*/); +void SetEPCountRxReg(uint32_t * /*pdwReg*/, uint16_t /*wCount*/); +void SetEPTxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/); +void SetEPRxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/); +uint16_t GetEPTxCount(uint8_t /*bEpNum*/); +uint16_t GetEPRxCount(uint8_t /*bEpNum*/); +void SetEPDblBuf0Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/); +void SetEPDblBuf1Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf1Addr*/); +void SetEPDblBuffAddr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/, uint16_t /*wBuf1Addr*/); +uint16_t GetEPDblBuf0Addr(uint8_t /*bEpNum*/); +uint16_t GetEPDblBuf1Addr(uint8_t /*bEpNum*/); +void SetEPDblBuffCount(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); +void SetEPDblBuf0Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); +void SetEPDblBuf1Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); +uint16_t GetEPDblBuf0Count(uint8_t /*bEpNum*/); +uint16_t GetEPDblBuf1Count(uint8_t /*bEpNum*/); +EP_DBUF_DIR GetEPDblBufDir(uint8_t /*bEpNum*/); +void FreeUserBuffer(uint8_t bEpNum/*bEpNum*/, uint8_t bDir); +uint16_t ToWord(uint8_t, uint8_t); +uint16_t ByteSwap(uint16_t); + +#endif /* __USB_REGS_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_sil.c b/Soft/Suwmiarka_CrossWorks/usb_sil.c new file mode 100644 index 0000000..2419904 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_sil.c @@ -0,0 +1,103 @@ +/** + ****************************************************************************** + * @file usb_sil.c + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Simplified Interface Layer for Global Initialization and Endpoint + * Rea/Write operations. + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Includes ------------------------------------------------------------------*/ +#include "usb_lib.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : USB_SIL_Init +* Description : Initialize the USB Device IP and the Endpoint 0. +* Input : None. +* Output : None. +* Return : Status. +*******************************************************************************/ +uint32_t USB_SIL_Init(void) +{ + /* USB interrupts initialization */ + /* clear pending interrupts */ + _SetISTR(0); + wInterrupt_Mask = IMR_MSK; + /* set interrupts mask */ + _SetCNTR(wInterrupt_Mask); + return 0; +} + +/******************************************************************************* +* Function Name : USB_SIL_Write +* Description : Write a buffer of data to a selected endpoint. +* Input : - bEpAddr: The address of the non control endpoint. +* - pBufferPointer: The pointer to the buffer of data to be written +* to the endpoint. +* - wBufferSize: Number of data to be written (in bytes). +* Output : None. +* Return : Status. +*******************************************************************************/ +uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize) +{ + /* Use the memory interface function to write to the selected endpoint */ + UserToPMABufferCopy(pBufferPointer, GetEPTxAddr(bEpAddr & 0x7F), wBufferSize); + + /* Update the data length in the control register */ + SetEPTxCount((bEpAddr & 0x7F), wBufferSize); + + return 0; +} + +/******************************************************************************* +* Function Name : USB_SIL_Read +* Description : Write a buffer of data to a selected endpoint. +* Input : - bEpAddr: The address of the non control endpoint. +* - pBufferPointer: The pointer to which will be saved the +* received data buffer. +* Output : None. +* Return : Number of received data (in Bytes). +*******************************************************************************/ +uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer) +{ + uint32_t DataLength = 0; + + /* Get the number of received data on the selected Endpoint */ + DataLength = GetEPRxCount(bEpAddr & 0x7F); + + /* Use the memory interface function to write to the selected endpoint */ + PMAToUserBufferCopy(pBufferPointer, GetEPRxAddr(bEpAddr & 0x7F), DataLength); + + /* Return the number of received data */ + return DataLength; +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_sil.h b/Soft/Suwmiarka_CrossWorks/usb_sil.h new file mode 100644 index 0000000..8f72056 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_sil.h @@ -0,0 +1,46 @@ +/** + ****************************************************************************** + * @file usb_sil.h + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Simplified Interface Layer function prototypes. + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_SIL_H +#define __USB_SIL_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +uint32_t USB_SIL_Init(void); +uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize); +uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer); + +/* External variables --------------------------------------------------------*/ + +#endif /* __USB_SIL_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Soft/Suwmiarka_CrossWorks/usb_type.h b/Soft/Suwmiarka_CrossWorks/usb_type.h new file mode 100644 index 0000000..7b12a59 --- /dev/null +++ b/Soft/Suwmiarka_CrossWorks/usb_type.h @@ -0,0 +1,54 @@ +/** + ****************************************************************************** + * @file usb_type.h + * @author MCD Application Team + * @version V4.0.0 + * @date 28-August-2012 + * @brief Type definitions used by the USB Library + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_TYPE_H +#define __USB_TYPE_H + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +#ifndef NULL +#define NULL ((void *)0) +#endif + +typedef enum +{ + FALSE = 0, TRUE = !FALSE +} +bool; + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/* External variables --------------------------------------------------------*/ + +#endif /* __USB_TYPE_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/notatki.txt b/notatki.txt index e6c00ed..98c58c2 100644 --- a/notatki.txt +++ b/notatki.txt @@ -1,4 +1,6 @@ -SPI, 1,5V ~100khz +SPI, 1,5V ~100khz +wyjscie chyba prądowe 0/100uA albo open drain od góry (WAT?) + LSB first